Задать вопрос
  • Как сделать ручной редирект на определенную страницу?

    @MikUrrey
    Думаю, лучше всего сделать так: каждое сообщение сделать (если еще не сделано) объектом, в котором будет приходить тип, например text или command.
    text выводится клиенту, command выполняется браузером.
    //Где-то в недрах кода ждем команды...
    document.addEventListener("commandFromChat", function(e) {
      switch(e.detail.command) {
        case "goto": return document.location.href = e.detail.payload;
        case "somethingElse":  break; //можно обрабатывать разные команды
      }
    });
    
    //Нам письмо!
    let message = {
      "type":  "command",
      "command":  "goto",
      "payload":  "https://flowers.shop/красные-розы-100-см.html"
    };
    
    //Получая команду, браузер инициирует событие, например так:
    if (message.type === "command") {
      let event = new CustomEvent("commandFromChat", { "detail": message});
      document.dispatchEvent(event);
    }


    Таким образом можно чат превратить в инструмент исполнения любых желаний покупателя менеджером)

    Только не забудьте о безопасности, чтобы П не превратился в объект развлечения для К :))
    Ответ написан
    2 комментария
  • Symfony 5.4, как получить список внешних связей у сущности?

    @MikUrrey Автор вопроса
    public function someAction(
            \Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository $repo, 
            \Symfony\Component\HttpFoundation\Request $request
        ): \Symfony\Component\HttpFoundation\Response
    {
            $queryBulder  = $repo->createQueryBuilder('a');
            $em           = $queryBulder->getEntityManager();
            $MetaData     = $em->getClassMetadata($repo->getClassName());
            $associations = $MetaData->getAssociationMappings();
    }

    Ассоциативным массивом приходит вся необходимая информация, дальше - дело техники.
    Ответ написан
    Комментировать
  • Как исправить кодировку в ajax?

    @MikUrrey
    Ответ конкретно на вопрос:
    $pol = mb_convert_encoding($_GET['value'], 'UTF-8', 'windows-1251');
      $pol1 = mb_convert_encoding($_GET['oldvalue'], 'UTF-8', 'windows-1251');

    или
    $pol = iconv('UTF-8', 'windows-1251', $_GET['value']);
      $pol1 = iconv('UTF-8', 'windows-1251', $_GET['oldvalue']);


    Вы, надеюсь, понимаете, где ваш код уязвим, почему его нельзя использовать в реальном проекте и то, что набор функций mysql_* уже давно никто не использует?
    Ответ написан
  • Почему не находит часть строки с символами подчёркивания?

    @MikUrrey
    Почему не находит часть строки с символами подчёркивания?

    Находит, strpos вернул позицию начала подстроки в строке - 0.
    Если нужно проверить, то строгим равенством - не находя подстроку, strpos возвращает false.
    <?php 
    if ($pos !== false) { ... }

    Как можно обрезать строку и получить brand_id?

    Много способов, зависит от исходных условий. В вашем случае, возможно, такой подойдет:
    <?php
    $brand_id = preg_replace('/^_from_search_/',  '',  $str);
    Ответ написан
    6 комментариев
  • Как я могу обратно прокрутить анимацию keyframes?

    @MikUrrey
    Вообще на счет добавления-удаления классов направление мысли верное, но вроде как писать обратную анимацию больше не нужно - появилось правило
    animation-direction: reverse
    Ответ написан
  • Php код вставляется как текст в html, как исправить?

    @MikUrrey
    У вас, похоже, не установлен PHP. Попробуйте:

    sudo apt install php libapache2-mod-php
    sudo systemctl reload apache2
    Ответ написан
    1 комментарий
  • Как закрыть бургер после скролла?

    @MikUrrey
    Потому что querySelector возвращает один элемент, а querySelectorAll возвращает коллекцию (итерируемый объект типа массива).
    const burger__btn = document.querySelectorAll('.menu__item-link');
    //...............
    for(let i = 0, l = burger__btn.length; i < l; i++)
     burger__btn[i].addEventListener('click',  () => {
        menu.classList.remove('active');
        burger.classList.remove('active-burger');
        body.classList.remove('locked');
     })
    }
    Ответ написан
  • Как работает телеграм бот?

    @MikUrrey
    Бот может отправлять сообщения только от своего имени. Поэтому в данном случае ему нужно хранить связи, кто с кем общается. У админа и у пользователя есть ID, которые они не знают, но которые должен знать бот, чтобы правильно "раздавать" диалоги.
    Ответ написан
  • JS fetch(): как отличить ошибку CORS от других?

    @MikUrrey Автор вопроса
    Как выяснилось, из соображений безопасности браузеры не делятся с веб-разработчиками причинами блокировок запросов, но с низкой точностью и по косвенным признакам причину ошибки все же можно определить:
    const url = 'some url';
    try {
          const response = await fetch(url);
          //.....
    } catch {
          if (url.startsWith('http:')) {
            console.log(`It's may be a mixed content error`);
          } else {
            try {
              await fetch(url, {'mode':'no-cors'}); //если ресурс доступен, то ошибки не будет
              console.log(`It's may be a CORS error`);
            } catch {
              console.log('Other error');
            }
          }
    }

    Применяя это решение где-либо, имейте в виду, что этот способ не дает 100% точный ответ, является ли ошибка CORS или нет.
    Ответ написан
    2 комментария
  • Как сделать везде одинаковую верхнюю панель на ubuntu?

    @MikUrrey
    В телеграме есть настройка, кажется, Use native view или как-то так

    UPD: Настройки - Продвинутые настройки - Системная рамка окна
    Ответ написан
    Комментировать
  • Как избавиться от дерганой загрузки в yii2?

    @MikUrrey
    Попытка обратиться к инлайновым стилям - это что за зверь вообще такой?) Если инлайновых стилей нет, то и попыток никаких там нет, либо это какая-то путаница в терминологии.
    Я бы сделал инлайновый стиль, минимально необходимый чтобы вывести поверх загружающейся страницы какой-нибудь анимированный лоадер (который разместил бы первым же тегом после ) и убирающий скролл страницы. А в конце файла CSS добавил бы правила, скрывающие лоадер и возвращающие скроллбар. Этакая "шторка", которая скроет "сарай", и поднимется, когда появится "дворец"
    <head>
    <!--  ...  -->
    <style>
    .loader {
      position: fixed;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      background: url(здесь красивый сплэш);
      opacity: 1;
      will-change: opacity;
      transition: opacity 1s;
    }
    html, body {
      overflow: hidden;
    }
    </style>
    <link type="style/css" rel="style.css" />
    </head>
    <body>
    <div class="loader"></div>
    <!--  ...  -->
    </body>


    style.css:
    /*
    ...
    ...
    ...
    */
    .loader {
      opacity: 0;
    }
    html, body {
      overflow: auto;
    }
    Ответ написан
  • Как вытащить логи PHP наружу из контейнера?

    @MikUrrey Автор вопроса
    Помог следующий совет от единомышленника с другого ресурса:

    Поскольку вся директория, куда подключается том, замещается, нужно выполнить создание файла после монтирования, используя секцию CMD:
    CMD touch /usr/local/php-logs/php-fpm.log && \
      chmod 666 /usr/local/php-logs/php-fpm.log && \
      php-fpm -F

    (php-fpm -F - это команда запуска сервера, которая уже была в CMD).

    Теперь всё работает просто отлично.
    Ответ написан
    Комментировать
  • Ошибка при сборке контейнера во время установки composer?

    @MikUrrey Автор вопроса
    Решение такое: curl: (23) Failed writing body означает, что программа, вызванная "по трубе", не обработала вывод от curl и упала. Если ваш случай 1 в 1, значит, скорее всего, неправильно сконфигурирован РНР. В php.ini включите display_errors = On и смотрите вывод, РНР сообщит, что не так.
    В моем случае не так было вот что:
    Fatal error: Directive 'track_errors' is no longer available in PHP in Unknown on line 0

    Удалил из php.ini track_errors, и контейнер взлетел.
    Ответ написан
    Комментировать
  • Как уладить проблему с Сomposer 1.x.x?

    @MikUrrey Автор вопроса
    Странно, но на следующий день все сработало без ошибок. Подозреваю, что это мог быть github'овский rate limit, но не уверен в этом полностью.
    Возможно, кому-то будет полезен совет: если не нашли решения подобной проблемы, попробуйте сделать то же самое через сутки.
    Ответ написан
    Комментировать
  • Как сказать ajax чтобы он брал input или что угодно с блока на который я кликнул?

    @MikUrrey
    $(this) внутри function() {} - это jQuery экземпляр кнопки, по которой вы кликнули в данный момент.
    find() - может селектором забирать элементы внутри заданного экземпляра jQuery.
    Как-то так, значит:
    $('button').on('click', function() {
            var id = $(this).find('input').val();
    ...
    Ответ написан
    1 комментарий
  • Как выполнить подзапрос в SQL (SELECT с передачей параметра из основного запроса?

    @MikUrrey
    select u.name as username,
    (select count(id) from orders where user_id=u.id) as orders_count
    from users u

    Добавляем псевдоним для таблицы users. Так должно сработать.
    Но вариант не очень, предполагаю, что зная все условия, можно придумать более производительное решение.
    Ответ написан
    3 комментария
  • Как сделать отметить людей?

    @MikUrrey
    1) В браузере: в JS переменную рендерится список участников беседы. Как- зависит от требований. Может, статично вместе с HTML-кодом страницы, может, динамически - AJAXом, а может, в "живом" режиме посредством WebSocket. На обработчик события input в поле textarea вешается задача выводить меню участников на позиции курсора, если нажата "собака" @ (чаще всего именно она используется для обращений). Клик на пункте меню добавляет ник собеседника после "собаки"
    2) На сервере: получаем текст и регуляркой извлекаем подстроки вида "@никнейм", собираем их и извлекаем из базы данных юзеров по никнеймам их реквизиты, на которые и будем слать уведомления (SELECT WHERE IN).

    Более подробные детали реализации проявляются по ходу изучения стека разработки :)
    Ответ написан
    Комментировать
  • Как сделать сетку как на картинке?

    @MikUrrey
    Убрать
    grid-template-rows: repeat(4, 1fr);
    Ответ написан
    Комментировать
  • Access-Control-Allow-Origin, почему браузер его не понимает?

    @MikUrrey Автор вопроса
    Проблему решило добавление правила в default.conf в location
    if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Allow-Headers' '*';
                add_header 'Access-Control-Allow-Methods' '*';
                add_header 'Access-Control-Expose-Headers' '*';
                add_header 'Access-Control-Max-Age' 1728000;
                add_header 'Content-Type' 'text/plain; charset=utf-8';
                add_header 'Content-Length' 0;
                return 204;
            }

    Хотелось бы контролировать отправляемые заголовки скриптом, но так тоже пока сойдёт.
    Ответ написан
    Комментировать