palkan_karabov
@palkan_karabov
PressF1

Как в yii2 проверить существует ли представление?

$model = Page::find()->where(['url' => $page])->one();
        return $this->render('$model->url', [
            'model' => $model,
        ]);

Как проверить существует ли представление, и если его нет, то открыть по-умолчанию "view"?
  • Вопрос задан
  • 1872 просмотра
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
1. кавычки вокруг $model->url надо убрать иначе никогда не сработает
2. :
if( file_exists(Yii::getAlias('@frontend').'/views/mydir'.$model->url.'.php')){
$view = $this->render($model->url, [
            'model' => $model,
        ]);
}else{
$view = $this->render('default', [
            'model' => $model,
        ]);
}
return $view;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@melnikov_m
Тут надо проверять на существование модель, а не представление.
Ответ написан
Isolution666
@Isolution666
Full-Stack Developer
Напишите функцию.
...
use yii\base\ViewNotFoundException;
...
$get = Yii::$app->request->get();
$path = Yii::getAlias('@web').'/views/mydir/'.$get['url'];
...
try {
    // 1) тут пишите то что хотите проверить
    $this->render($path, ['model' => $model,]);
} catch (ViewNotFoundException $e) {
    // 2) тут выводите "удобную" ошибку, чтобы не закрывать ошибкой 500 или той которая вылезает
    $this->render('default', [ 'model' => $model,]);
}
...


Можно обратится и к Yii::getAlias('@frontend') - а вдруг проект лежит не в папке frontend ???
Так что никаких return $view; Либо вы получите представление, либо default
ViewNotFoundException это отслеживает, я давно в Yii отказался от file_exists потому что он не эффективен и не работает, да, если файл будет, ошибки не вылезут, а если файла не будет, вы столкнётесь с ViewNotFoundException

Так почему бы сразу не отловить ошибку и просто вывести её в виде текста на странице?
Гораздо лучше чем ошибка на всю страницу.

Ну ведь Easy? Правда? :)))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы