• Как создать очередь и запустить воркер динамически в yii2-queue?

    @sehav
    Мое решение:
    Отнаследовался от redisCommand
    use yii\queue\redis\Command;
    
    class RedisCommand extends Command
    {
        public function actionRun($channel = null)
        {
            if ($channel !== null) {
                $this->queue->channel = $channel;
            }
    
            return $this->queue->run(false);
        }
    }

    Подключил его в консольном конфиге
    'queue' => [
                'class' => \yii\queue\redis\Queue::class,
                'commandClass' => \app\commands\RedisCommand::class,
                'redis' => 'redis',
                'channel' => 'default', // Queue channel key
                'as log' => \yii\queue\LogBehavior::class,
            ]

    В консоли одноразово
    yii queue/run channel_group_1

    Для listen аналогично переопределите метод actionListen, только канал вторым параметром
    Команда будет выглядеть
    yii queue/run 3 channel_group_1
    Ответ написан
    Комментировать
  • Как правильно хранить контент поста?

    ThunderCat
    @ThunderCat Куратор тега Веб-разработка
    {PHP, MySql, HTML, JS, CSS} developer
    Хранить html код в столбце поста кажется нецелесообразным по ряду причин:
    Угу, ага...

    Лишняя трата памяти на хранение html тегов
    Ого, а лишние это сколько? Экономия на байтах чаще всего приводит к тратам на вычислительные мощности. Некоторые расчеты чуть ниже.
    Уменьшение производительности (?)
    Производительности чего?

    Стили/компоненты могут изменяться, а код останется прежним
    Стили как раз и нужны для того, чтобы легко конфигурировать визуал, не привязываясь к коду. Код может быть каким угодно, но стилизация через теги пока что лучший вариант, который придумали разработчики.

    Использовать собственные минифицированные теги, благодаря которым определенный парсер будет воссоздавать нужные блоки с помощью компонентов (возможно динамичесих)
    Ага, переизобретаем BBCode, найс... Для понимания проблемы - такие коды придуманы для форумов, с целью ограничить использование хтмл в пользовательском вводе. При этом подходе он худо-бедно оправдан, хотя и требует постобработки при каждом выводе, а это использование регулярок, что как бы совсем не бесплатно. В вашем же случае, источник текста более-менее доверенный, и ограничение в тегах больше мешает чем помогает.
    Что касается экономии на "минифицированных" тегах, ну допустим сэкономите вы 100 байт на тегах, то есть на 1000 постов экономия будет.... ТА-ДАААМ! 0,1 мегабайта! А если экономия 1000 байт на пост, то целый МЕГАБАЙТ можно сэкономить! Похвальная рачительность.

    Хранить каждый элемент поста отдельно в бд со следующим содержанием (element_name, position, content, post_id), используя отношения к родительскому посту, соответственно сохранится структура и рендериться пост будет через соответствующие компоненты в нужном порядке (однако как будет именно рендериться в шаблоне поста пока неизвестно)
    Базовые элементы и так должны храниться отдельно, другой вопрос почему они у вас рендерятся в одном порядке, а в другом месте в другом порядке? Заголовок, короткое описание, текст, главное изображение - отдельные поля, оглавление по сути часть текста, зачем его выносить отдельно - загадка, это же такой же текст, котрый автор волен располагать . Вариант с внешней таблицей по сути приводит нас к выносу части данных в EAV(отличный пример универсализации в ущерб производительности), что как раз будет серьезно напрягать выборки бд, если понадобится делать какие-либо поисково-выборочные манипуляции по этим данным.
    Ответ написан
    6 комментариев
  • Как правильно хранить контент поста?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Использовать собственные минифицированные теги, благодаря которым определенный парсер будет воссоздавать нужные блоки с помощью компонентов (возможно динамичесих)

    20 лет назад этот вопрос был полнонстью решен с помощью технологий XML/XSLT/XPath.
    Языки C#/dotNet, Java поддерживают этот стек. И много других языков и библиотек.

    Потом еще создавали более простые вещи. Шаблонизаторы. Velocity, FreeMarker. Они немножко
    переворачивают постановку. Но их тоже можно рассмотреть.

    Хранить html код в столбце поста кажется нецелесообразным.

    С точки зрения суммарной стоимости владения (TCO) база данных всегда будет дороже
    чем файловая система. А самым дешевым будут хранилища типа Amazon S3, MS Blob, G-Drive.
    Ну если пересчитать удельно сколько стоит гигабайт.

    Хранить каждый элемент поста отдельно в бд со следующим содержанием (element_name, position, content, post_id),
    Тут - непонятно. Но есть такое эвристическое правило дизайна
    хороших NoSQL систем. Все данные для запроса должны лежать физически рядышком
    и не требовать дополнительных действий
    . В идеале - для отдачи поста вы должны сделать
    один единсвтвенный SELECT без joins и без подзапросов и агрегаций и без CONNECT-BY.
    Ответ написан
    2 комментария
  • Как вместо числа "5620", показывать "5,6K"?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Вы какой-то не тот интернет "облазили". Задача давно решена, ответ ищется за три секунды: https://www.google.com/search?q=thousands+to+k+php
    Но даже если предположить, что никто до вас такого не делал, то ведь это алгоритм на десять строчек...
    Ответ написан
    Комментировать
  • Yii как работать с датами?

    1. yiiframework.ru/forum/viewtopic.php?t=18206
    Там же и на 2 вопрос ответ, если я правильно понял.
    Ответ написан
    3 комментария
  • Yii2: как принимать только post запросы на action?

    @karminski
    Senior React.JS Developer
    Вообще то в Yii2 есть замечательная вещь как фильтры. Вам нужен VerbFilter. Курить мануалы тут: www.yiiframework.com/doc-2.0/yii-filters-verbfilte...
    Ответ написан
    Комментировать
  • Почему не срабатывает событие .click после pjax загрузки?

    bubandos
    @bubandos
    bash'у, javascript'ую, php'лю, css'аю, html'каю
    Вы перезагружаете содержимое контейнера, соответственно, у вас уже другой экземпляр кнопки создается.
    Поэтому и обработчика события на нем нет.
    Выхода два:
    1) после обновления контента вешать обработчик события заново.
    2) повесить обработчик на один из родителей и анализировать event.target, а заодно почитать про паттерн behavior и всплытие событий... например, тут )
    Ответ написан
    2 комментария
  • YII2 как получить старые значения модели?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Это не подойдёт?
    public function afterSave($insert, $changedAttributes)
    {
            var_dump($changedAttributes['desabilitado']);
            var_dump($this['desabilitado']);
            die;
            [...]
    }

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

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    у array_reverse есть второй параметр отвечающий за сохранение порядка ключей
    <?php
    $go = ['test1','test2','test3'];
    print_r(array_reverse($go, true));

    выведет
    Array ( [2] => test3 [1] => test2 [0] => test1 )

    более правильное решение если массив именно такой как ты указал, т.е. не ассоциативный
    <?php
    $go = ['test1','test2','test3'];
    
    for ($i=count($go)-1; $i>=0; $i--) {
         echo $i.' => '.$go[$i].'<br>';
    }

    выведет
    2 => test3
    1 => test2
    0 => test1
    Ответ написан
    Комментировать
  • Как перемещать страницу на нужную строчку таблицы?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Лучше всего делать это на jQuery, примерно так:

    var $rows = $("#main").find("tr");
    
    function goToRow (num) {
         var $target = $rows.eq(num);
         var y = $target.offset().top;
    
         $(window).scrollTop(y);
    }
    Ответ написан
    1 комментарий
  • Какое техническое решение выбрать под проект?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Но не знаю, какое техническое решение взять? Писать на нативном РНР? Взять готовый фрэймворк?

    Что знаете, на том и пишите.

    Если Вы задаёте вопрос про "фреймворки или нет", значит Вам темболее необходимо использовать фреймворк. Свой велосипед Вы в любом случае напишите хуже.

    Если Вы не разработчик, то наймите ПМ или разраба, он Вам и сообщит, на чем именно он будет писать.
    Ответ написан
    1 комментарий
  • Есть ли волшебный метод, чтобы запретить var_export вытащить приватные поля класса?

    @rPman
    Не хранить переменные в виде мембера класса, а хранить как static внутри метода
    Ответ написан
    2 комментария
  • Для чего нужны буквы с двоеточием?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Ответ написан
    Комментировать
  • Для чего нужны буквы с двоеточием?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Поняли, в целом, правильно. Это сериализованные данные.
    https://www.php.net/manual/ru/function.serialize.php
    https://www.php.net/manual/ru/function.unserialize.php
    Ответ написан
    Комментировать
  • Как получить якорь URL?

    @GrayHorse
    // url === текущее местоположение
    location.hash; // #first
    location.hash.substring(1); // first
    
    // Для переменной url (строки)
    new URL(url).hash.substring(1);
    url.match(/(?<=#).+$/)[0];


    И якорь должен быть в конце ссылки.
    // Неправильно:
    new URL("http://example.com/#first&utm_content=lorem"); 
    // hash: "#first&utm_content=lorem", search: ""
    
    // Правильно:
    new URL("http://example.com/?utm_content=lorem#first"); 
    // hash: "#first", search: "?utm_content=lorem",
    Ответ написан
    Комментировать
  • Чем array_walk лучше foreach?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Если сама функция array_walk может быть не интересной, то ее рекурсивная версия куда вкуснее, тк работает с вложенными массивами
    Ответ написан
    Комментировать
  • Чем array_walk лучше foreach?

    @novrm
    Работая по ссылке с foreach можете налететь на очень неприятны грабли, которые незаметны и сильно попортят вам нервы.
    Особенно когда разработчики неопытные.
    И именно - ссылку после foreach нужно удалять.
    array_walk для работы по ссылке - само-то, лишь тем и лучше.
    В других случаях — будь попроще — используй foreach.

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

    Пример:
    array_walk($guide['postInGuides'], function (&$postInGuide, $key) use ($guide, $viewRenderer) {
        $postInGuide['post']['url'] = [
            'read' => $viewRenderer->url('guide/guide/post', [
                'slugGuide' => $guide['name'],
                'slugPost'  => $postInGuide['post']['slug'],
            ]),
            'update' => $viewRenderer->url('post/post/action', [
                'slugPost'  => $postInGuide['post']['slug'],
                'action' => 'update',
            ]),
            'delete' => $viewRenderer->url('post/post/action', [
                'slugPost'  => $postInGuide['post']['slug'],
                'action' => 'delete',
            ]),
        ];
    });
    Ответ написан
    Комментировать
  • Чем array_walk лучше foreach?

    webinar
    @webinar Куратор тега PHP
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Сделайте тоже самое, только запихните не $item = 'hello!'; а что-то посложнее и разница будет меньше.
    Ну и банально избежать дублирование кода.
    function test_print($item2, $key) 
    {
        echo "$key. $item2<br />\n";
    }
    array_walk($array1, 'test_print');
    array_walk($array2, 'test_print');
    array_walk($array3, 'test_print');
    array_walk($array4, 'test_print');
    array_walk($array5, 'test_print');
    //вот тебе новая выгода:
    $func_name = 'test_print';
    array_walk($array5, $func_name);

    Прикиньте это c foreach

    В целом foreach и if else творят чудеса и позволяют сделать что угодно. А порой это даже быстрее работает. Но выглядит не читабельно, по сути не гибко и т.д.
    Ответ написан
    Комментировать
  • Скрыть блок после выбора некоторого значения в dropDownList YII2?

    qonand
    @qonand
    Software Engineer
    1. Вы вызываете функцию, а значит необходимо указывать скобки т.е. не getSalutationValue а getSalutationValue()
    2. Откуда в функции возьмется this если Вы его не передаете? нужно передавать
    3. Вы вешаете событие onchange на div в котором содержится выпадающий список, а не на сам выпадающий список

    итого нужно как-то так:
    function getSalutationValue(value) {
        if(value == 'n' ) {
            document.getElementById('driver').style.display='none';
        }
    }


    <?= $form->field($model, 'license')->dropDownList([
            'y' => 'Есть', 
            'n' => 'Нет'
        ], [
            'onchange' => 'getSalutationValue(this.value)'
        ]) 
    ?>
    Ответ написан
    1 комментарий