Страница 1 из 1

widgets + javascript

Добавлено: 2016.02.24, 08:55
kwasti
не смог найти как правильно добавить 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() то скрипт на странице появляется столько раз, сколько виджетов добавляю на страницу.

Re: widgets + javascript

Добавлено: 2016.02.24, 09:15
vitalik1183
через ассет не судьба?

Re: widgets + javascript

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

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

Re: widgets + javascript

Добавлено: 2016.02.24, 09:36
andrei.obuhovski

Re: widgets + javascript

Добавлено: 2016.02.24, 09:59
vitalik1183
что же Вы такие буки.
дык загуглить же несложно "yii2 assets" после такого
да и ниже уже линк бросили, не сердитесь)

Re: widgets + javascript

Добавлено: 2016.02.24, 10:54
kwasti
из всего что я там прочитал, я понял только как 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 нет, да и смысла как бы большого нет, т.к. ф-ция специфична только для данного виджета и добавлять еще куда-то я точно не буду

Re: widgets + javascript

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

Re: widgets + javascript

Добавлено: 2016.02.24, 11:05
vitalik1183
Кстати, в качестве примера можно взять это.

Re: widgets + javascript

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

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

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

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

Re: widgets + javascript

Добавлено: 2016.02.24, 11:21
vitalik1183
Что за привычка пихать жс код в пагу???

Re: widgets + javascript

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

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

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

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

Re: widgets + javascript

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

Re: widgets + javascript

Добавлено: 2016.02.24, 11:40
vitalik1183
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) Профит

Re: widgets + javascript

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

Re: widgets + javascript

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

Re: widgets + javascript

Добавлено: 2019.10.29, 15:21
Vi_ru_S
Прочитал тему. Такой вот вопрос если я тоже например не хочу что бы JS подключался на каждой странице... Но у меня ситуация такая что виджет может вызываться несколько раз в одном view файле так это получиться что JS несколько раз подлючится как быть в такой ситуации? :D

Re: widgets + javascript

Добавлено: 2019.10.29, 18:50
yiiliveext
Через assets не подключится несколько раз. AssetManager разруливает такие штуки.