yii2-vote icon indicating copy to clipboard operation
yii2-vote copied to clipboard

Asset для виджета

Open loveorigami opened this issue 9 years ago • 5 comments

Вылезла еще одна проблемка при использовании кеша. При первом выводе списка виджет отрабатывает верно. Затем список кешируется и вне этого списка остается js-функция vote. Следовательно, при клике на кнопки голосования, функция эта не находится и появляются ошибки.

Правильно, наверно, ее будет вынести в отдельный ассет и подключать (регистрировать принудительно) там, где выводится закешированный список.

loveorigami avatar Jan 17 '16 16:01 loveorigami

также, прочитал в доках, что для динамических элементов в кеше нужно использовать DynamiсRender Обернул виджет в него - все работает,

                <?= $this->renderDynamic("return \\chiliec\\vote\\Display::widget([
                        'model_name' => 'pages', // name of current model
                        'target_id' => $model->id, // id of current element
                        // optional fields
                        'view_aggregate_rating' => true, // set true to show aggregate_rating
                        'mainDivOptions' => ['class' => 'text-center'], // div options
                        'classLike' => 'glyphicon glyphicon-thumbs-up', // class for like button
                        'classDislike' => 'glyphicon glyphicon-thumbs-down', // class for dislike button
                        'separator' => '&nbsp;', // separator between like and dislike button
                    ]);
                ");?>

но до обновления страницы. После обновления js-функция vote все равно не подтягивается...

loveorigami avatar Jan 18 '16 11:01 loveorigami

Но как сделать ассет, если js собирается динамически из произвольных кусков?

После обновления js-функция vote все равно не подтягивается...

Кэш думает, что у него есть внутри всё что нужно и не доходит до выполнения виджета, где регистрируется динамически созданный javascript. Так что нужно либо не кэшировать виджет, либо как-то сохранять сформированный js в файл и потом подгружать уже его. Но как?..

chiliec avatar Jan 18 '16 14:01 chiliec

Вот, немного похожее решение того, о чем я написал выше и в след. issue. https://github.com/AkiraShirase/yii2-vote

Вижу, ага, наверное там правильнее сделано. Надо только разобраться как там это всё происходит =)

chiliec avatar Jan 18 '16 14:01 chiliec

Посмотрел внимательнее и думаю, что его реализация так же не будет работать с кэшированием. Дефолтная реализация может и будет, если дополнительно где-то за пределами кэширования вызвать:

VoteAsset::register($this->view);

но чтобы задать свои обработчики на javascript-события нужно опять вызывать метод clientWidget, а для этого нужно опять произвести полную инициализацию всего виджета. Если я прав, тогда переделывание не имеет смысла и проблема решается либо вынесением инициализации виджета за пределы кэширования, либо, например, таким костылём:

<!-- Это нужно только для подключения js-файла голосования -->
<?php echo \chiliec\vote\Display::widget([
    'model_name' => 'does not matter',
    'target_id' => 0,
    'mainDivOptions' => ['style' => 'display: none;']
]); ?>

chiliec avatar Jan 19 '16 06:01 chiliec

VoteAsset::register($this->view);

Это я и имел ввиду в самом первом сообщении, как один из вариантов решения...

Тем не менее, хотелось бы понять в таком случая, для каких целей используется DynamicRender https://github.com/yiisoft/yii2/blob/master/docs/guide/caching-fragment.md#dynamic-content-

По описанию, как раз таки для данного случая...

Another problem is that the content being cached may contain PHP code that must be executed for every request (e.g. the code for registering an asset bundle). Both problems can be solved by the so-called dynamic content feature.

где и сказано про ассеты.... по идее, должно автоматически регистрировать ассет

loveorigami avatar Jan 19 '16 12:01 loveorigami