• Как установить yii2 на vps?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Забыли установить пакет для зависимостей bower
    Нужно в консоли вписать
    composer global require "fxp/composer-asset-plugin:^1.3.1"
    Ответ написан
    8 комментариев
  • Как работает media css?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Наоборот, @media (max-width: 767px) значит: "применять только для ширины браузера максимально 767 пикселей включительно".
    Если нужно правило "только для браузеров, у которых ширина больше 768 пикселей и ровно" применяйте:
    @media (min-width: 768px)
    Ответ написан
    1 комментарий
  • Можно ли получить или поставить cookie для домена, на котором лежит js файл?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Нет, это практически невозможно. Я как-то задавал вопрос, только "наоборот". Нет, куки идут только в тот домен, на котором исполняется код (а не откуда он загружается).
    Иначе вы могли бы подключить любой файл google.com и менять там куки?
    Ответ написан
  • Как сделать более конкретный поиск Fulltext?

    Akdmeh
    @Akdmeh Автор вопроса
    PHP, Yii2, Music
    По моему опыту - используйте Sphinx и не тратьте время на инструменты, которые слабо реализованы.
    Ответ написан
    Комментировать
  • UrlManager в Yii2 нужна помощь!?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Да, вы отлично почувствовали суть ошибки:
    Нужно вот так сделать:
    'price/<id:\d+>-<slug:[a-z0-9_-]+>' => 'price/view'

    Должно заработать, проверьте.
    А для понимания этих d+ - обратитесь к гуглу: PREG-шаблоны PHP. Что-то типа:
    www.skillz.ru/dev/php/article-Regulyarnye_vyrazhen...
    Но лучше поискать даже учебники PHP
    Ответ написан
  • Как загружать Global fixtures в Codeception + Yii2?

    Akdmeh
    @Akdmeh Автор вопроса
    PHP, Yii2, Music
    Итого, пишу тем, кто столкнется с той же проблемой. Нужно просто сложить в одном месте все нужные фикстуры.
    И если они нужны постоянно - просто запустить их консолью один раз:
    yii fixture/load "*" (пусть это и требует кое-какую настройку)
    Yii2 и codeception достаточно хитрые - перед каждым тестом они делают начало транзакции, а после каждого теста - откат (главное используйте InnoDB во всех таблицах).
    Поэтому фикстуры оказываются глобально доступны для всех методов и в неизменном виде для каждого теста.
    Удобно, но случилось так, что этот момент как-то оказался мне достаточно нечетко описанным, а на сайте - еще и с устаревшей документацией. Ну что поделаешь, особенности Open Source. Иногда приходится это изучать и копаться самому.

    Да и в принципе, все нужные данные в документации были, просто именно момент с транзакциями и неизменностью кода я как-то упустил или не понял.
    Ответ написан
    Комментировать
  • Правильно ли это с точки зрения SEO?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Если контент один и тот же - лучше делать редирект, тогда гугл не будет вас штрафовать за дубликаты страниц
    Ответ написан
    Комментировать
  • Можно ли включить general_log для определнного запроса?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Думаю, да.
    Сначала в конфиге MySQL установите:
    general_log_file = /var/log/mysql/general.log

    А затем перед нужным запросом попытайтесь включить: SET GLOBAL general_log = 'ON';, а после - SET GLOBAL general_log = 'OFF';
    Скорее всего, в это время будут цепляться и другие, ненужные запросы, но так хотя бы размеров логов будет не таким большим
    Ответ написан
    3 комментария
  • Стиль кода или где предел его сокращения?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Вы полностью правы. Это - сумашествие.
    Это нечитаемо, умышленно запутанно. Писать код нужно в первую очередь для других людей, которые будут код сопровождать. А компьютеру одним пробелом больше/меньше - без разницы.
    Для того, чтобы в конец не сойти с ума - предлагаю вам изучить автоформатирование код в некоторых IDE. Сделал клик - и файл отформатировался под нужные вам стандарты.
    Очень помогает от таких лабиринтов.
    Хотя конкретно эти коды не спасет особо, тут вопрос чисто в запутанной логике коде.
    Ответ написан
    Комментировать
  • Роутинг MVC на php?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Используйте готовые решения, посмотрите Slim, или разберитесь с Symfony. Сэкономьте свое время, не городите лишние велосипеды.
    А вообще - просто делайте проверку на существование метода:
    php.net/manual/ru/function.method-exists.php
    То есть, если метода в искомом классе не существует - перебрасывайте на специальный метод.
    Ну и такую же проверку делайте для самого класса.

    То есть, добавить как минимум

    if (class_exists($controllerName)) {
        $controllerObject = new $controllerName;
        if (method_exists($controllerObject, $actionName)) {
             $result = call_user_func_array(array($controllerObject, $actionName), $parameters);
        } else {
           //load 404 method
        }
    } else {
    //load 404
    }
    Ответ написан
    1 комментарий
  • Как повлияет данная компрессия?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Ну, начать бы стоит с того, что убрать лишние плагины. 30 файлов - слишком много.
    Если сжать в один файл - будет позитивное изменение. 1 запрос размером 1000 кб работает быстрее, чем 10 по 100 кб, так как есть задержки на соединения, кое-какие ограничения браузеров, да и передача лишней информации из-за http-заголовков.
    Еще лучше будет, если вы сделаете картинку предзагрузки - покажете какую-то иконку загрузки, а сами CSS-стили будете качать в фоновом режиме.
    Ответ написан
    3 комментария
  • Как перенести БД на другой сайт, написанный на yii2?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Я переносил сложнейшие проекты. Да, приходится иногда писать конвертаторы, да, иногда это может быть сложно.
    Но на самом деле конвертаторы займут несколько часов, а вот грамотно перенести, чтобы пользователи не жаловались на то, что пропала какая-то нужная функция - намного сложнее...
    Ответ написан
    Комментировать
  • Как решить ошибку при миграциях?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Вам не хватает оперативной памяти, это факт.
    Нужно еще только выяснить, что случилось.
    Возможно, вы не выключили dev-мод? Возможно, серверу действительно не хватает оперативки для вашей задачи?
    Тут либо делать не одну миграцию, а несколько миграций по-мельче и запускать их по очереди.
    Ну и самый простой вариант - менять хостера, хотя не факт, что это его вина - может у вас где-то идет прожорливый цикл, который зациклился.
    Ответ написан
  • Telegram Bot - как получить сообщение от юзера?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Да вы шутите! Как раз позавчера игрался над этой задачей.

    <?php
    namespace app\telegram_logger;
    
    use yii\base\Component;
    use yii\base\InvalidConfigException;
    use yii\httpclient\Client;
    /**
     * Telegram Bot
     *
     * @author Ali Irani <ali@irani.im>
     */
    class TelegramBot extends Component
    {
        const API_BASE_URL = 'https://api.telegram.org/bot';
        /**
         * Bot api token secret key
         * @var string
         */
        public $token;
    
        private $_client;
        /**
         * Check required property
         */
        public function init()
        {
            parent::init();
            if ($this->token === null) {
                throw new InvalidConfigException(self::className() . '::$token property must be set');
            }
        }
        /**
         * @return Client
         */
        public function getClient()
        {
            if ($this->_client) {
                return $this->_client;
            }
            return new Client(['baseUrl' => self::API_BASE_URL . $this->token]);
        }
        /**
         * Send message to the telegram chat or channel
         * @param int|string $chat_id
         * @param string $text
         * @param string $parse_mode
         * @param bool $disable_web_page_preview
         * @param bool $disable_notification
         * @param int $reply_to_message_id
         * @param null $reply_markup
         * @link https://core.telegram.org/bots/api#sendmessage
         * return array
         */
        public function sendMessage($chat_id, $text, $parse_mode = null, $disable_web_page_preview = null, $disable_notification = null, $reply_to_message_id = null, $reply_markup = null)
        {
            $response = $this->getClient()
                ->post('sendMessage', compact('chat_id', 'text', 'parse_mode', 'disable_web_page_preview', 'disable_notification', 'reply_to_message_id', 'reply_markup'))
                ->send();
            return $response->data;
        }
    
        public function getUpdates($offset, $timeout = 30)
        {
            $response = $this->getClient()
                ->post('getUpdates', ['offset'=>$offset, 'timeout'=>$timeout])
                ->send();
            return $response->data;
        }
    }

    Потом запускаю консольное приложение:
    <?php
    
    namespace app\console;
    
    use Yii;
    
    use app\telegram_logger\TelegramBot;
    
    set_time_limit(0);
    ini_set('memory_limit', '512M');
    
    class TelegramController extends \yii\console\Controller
    {
        const UPDATE_INFO_FILE = '@runtime/last_telegram_update_id.txt';
    
        public function actionIndex()
        {
            echo "Start waiting for messages\n";
    
            $bot = new TelegramBot(['token' => Yii::$app->params['telegram']['botToken']]);
    
            if (file_exists(Yii::getAlias(self::UPDATE_INFO_FILE))) {
                $last_update_id = Yii::getAlias(self::UPDATE_INFO_FILE);
            } else {
                $last_update_id = 1;
            }
    
            while (true) {
                echo "Requesting updates\n";
                $data = $bot->getUpdates($last_update_id, 5);
                if (empty($data)) {
                    echo "Empty response\n";
                } else {
                    if ($data['ok'] == 1) {
                        if (is_array($data['result'])) {
                            foreach ($data['result'] as $update) {
                                if (!empty($update['message']['text']) && $update['message']['text'] == '/getid') {
                                    $bot->sendMessage($update['message']['chat']['id'], 'Ваш ID: '.$update['message']['chat']['id']);
                                }
                                $last_update_id = $update['update_id'] + 1;
                            }
    
                            file_put_contents(Yii::getAlias(self::UPDATE_INFO_FILE), $last_update_id);
                        } else {
                            echo "Result is not array\n";
                        }
                    } else {
                        echo 'Error '.$data['error_code'].': '.$data['description']."\n";
                    }
                }
            }
    
            echo "Finished\n";
        }
    }


    Сразу говорю, код плохой, я его делал на коленке, так как нужно было довольно срочно и, что называется "на вчера", но от него можно оттолкнуться. А вообще почитайте документацию Telegram Bot API, хотя она и запутанная.

    P.S. В композер пропиши yii2-httpclient; также надеюсь вы знаете, как подключать консольное приложение.
    Ответ написан
    Комментировать
  • Хороший ли тон переопределять правую кнопку мышки?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    По своему опыту - иногда так и хочется кликнуть правой кнопкой, но это очень неочевидное решение интерфейса, поэтому лучше рассчитывать на однокнопочное управление - так будет понятнее. Особенно большие проблемы возникнут у владельцев телефонов, где просто нет правой кнопки (разве что долгий тап), ну и в маководов свои особенности по этому поводу.
    Ответ написан
  • Как добавить в блок просмотренные товары?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Я бы лучше записывал в cookie уникальный идентификатор пользователя, сгенерированный случайно.
    И затем уже записывал в БД по этому идентификатору все данные, которые просмотрел пользователь.
    По сути, вы сможете логгировать его действия, также если пользователь решит зарегистрироваться, подставите сразу этому пользователю все просмотренные товары.
    Почему так, а не иначе?
    1) вы сами сможете видеть статистику просматриваемого
    2) cookies имеет ограничение на объем, поэтому все может не поместиться
    3) в принципе, можно использовать localStorage, но тут уже вам нужно двигаться в сторону JS
    Ответ написан
    Комментировать
  • Массивы -константы миф в php?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Извините, сам ошибся, исправил ответ.
    Да, это работает с версии 7.0, у вас просто опечатка в коде.
    Ответ написан
    Комментировать
  • Псевдо-персистентное соединение в PHP, возможно ли?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Теоретически вам могло бы помочь reactphp.org
    На практике тяжело сказать, что это будет решением вашей проблемы на 100%.
    Я бы скорее смотрел в сторону либо другого языка программирования (Node.JS, Go, Python, Java...) либо экстенсивным методом (добавлять дополнительные сервера и балансировать нагрузку)
    Ответ написан
    1 комментарий
  • Как сделать регистронезависимый поиск в yii2?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    like binary как раз и указывает на то, чтобы искать регистрозависимо.
    А вообще, поиск там как раз не зависит от регистра, если стоит кодировка utf8_general_ci (ci - как раз значит case insensitive)
    Ответ написан
    1 комментарий
  • Как сделать dropdown-input вместо текстового в yii\grid\SerialColumn Yii2?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    ['attribute'=>'status',
                'label'=>'Статус',
                'value'=>function($model) {
                    return $model->status; //тут доработайте вывод
                },
                                                                           //searchModel - может иметь другое, ваше название
                'filter' => Html::activeDropDownList($searchModel, 'status', [
                                  ''=>'Все',
                                  'new'=>'Новый',
                                  'delivered'=>'Доставленный',
                                  'cancelled'=>'Отказанные']),
                ],
    Ответ написан
    Комментировать