Как заставить работать rating_widget из хука? 2.X

Рейтинг контента формируемого хуком. Не работает голосование

 
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2606
Понадобилось мне выводить датасеты контента отсортированные специальным образом.
С этим отлично справляется хук content_list_filter.php
И, казалось бы, всё хорошо, но рейтинг у выведенных материалов отличается от того, что нужен. В результате разборки с пользователями, мол почему мой материал имеет рейтинг выше, а первый не он. И каждый раз объяснения про то, что за вчерашний и другие дни рейтинг в зачет не идет и т.д.
Впихнуть изменения рейтинга в модель не представляется возможным, поэтому решил использовать хук content_{$ctype['name']}_before_list.
Прямо в хуке формирую модель для датасета, там же получаю массив контента, там же получаю рейтинг. Выводится всё замечательно, но... голосование в виджете рейтинга не работает. После нажатия на голосовалку индикатор загрузки зависает навсегда.
Вставлял console.log в rating.js и понял, что почему-то нет значения url: '/rating/vote'
Аякс просто не знает кому звонить.
Значение это формируется в конце файла \templates\default\controllers\rating\widget.tpl.php
Спойлер
А в начале этого же файла написано:
Код PHP:
  1. <?php $is_first_widget = $this->addJS('templates/default/js/rating.js'); ?>
И почему-то это не срабатывает.
Если отменить проверку $is_first_widget например так:
Спойлер
всё сразу прекрасно работает.

Пробовал уже в разных местах хука писать $is_first_widget == 1 или == true - бесполезно.
Кто поможет в беде?
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 3512
$is_first_widget и всё что с ним связано - это так обозначается тот момент, когда на странице надо вывести код, повторяющийся в цикле, только один раз.
Вероятно в вашем хуке нет подключения яваскрипта
Код PHP:
  1. $this->addJS('templates/default/js/rating.js')
или оно неверно прописано, так как $this в хуке, уже не тот, что был вчера и третьего дня в шаблоне
Реклама
cms
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2606
Loadырь:
Вероятно в вашем хуке нет подключения яваскрипта
Пробовал.
class 'content' does not have a method 'addJS'
InstantCMS Team
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 4338
Ris, по-видимому, вы ячейки с рейтингом переопределяете на свои в вашем хуке и
Код PHP:
  1. <?php $is_first_widget = $this->addJS('templates/default/js/rating.js'); ?>
Уже отработал ранее, т.е. указанный скрипт подключился и все попытки его подключения вновь возвращают false, которое и записывается в $is_first_widget.
Варианты:
1. Текущий HTML виджета реплейсить, меняя что вам нужно.
2. В вашем хуке сделать что-то вроде:

Код PHP:
  1. $this->cms_template->addHead('<script>icms.rating.setOptions({url: "'.href_to('rating', 'vote').'"});</script>');
3. В вашем хуке content_{$ctype['name']}_list_filter сделайте значение $ctype['is_rating'] в 0 или false. Пожалуй этот вариант самый лучший.
Редактировалось: 2 раз (Последний: 4 мая 2017 в 21:05)
Видео каталог для InstantCMS | Аудио каталог для InstantCMS | Мы Вконтакте | Предложение для спонсоров
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2606
Fuze:
2. В вашем хуке сделать что-то вроде:
Не работает.
$this->cms_template->addJS('templates/default/js/rating.js')
не ругается, но тоже не работает.
Пробовал вне кода php писать
Код PHP:
  1. <script>icms.rating.setOptions({url: "'.href_to('rating', 'vote').'"});</script>
ругается в консоли Uncaught ReferenceError: icms is not defined

Fuze:
1. Текущий HTML виджета реплейсить, меняя что вам нужно.
А это как?

Fuze:
3. В вашем хуке content_{$ctype['name']}_list_filter сделайте значение $ctype['is_rating'] в 0 или false. Пожалуй этот вариант самый лучший.
Виджет рейтинга пропал. shock

Fuze:
Уже отработал ранее, т.е. указанный скрипт подключился и все попытки его подключения вновь возвращают false, которое и записывается в $is_first_widget.
А нельзя ли его как-то отключить, чтобы он потом подключился?
Или $is_first_widget = true в шаблон отправить принудительно?
Редактировалось: 2 раз (Последний: 4 мая 2017 в 21:30)
InstantCMS Team
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 4338
Ris:
Не работает.
должно работать по идее
Ris:
не ругается, но тоже не работает.
Так и подключать не за чем, данный скрипт у вас ранее подключен.
Ris:
ругается в консоли Uncaught ReferenceError: icms is not defined
Правильно, тогда уж надо вот так:
Код JAVASCRIPT:
  1. <script>
  2. $(function(){
  3. icms.rating.setOptions({url: "'.href_to('rating', 'vote').'"});
  4. });
  5. </script>
Ris:
Виджет рейтинга пропал.
Тогда я не понял что вы делаете в хуке content_{$ctype['name']}_before_list. Хук вызывается, когда виджеты рейтинга сформированы. И еще попробуйте тогда в хуке content_{$ctype['name']}_before_list обратно включить $ctype['is_rating'] в 1.

Ris:
А это как?
Код PHP:
  1. foreach($items as $id=>$item){
  2. $items[$id]['rating_widget'] = str_replace('что найти', 'чем заменить', $item['rating_widget']);
  3. }
Редактировалось: 1 раз (Последний: 4 мая 2017 в 21:33)
Видео каталог для InstantCMS | Аудио каталог для InstantCMS | Мы Вконтакте | Предложение для спонсоров
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2606
Fuze:
Тогда я не понял что вы делаете в хуке content_{$ctype['name']}_before_list. Хук вызывается, когда виджеты рейтинга сформированы.
Приходится формировать новые виджеты. Прямо в хуке. С нужными значениями рейтинга.
Ведь список заново получается из модели без виджетов рейтинга.
InstantCMS Team
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 4338
Ris:
Приходится формировать новые виджеты. Прямо в хуке. С нужными значениями рейтинга.
Ведь список заново получается из модели без виджетов рейтинга.
Тогда попробуйте в первом хуке, где фильтр, выключать рейтинг ($ctype['is_rating'] = 0;), во втором включать ($ctype['is_rating'] = 1;). Должно получиться.
Редактировалось: 1 раз (Последний: 4 мая 2017 в 21:37)
Видео каталог для InstantCMS | Аудио каталог для InstantCMS | Мы Вконтакте | Предложение для спонсоров
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2606
Fuze:
Тогда попробуйте в первом хуке, где фильтр, выключать рейтинг ($ctype['is_rating'] = 0;), во втором включать ($ctype['is_rating'] = 1;). Должно получиться.
Я первый хук фильтра совсем выключил. Во втрором хуке content_{$ctype['name']}_before_list формируется модель и из нее новый список контента:
Код PHP:
  1. $this->model->filterIn("id", $newcom)->order_by = "FIELD(i.id, $newstr)";
  2. $items = $this->model->getContentItems($ctype['name']);
Потом туда виджеты рейтинга засовываются:
Спойлер
Fuze:
<script>
$(function(){
icms.rating.setOptions({url: "'.href_to('rating', 'vote').'"});
});
</script>
Uncaught ReferenceError: $ is not defined
InstantCMS Team
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 4338
Ris:
Я первый хук фильтра совсем выключил.
Включите
Ris:
Во втрором хуке content_{$ctype['name']}_before_list формируется модель и из нее новый список контента:
Смысла от сортировки тут нет. Сортировать нужно в предыдущем хуке.

1 хук - нужная сортировка, $ctype['is_rating'] = 0
2 хук формирование виджета рейтинга, $ctype['is_rating'] = 1
профит
Видео каталог для InstantCMS | Аудио каталог для InstantCMS | Мы Вконтакте | Предложение для спонсоров
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2606
Fuze,
Включил оба хука. В первом выбираю список контента, во втором подменяю рейтинг.
Если сделать так:
Fuze:
1 хук - нужная сортировка, $ctype['is_rating'] = 0
2 хук формирование виджета рейтинга, $ctype['is_rating'] = 1
получаю Notice: Undefined index: rating_widget in ...
Если убрать отключение-включение рейтинга - голосование работает четко, но у первого контента в спике виджет рейтинга пустой и количество запросов sql возрастает с 28-ми до 42-х... Ведь рейтинг на подмену не от балды берется, а приходится повторить те же операции, что и в первом виджете.
Все же это довольно запутанный и многоступенчатый метод.
Попробую всё же найти способ просто отправить в шаблон виджета $is_first_widget = true;

В общем убился, но так ничего путного и не придумал.
Нарисовал в \templates\default\controllers\rating\widget.tpl.php
Код PHP:
  1. <?php if ($is_first_widget || substr($_SERVER['REQUEST_URI'], 0, 16) == '/мой_датасет' )
Костыль, конечно, но в шаблоне и так пришлось многое допилить.
Fuze, Loadырь, огромное спасибо за помощь!
Теперь понял, как и что.
Но всё равно создатель яваскрипта - явно недобрый человек... smile
Редактировалось: 1 раз (Последний: 5 мая 2017 в 00:30)
В начало страницы
Предыдущая темаСледующая тема Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.