-
Notifications
You must be signed in to change notification settings - Fork 29
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
Обновить модель после голосования #17
Comments
единственное, что заметил, это Post-ом шлется название модели без слешей, как |
Идея замечательная, но нужно всё хорошенько обдумать перед таким крутым изменением. Наверняка найдутся ещё какие-то подводные камни. |
Вот, немного похожее решение того, о чем я написал выше и в след. issue. |
Ну, тут особо кардинального изменения не произошло )... В принципе - можно сделать отдельную ветку и там все это потестить). |
В принципе и от настройки |
Можно сделать, как один из вариантов... Во многих проектах такая табличка уже есть (у меня , по крайней мере), при привязке комментариев, избранного, и тп... Также, такой подход удобен для выборки в личном кабинете всех проголосованных записей (типа - избранного) |
Правда, если убирать эту настройку, надо придумать как оставить возможность задавать собственные значения для разрешения голосовать гостям и менять свой голос. Или эта фича не нужна и глобальных значений достаточно? |
Я не призывал убирать эту настройку )... 'modules' => [
'vote' => [
'matchingModels' => [ // matching model names with whatever unique integer ID
'common\models\Page' => 3,
'my-local-module\models\Page' => ['id'=>2, 'allow_guests'=>false],
'vendor\chiliec\module\page\models\Page' => ['id'=>4, 'allow_guests'=>true],
],
],
], намного понятнее, чем 'modules' => [
'vote' => [
'matchingModels' => [ // matching model names with whatever unique integer ID
'page1' => 3,
'page2' => ['id'=>2, 'allow_guests'=>false],
'page3' => ['id'=>4, 'allow_guests'=>true],
],
],
], |
Переделал |
посмотрел, толковое решение... 'model' => $model, //*Obligatory parameter. Object for Like/Dislike.
'primaryField' => 'id', //Name of primary key for model а затем, после сохранения голоса, например тут запустить метод записи в модель, аналогичный типа $model::afterFind(); И поскольку обновится запись, кеш у меня автоматически сбросится... |
Я вот всё думаю как бы поменьше действий делать для подключения. Подключение поведения уже происходит динамически, теперь хочется ещё вынести рейтинг во внешнюю таблицу. Хотелось бы формировать его на лету (ведь по сути это всё вычисляемые избыточные данные), но похоже не получится, ведь необходимо оставить возможность делать выборку с учетом рейтинга. Надо ещё подумать, возможно найдется какой-то вариант. |
За кеширование у меня отвечает тоже поведение. Примерно, как тут |
Выборку с учетом рейтинга делать надо ). У меня сортировка ListView содержит параметр "по рейтингу". А еще понадобится выборка в личном кабинете всех записей, за которые отдан голос или добавленных в избранное. Насчет подключения - тоже не очевидно. Можно оставить как вариант через bootstrap. Так получается, что поведение будет цепляться к каждой модели и перебирать массив моделей из конфига... А на самом деле в проекте у меня поведение нужно в 4-5 моделях из более чем 40. Тем более, что есть уже четкие сформировавшиеся методики подключения поведений. К примеру, давно хотел предложить (или сделать у себя) добавить возможность добавлять в избранное. Это тоже своего рода "голосование". Просто удобно одним виджетом вывести эти три кнопки. У себя еще на CodeIgniter я делал такой модуль |
Возможность выборки с учетом рейтинга - обязательное условие, без которого и нет смысла выносить рейтинг во внешнюю таблицу. Главное теперь понять как это сделать Естественно можно подключать и по-старинке вместо bootstrap, но так удобнее - меньше действий и можно быть уверенным, что у всех перечисленных моделей есть это поведение. И пусть оно во всех 40 моделях будет, раз уж они поддерживают голосование, оверхэд минимален. Насчет избранного надо подумать, возможно отдельный issue создать, пока в концепции данного модуля применения не особо вижу, всё же это несколько иная функциональность. |
открыл issue #19 под избранное. Там я описал функциональность - все аналогично и проще - по крайней мере я у себя так делал. |
Ну тогда мне кажется можно добавить вот это: $modelName = static::getModelNameById($modelId);
$model = $modelName::findOne($targetId);
$model->trigger($modelName::EVENT_AFTER_UPDATE); после этой строчки https://github.com/Chiliec/yii2-vote/blob/develop/models/Rating.php#L189 |
пока не делаю, т.к. отключил кеширование при разработке и тестировании этого модуля. Если получится нам переделать через asset - тогда буду пробовать |
Очень не хочется отказываться от переопределения методов, выполняющихся после голосования. Но, возможно, это можно сделать не из PHP, формируя js-код, а перегружая их прямо в Javascript в другом месте. Это бы решило проблему #18. |
Я на днях тут делал PR в ajax-modal Так вот, там скрипт написан в виде плагина, с возможностью call-back- ов, который можно написать прямо на странице в виде
Реализуются они при помощи триггеров |
Вывожу списком статьи через ListView.
Список кешируется. Кеш обновляется, если обновилась модель.
Голосование же идет по другому сценарию.
После факта голосования запись вставляется в таблицу rating.
Затем, после следующей выборки, обновляются поля в самой модели. Это если без кеша.
С кешем у меня эти поля не обновляются, т.к. не произошло обновления самой модели.
Получается, замкнутый круг: кеш не сбросился, т.к. не обновилась модель. Рейтинг не пересчитался, т.к. модель закеширована
Почему бы не объявлять массив моделей, т.к. они есть.
в виджете
поведение
и тогда после вставки голоса в ratiing, имея готовый класс модели, запустить код, который находится в поведении RatingBehavior.
В таком случае, инвалидируется кеш, и список статей будет отображаться верно.
The text was updated successfully, but these errors were encountered: