Как отфильтровать вывод списка нод на главной?

Главные вкладки

Аватар пользователя Tankha Tankha 14 июня 2009 в 15:01

Очень долго бьюсь и никак не могу определить - как можно сделать так, чтобы на главной выводились только те ноды которые прошли анализ в моем коде (на предмет - выводить их или нет).
Пока решил задачу просто - хакнул ядро (node.module). Отключил pager в node.module и сделал анализ (выводить-не выводить тизер) в node.tpl.php темы.

Но это ведь совсем как-то криво...

Пересмотрел все хуки - не увидел ничего похожего на то что мне нужно. Sad

Комментарии

Аватар пользователя Tankha Tankha 14 июня 2009 в 21:26

Эх не то... Sad

Мне нужно загрузить ноды, проанализировать и в процессе "решать" - эту показывать эту нет...
Наверное прийдется делать свою главную и туда вставлять код... - дублирующий стндартный вывод только со своими доработками.

Вообщем полностью продублировать функцию node_page_default() модуля node

Аватар пользователя romass romass 14 июня 2009 в 21:52

Если честно, то мне не совсем понятно в чем проблема… Если нельзя просто модифицировать запрос к БД и нужно придумать способ, чтобы как-то переопределить функцию node_page_default, то это можно сделать через hook_ menu_alter.

Аватар пользователя Dan Dan 15 июня 2009 в 1:10

Вариантов масса - от написания inline кода на странице, которую потом делаем главной и своего модуля до использования сторонних модулей, views, в частности.

Аватар пользователя Tankha Tankha 15 июня 2009 в 1:42

Dan wrote:
Вариантов масса - от написания inline кода на странице, которую потом делаем главной и своего модуля до использования сторонних модулей, views, в частности.

Я сделал модуль (от views падает сайт).
Только не знаю какую функцию использовать...

Аватар пользователя Tankha Tankha 15 июня 2009 в 1:22

Проблема в том, что ноду нужно проанализировать. Т.е. вытащить поля ССК (в т.ч. и список юзеров поля User Reference), сравнить с текущим юзером, сделать еще кучу всяких операций и потом выводить или не выводить. Модификацией одного запроса тут не обойтись... Sad
А hook_menu_alter разве может переопределить node_page_default? Это же хук меню вроде...

Аватар пользователя Dan Dan 15 июня 2009 в 1:52

"Tankha" wrote:
Проблема в том, что ноду нужно проанализировать. Т.е. вытащить поля ССК (в т.ч. и список юзеров поля User Reference), сравнить с текущим юзером, сделать еще кучу всяких операций и потом выводить или не выводить. Модификацией одного запроса тут не обойтись... :(

1. либо Вы делаете для каждой ноды node_load и убиваете MySQL, либо...
2. таки составляете SQL запрос
3. возможно имеет смысл изменить архитектуру сайта

Аватар пользователя Tankha Tankha 15 июня 2009 в 2:09

Dan wrote:

1. либо Вы делаете для каждой ноды node_load и убиваете MySQL, либо...

уже Smile
Только модуль Flag все время глючит - замучался я с ним...
Dan wrote:

2. таки составляете SQL запрос

Увы... не получится.

Dan wrote:

3. возможно имеет смысл изменить архитектуру сайта

Вы имеете в виду сделать не на Drupal а на чем-то другом? Как то обидно - столько времени потратил. Smile
Вообще немного убивает то, что всё завязано на node. Я когда-то несколько лет работал с Access (майкрософтовским) и настолко проникся идеологией что всё пытаюсь сделать как там. Smile
Если бы в Drupal можно было так же гибко разбирать-собирать те-же node... Или вот эта ситуация что сейчас - почему нет хука который переопределял бы вывод нод (что-то вроде hook_page_alter)? По принципу модулей контролирующих доступ - пробежался по нодам, определил какие показывать какие нет и они ВЕЗДЕ либо видны либо нет (например в модуле event тоже).

P.S.
Возможно я просто еще не до конца проник в принципы работы Drupal...

Аватар пользователя Tankha Tankha 15 июня 2009 в 2:19

Хуже всего что руководство гонит - быстрей, не дают посидеть разобраться...
Вообщем пока обошелся хаком модуля node (в том числе пришлось сделать свою разбивку на страницы). А потом надо будет смотреть как это лучше реализовать...

Наверное прийдется делать свою главную страницу и там всё красиво своими запросами реализовать. Просто думал что можно обойтись штатным функционалом.

Аватар пользователя Dan Dan 15 июня 2009 в 22:19

"Tankha" wrote:
Вообщем пока обошелся хаком модуля node (в том числе пришлось сделать свою разбивку на страницы). А потом надо будет смотреть как это лучше реализовать..

Хм. Если вас устраивает код в node.module, то почему бы не взять его за основу и написать собственный модуль? Сделайте новый пункт меню типа MENU_CALLBACK, напр. my_node_list, вставьте туда код из node.module с Вашими правками и в настройках сайта сделайте my_node_list главной страницей.

Аватар пользователя Tankha Tankha 16 июня 2009 в 0:11

Не то чтобы устраивает... Просто там это намного удобнее перехватывать (там есть четкое движение по строкам и перегонка их в $output - вот здесь можно и решать по каждой ноде что с ней делать). Кстати мои несколько сот строк кода работают там (в node.module) раза в два быстрее чем в шаблоне.

Я просто был почему-то уверен что есть такая функция - перехват списка нод перед выводом. 100%-ный перехват - т.е. могу идти по списку и решать - вот эту ноду показывать а эту нет.
Стыдно признаться но я никак не могу до конца понять идеологию Drupal. Когда всё станет ясно, то наверное напишу свой модуль с самого начала и всё переделаю.
А пока прийдется видимо так и сделать как Вы написали - свою главную страницу.

Аватар пользователя Dan Dan 16 июня 2009 в 1:04

Ну вообще для этих целей, особенно пока непонятно как друпал работает, лучше всего подходит views.

Вы писали что он у Вас не работает. Я так понимаю имелось ввиду UI? Да, оно тяжелое, но можно сделать список на локальном компе а потом импортировать его на сайт, где UI можно отключить.

Аватар пользователя Tankha Tankha 16 июня 2009 в 11:04

После views сайт падает как только его включить. (Падает страница списка модулей).
Друпал я не то чтобы не знаю - не могу до конца понять идеологию. Это очень существенный момент.

Аватар пользователя Dan Dan 16 июня 2009 в 16:22

"Loasty" wrote:
Не пробовали написать свой модуль, создать в ней новый тип ноды и фильтровать через hook_view?

Это ресурсоёмко. Фильтровать надо на этапе выборки из БД, а не откидывать _уже_ загруженные ноды.