yii2-vote
yii2-vote copied to clipboard
Asset для виджета
Вылезла еще одна проблемка при использовании кеша. При первом выводе списка виджет отрабатывает верно. Затем список кешируется и вне этого списка остается js-функция vote. Следовательно, при клике на кнопки голосования, функция эта не находится и появляются ошибки.
Правильно, наверно, ее будет вынести в отдельный ассет и подключать (регистрировать принудительно) там, где выводится закешированный список.
также, прочитал в доках, что для динамических элементов в кеше нужно использовать 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' => ' ', // separator between like and dislike button
]);
");?>
но до обновления страницы. После обновления js-функция vote все равно не подтягивается...
Но как сделать ассет, если js собирается динамически из произвольных кусков?
После обновления js-функция vote все равно не подтягивается...
Кэш думает, что у него есть внутри всё что нужно и не доходит до выполнения виджета, где регистрируется динамически созданный javascript. Так что нужно либо не кэшировать виджет, либо как-то сохранять сформированный js в файл и потом подгружать уже его. Но как?..
Вот, немного похожее решение того, о чем я написал выше и в след. issue. https://github.com/AkiraShirase/yii2-vote
Вижу, ага, наверное там правильнее сделано. Надо только разобраться как там это всё происходит =)
Посмотрел внимательнее и думаю, что его реализация так же не будет работать с кэшированием. Дефолтная реализация может и будет, если дополнительно где-то за пределами кэширования вызвать:
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;']
]); ?>
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.
где и сказано про ассеты.... по идее, должно автоматически регистрировать ассет