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


Я пытаюсь написать свой первый модуль и использую hook_menu для маршрутизации страниц. Модуль состоит из многоступенчатой формы и двух страниц статического контента.

/**
 * Implements hook_menu().
 */
function order_menu() {
  $items = array();

  $items['order/form'] = array(
    'title' => 'Order Form',
    'description' => 'Order multistep form.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('order_form'),
    'access callback' => TRUE,
    'file' => 'order_form.inc',
    'tpe' => MENU_CALLBACK,
  );

  $items['order/cancel'] = array(
    'title' => 'Order Cancelled',
    'description' => 'Order cancelled.',
    'page callback' => 'order_cancel',
    'access callback' => TRUE,
    'file' => 'order_form.inc',
    'type' => MENU_CALLBACK,
  );

  $items['order/success'] = array(
    'title' => 'Order Success',
    'description' => 'Order Successful.',
    'page callback' => 'order_success',
    'access callback' => TRUE,
    'file' => 'order_form.inc',
    'type' => MENU_CALLBACK,
  );

  return $items;
}

Что я хочу сделать, так это получить доступ'example.com/order/form "от"example.com/order "но когда я меняю крючок меню с $items["заказ/форма"] на $items["заказ"], он отображается как страница не найдена.

Любые предложения относительно того, как заставить модуль отображать контент, который я хочу получить example.com/order ?

 2
Author: kiamlaluno, 2011-03-17

2 answers

Вы заставляли Drupal перестраивать меню после того, как изменили код? Если вы этого не сделаете, Drupal будет использовать ранее определенные меню.

Чтобы заставить Drupal перестроить меню, вам просто нужно посетить страницу модулей (страница администрирования, на которой отображается список всех установленных модулей), отключить модуль и снова включить его. Последние две операции не являются строго необходимыми; вы, вероятно, получите тот же эффект, если нажмете кнопку "Сохранить", присутствующую на этой странице без необходимости включать или отключать какой-либо модуль вообще.
Drupal вызовет любую реализацию hook_menu() и hook_menu_alter(), и он получит последние обратные вызовы меню, определенные из вашего модуля.

В качестве альтернативы вы можете вызвать menu_rebuild() из кода или установить Devel, в котором есть блок, содержащий ссылку, которая позволяет заставить Drupal перестроить список меню, который он кэширует.

 2
Author: kiamlaluno, 2011-03-17 16:54:31

Проблема в том, что order не определен как пункт меню. Простым способом исправить это было бы включить его в определение меню крючка:

/**
 * Implements hook_menu().
 */
function order_menu() {
  $items = array();

  $items['order'] = $items['order/form'] = array(
    'title' => 'Order Form',
    'description' => 'Order multistep form.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('order_form'),
    'access callback' => TRUE,
    'file' => 'order_form.inc',
    'type' => MENU_CALLBACK,
  );

  ...

}

Вы могли бы использовать MENU_DEFAULT_LOCAL_TASK для пункта меню order/form, но я полагаю, что по умолчанию он создаст вкладку, которая может быть не тем, что вы хотите.

Не забудьте очистить кэш после внесения этих изменений.

 2
Author: googletorp, 2011-03-17 16:11:45