За последние 24 часа нас посетили 18223 программиста и 1700 роботов. Сейчас ищет 1491 программист ...

Составить запрос из нескольких таблиц join

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 12 фев 2018.

  1. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Deonis
    Вы мне подсказали как туда добавить кнопку именно под комментом???
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    @_ne_scaju_, я вам показл пример, на всякий случай, чтобы избежать дополнительных вопрос, типа "что такое data-атрибут" или "как установить обработчик события", или же "всё сделал, но обработчик события не срабатывает" ;)
    Смотрите не минимизированный код плагина, ищите цикл, где формируется html списка задач и добавляйте туда кнопку
     
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    В принципе я нашел где формируется эти задачи, но кнопочку добавить не знаю как:
    Код (Javascript):
    1.     // вывод информации генерируемой на странице
    2.     function dateSlider(show, flags, eventsOpts)
    3.     {
    4.         var $eventsCalendarSlider = $("<div class='eventCalendar-slider'></div>");
    5.         var $eventsCalendarMonthWrap = $("<div class='eventCalendar-monthWrap'></div>");
    6.         var $eventsCalendarTitle = $("<div class='eventCalendar-currentTitle'><a href='#' class='eventCalendar-monthTitle'></a></div>");
    7.         var $eventsCalendarArrows = $("<a href='#' class='eventCalendar-arrow eventCalendar-prev'><span>" + eventsOpts.locales.txt_prev + "</span></a><a href='#' class='eventCalendar-arrow eventCalendar-next'><span>" + eventsOpts.locales.txt_next + "</span></a>");
    8.         var $eventsCalendarDaysList = $("<ul class='eventCalendar-daysList'></ul>"),
    9.         //пробую вот так добавить кнопку, но она не появляется)
    10.         var $eventsCalendarDelete = $("<div class='eventCalendar-delete'><button>x</button></div>"),
    11.  
    12.             date = new Date();
    13.  
    14.         if ( !flags.wrap.find('.eventCalendar-slider').length ) {
    15.             flags.wrap.prepend($eventsCalendarSlider);
    16.             $eventsCalendarSlider.append($eventsCalendarMonthWrap);
    17.         } else {
    18.             flags.wrap.find('.eventCalendar-slider').append($eventsCalendarMonthWrap);
    19.         }
    20.  
    21.         flags.wrap.find('.eventCalendar-monthWrap.eventCalendar-currentMonth').removeClass('eventCalendar-currentMonth').addClass('eventCalendar-oldMonth');
    22.         $eventsCalendarMonthWrap.addClass('eventCalendar-currentMonth').append($eventsCalendarTitle, $eventsCalendarDaysList);
    23.  
    24.  
    25.  
    26.         // if current show current month & day
    27.         if (show === "current") {
    28.             day = date.getDate();
    29.             $eventsCalendarSlider.append($eventsCalendarArrows);
    30.  
    31.         } else {
    32.             date = new Date(flags.wrap.attr('data-current-year'),flags.wrap.attr('data-current-month'),1,0,0,0); // current visible month
    33.             day = 0; // not show current day in days list
    34.  
    35.             moveOfMonth = 1;
    36.             if (show === "prev") {
    37.                 moveOfMonth = -1;
    38.             }
    39.             date.setMonth( date.getMonth() + moveOfMonth );
    40.  
    41.             var tmpDate = new Date();
    42.             if (date.getMonth() === tmpDate.getMonth()) {
    43.                 day = tmpDate.getDate();
    44.             }
    45.  
    46.         }
    47.  
    48.         // get date portions
    49.         var year = date.getFullYear(), // year of the events
    50.             currentYear = new Date().getFullYear(), // current year
    51.             month = date.getMonth(), // 0-11
    52.             monthToShow = month + 1;
    53.  
    54.         if (show != "current") {
    55.             // month change
    56.             getEvents(flags, eventsOpts, eventsOpts.eventsLimit, year, month,false, show);
    57.         }
    58.  
    59.         flags.wrap.attr('data-current-month',month)
    60.             .attr('data-current-year',year);
    61.  
    62.         // add current date info
    63.         moment.locale(eventsOpts.locales.locale);
    64.  
    65.         var formatedDate = moment(year+" "+monthToShow, "YYYY MM").format("MMMM YYYY");
    66.         $eventsCalendarTitle.find('.eventCalendar-monthTitle').html(formatedDate);
    67.  
    68.         // print all month days
    69.         var daysOnTheMonth = 32 - new Date(year, month, 32).getDate();
    70.         var daysList = [],
    71.             i;
    72.         if (eventsOpts.showDayAsWeeks) {
    73.             $eventsCalendarDaysList.addClass('eventCalendar-showAsWeek');
    74.  
    75.             // show day name in top of calendar
    76.             if (eventsOpts.showDayNameInCalendar) {
    77.                 $eventsCalendarDaysList.addClass('eventCalendar-showDayNames');
    78.  
    79.                 i = 0;
    80.                 // if week start on monday
    81.                 if (eventsOpts.startWeekOnMonday) {
    82.                     i = 1;
    83.                 }
    84.  
    85.                 for (; i < 7; i++) {
    86.                     daysList.push('<li class="eventCalendar-day-header">'+moment()._locale._weekdaysShort[i]+'</li>');
    87.  
    88.                     if (i === 6 && eventsOpts.startWeekOnMonday) {
    89.                         // print sunday header
    90.                         daysList.push('<li class="eventCalendar-day-header">'+moment()._locale._weekdaysShort[0]+'</li>');
    91.                     }
    92.  
    93.                 }
    94.             }
    95.  
    96.             dt=new Date(year, month, 01);
    97.             var weekDay = dt.getDay(); // day of the week where month starts
    98.  
    99.             if (eventsOpts.startWeekOnMonday) {
    100.                 weekDay = dt.getDay() - 1;
    101.             }
    102.             if (weekDay < 0) { weekDay = 6; } // if -1 is because day starts on sunday(0) and week starts on monday
    103.  
    104.             for (i = weekDay; i > 0; i--) {
    105.                 daysList.push('<li class="eventCalendar-day eventCalendar-empty"></li>');
    106.             }
    107.     }
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Не нашли. Проинспектируйте код списка, посмотрите какие классы у элементов. По этим классам можно будет найти в JS то, что нужно.
     
  5. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Я так и не нашел) может быть этот кусок ?
    PHP:
    1.         // каждый eventCalendar выполнит эту функцию
    2.         that.each(function(){
    3.  
    4.             flags.wrap = $(this);
    5.             flags.wrap.addClass('eventCalendar-wrap').append("<div class='eventCalendar-list-wrap'><p class='eventCalendar-subtitle'></p><span class='eventCalendar-loading'>"+eventsOpts.locales.txt_loading+"</span><div class='eventCalendar-list-content'><ul class='eventCalendar-list'></ul></div></div>");
    6.  
    7.             if (eventsOpts.eventsScrollable) {
    8.                 flags.wrap.find('.eventCalendar-list-content').addClass('scrollable');
    9.             }
    10.  
    11.             setCalendarWidth(flags);
    12.             $(window).resize(function(){
    13.                 setCalendarWidth(flags);
    14.             });
    15.             //flags.directionLeftMove = flags.wrap.width();
    16.  
    17.             // show current month
    18.             dateSlider("current", flags, eventsOpts);
    19.  
    20.             getEvents(flags, eventsOpts, eventsOpts.eventsLimit,false,false,false,false);
    21.  
    22.             changeMonth(flags, eventsOpts);
    23.  
    24.             flags.wrap.on('click','.eventCalendar-day a',function(e){
    25.             //flags.wrap.find('.eventCalendar-day a').live('click',function(e){
    26.                 e.preventDefault();
    27.                 var year = flags.wrap.attr('data-current-year'),
    28.                     month = flags.wrap.attr('data-current-month'),
    29.                     day = $(this).parent().attr('rel');
    30.  
    31.                 getEvents(flags, eventsOpts, false, year, month,day, "day");
    32.             });
    33.             flags.wrap.on('click','.eventCalendar-monthTitle', function(e){
    34.             //flags.wrap.find('.eventCalendar-monthTitle').live('click',function(e){
    35.                 e.preventDefault();
    36.                 var year = flags.wrap.attr('data-current-year'),
    37.                     month = flags.wrap.attr('data-current-month');
    38.  
    39.                 getEvents(flags, eventsOpts, eventsOpts.eventsLimit, year, month,false, "month");
    40.             });
    41.         });
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Не может. Если вы смотрели код сообщений, то кроме всего прочего, увидели бы, что у элемента <ul> есть класс "eventCalendar-list", но есть зацепка, которая предельно упрощает поиск - не очень часто встречающийся тег <time>. Открываем файлик, Ctrl+F, вводим <time и вот оно на 424-ой строке.
     
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Нашел, я бы и не догадался бы где этот вывод инфи происходит. Теперь кнопочку туда цеплять?
     
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Попробовал очистить форму после отправки, но не тут то было, хотел чтобы форма сбросилась, это получилось, но когда выбрал опять предмет, и отправил форму, то у меня загрузились те же события короче друг под другом стали, как и было, дублировались) В какую сторону копать чтобы дойти до верного пути?
    PHP:
    1.   $('.my_class').on('submit', function(e){
    2.     e.preventDefault();
    3.     $.ajax({
    4.       url: '/functions.php',
    5.       type: 'POST',
    6.       dataType: 'json',
    7.       data: $(this).serialize(),
    8.       success: function(data){
    9.         $("form")[0].reset();
    10.         initCalendar(data); //вот такая запись нормальная для подгрузки плагина?
    11.       },
    12.       error: function(xhr, ajaxOptions, thrownError){
    13.         console.log(thrownError + '; ' + xhr.statusText + '; ' + xhr.responseText);
    14.       }
    15.     });
    16.   });
     
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Deonis
    Думаю я уже надоел, создал тему за месяц одну и уже успел надоесть)
     
  10. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Ваша форма никак не влияет на поведение плагина.
    Ошибка. Дело совсем не в этом. Во-первых, лично у меня сейчас очень мало свободного времени. А во-вторых, всё, что мы тут пытаемся разбирать, по сути вылетает в трубу, т.к. чужой опыт хорошо прилипает к уже имеющимся знаниям, но практически мгновенно исчезает, если базовые знания практически равняются нулю.
    Попробуйте найти в плагине переменную или это может быть свойство объекта, куда записываются данные (JSON-строка). Дальше нужно будет подумать, как очищать эти закешированные данные при каждой инициализации плагина.
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Deonis
    Хорошо попробую найти свойство или переменную, как можно это делать тестировать, например в php var_dump(), printf_r() а в js как?
    --- Добавлено ---
    как прилипает, начинаешь кодить как этот программист до тебя, а потом быстро забываешь или как?
     
  12. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    console и самое базовое - console.log();
    Если есть хороший фундамент, то на нём можно строить дом, а если фундамента нет и ты начинаешь без него выкладывать кирпичики, то такой дом обречён. Изучите хотя бы основы JS и я вас уверяю, что многие вопросы просто отпадут, а помогать вам будет гораздо проще. Да и вам будет проще улавливать суть возникающих проблем и пояснения тех, у кого опыт немного больше вашего.
     
    _ne_scaju_ нравится это.
  13. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Достойный ответ) Я когда-то начинал изучать js около 20 уроков прошел азы имею введу если честно уже все забыл не практиковал тупо перепробовал что проходил и все.
     
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Да именно на этом сайте учил основы js!
    Начал смотреть на код, и что-то мне на глаза попался вот такой код:
    Код (Javascript):
    1.     function getEvents(flags, eventsOpts, limit, year, month, day, direction) {
    2.         limit = limit || 0;
    3.         year = year || '';
    4.         day = day || '';
    5.  
    6.         // Чтобы избежать проблемы с январем (месяц = 0)
    7.         if (typeof month != 'undefined') {
    8.             month = month;
    9.         } else {
    10.             month = '';
    11.         }
    12.  
    13.         //var month = month || '';
    14.         flags.wrap.find('.eventCalendar-loading').fadeIn();
    15.  
    16.         if (eventsOpts.jsonData) {
    17.             // пользователь отправляет json в параметрах плагина
    18.             eventsOpts.cacheJson = true;
    19.  
    20.             flags.eventsJson = eventsOpts.jsonData;
    21.             getEventsData(flags, eventsOpts, flags.eventsJson, limit, year, month, day, direction);
    22.  
    23.         } else if (!eventsOpts.cacheJson || !direction) {
    24.             // первая загрузка: загрузка json и сохранение его в будущих фильтрах
    25.             $.getJSON(eventsOpts.eventsjson + "?limit="+limit+"&year="+year+"&month="+month+"&day="+day, function(data) {
    26.                 flags.eventsJson = data; // сохранение данных в будущих фильтрах
    27.                 getEventsData(flags, eventsOpts, flags.eventsJson, limit, year, month, day, direction);
    28.             }).error(function() {
    29.                 showError("error getting json: ", flags.wrap);
    30.             });
    31.         } else {
    32.             // фильтр previus сохранен json
    33.             getEventsData(flags, eventsOpts, flags.eventsJson, limit, year, month, day, direction);
    34.         }
    35.  
    36.         if (day > '') {
    37.             flags.wrap.find('.eventCalendar-current').removeClass('eventCalendar-current');
    38.             flags.wrap.find('#dayList_'+day).addClass('eventCalendar-current');
    39.         }
    40.     }
    Это то что мне нужно было найти, плюс был коммент который перевел, ура)
     
    #89 _ne_scaju_, 15 фев 2018
    Последнее редактирование: 15 фев 2018
  15. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Jquery надо изучать после того, как изучил чистый JS
     
    _ne_scaju_ нравится это.
  16. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Deonis
    Привет, делаю обновления и удаления записи, уже сделал запросы проверил все срабатывает, id урока подставляю в get параметр в юрл адрес, потом передаю в функцию ну и все. Но тут такая штука, если пользователь поменяет в юрл id записи которую он редактирует или удаляет то запись удалится или от редактируется. Каким способом лучше проверить пользователя что именно он писатель и ему разрешено изменять или удалять эту запись?
    Как проверить $_GET['id']?
    Посоветуй пожалуйста.
     
  17. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Приветствую. Сообщений не было более 12-ти часов, я уже начал переживать :D
    Если память не изменяет, то у вас в сессии есть ID юзера. Вот и подставляйте в запрос соответствующее условие: WHERE `ID_записи` = 100500 AND `ID_юзера` = $_SESSION['ID_юзера'];
     
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Я так и делаю если честно, согласно условию мне пишет запись изменена, или удалена, но на самом деле не чего не удалилось и не изменилось, хочу вывести правильно сообщение, например, вы изменили запрос в юрл изменение невозможно или удаление.
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Deonis
    Не получается, запись то как надо не удаляется, но блин сообщение об удачном удалении выводится, а надо чтобы ошибку вывел, потому что url адрес изменился)
    --- Добавлено ---
    @Deonis
    Ок давай покажу:
    PHP:
    1. function Del($getid, $sessionUid)
    2. {
    3.     # глобальная переменная подключения
    4.    global $pdo;
    5.  
    6.     $del = $pdo->prepare('DELETE FROM `predmet_info` WHERE `id` = ? AND `uid` = ?');
    7.     $del->execute([$getid, $sessionUid]);
    8. }
    С ней все понятно она только выполняет запрос удаления.
    PHP:
    1. <?php
    2. if (session_status() == PHP_SESSION_NONE) {
    3. }
    4.  
    5. if(!isset($_SESSION['uid']))
    6. {
    7.     header('Location: /');
    8.     exit();
    9. }
    10.  
    11. include($_SERVER['DOCUMENT_ROOT']."/config/db.php");
    12. include($_SERVER['DOCUMENT_ROOT']."/events/ins_del_upd.php"); # подключаем функции для работы с данными
    13.  
    14. if(isset($_GET['id']))
    15. {  
    16.     $getID = $_GET['id'];
    17.  
    18.     if ($_SERVER['REQUEST_METHOD'] == 'POST')
    19.     {
    20.         if(isset($_SESSION['uid']))
    21.         {
    22.             # сохраняем сессию в переменную
    23.            $uid = $_SESSION['uid'];
    24.  
    25.             # delete the records
    26.            $del = Del($getID, $uid);
    27.             $_SESSION['success'] = 'Заметка успешно удалена';
    28.             header('Location: /events/UserEvents.php');
    29.             exit;
    30.         }
    31.     }
    32. }
    33. ?>
    34.  
    35. <!DOCTYPE html>
    36. <html lang="en">
    37. <head>
    38.     <meta charset="UTF-8">
    39.     <title>Удалить заметку</title>
    40.     <link rel="stylesheet" href="/css/style.css">
    41.    <link rel="stylesheet" href="/css/bootstrap.min.css">
    42.     <link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.css">
    43.     <script src="/js/jquery.min.js"></script>
    44. </head>
    45. <body>
    46. <div class="delzapic">
    47. <?php
    48.     if (isset($_SESSION['errors']))
    49.     {
    50.     echo '<div class="alert alert-danger" role="alert">' .$_SESSION['errors'].'</div>';
    51.     unset($_SESSION['errors']);
    52.     }
    53. ?>
    54. <div class="alert alert-warning" role="alert"><p>Вы действительно хотите удалить эту запись?</p></div>
    55.  
    56. <form action="" method="post">
    57.     <input type="text" value="<?php echo $getID; ?>">
    58.     <input type="submit" name="submit" value="Удалить" />
    59. </form>
    60. </div>
    61.  
    62. </body>
    63. </html>
    Ну вот и сам файл который по сути должен проверить нажатия кнопки удалить и обратится к функции удаления.
    Где у меня не правильно условие стоит?
     
  20. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Условий больше, чем нужно.
    Для начала, проверить данные, которые участвуют в запросе. Т.к. у вас всё в одном файле, то обычного вывода будет достаточно.
    Ошибка в сессии - это всё равно, что шинель в трусы заправлять. Чем обычные переменные не устроили или, раз уж у вас там какая-то переадресация, то почему бы не добавлять какой-то параметр? Но даже если сессии, то где вы хоть что-то присваиваете $_SESSION['errors']? Результат должна возвращать функция Del (например, true/false). Смотрим, что возвращает метод execute()
     
  21. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Deonis
    Более менее разобрался, только вопрос зачем возвращать выполненный запрос del()?
    Вопрос меня все же интересует до сих пор вопрос, как же очистить можно поля вывода в календаре чтобы фильтры очистились, помоги пожалуйста)
     
  22. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Не выполненный запрос, а результат его выполнения или какой-то "маркер", который бы говорил о том, что запрос выполнен успешно или нет. По поводу "очистки" и прочего, что требует разбор кода плагина и его дополнение/изменение, я уже говорил - у меня сейчас нет на это времени.
     
  23. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Хорошо спасибо)
    Я к стати показывал код который выводит генерируемую json строку в js.
    Посмотри на быструю руку, может подскажешь как же очистить вот функция:
    Код (Javascript):
    1.     // функция для работы с json данными она принимает и сохраняет его в фильтрах
    2.     function getEvents(flags, eventsOpts, limit, year, month, day, direction) {
    3.         limit = limit || 0;
    4.         year = year || '';
    5.         day = day || '';
    6.  
    7.         // Чтобы избежать проблемы с январем (месяц = 0)
    8.         if (typeof month != 'undefined') {
    9.             month = month;
    10.         } else {
    11.             month = '';
    12.         }
    13.  
    14.         //var month = month || '';
    15.         flags.wrap.find('.eventCalendar-loading').fadeIn();
    16.  
    17.         if (eventsOpts.jsonData) {
    18.             // пользователь отправляет json в параметрах плагина
    19.             eventsOpts.cacheJson = true;
    20.  
    21.             flags.eventsJson = eventsOpts.jsonData;
    22.             getEventsData(flags, eventsOpts, flags.eventsJson, limit, year, month, day, direction);
    23.  
    24.         } else if (!eventsOpts.cacheJson || !direction) {
    25.             // первая загрузка: загрузка json и сохранение его в будущих фильтрах
    26.             $.getJSON(eventsOpts.eventsjson + "?limit="+limit+"&year="+year+"&month="+month+"&day="+day, function(data) {
    27.                 flags.eventsJson = data; // сохранение данных в будущих фильтрах
    28.                 getEventsData(flags, eventsOpts, flags.eventsJson, limit, year, month, day, direction);
    29.             }).error(function() {
    30.                 showError("error getting json: ", flags.wrap);
    31.             });
    32.         } else {
    33.             // фильтр previus сохранен json
    34.             getEventsData(flags, eventsOpts, flags.eventsJson, limit, year, month, day, direction);
    35.         }
    36.  
    37.         if (day > '') {
    38.             flags.wrap.find('.eventCalendar-current').removeClass('eventCalendar-current');
    39.             flags.wrap.find('#dayList_'+day).addClass('eventCalendar-current');
    40.         }
    41.     }
     
  24. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Тупой плагин, даже очистить не могу
     
  25. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Deonis
    Привет, подкинь календарик мне который написан на js без хлама всякого) Буду работать пробовать с ним, спасибо.