Истинно православный хук. Какой он?
Теперь хочу выяснить, как это должно выглядеть с точки зрения создателей CMS.
Допустим, возникла потребность в создании хитрого датасета, который никак средствами стандартной модели не сделать. Или потребовалось в определенном типе контента выводить комментарии в другом порядке и в другом шаблоне.
Как в таком случае активировать вышеупомянутый хук?
Просто в системный файл вписывать условие, что если if(something){$this->runExternalHook(filehook, $parametrs -> $tarametrs) ?
Файл с хуком располагается в месте filehook и в нем содержится класс (или не содержится?) и функция, которую активирует данный хук.
Как все это правильно должно выглядеть?
Нужно в первую очередь прочитать инстант-православную документацию.Теперь хочу выяснить, как это должно выглядеть с точки зрения создателей CMS.
1. Проверить, нет ли уже в движке хука на нужную вам правку функционала.Допустим, возникла потребность в создании хитрого датасета, который никак средствами стандартной модели не сделать.
2. Если сами не нашли, то поначалу лучше спросить на форуме, описав то, что вы хотите сделать. Например на список датасетов хук есть. Повлиять на выборку записей типа контента — тоже хук есть.
Если в движке нужного вам хука не заложено, то необходимо:
1. Проанализировать, куда наиболее функционально вставить вызов хука, что ему передать и как его назвать максимально универсально, не прицепляясь к вашей идее.
2. Добавить вызов хука в код последовательной или параллельной схемой вызова (см. документацию)
3. Написать нам с предложением внести хук в движок или же прислать пулреквест на гитхабе.
Если по документации что-то непонятно — спрашивайте уточняющие вопросы.
Нет, этого нет и быть не может. Это кроме меня вряд ли кому пригодится.1. Проверить, нет ли уже в движке хука на нужную вам правку функционала.
Для обеспечения спецолимпиады на сайте потребовалось создать в таблице рейтинга новую колонку votedate (время голосования).
После этого создал датасеты "лучшие за день" и "лучшие за вчерашний день". И важно, что именно не дата публикации, а сумма рейтинга проголосовавших за отведенное время имеет значение…
Собственно все работает, но пришлось добавить новую функцию в модель контента:
public function getBest($ctype_name, $dataset) { { } else { } $sql = "SELECT target_id, SUM(score) as points FROM cms_rating_log WHERE target_subject = 'anec' AND votedate BETWEEN '$dfrom' AND NOW() GROUP BY target_id ORDER BY points DESC LIMIT 0, 15"; } else { { } else { } $sql="Select target_id, sum(score) as points From cms_rating_log Where votedate Between '$dfrom' And '$dto' Group by target_id Order by points DESC LIMIT 15"; } $arr = $this->db->query($sql); global $points; $id = $joke['target_id']; $points = $joke['points']; $table_name = $this->table_prefix . $ctype_name; $this->select('u.nickname', 'user_nickname'); $this->useCache("content.item.{$ctype_name}"); $item = $this->getItemByField($table_name, 'id', $id, function($item, $model){ global $points; 'id' => $item['user_id'], 'nickname' => $item['user_nickname'] ); $item['rating'] = $points; return $item; }, 'id'); $items[] = $item; } return $items; } }
if ($dataset == 'bestyesterday' || $dataset == 'besttoday'){ $items = $this->model->getBest($ctype['name'], $dataset); $total = 15;} else { $total = $this->model->getContentItemsCount($ctype['name']); $items = $this->model->getContentItems($ctype['name']); }
в начале файла можете прописать ваше условие:
<?php class onВашкомпонентContentListFilter extends cmsAction { public function run($data){ if ($dataset == 'bestyesterday' || $dataset == 'besttoday'){ // $dataset можно получить из реквеста $model->orderBy('the_best_of_the_best'); // или что-то типа того }
Fuze имел ввиду что добавить строчку типа этой cmsEventsManager::hook('content_list_filter', array($ctype, $this->model)); в нужном месте, а не всю вашу писанину из под первого спойлера.Нет, этого нет и быть не может. Это кроме меня вряд ли кому пригодится.
Создайте файл этого хука, пропишите его в манифесте и делайте с моделью что хотите.
Но зачем мне тогда городить огород с хуками, если с моделью делать что хочу?
Я и так просто написал условие во фронтенде и допфункцию в модели. У меня и так всё работает.
Как раз спрашивал, как сделать тоже самое, но не внося изменений в системные файлы (в модель).
Вы не поняли. В хуке и выполняйте свои действия. Хук реализуется от контроллера. Т.е. чтобы сделать хук, нужен контроллер, его обрабатывающий. А к контроллеру модель своя (если нужна).если с моделью делать что хочу?
Соответственно в своей модели вы реализуете метод getBest, а в хуке дополните уже существующие записи своими данными.
Так делать не нужно. Используйте методы класса БД или модели.($joke = mysqli_fetch_assoc($arr)){
Вообще в целом ваш код будет выполняться долго и весь подход в корне неверный — все перемешано, новый список записей получаете по одной, еще и перезаписывая то, что уже получено. Вам нужно использовать хук content_ВАШТ_ТИП_КОНТЕНТА_before_list, в нем для переданных id получить недостающие данные через конструкцию IN mysql и полученные данные записать в массив.
global лучше не использовать, сделать так:
$item = $this->getItemByField($table_name, 'id', $id, function($item, $model) use($points){ ..........
Так делать не нужно. Используйте методы класса БД или модели.
Это тяжелое наследие темного прошлого. Эта функция в данный момент работает на сайте под InstantCMS 1.9. Пять лет работает.
global лучше не использовать, сделать так:
Завтра попробую. Еще раз спасибо за помощь!