Создание листинга нод с фильтрами без Views

Аватар пользователя Наденька Наденька 5 апреля 2018 в 17:27

Привет сообществу!

Подскажите как можно через кастомный модуль сделать свой каталог без использования Views?

Идея такая:

Создать страницу, получать значения из URL сделать единое представление для вывода всевозможных выборок товара в зависимости от вложенности URL'a

Вопрос #1

И тут уже первая проблема, предположим я создала страницу:

<?php
function custom_menu()
{
    
$items['catalog'] = [
       
'title' => 'Каталог'//page title
];
?>

Как бы так сделать что бы последующие уровни вложенности URL'a тоже шли на этот роут?

Вопрос #2

Далее подразумевается, что я получила коллекцию с нодами отфильтровав по типу материала

<?php
   $nodes 
node_load_multiple([], ['type' => "catalog"]);
?>

Как сделать вывод этого счастья через темплейт в модуле + запилить пагинацию?

P.S

Я понимаю что мои вопросы на уровне "почитай доки, там всё есть", моя проблема в том, что я не смогла адекватно спросить у гугла то, что бы вывело меня на зацепки к необходимой терминологии. По этому прошу не решать мои проблема, а просто бросаться в меня ссылками или ключевыми словами (желательно по английски) по теме вопросов.

Благодарю всех откликнувшихся!

Комментарии

Аватар пользователя bumble bumble 5 апреля 2018 в 18:58

Наденька wrote:

для вывода всевозможных выборок товара в зависимости от вложенности URL'a

Поясните.

В целом, примерно следующий путь:

  • В hook_menu указываете коллбек страницы, в нем реализовываете всю логику.
  • Значения фильтров передается гет-параметрами, в коллбеке ловится с помощью drupal_get_query_parameters
  • Эти параметры передаются в качестве условий в EntityFieldQuery.
  • Выборка из загруженных нод передается в шаблон, который можно организовать с помощью hook_theme
Аватар пользователя Наденька Наденька 5 апреля 2018 в 20:18

Под этим пунктом я имела в виду вложеность урла после основной страницы /catalog по типу /catalog/category/subcategory/etc

Благодарю за ссылки!

Аватар пользователя bumble bumble 6 апреля 2018 в 15:54

Ну... Хук меню позволяет организовать демонические динамические пути, и передавать их в качестве аргументов в коллбек страницы:

<?php
$items
['catalog/%/%/%'] = array(
  
// ...
  
'page callback' => 'mymodule_page_callback',
  
'page arguments' => [123]
  
// ...
);

// и сам коллбек:
function mymodule_page_callback($category$subcategory$etc) {}
?>

Осталось определить чем в пути должно быть это:

  • category
  • subcategory
  • etc
Аватар пользователя Phantom63rus Phantom63rus 5 апреля 2018 в 19:35

Вы потратите много времени и получите посредственный результат. Такие вещи в друпале делаются именно на вьюсе, если же очень не хочется - то лучше взять другой движок.

Аватар пользователя Наденька Наденька 5 апреля 2018 в 20:21

Спасибо, в целом я согласна, это проще сделать на том-же laravel или yii но увы писать всю логику бэкенда я не потяну сейчас по уровню знаний. Если вы знаете какой-нибудь инструмент, что бы построить мостик между бекендом на друпал и клиентской частью на каком-нибудь ооп микро-фреймворке буду очень благодарна за совет.

Аватар пользователя Phantom63rus Phantom63rus 5 апреля 2018 в 20:35

Нет, я с таким не сталкивался.

Интересно что вы хотите получить в итоге, т.е. какова общая задача?

Аватар пользователя Наденька Наденька 5 апреля 2018 в 22:19

Простой каталог с чистыми ссылками, которые я буду парсить как query параметры. типа catalog/category/subcategory/etc

плюс хочу на разные роуты собрать кастомные query что бы пробрасывать их через один и тот-же темплейт без необходимости клонировать представления. Звучит дико, но мне в проекте часто нужно менять какую-то мелочь во вьюшке и затем во всех её клонах, по этому ищу способ собрать по типу как в MVC разные контроллеры выводить через одно представление.

Аватар пользователя Phantom63rus Phantom63rus 5 апреля 2018 в 22:27

Первое делается через контекстные фильтры без проблем.

Второе - во вьюшке можно создать несколько страниц и при редактировании выбирать либо изменить во всех, либо в конкретной.

Аватар пользователя Наденька Наденька 5 апреля 2018 в 22:41

Интересно, изучу!

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

В любом случае благодарю за участие Smile

Аватар пользователя gun_dose gun_dose 5 апреля 2018 в 22:47

ООП, контроллеры, MVC это надо на восьмёрке делать. На семёрке скролл у мышки сломается, когда число строк модуля перевалит за 2000, и эти спагетти будут совершенно не читаемые.

Аватар пользователя Наденька Наденька 5 апреля 2018 в 23:55

Спасибо, 8ку уже осваиваю маленькими шажками. Но один из проектов хочется малой кровью добить, по этому ищу аналоги Smile В конце концов, есть же сет модулей семплов ооп и для 7ки вот я и мучаю себя и сообщество в поисках идей .

Аватар пользователя 1Andres 1Andres 28 февраля в 10:12

Возможно вопрос не актуален. Но всё же опишу своё решение, вроде бы оно очень подходит для решения вашей проблемы.

Однажды я устал делать несколько одинаковых правок мышкой во всех вьюсах.

Но от самого вьюса отказываться не хотел, так как не хотел изучать тонкости запросов к БД.

В итоге взял от вьюса его умения делать запросы к БД (в разделе КРИТЕРИИ ФИЛЬТРАЦИИ), а вывод (ПОЛЯ) листингов (товаров, и всего что может выдавать вьювс) писал ПХП кодом (node_load_multiple работает очень быстро, как правило на одной странице листинга товаров, вам не понадобится грузить более 13 node).

Во всех вью у меня осталось только одно поле: nid (для вьюх node).

Таким образом вьюха которая выводит только поле Айдишник любой сущности отрабатывает оооочень быстро, даже если вы захотите вывести все >5000 nid которые у вас есть (такое конечно в практике бессмысленно).

И самая главная мысль: этот подход реализовал с помощью:

$view = views_get_view('foo');
$view->set_display('page');
$view->execute();
$views_get_result = $view->result;

print_r($views_get_result); // --> выведет массив со списком nid которые подобрала вью по заданным фильтрам.

Подробнее про views_get_view http://xandeadx.ru/blog/drupal/633.

Также замечу, что я без проблем реализовал листинги товаров с совремённой фильтрацией, пагинацией, AJAX подгрузкой и блэк джеком. (фичи пагинации, аджакса написал сам, то есть это теперь не зависит от views).

Фича AJAX фильтрации наполовину от views (в её (!) открытые фильтра летят GET параметры), но вывод HTML виджетов, в которые тыкают посетители, полностью под моим контролем, они не знают ничего про Views, а Views про них.