Задать вопрос
  • Как сгруппировать диалоги по двум полям в MySQL через GroupBY?

    @alexalexes
    Пробуйте этот запрос с вычисленным псевдопараметром dialog_hold.
    Суть в том, что этот параметр одинаковый для переписки пользователя 1 и пользователя 2 в ту и другую сторону.
    Должно получаться число 1000002 при sender_id=1, recipient_id=2 и при sender_id=2, recipient_id=1.
    По этому параметру можно отсортировать переписку так, чтобы беседы пользователей шли по порядку.
    Значение 1000000 должно быть заведомо большое, чем возможно число пользователей в вашей системе в любой исторический период. Однако, max(user_id) * 1000000 + max(user_id) никогда не должно превышать макс. целочисленное значение, с которым может работать СУБД (верхний предел id пользователей, когда этот финт ушами способен работать).
    select a.*
    from (select d.id, d.tovar_id, d.sender_id, d.recipient_id, d.message,
                 case
                   when d.sender_id < d.recipient_id
                   then d.sender_id * 1000000 + d.recipient_id
                   else d.recipient_id * 1000000 + d.sender_id
                 end dialog_hold
            from dialogs d
           where d.tovar_id = :tovar_id
             and (d.sender_id = :user_id or d.recipient_id = :user_id)
          ) a
    order by  a.tovar_id, a.dialog_hold, a.id
    Ответ написан
  • Есть камера от регистратора как её подключить к ТВ или компьютеру?

    @alexalexes
    Игра не стоит свеч.
    Этой камере нужно где-то брать 12 вольт (две жилы у джека - эта питание, третья - сигнал RCA желтый тюльпан).
    При подключении к телевизору вам придется заморочиться с отельным блоком питания,
    а при подключении к ПК, питание можно взять из БП системника, а вот для видеосигнала нужна плата видеозахвата, либо ее usb-аналог.
    Картинка скорее всего будет 720 × 576 - это как у любой самой бюджетной камеры, которая цепляется напрямую по USB без всяких заморочек.
    Ответ написан
  • Не приходят формы с сайта на почту?

    @alexalexes
    У вас что клиентский, что серверный скрипт не имеют функционала оповещать пользователя о возникшей ошибке.
    php-скрипт должен отдавать хоть малюсенькое текстовое сообщение, что удалось отправить почту.
    ....
    $send_result = mail($admin_email, adopt($form_subject), $message, $headers );
    echo $send_result ? 'success' : 'fail';

    Клиентский скрипт должен иметь возможность в коллбэк функции done словить это сообщение:
    ...
    ).done(function(e)
    {
        var resp = e.responseText;
        alert(resp === 'success' ? 'Сообщение отправлено!' : 'Ошибка отправки сообщения');
    ....
    }

    Для аякса хорошо бы еще добавить функцию fail(), когда серверный скрипт вообще не отвечает.
    $.ajax({
          type: "POST",
          url: "../js/mail.php", //Change
          data: th.serialize()
        }).done(function(e) {
         .......
        }).fail(function()
        {
          alert('Фатальная ошибка отправки!');
        });

    Немного доработав скрипты, и получив некоторые сообщения, можно будет сориентироваться, какого рода ошибка у вас возникла.
    Ответ написан
    Комментировать
  • Как добавить тег в скрипт?

    @alexalexes
    А что мешает плюсануть текст в нужном месте?

    ......('span').html( '<i class="new"></i>' + $('#form-uploa......


    PS: правда для вывода текста в тег использовать не метод text(), а html().
    Ответ написан
  • Как выполнить нужные условия до и после определенной даты JS?

    @alexalexes
    var now = new Date(); // Текущая дата
           var event_date = new Date ("Jul 17 2018 11:30:00 GMT+0300"); // дата события (+ часовой пояс, крайне обязательно)
           var dif_time = now.getTime() - event_date.getTime(); // разность в милисикундах по UTC (время приведено в один часовой пояс, крайне удачно)
           var duration = 60 * 60 * 1000; // время длительности вебинара в милисекундах
           switch(true)
           {
               case dif_time < 0:
                // действия до события
                break;
              case dif_time >= 0 && dif_time < duration:
                // действия во время события до окончания, (dif_time / 1000) - куда перематывать
                break;
              case dif_time >= duration:
                // действия после окончания события
                break;
           }
    Ответ написан
    4 комментария
  • Почему на MacOS криво работает кнопка наверх?

    @alexalexes
    У вас очень тяжелый файл www.annalev.ru/static/bundle/js/bundle.min.js, в котором лежит функция скроллинга, пока он не загрузиться на клиенте полностью, скроллинг не будет работать.
    Решить проблему можно несколькими путями:
    1) Все легковесные функции, которые не зависят от библиотек поместить в отдельный файл, который будет подключаться выше списком, чем тяжеловесные js.
    2) Написать код легковестных функций прямо в документе (или в общем шаблоне страниц, где описывается head или footer, в случае если у вас CMS);
    3) Написать обработчик скроллинга непосредственно в атрибуте onclick.
    PS: Дополнительно, посмотреть, какой функционал можно "выбросить" в подключенных библиотеках.
    Например, на JQuery можно опционально отключать некоторые возможности и скачивать js-файл значительно меньших размеров, чем в полной комплектации.
    Ответ написан
    4 комментария
  • Почему некорректно скачивается pdf в firefox?

    @alexalexes
    Приведенный код напрямую не связан с технологией ajax. Он всего лишь подставляет в элемент с id-шником lp-download-pdf свойства href (по наличию этого свойства можно догадаться, что это элемент-ссылка) и download, затем, принудительно программно запускает событие клика, словно по элементу нажал пользователь.
    Как браузер отреагирует на двойное "роботизированное" нажатие на ссылку с одним и тем же href можно только догадываться. Можно попытаться сделать ссылку при каждом нажатии уникальной.
    Подставьте на этом этапе какой-нибудь рандомный параметр к ссылке:
    .attr('href', string.trim() + "?random_param=" + Math.round(Math.random() * 1000))
    Ответ написан
    Комментировать
  • Почему не срабатывает аякс запрос?

    @alexalexes
    $("#form")
    У вас на странице формы имеют атрибут id="form" или id="form1"?
    Нет.
    А на что будут вешаться обработчики submit в этом случае? Ни на что.
    Решение:
    Для отладки JS-кода в любом непонятном месте, пока вы новичок, проверяйте, что вылавливает JQuery селектор:
    var form_elem = $("#form"); // тут должны словить DOM-объект формы в JQuery обертке
    form_elem.submit(function(.......... // а тут цепляем обработчик.

    Чтобы приведенный выше код поставил обработчики submit, на странице должны существовать элементы с такими атрибутами:
    <form id="form"></from>
    или такой:
    <form id="form1"></from>
    Атрибуты action и method, конечно, должен быть определены.
    Ответ написан
  • Можно ли задать соотношение сторон изображения?

    @alexalexes
    У меня самый колхозный вариант был: создать png картинку с прозрачным цветом с нужным соотношением сторон (и самых гигантских размеров, каким может быть монитор) и поместить ее в виде img в контейнер на самом глубоком z-значении.
    Пропорции контейнера выравнивались по содержимому и одновременно он мог быть любых не фиксированных стилем размеров.
    Ответ написан
    Комментировать
  • Почему параметр функции undefined?

    @alexalexes
    Проследите за тем, что значит this, там где работает функция.
    Контекст this теряется, если функция вызвана обработчиком какого-нибудь события.
    PS: если нужно обратиться с собственному классу, то обычно обращаются либо к глобальному экземпляру объекта, либо делают обвязку функции с помощью передачи this через переменную замыкания.
    Ответ написан
    Комментировать
  • Как избавиться от бага на IOS?

    @alexalexes
    Скорее всего нужен svg формат для гарнитуры шрифта.
    PS: по стопам вопроса Как подключить шрифт для iOS?
    Ответ написан
  • Как убрать белое пространство после футера?

    @alexalexes
    Наведите порядок в этом контейнере, из-за него распирает страницу:
    <div id="container">
    <div id="wb_bs1" style="position:absolute;left:0px;top:616px;width:85px;height:85px;z-index:753;">
    <a id="bs1" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs3" style="position:absolute;left:0px;top:1670px;width:85px;height:85px;z-index:754;">
    <a id="bs3" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs4" style="position:absolute;left:0px;top:2984px;width:85px;height:85px;z-index:755;">
    <a id="bs4" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs6" style="position:absolute;left:3px;top:6143px;width:85px;height:85px;z-index:756;">
    <a id="bs6" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs7" style="position:absolute;left:0px;top:6713px;width:85px;height:85px;z-index:757;">
    <a id="bs7" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs8" style="position:absolute;left:0px;top:7372px;width:85px;height:85px;z-index:758;">
    <a id="bs8" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs9" style="position:absolute;left:0px;top:8586px;width:85px;height:85px;z-index:759;">
    <a id="bs9" style="visibility:hidden;">&nbsp;</a>
    </div>
    <div id="wb_bs10" style="position:absolute;left:0px;top:9129px;width:85px;height:85px;z-index: 10000;">
    <a id="bs10" style="visibility:hidden;">&nbsp;</a>
    </div>
    </div>

    PS: Похоже на какой-то костыль, благодаря чему поддерживается необходимая высота страницы.
    Ответ написан
    2 комментария
  • Как переместить ось x, в Chart.js, в точку 0 оси координат x-y?

    @alexalexes
    https://code.tutsplus.com/ru/tutorials/getting-sta...
    Обратите внимание на этот пример:
    var chartOptions = {
      scales: {
        yAxes: [{
          barPercentage: 0.5,
          gridLines: {
            display: false
          }
        }],
        xAxes: [{
          gridLines: {
            zeroLineColor: "black",
            zeroLineWidth: 2
          },
          ticks: {
            min: 0,
            max: 6500,
            stepSize: 1300
          },
          scaleLabel: {
            display: true,
            labelString: "Density in kg/m3"
          }
        }]
      },
      elements: {
        rectangle: {
          borderSkipped: 'left',
        }
      }
    };

    В особенности, на свойства gridLines и ticks у xAxes.
    Прописывая данные свойства у себя в примере и отрегулировав числовые параметры, вы сможете добиться желаемого положения и отображения осей.
    Ответ написан
    4 комментария
  • Как называется такой взлом сайта?

    @alexalexes
    Сайт пережил внедрение вредоносного кода.
    Устранение последствий:
    1) Приостановление работы сайта;
    2) Изучение логов посещений и ошибок сервера, установление точки и время заражения (если возможно);
    3) Сохранение состояния каталогов сайта и дампа БД для изучения;
    4) Восстановление скриптов сайта из изолированного репозитория разработчика;
    5) Восстановление БД сайта из бекапа до времени заражения;
    Устранение причин:
    6) Анализ и исправление прав доступа к FTP-каталогам, пользователей CMS;
    7) Анализ и исправление кода на уязвимость к инъекциям в запросах и шаблонах.
    8) Анализ данных в БД на предмет содержания инъекций в записях таблиц.
    9) Возобновление работы сайта с тщательным мониторингом логов.
    Ответ написан
    1 комментарий
  • Js и Pdf как что и почему?

    @alexalexes
    Если вам нужно сделать таблицу с автозаполнением полей для печати, то в случае веб-реализации вам нужно не начальные, а уверенные знания JavaScript.
    Вот примерно так можно это сделать.
    <html>
      <head>
        <meta http-equiv="Content-Type" content='text/html; charset=utf-8'>
      </head>
      <body>
        <style>
          html, body
          {
            margin: 0;
            padding: 0;
          }
          table
          {
            border-collapse: collapse;
            background-color: #fff;
          }
          table,
          table td,
          table th
          {
            border: 1px solid #333;
          }
        </style>
        <table id="job_briefing">
          <tr><th>Работник</th><th>Должность</th><th>Дата инструктажа</th><th>Инструкция</th><th>Подпись</th></tr>
        </table>
        <script>
          (function()
          {
            var row_count = 30; // количество строк таблицы
            var inctruct_info = '№18 от 01.07.2015'; // номер инструкции, которая будет заполнятся автоматически
            // справочник работников
            var workers =
            [
              {                   
                name: 'Иванов И.А.',
                post: 'Водитель'
              },
              {
                name: 'Петров И.А.',
                post: 'Техник'
              },
              {
                name: 'Сидоров И.А.',
                post: 'Инженер'
              },
            ];
            var job_briefing_table = document.getElementById('job_briefing'); // получаем DOM-элемент со страницы
            for(var i = 0; i < row_count; i++)
              job_briefing_table.appendChild(create_table_row()); // наполняем строками
            
            // функция создания строки
            function create_table_row()
            {
              var tr_elem = document.createElement('tr'); // создаем элемент tr
              var td_elem = document.createElement('td'); // создаем элемент td
              td_elem.appendChild(create_select(workers)); // создаем элемент select и вставялем его в td
              tr_elem.appendChild(td_elem); // вставляем td в tr
              for(var i = 0; i < 4; i++) // создаем и вставляем остальные td
              {
                td_elem = document.createElement('td');
                tr_elem.appendChild(td_elem);
              }
              return tr_elem;
            }
            // функция создания выпадающего списка с работниками
            function create_select(workers /* - список работников*/)
            {
              var select_elem = document.createElement('select'); // содаем элемент select
              var worker_count = workers.length; // определяем кол-во работников в списке
              var option_elem = document.createElement('option'); // создаем элемент option
              option_elem.setAttribute('value', -1); // добавляем в option атрибут value для пустого элемента
              select_elem.appendChild(option_elem); // вставляем option в select
              for(var i = 0; i < worker_count; i++) // перебираем список работников
              {
                var worker = workers[i]; // текущий элемент списка работников
                option_elem = document.createElement('option');
                option_elem.setAttribute('value', i); // добавляем в option атрибут value = порядковый номер работника в списке 
                option_elem.innerHTML = worker.name; // имя работника в option
                select_elem.appendChild(option_elem); // вставляем option в select
              }
              select_elem.onchange = worker_select_onchange; // добавляем обработчик события выбора элемента в выпадающем списке работников
              return select_elem; // возвращаем готовый элемент выпадающего списка
            }
            // обработчик события выбора элемента в выпадающем списке работников
            function worker_select_onchange(e)
            {
              var target = e.target; // получаем то элемент select, на котором произошло событие выбора работника
              var select_value = target.value; // получаем выбранное value - порядковый номер работника
              var tr_elem = target.parentNode.parentNode; // получаем строку, на котором располагается select (второй родительский элемент)
              var td_elems = tr_elem.getElementsByTagName('td'); // получаем все ячейки этой строки
              td_elems[1].innerHTML = select_value == -1 ? '' : workers[select_value].post; // задаем должность для 2-ой ячейки
              td_elems[2].innerHTML = select_value == -1 ? '' : get_current_date(); // задаем текущую дату для 3-ей ячейки
              td_elems[3].innerHTML = select_value == -1 ? '' : inctruct_info; // задаем сведения об инструкции для 4-ой строки
            }
            // функция получения текущей даты по формату DD.MM.YYYY
            function get_current_date()
            {
              var date = new Date();
              var day = date.getDate();
              var month = date.getMonth() + 1;   
              return  (day < 10 ? '0' : '') + day + '.'  + (month < 10 ? '0' : '') + month + '.' + date.getFullYear();
            }
          })();
        </script>
      </body>
    </html>
    Ответ написан
    1 комментарий
  • Как изменить стиль командой строки?

    @alexalexes
    Изменить стиль можно, но очень ограниченно:
    Прав. кнопка мыши по заголовку окна -> свойства.
    Ответ написан
    3 комментария
  • Как удалить нужную запись из БД?

    @alexalexes
    Если заняться изучением основ SQL, то можно понять, что в данной ситуации самым оптимальным решением будет - выполнить запрос с параметром:
    DELETE FROM videos WHERE id = ?
    Естественно, на странице браузера надо обеспечить, чтобы при нажатии кнопки "Удалить" серверу передавался id удаляемой записи, помимо того, какое действие мы хотим совершить.
    Серверный скрипт, также должен принимать не только параметр вида действия (delete), но параметр id, на какую запись необходимо направить действие. Далее, структура SQL-запроса должна иметь в себе возможность подставить параметр.
    PS:
    $ids = R::getAssoc('SELECT id FROM videos');
        $videos = R::find( 'videos', 'id = ?', $ids );

    Самое не оптимальное решение - выгребать все записи из таблицы, а потом на стороне серверного приложения искать ту единственную, которая удовлетворяет условию. Эта медвежья услуга нагружает тракт обмена данных между веб-сервером и СУБД-сервером.
    Ответ написан
    Комментировать
  • Как вывести текстовое содержимое элемента в консоль браузера?

    @alexalexes
    Чтобы получить решение, изучите материал:
    1. Вывод в консоль;
    2. Поиск элементов в документе;
    3. Получение содержимого элемента.
    Ответ написан
    Комментировать