Ответы пользователя по тегу Yii
  • Как задать правило для urlManager?

    Если файлы сохраняются не в web, то не стоит без крайней необходимости давать к ним прямой доступ. Сделайте специальный контроллер с методом который будет отдавать эти файлы
    Условно:
    class DataController {
      public function actionGetSitemap($lang) {
        return file_get_contents(Yii::getAlias('@app/storage') . '/'.$lang);
      }
    }


    Тогда правило можно записать как-то так:
    '/<lang:\w+>_sitemap.xml' => 'data/get-sitemap',
    Ответ написан
    Комментировать
  • Когда я отрываю yii проект на сервере, то в documentRoot что прописывать?

    DocumentRoot указывает на корневой каталог сайта. Всё что выше - не доступно к прямому запросу извне.
    Ответ написан
  • Как определить завершилась ли выполнение консольной команды?

    Самый простой способ - использование файлов-блокировок. При запуске комманда создаёт некий пустой файл с определённым именем, а при окончании работы удаляет его. Соответсвенно, при старте она проверяет существует ли уже такой файл и если существует, то это с высокой степенью вероятности означает, что ещё работает предыдущий запуск. Вместо файла модно использовать базу данных.
    Способ посложнее - запускать задачи через специальный менеджер задач, который будет следить за их очередностью, контроллировать не завис ли процес и пр.
    Ответ написан
    1 комментарий
  • Как в detailview (yii2) сделаю функцию в значении?

    Тоже столкнулся с этой проблемой. Сделал свой виджет немного подправив DetailView по аналогии с тем, как оно сделано в GridView.
    Создаём свой класс app\components\widgets\DetailWidget и чуть-чуть меняем метод renderAttribute:
    <?php
    namespace app\components\widgets;
    
    use Yii;
    use yii\base\Arrayable;
    use yii\base\InvalidConfigException;
    use yii\base\Model;
    use yii\base\Widget;
    use yii\helpers\ArrayHelper;
    use yii\helpers\Html;
    use yii\helpers\Inflector;
    use yii\i18n\Formatter;
    
    class DetailView extends \yii\widgets\DetailView
    {
        /**
         * @inheritdoc
         */
        protected function renderAttribute($attribute, $index)
        {
            if (is_string($this->template)) {
                $captionOptions = Html::renderTagAttributes(ArrayHelper::getValue($attribute, 'captionOptions', []));
                $contentOptions = Html::renderTagAttributes(ArrayHelper::getValue($attribute, 'contentOptions', []));
                if ($attribute['value'] instanceof Closure) {
                    $value = call_user_func($attribute['value'], $model);
                } else {
                    $value = $this->formatter->format($attribute['value'], $attribute['format']);
                }
                return strtr($this->template, [
                    '{label}' => $attribute['label'],
                    '{value}' => $value,
                    '{captionOptions}' => $captionOptions,
                    '{contentOptions}' => $contentOptions,
                ]);
            }
            return call_user_func($this->template, $attribute, $index, $this);
        }
    }


    Теперь, используя наш новый виджет app\components\widgets\DetailView вместо yii\widgets\DetailView, можно в качестве value ставить свою функцию, например у меня это выглядит так:
    <?= DetailView::widget([
            'model' => $model,
            'attributes' => [
                'id',
                'title',
                'author',
                'year',
                'description',
                'format',
                [
                    'attribute' => 'categories',
                    'format' => 'html',
                    'value' => function ($model) {
                        /** @var app\models\library\Book $model */
                        $items = $model->getCategories()->all();
                        $result = '';
                        foreach ($items as $item) {
                            $result .= "<p>$item->name</p>";
                        }
                        return $result;
                    }
                ]
            ],
        ]) ?>
    Ответ написан
    Комментировать