Программное создание страницы

22 декабря 2019 в 9:13
Аватар пользователя y-vo y-vo 0 11 Решено

Приветствую. Есть необходимость создания страницы похожих на текущую нод по определенным критериям, при этом путь должен быть что то типо nodes-same-[cur_node_title], пробую создавать эти страницы через hook_menu. Для теста пробую записать в адрес хотя бы nid ноды, пишу примерно так:

<?php
/**
 * Implements hook_menu().
 */
function anyg_same_nodes_menu() {
  
$current_node menu_get_object();
  
$items = array();
  if (
$current_node->type == 'article'){
    
$page_path 'same-games-'.$current_node->nid;
    
$items[$page_path] = array(

      

'title' => 'Custom page',
      
'page callback' => 'starting_drupal_dev_custom',
      
'access arguments' => array('access content'),
    );
  }

  return 

$items;
}
/**
 * Custom callback function.
 */
function starting_drupal_dev_custom() {
  return 
'<p>Hello world</p>';
}
?>

Но ничего не выходит, видимо я не понимаю как это работает. Может кто то подсказать что тут не так, в какую сторону копать?

Комментарии

hook_menu() НЕ выполняется в реалтайме, он выполняется при перестройке меню, например, во время сброса кеша.
Кусок кода:

  $current_node = menu_get_object();
  $items = array();
  if ($current_node->type == 'article'){
    $page_path = 'same-games-'.$current_node->nid;

Лишён смысла.

Вам нужно создать роут с аргументом, типа

$items['my-module/%/edit'] = array(
  'page callback' => 'mymodule_abc_edit',
  'page arguments' => array(
    1,
  ),
);

Пример из доки, адаптируете сами.

В % передавать уже заголовок, в page callback - выхватывать заголовок и делать нужную магию.

Единственное, что я не уверен, что хук меню обработает адреса вида
nodes-same-%, но попробуйте для начала хотя бы со слешем
nodes-same/%

А дальше есть минимум два решения этой проблемы

22 декабря 2019 в 9:54

Спасибо, стало немного попонятнее, только немного непонятно - page callback в каком случае вызывается? При открытии страницы?

24 декабря 2019 в 17:33

Хук _menu работает так что выполняется при сбросе кеша. Если надо создать страницы для имеющихся материалов типа article, то надо
- Получить запросом все требуемые nid из базы
- В цикле для них создать $items
- Сбросить кеш.

24 декабря 2019 в 14:45

Проблема в том что при таком подходе в любом случае надо будет делать node_load, так как похожие должны формироваться на основе нескольких словарей тегов каждой ноды

24 декабря 2019 в 17:28

Да хоть дырку без бублика выбирай.
Система меню друпала очень плохо прожёвывает большое количество (десятки тысяч) пунктов.

А если нода добавилась, то ей ждать перестройки меню?

25 декабря 2019 в 0:22