widgets + javascript

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
kwasti
Сообщения: 251
Зарегистрирован: 2016.01.28, 16:14

widgets + javascript

Сообщение kwasti » 2016.02.24, 08:55

не смог найти как правильно добавить JavaScript в widgets
создал в котором есть повторяющийся JavaScript код, решил его обернуть в функцию
регистрирую так:

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

class KwMenu extends \yii\bootstrap\Widget
{
 public function init()
    {
        parent::init();

        $script = '    function click_menu(m) {      }    ';
        $view = $this->getView();
        $view->registerJs($script, POS_READY);
    }
    public function run()
    {
    }
 
но на странице я этот скрипт не нахожу.
что не так?
если через echo в init() то скрипт на странице появляется столько раз, сколько виджетов добавляю на страницу.

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: widgets + javascript

Сообщение vitalik1183 » 2016.02.24, 09:15

через ассет не судьба?
Yii2!

kwasti
Сообщения: 251
Зарегистрирован: 2016.01.28, 16:14

Re: widgets + javascript

Сообщение kwasti » 2016.02.24, 09:33

что же Вы такие буки.
поддеть можете, а пояснить сложно? какие именно asset'ы их там много всяких...
Вместо ответа приходится флуд разводить...

я только изучаю yii2 много не понимаю, но во многом разобрался.


Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: widgets + javascript

Сообщение vitalik1183 » 2016.02.24, 09:59

что же Вы такие буки.
дык загуглить же несложно "yii2 assets" после такого
да и ниже уже линк бросили, не сердитесь)
Yii2!

kwasti
Сообщения: 251
Зарегистрирован: 2016.01.28, 16:14

Re: widgets + javascript

Сообщение kwasti » 2016.02.24, 10:54

из всего что я там прочитал, я понял только как js подключать в приложение. Но это я и раньше знал как, только в этом случае скрипт будет подключаться к каждой странице а мне этого не нужно.
расширение мне тоже не подходит, т.к.: 1. я еще не разобрался толком как их создавать. 2. для их развертывания нужен GitHub или аналог. я же создал обычный класс наследник widget
и хотелось бы на вьюшках не заморачиваться(не запоминать какой скрипт и где подрубить) а достаточно было добавить нужный widget и все, а он уже сам подключал/не подключал скрипты.
сейчас я использую echo для добавления скрипта, но если виджет использовать несколько раз то и скрипт появляется несколько раз.
а хотелось бы только один раз.

смотрел как подключаются у расширений в папке vendor
но там тоже не особо пролило мне свет.
в одном например нашел такой код в методе run():

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

$view = $this->getView();
        DepDropAsset::register($view)->addLanguage($this->language, 'depdrop_locale_');
...
            $view->registerJs("initDepdropS2('{$id}','{$loading}');");
но я делал так же, разве что у меня не было класса "*Asset", но у меня и файлов js нет, да и смысла как бы большого нет, т.к. ф-ция специфична только для данного виджета и добавлять еще куда-то я точно не буду

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: widgets + javascript

Сообщение vitalik1183 » 2016.02.24, 10:59

kwasti писал(а):Но это я и раньше знал как, только в этом случае скрипт будет подключаться к каждой странице а мне этого не нужно.
неправда, как скажите так и подключит. можно хоть для 1 новости.
я же создал обычный класс наследник widget
все верно, где затык?
и хотелось бы на вьюшках не заморачиваться(не запоминать какой скрипт и где подрубить) а достаточно было добавить нужный widget и все, а он уже сам подключал/не подключал скрипты.
ну дак во вью виджета подключите ассет, и фреймворк подключит остальное за вас при вызове виджета!
сейчас я использую echo для добавления скрипта, но если виджет использовать несколько раз то и скрипт появляется несколько раз.
а хотелось бы только один раз.
не надо никакого echo забудьте про это в рамках yii2
Yii2!

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: widgets + javascript

Сообщение vitalik1183 » 2016.02.24, 11:05

Кстати, в качестве примера можно взять это.
Yii2!

kwasti
Сообщения: 251
Зарегистрирован: 2016.01.28, 16:14

Re: widgets + javascript

Сообщение kwasti » 2016.02.24, 11:17

поковырялся еще и почти получилось.
убрал второй параметр в registerJs() и скрипт появился, правда в странном виде.

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

<script type="text/javascript">jQuery(document).ready(function () {

        function click_menu(m,id) {
...
           }
        
});</script>
что за "jQuery(document).ready(function ()" как это исправить/убрать?
из-за этого моя ф-ция не видна

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: widgets + javascript

Сообщение vitalik1183 » 2016.02.24, 11:21

Что за привычка пихать жс код в пагу???
Yii2!

kwasti
Сообщения: 251
Зарегистрирован: 2016.01.28, 16:14

Re: widgets + javascript

Сообщение kwasti » 2016.02.24, 11:25

ээ куда пихать?? )) я не php-шник, я только учусь и не весь сленг мне еще знаком )
я с++ 10-ки лет..., надеялся не придется заниматься php... да вот не получилось.. на старости лет изучать все-таки пришлось..

кстати, пока привычек нет, так что если что-то делаю не так, то буду рад замечаниям )
vitalik1183 писал(а):
kwasti писал(а):Но это я и раньше знал как, только в этом случае скрипт будет подключаться к каждой странице а мне этого не нужно.
неправда, как скажите так и подключит. можно хоть для 1 новости.

а вот так я еще наверно не умею...
я пока умею просто перечислять все css, js в AppAsset
по крайней мере стиль для менюшки, перечисленный тут, у меня сейчас грузится на всех страницах. (тоже надо будет это убрать)

как работает класс: KwastiMenuAsset extends AssetBundle {} я как раз сейчас пытаюсь разобраться.

Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: widgets + javascript

Сообщение Nerf » 2016.02.24, 11:37

$view->registerJs($script, POS_READY);
POS_READY - это константа класса yii\web\View, а не глобальная. Замените на $view::POS_READY.
ПС: Перенесите код в run(), в init() не логично.
Последний раз редактировалось Nerf 2016.02.24, 11:40, всего редактировалось 1 раз.

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: widgets + javascript

Сообщение vitalik1183 » 2016.02.24, 11:40

kwasti писал(а):ээ куда пихать?? )) я не php-шник, я только учусь и не весь сленг мне еще знаком )
Лучше разместить код в файле.

1) Создайте папку widgets
2) Создайте класс и отнаследуйте его от Widget
3) Создайте в этой же папке AppAsset например с таким содержимым(пути и прочее ессно исправьте):

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

namespace frontend\widgets\Similar\views\lists;


use yii\web\AssetBundle;

class AppAsset extends AssetBundle
{
    public $sourcePath = '@frontend/widgets/Similar/views/lists/assets';
    public $baseUrl = '@web';
    public $css = ['css/style.css'];
    public $js = [/* ВАШИ JS-СКРИПТЫ ДЛЯ ДАННОГО ВИДЖЕТА */];
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
    ];
}
4) В представлении вставьте:

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

use frontend\widgets\Similar\views\lists\AppAsset;

AppAsset::register($this);
5) Профит
Yii2!

kwasti
Сообщения: 251
Зарегистрирован: 2016.01.28, 16:14

Re: widgets + javascript

Сообщение kwasti » 2016.02.24, 11:45

Спасибо, все получилось!
а почему в init() не логично?
он как раз используется для инициализации виджета
а run для отображения..

Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: widgets + javascript

Сообщение Nerf » 2016.02.24, 12:07

init() вызывается после инициализации, run() при выполнении.
Например, при создании виджета $widget = new SomeWidget([...]), если разместить код в init(), то js выведется, хотя виджет нигде еще не выводился. Посмотрите сторонние виджеты, где и что делается. В init() стоит проверять, например, входящие данные.

Аватара пользователя
Vi_ru_S
Сообщения: 60
Зарегистрирован: 2018.08.14, 07:39
Откуда: Владивосток
Контактная информация:

Re: widgets + javascript

Сообщение Vi_ru_S » 2019.10.29, 15:21

Прочитал тему. Такой вот вопрос если я тоже например не хочу что бы JS подключался на каждой странице... Но у меня ситуация такая что виджет может вызываться несколько раз в одном view файле так это получиться что JS несколько раз подлючится как быть в такой ситуации? :D
В действительности все иначе чем на самом деле. Антуан де Сент Экзюпери

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

Re: widgets + javascript

Сообщение yiiliveext » 2019.10.29, 18:50

Через assets не подключится несколько раз. AssetManager разруливает такие штуки.

Ответить