Рендеринг HTML в AppAsset.php

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
indeveler
Сообщения: 7
Зарегистрирован: 2015.02.23, 13:12

Рендеринг HTML в AppAsset.php

Сообщение indeveler »

Здравствуйте!
Вдруг застрял на совершенно простом вопросе.
Создал js файлик для открытия модального окна. Написал статичный метод в AppAsset для подключения этого файлика.
И решил там же организовать вывод самого модального виджета.

Код: Выделить всё

    public static function registerModal()
    {
        Yii::$app->view->registerJsFile('/js/modal.js', ['depends' => ['\yii\web\JqueryAsset']]);

        Modal::begin([
            'headerOptions' => ['id' => 'modalHeader'],
            'id' => 'modal',
            'size' => 'modal-lg',
            //keeps from closing modal with esc key or by clicking out of the modal.
            // user must click cancel or X to close
            'clientOptions' => [
                'backdrop' => 'static',
                'keyboard' => FALSE
            ]
        ]);
        echo '<div id="modalContent"></div>';
        Modal::end();
    }
Честно говоря от реализации немного коробит. Писать свой виджет не вижу необходимости, но в статичном методе рендерить html тоже кажется интуитивно некорректно, хоть это и AssetBundle.

$вопросы[] = 'Насколько позволительно использовать такой статичный метод, чтобы вызывать его на некоторых вьюхах?';
$вопросы[] = 'Как в Yii2 это делается более грамотно?';

return $вопросы;
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Рендеринг HTML в AppAsset.php

Сообщение Dominus »

Сделайте свой виджет в котором рендерите модальное окно, регестрируете свои assets.
И подключайте его где угодно.

MyModalAssets.php

Код: Выделить всё

<?php

namespace common\assets;

use yii\web\AssetBundle;

/**
 * Class MyModalAssets
 * @package common\assets
 */
class MyModalAssets extends AssetBundle
{
    public $sourcePath = '@common/assets/src';

    public $css = [];
    public $js = [];

    public function init()
    {
        parent::init();
        $this->js[] = 'js/modal.js';
    }

    public $depends = [
        'yii\web\JqueryAsset',
    ];
}
MyModal.php

Код: Выделить всё

<?php

namespace common\widgets;

use Yii;
use yii\bootstrap\Modal;
use common\assets\MyModalAssets;

/**
 * Class MyModal
 * @package common\widgets
 */
class MyModal extends \yii\bootstrap\Widget
{
     /**
     * Options
     * yii\bootstrap\Modal
     * @var array
     */
     public $options = [];
     
    /**
     * @var string
     */
    public $content;


    public function init()
    {
        parent::init();
        $this->registerAssets();
    }

    public function run()
    {
        Modal::begin($this->options);
        echo $this->content;
        Modal::end();
    }

    public function registerAssets()
    {
        $view = $this->getView();
        MyModalAssets::register($view);
    }
}
Выводим где нужно

Код: Выделить всё

<?= \common\widgets\MyModal::widget([
  'content' => '<div id="modalContent"></div>',
  'options' =>[
    // yii\bootstrap\Modal Options
  ]
]); ?>
Последний раз редактировалось Dominus 2017.08.27, 23:03, всего редактировалось 2 раза.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
indeveler
Сообщения: 7
Зарегистрирован: 2015.02.23, 13:12

Re: Рендеринг HTML в AppAsset.php

Сообщение indeveler »

Спасибо, что написали виджет за меня)
Да, пожалуй это наиболее правильный подход.
Благодарю!
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Рендеринг HTML в AppAsset.php

Сообщение Dominus »

Да не за что)))
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Ответить