Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Asset для виджета #18

Open
loveorigami opened this issue Jan 17, 2016 · 5 comments
Open

Asset для виджета #18

loveorigami opened this issue Jan 17, 2016 · 5 comments

Comments

@loveorigami
Copy link

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

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

@loveorigami
Copy link
Author

также, прочитал в доках, что для динамических элементов в кеше нужно использовать 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 все равно не подтягивается...

@chiliec
Copy link
Owner

chiliec commented Jan 18, 2016

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

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

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

@chiliec
Copy link
Owner

chiliec commented Jan 18, 2016

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

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

@chiliec
Copy link
Owner

chiliec commented Jan 19, 2016

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

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;']
]); ?>

@loveorigami
Copy link
Author

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.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants