Шаблоны в Yii2 - как пользоваться?

387
02 июля 2017, 15:53

Сразу прошу прощения, если глупый вопрос, но я так и не понял, есть ли такое в yii2, и если есть - то как им пользоваться. Что я имею ввиду: есть такой код:

foreach ($reviews as $rev){
    ?>
                    <li>
                        <div class="col-lg-7 col-md-7 col-sm-7 col-md-offset-3 col-lg-offset-3 col-sm-offset-3">
                            <div class="pm-testimonial-container">
                                <div class="pm-testimonial-quote-box">
                                    <i class="fa fa-quote-left"></i>
                                </div>
                                <div class="pm-testimonial-text-box">
                                    <p>тут текст</p>
                                    <p class="pm-testimonial-name">Автор</p>
                                    <p class="pm-testimonial-title">Город</p>
                                </div>
                            </div>
                        </div>
                    </li>
                    <?
                }

Вот я хочу вынести этот html код в шаблон, вместо динамического текста прописать что то типа [city], [author] и [text]. И в цикле вызывать наподобие

echo $this->template('items', ['city'=>'City', 'author'=>'Kola', 'text'=>'Text']);

Буду благодарен за любую помощь

Answer 1

Фиг его знает, как с шаблонами. Никогда не ставил их. Также, наверно: добавить в composer.json, обновить через composer update через консоль, подключить в конфигурации config/web.php шаблонизатор по гайду шаблонизатора, и в папке views/ создавать файлы. Только с расширением другим. Наверно, типа .tpl или че там. Поставить подсветку синтаксиса этого шаблонизатора в свой блокнот. И фигачить [city], [author] и [text].

Могу привести примеры, как фигачить без шаблонизатора и без стиля битрикса с вкраплениями php-тегов (<?php ?>, <?= ?>) внутрь html. Тут хелпер yii\helpers\Html типа юзается. Вообще, обычно все решают виджеты

GridView DetailView

Но я только с техническими сайтами работал, где такие виджеты только и нужны.

Монструозно

Файл views/site/index.php

<?php
use yii\helpers\Html;
foreach ($reviews as $review) {
    echo Html::beginTag('li');
        echo Html::beginTag('div', ['class' => 'col-lg-7 col-md-7 col-sm-7 col-md-offset-3 col-lg-offset-3 col-sm-offset-3']);
            echo Html::beginTag('div', ['class' => 'pm-testimonial-container']);
                echo Html::beginTag('div', ['class' => 'pm-testimonial-quote-box']);
                    echo Html::tag('i', '', ['class' => 'fa fa-quote-left']);
                echo Html::endTag('div');
                echo Html::beginTag('div', ['class' => 'pm-testimonial-text-box']);
                    echo Html::tag('p', $review->text);
                    echo Html::tag('p', $review->author, ['class' => 'pm-testimonial-name']);
                    echo Html::tag('p', $review->city, ['class' => 'pm-testimonial-title']);
                echo Html::endTag('div');
            echo Html::endTag('div');
        echo Html::endTag('div');
    echo Html::endTag('li');
}
?>

Файл controllers/SiteController.php

<?php
namespace app\controllers;
use yii\web\Controller;
use app\models\Reviews;
class SiteController extends Controller
{
    public function actionIndex($id)
    {
        $reviews = Reviews::find()
            ->alias('t')
            ->where(['t.testimonial_id' => $id])
            ->all();
        return $this->render('index', ['reviews' => $reviews]);
    }
}
?>

Со вторым шаблоном

Файл views/site/index.php

<?php
foreach ($reviews as $review) {
    echo $this->render('_testimonial', ['review' => $review]);
}
?>

Файл views/site/_testimonial.php

<?php
use yii\helpers\Html;
echo Html::beginTag('li');
    echo Html::beginTag('div', ['class' => 'col-lg-7 col-md-7 col-sm-7 col-md-offset-3 col-lg-offset-3 col-sm-offset-3']);
        echo Html::beginTag('div', ['class' => 'pm-testimonial-container']);
            echo Html::beginTag('div', ['class' => 'pm-testimonial-quote-box']);
                echo Html::tag('i', '', ['class' => 'fa fa-quote-left']);
            echo Html::endTag('div');
            echo Html::beginTag('div', ['class' => 'pm-testimonial-text-box']);
                echo Html::tag('p', $review->text);
                echo Html::tag('p', $review->author, ['class' => 'pm-testimonial-name']);
                echo Html::tag('p', $review->city, ['class' => 'pm-testimonial-title']);
            echo Html::endTag('div');
        echo Html::endTag('div');
    echo Html::endTag('div');
echo Html::endTag('li');
?>

Файл controllers/SiteController.php

<?php
namespace app\controllers;
use yii\web\Controller;
use app\models\Reviews;
class SiteController extends Controller
{
    public function actionIndex($id)
    {
        $reviews = Reviews::find()
            ->alias('t')
            ->where(['t.testimonial_id' => $id])
            ->all();
        return $this->render('index', ['reviews' => $reviews]);
    }
}
?>

С виджетом

Файл views/site/index.php

<?= app\components\widgets\Testimonial(['reviews' => $reviews]) ?>

Файл components/widgets/Testimonial.php

<?php
namespace app\components\widgets;
use yii\helpers\Html;
class Testimonial extends yii\base\Widget
{
    public $reviews;
    public function init()
    {
        if (!isset($this->reviews)) {
            throw new \yii\base\Exception("Property \$reviews must be set.");
        }
    }
    public function run()
    {
        foreach($this->reviews as $review) {
            echo Html::beginTag('li');
                echo Html::beginTag('div', ['class' => 'col-lg-7 col-md-7 col-sm-7 col-md-offset-3 col-lg-offset-3 col-sm-offset-3']);
                    echo Html::beginTag('div', ['class' => 'pm-testimonial-container']);
                        echo Html::beginTag('div', ['class' => 'pm-testimonial-quote-box']);
                            echo Html::tag('i', '', ['class' => 'fa fa-quote-left']);
                        echo Html::endTag('div');
                        echo Html::beginTag('div', ['class' => 'pm-testimonial-text-box']);
                            echo Html::tag('p', $review->text);
                            echo Html::tag('p', $review->author, ['class' => 'pm-testimonial-name']);
                            echo Html::tag('p', $review->city, ['class' => 'pm-testimonial-title']);
                        echo Html::endTag('div');
                    echo Html::endTag('div');
                echo Html::endTag('div');
            echo Html::endTag('li');
        }
    }
}

Файл controllers/SiteController.php

<?php
namespace app\controllers;
use yii\web\Controller;
use app\models\Reviews;
class SiteController extends Controller
{
    public function actionIndex($id)
    {
        $reviews = Reviews::find()
            ->alias('t')
            ->where(['t.testimonial_id' => $id])
            ->all();
        return $this->render('index', ['reviews' => $reviews]);
    }
}
?>
READ ALSO
Проблема кодировки. PHP, MYSQLI

Проблема кодировки. PHP, MYSQLI

Всем привет! У меня произошла проблема с выводом русских символов из базы данных (MyISAM) с помощью PHPСравнение таблицы - utf8_general_ci

220
Как за хешировать Cookies без повторения хеша

Как за хешировать Cookies без повторения хеша

Хеширую куки, но получается одинаковый хэш, хотя все строки разные

145
Как вернуться на главную страницу сайта после открытия &ldquo;send.php&rdquo;?

Как вернуться на главную страницу сайта после открытия “send.php”?

Есть у меня файл на php который отправляет данные, введённые в формах на сайте в текстовый файл

194