Assets в widget

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

Re: Assets в widget

Сообщение shkarbatov »

Простите, что?

Если Вы о подключении ассетов, то они у меня подключаются во view:

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

<?php
use app\modules\confirm\assets\IvrAsset;
IvrAsset::register($this);
?>

<div>Test</div>
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Assets в widget

Сообщение Loveorigami »

Если это тесты - посмотрите, как другие делают виджеты. Первая ссылка
http://blog.cybdev.org/sozdanie-vidzhetov-v-yii2
смотрите, тестируйте...

Что проще - один раз зарегистрировать ассет в самом виджете или подключать в каждом виде, как делаете вы.
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

Re: Assets в widget

Сообщение shkarbatov »

Loveorigami писал(а):Если это тесты - посмотрите, как другие делают виджеты.
Я имел ввиду, что текст отобразил тестовый, что бы весь view не отображать.
Loveorigami писал(а):Что проще - один раз зарегистрировать ассет в самом виджете или подключать в каждом виде, как делаете вы.
У меня для каждого вида свои скрипты, если бы они были общие, то тогда конечно же в виджете.
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

Re: Assets в widget

Сообщение shkarbatov »

Loveorigami писал(а):Первая ссылка
http://blog.cybdev.org/sozdanie-vidzhetov-v-yii2
смотрите, тестируйте...
Не думаю, что стоит кого-то учить так делать, писать js-код в компоненте виджета:

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

private function getJs() {
        $js = [];
        $js [] = "function initialize() {";
        $js [] = "var mapOptions = {";
        $js [] = "center: new google.maps.LatLng({$this->location['lat']}, {$this->location['lng']}),";
        $js [] = "zoom: 11,";
        $js [] = "};";
        $js [] = "var map = new google.maps.Map(document.getElementById('map-canvas'),";
        $js [] = "mapOptions);";
        $js [] = "var input = /** @type {HTMLInputElement} */(";
        $js [] = "document.getElementById('pac-input'));";
        $js [] = "var types = document.getElementById('type-selector');";
        $js [] = "map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);";
        $js [] = "map.controls[google.maps.ControlPosition.TOP_LEFT].push(types);";
        $js [] = "var autocomplete = new google.maps.places.Autocomplete(input);";
        $js [] = "autocomplete.bindTo('bounds', map);";
        $js [] = "var infowindow = new google.maps.InfoWindow();";
        $js [] = "var marker = new google.maps.Marker({";
        $js [] = "map: map,";
        $js [] = "anchorPoint: new google.maps.Point(0, -29)";
        $js [] = "});"; 
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Assets в widget

Сообщение Loveorigami »

Я ссылку не для обсуждения дал, а первую попавшуюся для того, чтоб вы посмотрели, как регистрируется ассет в виджете.
У меня для каждого вида свои скрипты, если бы они были общие, то тогда конечно же в виджете.
Это вообще не понятно... Вы что-то путаете, или я присоединяюсь к тем, которые не понимают вашей задачи...
Мне думается - должно быть наоборот.
1. Если скрипты общие - зачем вам тогда виджет? Скрипты для вида подключайте в виде (шаблоне).
2. Если скрипты под виджет (т.е. специфические) - регистрируйте их в виджете.
Последний раз редактировалось Loveorigami 2016.05.11, 23:00, всего редактировалось 1 раз.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Assets в widget

Сообщение Loveorigami »

Тогда на моем примере.
1. Есть виджет https://github.com/loveorigami/yii2-slimscroll-widget

2. У него есть ассет.
https://github.com/loveorigami/yii2-sli ... lAsset.php
Очевидно, что он не является общим для всех видов.

3. Подключается только тогда, когда объявляется виджет в виде
https://github.com/loveorigami/yii2-sli ... ll.php#L72
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

Re: Assets в widget

Сообщение shkarbatov »

Loveorigami писал(а):1. Если скрипты общие - зачем вам тогда виджет? Скрипты для вида подключайте в виде (шаблоне).
2. Если скрипты под виджет (т.е. специфические) - регистрируйте их в виджете.
Скрипты виджета, я их и регистрирую в виджете, только не в компоненте виджета а в его view, как обычные view на проекте.
Но судя по примерам ниже, так делать нельзя и их надо регистрировать непосредственно в компоненте виджета.
Loveorigami писал(а):Тогда на моем примере.
1. Есть виджет https://github.com/loveorigami/yii2-slimscroll-widget

2. У него есть ассет.
https://github.com/loveorigami/yii2-sli ... lAsset.php
Очевидно, что он не является общим для всех видов.

3. Подключается только тогда, когда объявляется виджет в виде
https://github.com/loveorigami/yii2-sli ... ll.php#L72
Спасибо, попробую так.
shkarbatov
Сообщения: 423
Зарегистрирован: 2012.12.10, 14:19
Откуда: Россия

Re: Assets в widget

Сообщение shkarbatov »

В общем разобрался.

Основная проблема как раз в отсутствии layout для виджета, то есть, если у меня контроллер не рендерит вид, а например делает обычный return, то никаких ассетов не будет.

Решить эту проблему, можно сделав файл view виджета на проекте и в него запихнуть его вызов:

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

echo \app\modules\confirm\widgets\confirm\ConfirmWidget::widget(['phone' => $phone, 'operation' => $operation]);
В контроллере надо использовать renderAjax(), выше созданного вида:

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

$this->renderAjax('/payment/card/confirm_widget', ['phone' => $phone, 'operation' => 'payment']);
И абсолютно не важно, где Вы будете регистрировать ассеты, во view или в widget.
Закрыто