Ответы пользователя по тегу Yii
  • Можно ли настроить пагинацию в gridview?

    @vksee
    <?= GridView::widget([
        'pager' => [
            'firstPageLabel' => 'Начало',
            'lastPageLabel' => 'Конец',
        ],
    ]) ?>

    yii\grid\GridView->pager
    yii\widgets\LinkPager
    Ответ написан
    Комментировать
  • Как определить завершилась ли выполнение консольной команды?

    @vksee
    Существует готовое решение. Использовать можно файловые блокировки, базы данных и т.п.
    https://www.yiiframework.com/doc/api/2.0/yii-mutex...
    Ответ написан
    Комментировать
  • Почему DetailView не хочет работать с кастомными столбцами?

    @vksee
    yii\grid\CheckboxColumn предназначен для GridView.
    Привязывается к строкам в таблице, а не к определенному атрибуту.
    Checkbox column отображает колонку как флаг (сheckbox)...
    Пользователи могут нажимать на флаги для выделения строк в таблице.


    Попробуйте такое:
    echo DetailView::widget([
        'model' => $model,
        'attributes' => [
            [
                'attribute' => 'is_completed',
                'format' => 'raw',
                'value' => Html::checkbox('is_completed', $model->is_completed, ['disabled'=>true])
            ]
        ]
    ]);
    Ответ написан
    Комментировать
  • Как сделать настройку миниатюры как вконтакте?

    @vksee
    К примеру:
    https://github.com/vova07/yii2-fileapi-widget
    https://github.com/bupy7/yii2-widget-cropbox

    Изображение можно уменьшить: изменением размеров (resize), обрезкой (crop), их варианты, и комбинации этих вариантов, плюс иногда бывает необходимость дополнять полями (вместо обрезки).
    Ответ написан
  • Почему ActiveRecord не выводит данные из связанной таблицы если имя поля = имени таблицы?

    @vksee
    Добавляйте в имена полей/атрибутов с айдишниками связанных таблиц постфикс _id, и не будет проблем.

    структура:
    Medical
    id integer primary auto increment
    title string
    town_id integer

    class Medical extends \yii\db\ActiveRecord
    {
      ...
        // связь - у одного медцентра может стоять только 1 город в поле town
        public function getTown()
        {
            return $this->hasOne(Town::className(), ['id' => 'town_id']);
        }
      ...
    }

    И тогда:
    $medical->town_id - айдишник,
    $medical->town - связанный объект типа Town

    Ошибка Trying to get property 'name' of non-object ->with() как решить?
    Ответ написан
    Комментировать
  • Почему в Yii2 не могу воспроизвести динамический запрос?

    @vksee
    Прежде всего стоит для начала обратить внимание на то, что везде фигурирует имя атрибута userID, а в getUsers() почему-то user_id:
    public function getUsers() {
    return $this->hasMany(Users::className(), ['id' => 'user_id'])
    }
    Ответ написан
    Комментировать
  • Ошибка Trying to get property 'name' of non-object ->with() как решить?

    @vksee
    Преамбула:
    Класс Event наследник ActiveRecord.
    При обращении к свойству, если в вашем классе в рамках PHP не объявлено доступное свойство type - то вызывается магический метод __get('type') (у родительского класса) для определения существования в рамках Yii атрибута или геттера getType() для получения значения этого атрибута: yii\db\BaseActiveRecord::__get()
    - Вначале проверяется наличие атрибута с таким именем, если имеется - возвращается значение атрибута.
    - Затем проверяется наличие уже полученных значений по связанным данным. Это, как правило, другой объект наследник ActiveRecord, в вашем случае описано для class Type.
    - Если пока ни чего не найдено, проверяется наличие геттера и его вызов, к примеру getType().
    - Если геттер вернул не объект запроса данных, то возвращается это значение из геттера.
    Методы определения связей (hasOne, hasMany и т.п.) - возвращают объект типа ActiveQueryInterface (как правило это ActiveQuery).
    - Если результат геттера возвращает объект типа ActiveQueryInterface, то этот запрос выполняется, и затем возвращается уже результат запроса.
    Таким образом мы получаем результат запроса и получаем связанную запись или записи типа ActiveRecord.
    Если требуется получить результат запроса связанных данных (объект типа ActiveRecord), то вызывается $ev->type, но если сам запрос для дальнейшей манипуляции - то $ev->getType().

    Ответ:
    В вашем случае ошибка в том, что до описанной в getType() связи дело не доходит. Потому что есть атрибут type.
    Ваш код $ev->type - возвращает "айдишник". А вы к нему обращаетесь затем как к объекту ...->name.

    1. Требуется по разному назвать связь и атрибут для хранения связи.
    Удобнее сделать так - атрибут назвать type_id (в базе и в правилах):
    public function getType() {
        return $this->hasOne(Type::className(), ['id' => 'type_id']);
    }

    И тогда:
    - $ev->type_id - айдишник связанных данных.
    - $ev->type - благодаря магии __get() и описанию связи через getType() - вернётся связанный объект типа class Type (наследник ActiveRecord).
    - $ev->getType() - запрос ActiveQuery для получения связанных данных.

    2. Или переименуйте getType() на что-нибудь типа getEventType(), и тогда сработает $ev->eventType->name.
    Ответ написан
    1 комментарий
  • Как настроить маршрутизацию в зависимости от параметров в UrlManager?

    @vksee
    *** Вариант 1 *** - создать специальное правило для URL.
    <?php
    namespace app\components;
    use yii\web\UrlRuleInterface;
    use yii\base\Object;
    
    class JoomlaUrlRule extends Object implements UrlRuleInterface
    {
        public function createUrl($manager, $route, $params)
        {
            return false;
        }
    
        public function parseRequest($manager, $request)
        {
            $it_joomla_url = $request->getPathInfo()==='' 
                         && $request->getQueryParam('option')==='com_content';
            if (!it_joomla_url) {
                return false;            
            }
            $view = $request->getQueryParam('view');
            if (empty($view)) {
                return false;            
            }
            return ["$view/view", $request->queryParams];
        }
    }

    Прописать его в конфиге приложения:
    [
        'components' => [
            'urlManager' => [
                // ...
                'rules' => [
                    ['class' => 'app\components\JoomlaUrlRule'],
                    // ...
                ],
            ],
        ],
    ]

    Yii2: Разбор и генерация URL

    *** Вариант 2 *** - решить задачу настройками веб-сервера.

    Для веб-сервера Apache - добавьте в файл .htaccess строки:
    RewriteCond %{THE_REQUEST} index.php [NC]
    RewriteCond %{QUERY_STRING} option=com_content [NC]
    RewriteCond %{QUERY_STRING} view=category [NC]
    RewriteRule (.*) /category/view/ [L,R=301,QSA]
    
    RewriteCond %{THE_REQUEST} index.php [NC]
    RewriteCond %{QUERY_STRING} option=com_content [NC]
    RewriteCond %{QUERY_STRING} view=article [NC]
    RewriteRule (.*) /article/view/ [L,R=301,QSA]

    Информация о правилах...
    Это два набора правил редиректа, для ссылок вида:
    index.php?option=com_content&view=category...
    index.php?option=com_content&view=article...

    Для изначального URL запроса - порядок параметров значения не имеет.
    К примеру, должны работать варианты:
    index.php?option=com_content&view=article&id=1
    index.php?id=1&view=article&option=com_content

    По ссылке index.php?option=com_content&view=article&id=1
    будет редирект на /article/view?option=com_content&view=article&id=1

    Все параметры запроса затем передаются в контроллер, обрабатывать можно только нужные параметры, к примеру, только id.

    Но для SEO рекомендую более строгие правила:
    RewriteCond %{THE_REQUEST} index.php [NC]
    RewriteCond %{QUERY_STRING} option=com_content [NC]
    RewriteCond %{QUERY_STRING} view=category [NC]
    RewriteCond %{QUERY_STRING} id=(\d+) [NC]
    RewriteRule (.*) /category/view?id=%1 [L,R=301]
    
    RewriteCond %{THE_REQUEST} index.php [NC]
    RewriteCond %{QUERY_STRING} option=com_content [NC]
    RewriteCond %{QUERY_STRING} view=article [NC]
    RewriteCond %{QUERY_STRING} id=(\d+) [NC]
    RewriteRule (.*) /article/view?id=%1 [L,R=301]

    По ссылке index.php?option=com_content&view=article&id=1 будет редирект на /article/view?id=1
    Ответ написан
    Комментировать
  • Как на хостинге запустить cron yii2?

    @vksee
    Судя по скриншоту, в вашем случае этот параметр должен быть:
    /domain/public_html/yii hello/index
    Слева от yii не должно быть пробела, /domain/public_html/yii - это путь к файлу скрипту.
    Убедитесь в наличии каталога /domain/public_html/, в котором есть файл yii.

    В общем случае, запуск этого скрипта из любого места:
    php /domain/public_html/yii hello/index
    Звучит команда примерно так: запустить php, который запустит на исполнение скрипт /domain/public_html/yii с параметрами hello/index.
    Если файл yii отмечен как исполняемый, то можно:
    /domain/public_html/yii hello/index

    И не забывайте, что это не веб приложение, а консольное, со своими нюансами.
    Ответ написан
    Комментировать
  • Yii2 + vue JS. Автоманическая генерация правил проверок формы на стороне клиента. Нашли ли вы для себя лучший способ?

    @vksee
    Используйте данные из $model->getActiveValidators() для генерации правил под вашу систему валидации на Vue.js.
    www.yiiframework.com/doc-2.0/yii-base-model.html#g...
    Ответ написан
    Комментировать