Как должен выглядеть хук?

Истинно православный хук. Какой он?

 
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2711
Почитал про инстантправославие. Проникся идеей выноса всех изменений в отдельные файлы и вызов их по хуку.
Теперь хочу выяснить, как это должно выглядеть с точки зрения создателей CMS.
Допустим, возникла потребность в создании хитрого датасета, который никак средствами стандартной модели не сделать. Или потребовалось в определенном типе контента выводить комментарии в другом порядке и в другом шаблоне.
Как в таком случае активировать вышеупомянутый хук?
Просто в системный файл вписывать условие, что если if(something){$this->runExternalHook(filehook, $parametrs -> $tarametrs) ?
Файл с хуком располагается в месте filehook и в нем содержится класс (или не содержится?) и функция, которую активирует данный хук.
Как все это правильно должно выглядеть?
InstantCMS Team
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 4379
HiAndy:
Теперь хочу выяснить, как это должно выглядеть с точки зрения создателей CMS.
Нужно в первую очередь прочитать инстант-православную документацию.
HiAndy:
Допустим, возникла потребность в создании хитрого датасета, который никак средствами стандартной модели не сделать.
1. Проверить, нет ли уже в движке хука на нужную вам правку функционала.
2. Если сами не нашли, то поначалу лучше спросить на форуме, описав то, что вы хотите сделать. Например на список датасетов хук есть. Повлиять на выборку записей типа контента - тоже хук есть.

Если в движке нужного вам хука не заложено, то необходимо:

1. Проанализировать, куда наиболее функционально вставить вызов хука, что ему передать и как его назвать максимально универсально, не прицепляясь к вашей идее.
2. Добавить вызов хука в код последовательной или параллельной схемой вызова (см. документацию)
3. Написать нам с предложением внести хук в движок или же прислать пулреквест на гитхабе.

Если по документации что-то непонятно - спрашивайте уточняющие вопросы.
Редактировалось: 2 раз (Последний: 30 апреля 2016 в 18:58)
Видео каталог для InstantCMS | Аудио каталог для InstantCMS | Мы Вконтакте | Предложение для спонсоров
Реклама
cms
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2711
Fuze:
1. Проверить, нет ли уже в движке хука на нужную вам правку функционала.
Нет, этого нет и быть не может. Это кроме меня вряд ли кому пригодится.
Для обеспечения спецолимпиады на сайте потребовалось создать в таблице рейтинга новую колонку votedate (время голосования).
После этого создал датасеты "лучшие за день" и "лучшие за вчерашний день". И важно, что именно не дата публикации, а сумма рейтинга проголосовавших за отведенное время имеет значение..
Собственно все работает, но пришлось добавить новую функцию в модель контента:

Спойлер
И условие во фронтенд:

Спойлер
И вот мне бы хотелось всю эту красоту из системный файлов вынести.
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 3587
HiAndy, у вас во фронтенде стоит уже два хука перед самыми вашими правками
Код PHP:
  1.  
  2. list($ctype, $this->model) = cmsEventsManager::hook('content_list_filter', array($ctype, $this->model));
  3. list($ctype, $this->model) = cmsEventsManager::hook("content_{$ctype['name']}_list_filter", array($ctype, $this->model));
  4.  
Создайте файл этого хука, пропишите его в манифесте и делайте с моделью что хотите.
в начале файла можете прописать ваше условие:
Код PHP:
  1.  
  2. <?php
  3.  
  4. class onВашкомпонентContentListFilter extends cmsAction {
  5.  
  6. public function run($data){
  7.  
  8. list($ctype, $model) = $data;
  9.  
  10. if ($dataset == 'bestyesterday' || $dataset == 'besttoday'){ // $dataset можно получить из реквеста
  11.  
  12. $model->orderBy('the_best_of_the_best'); // или что-то типа того
  13. }
  14. return array($ctype, $model);
  15.  
HiAndy:
Нет, этого нет и быть не может. Это кроме меня вряд ли кому пригодится.
Fuze имел ввиду что добавить строчку типа этой cmsEventsManager::hook('content_list_filter', array($ctype, $this->model)); в нужном месте, а не всю вашу писанину из под первого спойлера.
Редактировалось: 1 раз (Последний: 30 апреля 2016 в 19:56)
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2711
Loadырь:
Создайте файл этого хука, пропишите его в манифесте и делайте с моделью что хотите.

Но зачем мне тогда городить огород с хуками, если с моделью делать что хочу?
Я и так просто написал условие во фронтенде и допфункцию в модели. У меня и так всё работает.

Как раз спрашивал, как сделать тоже самое, но не внося изменений в системные файлы (в модель).
InstantCMS Team
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 4379
HiAndy:
если с моделью делать что хочу?
Вы не поняли. В хуке и выполняйте свои действия. Хук реализуется от контроллера. Т.е. чтобы сделать хук, нужен контроллер, его обрабатывающий. А к контроллеру модель своя (если нужна).
Соответственно в своей модели вы реализуете метод getBest, а в хуке дополните уже существующие записи своими данными.
HiAndy:
($joke = mysqli_fetch_assoc($arr)){
Так делать не нужно. Используйте методы класса БД или модели.

Вообще в целом ваш код будет выполняться долго и весь подход в корне неверный - все перемешано, новый список записей получаете по одной, еще и перезаписывая то, что уже получено. Вам нужно использовать хук content_ВАШТ_ТИП_КОНТЕНТА_before_list, в нем для переданных id получить недостающие данные через конструкцию IN mysql и полученные данные записать в массив.

global лучше не использовать, сделать так:

Код PHP:
  1. $item = $this->getItemByField($table_name, 'id', $id, function($item, $model) use($points){
  2. $item['user'] = array(
  3. ..........
Видео каталог для InstantCMS | Аудио каталог для InstantCMS | Мы Вконтакте | Предложение для спонсоров
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2711
Спасибо, теперь почти понял.

Fuze:
Так делать не нужно. Используйте методы класса БД или модели.

Это тяжелое наследие темного прошлого. Эта функция в данный момент работает на сайте под InstantCMS 1.9. Пять лет работает.

Fuze:
global лучше не использовать, сделать так:

Завтра попробую. Еще раз спасибо за помощь! v
В начало страницы
Предыдущая темаСледующая тема Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.