Задать вопрос
Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (4)

Лучшие ответы пользователя

Все ответы (12)
  • Как на хостинге запустить 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

    И не забывайте, что это не веб приложение, а консольное, со своими нюансами.
    Ответ написан
    Комментировать
  • Как настроить маршрутизацию в зависимости от параметров в 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
    Ответ написан
    Комментировать
  • Можно ли настроить пагинацию в gridview?

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

    yii\grid\GridView->pager
    yii\widgets\LinkPager
    Ответ написан
    Комментировать
  • Ошибка 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 комментарий