Ответы пользователя по тегу Yii
  • Почему yii2 не работает с php версией 5.4 хотя в требованиях стоит от 5.4?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Если библиотека работает с PHP 7, то нужно либо переходить на PHP 7, либо отказываться от библиотеки.
    Последняя версия PHP 5.4 была выпущена более трех лет назад. Сейчас даже 5.6 уже официально не поддерживается!
    Вы действительно уверены, что стоит до сих пор использовать настолько застаревшее ПО?
    Ответ написан
    Комментировать
  • Как установить yii2 на vps?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Забыли установить пакет для зависимостей bower
    Нужно в консоли вписать
    composer global require "fxp/composer-asset-plugin:^1.3.1"
    Ответ написан
    8 комментариев
  • 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. Иногда приходится это изучать и копаться самому.

    Да и в принципе, все нужные данные в документации были, просто именно момент с транзакциями и неизменностью кода я как-то упустил или не понял.
    Ответ написан
    Комментировать
  • Как перенести БД на другой сайт, написанный на 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; также надеюсь вы знаете, как подключать консольное приложение.
    Ответ написан
    Комментировать
  • Как сделать регистронезависимый поиск в 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'=>'Отказанные']),
                ],
    Ответ написан
    Комментировать
  • Будет ли работать валидация в yii2 без ActiveForm?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    ActiveForm это те же формы, но со стероидами. Все плюсы этого виджета сводятся к автоматической проверке большинства стандартных валидаторов Yii на стороне клиента + возможность AJAX-валидации + автоматизированная подсветка ошибок формы с предыдущих запросов.
    Вы можете не использовать ActiveForm, а использовать либо чистый HTML, либо хелпер \yii\helpers\HTML, и уже самому навешивать те обработчики, которые вам нужны, а для Yii2 оставить только серверную валидацию.
    Вообще в обсуждениях Yii2 все идет к тому, что они будут постепенно выносить все эти FrontEnd-виджеты в отдельные пакеты, а Yii2 именно сосредоточится на "серверном" коде. Так что если вам не нужно использовать ActiveForm - вы вольны использовать свои frontend-технологии.

    Ряд поправок сходу. Изучите генерацию name в input Yii2 - сэкономит немало времени. Суть в том, что они используют по умолчанию "пространства имен" для мультиотправки нескольких форм да порядка в коде. Например, name input-тега для заголовка новости может иметь название News[header], где первая часть - обычно название класса, если поведение не переопределено в классе методом formName, а в скобках - название поля.
    Это упрощает валидацию нескольких разных моделей.
    Немного сложнее устроен "табличный ввод", но это уже направляю вас к документации.
    Ответ написан
    Комментировать
  • Как в GridView Yii2 добавить строку Total?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    1) итог придется считать самому с помощью доп. функций. Я делаю это с помощью хелпера:
    <?php
    
    namespace app\helpers;
    
    class ArraySum
    {
        public static function getSum($array)
        {
            $sumArray=[];
            foreach ($array as $k=>$subArray) {
                foreach ($subArray as $id=>$value) {
                    $value = floatval($value);
                    if(isset($sumArray[$id])) {
                        $sumArray[$id]+=$value;
                    } else {
                        $sumArray[$id]=$value;
                    }
                }
            }
            return $sumArray;
        }
    }

    Код помогал хорошо мне, но возможно вам можно будет адаптировать (например, указывать, какие поля плюсовать или нет).
    Дальше я делал так. Допустим, у меня есть многомерный массив типа 0=>['id'=>2, 'date'=>'2017-05-12', 'operator_count'=>55, 'operator_count2'=>4, ...], 1=>['id'=>3, 'date'=>'2017-05-13', 'operator_count'=>57, ...]

    Этот массив пропускаем через мой класс.
    Если используете ActiveDataProvider, нужно сделать в контроллере
    $dataProvider->prepare();
    а затем
    $total_statistic = \app\helpers\ArraySum::getSum($dataProvider->getModels());

    Передаем $total_statistic в view, и там делаем следующие модификации:
    1) добавляем 'showFooter'=>true
    2) переделываем все "колонки" по аналогии с первым operator_count (остальные уже допишите сами).
    <?= GridView::widget([
            'dataProvider' => $dataProvider,
            'filterModel' => $searchModel,
            'showFooter'=>true,
            'columns' => [
                ['class' => 'yii\grid\SerialColumn'],
    
                'id',
                'date',
                'operator_count'=>[
    'attribute'=>'operator_count',
    'footer' => $total_statistic['operator_count']
    ],
                'operator_count2',
                'operator_count4',
                 'operator_count4',
    
            ],
        ]); ?>


    Остаются мелочи - нужно украсить это с помощью CSS, доделать, проверить...
    Но это уже, надеюсь, сами справитесь.

    Буду очень благодарен, если мне подскажут более оптимальный вариант, но я вроде бы не встречал подобного встроенного функционала в Yii2
    Ответ написан
    6 комментариев
  • Как включить логгирование консолиных команд в Yii2?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Насколько я помню, это, к сожалению, невозможно в консольном режиме.
    Ответ написан
  • Как удалить CRUD?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Потому что в CRUD стоит удаление только методом POST (посмотрите пример генератора, там видно, в каком формате должна быть ссылка, чтобы удалить запрос). Это сделано от CSRF-атак.
    Что делать?
    1) Или переходить только по той ссылке, которая делает AJAX-запрос на удаление (смотрите стандартный код после генератора)
    2) Удалите behavior VerbFilter, но это - очень нежелательно, так как снижает безопасность приложения
    Ответ написан
    3 комментария
  • Почему не работает своя валидация в yii2?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Сергей: да, ниже вам правильно ответили. На фронтэнде это работать и не должно было, извините, я просто не заметил. Для фронтэнда нужно писать свои правила, посмотрите
    www.yiiframework.com/doc-2.0/yii-validators-valida...
    Ответ написан
    2 комментария
  • Вопрос по yii и общая теория?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    1) Намного быстрее. И вы делаете сайты вместо того, чтобы копаться в архитектуре и пытаться постоянно усовершенствовать свой код, который к сайтам имеет посредственное отношение
    2) самому прописать в конфигах, почитайте об этом в главе о настройке/установке Yii
    3) Можно, но это довольно условно. Начните с basic-шаблона, для начала его хватит, а когда поймете базовые концепции и овладеете фреймоврком - сможете разобраться с advanced. Впрочем, можно пойти третьим путем и самому себе создать базовый шаблон, который вам подходит во всем.
    4) обычно на чистом PHP пишут шаблоны (это позволяет удобно подключать штатные виджеты и методы), но есть библиотеки для интеграции Smarty и Twig при необходимости
    Ответ написан
    3 комментария
  • Необходима помощь с AccessControl в Yii2!?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    'rules' => [
                        [
                            'actions' => ['index'],
                            'allow' => true,
                            'roles' => ['@'],
                        ],
                    ],

    Внутри rule нужно еще один массив
    Ответ написан
    2 комментария
  • Как улучшить производительность yii v.1 проекта?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Мне своего времени очень помогло включение show mysql slow query. Сначала ставите "запросы дольше 3 секунд", затем "2 секунды" и т.д. вплоть до полсекунды.
    Заметите, где не стоят нужные индексы и т.д.
    Затем, даже если индексы не помогут - ставим memcache и кешируем остальное, чтобы тяжелые запросы использовались как можно меньше.
    Если все равно тормоза - memcache на части страниц и виджеты.
    Затем посмотреть, работает ли Yii1 под PHP 7 (не помню этот момент) и если возможно - перевести скрипт на nGinx+PHP-FPM.
    Потом, если есть возможность - смотрим на базу данных и делаем partition по дате, если с этим есть проблемы.
    Ответ написан
    Комментировать
  • Запускать определенную функцию при сборке приложения yii2?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Вам уже все ответил Максим Тимофеев, правда, непонятно, зачем вы городите свой велосипед, если в Yii2 подобная система "Запомнить" уже есть встроенная в систему?
    Ответ написан
    1 комментарий
  • Как "кошерно" слепить правильный URL в Yii2?

    Akdmeh
    @Akdmeh
    PHP, Yii2, Music
    Этот метод может помочь, но не намного, в генерации названия.
    www.yiiframework.com/doc-2.0/yii-helpers-basehtml....
    Ответ написан
    1 комментарий