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

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

Приветствую. Есть необходимость создания страницы похожих на текущую нод по определенным критериям, при этом путь должен быть что то типо 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>';
}
?>

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

Лучший ответ

Аватар пользователя Semantics Semantics 22 декабря 2019 в 9:54
1

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/%

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

Комментарии

Аватар пользователя Semantics Semantics 22 декабря 2019 в 9:54
1

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/%

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

Аватар пользователя y-vo y-vo 24 декабря 2019 в 17:33

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

Аватар пользователя sas@drupal.org sas@drupal.org 24 декабря 2019 в 14:45
1

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

Аватар пользователя sas@drupal.org sas@drupal.org 24 декабря 2019 в 15:21

Если выбирать только идшинки, а не как некоторые node_load делать, то всё будет пучком и оптимально.

Аватар пользователя y-vo y-vo 24 декабря 2019 в 17:28

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

Аватар пользователя Semantics Semantics 25 декабря 2019 в 0:22

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

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

Аватар пользователя sas@drupal.org sas@drupal.org 25 декабря 2019 в 10:14

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