09. Новая функция



О чём речь: использование системы меню.
Описываемый hook: hook_menu.


Как упоминалось ранее, функция которую мы только что написали — это не hook: это название не опознаётся Друпалом. Мы должны сказать Друпалу как получить доступ к функции при выводе документа. Сделаем мы это при помощи hook_menu. Если вы помните, то мы уже использовали hook_menu в седьмой главе. hook_menu определяет связь между URL и функцией которая создаёт содержание для этого URL. Если нужно, то hook также делает проверку прав. Мы будем использовать уже сделанный нами ранее hook_menu.

<?php
function onthisdate_menu() {

 
$items = array();

 
//this was created earlier in tutorial 7.
 
$items['admin/settings/onthisdate'] = array(
   
'title' => 'On this date module settings',
   
'description' => 'Description of your On this date settings control',
   
'page callback' => 'drupal_get_form',
   
'page arguments' => array('onthisdate_admin'),
   
'access arguments' => array('access administration pages'),
   
'type' => MENU_NORMAL_ITEM,
   );

 
//this is added for this current tutorial.
 
$items['onthisdate'] = array(
   
'title' => 'On this date',
   
'page callback' => 'onthisdate_all',
   
'access arguments' => 'access onthisdate content',
   
'type' => MENU_CALLBACK
 
);

  return
$items;
}
?>

В сущности мы говорим следующее. Если пользователь идёт на URL http://example.com/onthisdate, то будет выведено содержание сгенерированное onthisdate_all, документ будет иметь название On this date, typeMENU_CALLBACK скажет Друпалу, что ссылку в меню показывать не надо и нужно только использовать эту функцию при запросе/получении URL. Если вы хотите, чтобы ссылка была создана в стандартном блоке навигации, то используйте MENU_NORMAL_ITEM.

Права

Как было сказано ранее в седьмой главе, hook_menu может проверить права доступа до вывода документа. Запись access argument в массиве пункта меню — это то место, где делается проверка. Если вы добавите значение в свой массив прав в функции perm hook, вы можете использовать эту строку в качестве параметра в функции user_access и если пользователь не входит в роль для которой установлены права доступа к этому документу, то документ выведен не будет.

Попробуйте это

Если модуль не включен, то включите его как сказано в шестой главе. Если модуль уже включен, то сбросьте системные определения для этого модуля. Для этого нужно его выключить, а затем снова включить.

Теперь перейдите по адресу: /onthisdate (или /?q=onthisdate если у вас не включены Clean URLs) и вы увидите документ который мы всё это время делали.

Смотрите также

Comments

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

Например, вместо 'page callback' следует использовать 'callback' , а вместо 'access arguments' просто 'access'.

Как то не получается с меню разобраться по данному примеру
warning: Invalid argument supplied for foreach() in C:\....\drupal\includes\menu.inc on line 258.
можно ли данный пример полностью с готовыми файлами скачать, на ...org найти не смог, так вроде все понятно кроме назначения прав

Господа, если у кого возникают проблемы при использовании этого примера, обратите внимание, что указанный синтаксис устарел.
Например, вместо 'page callback' следует использовать 'callback' , а вместо 'access arguments' просто 'access'.

тоже не помогло, мотрел в модуле голосования (Poll) в комлекте с drupal 6.1, так там callback и access по старому используються.
$items['admin/settings/onthisdate'] = тут у меня все отлично
$items['onthisdate'] = а вот это у меня не работает и permissions ничего по данному модулю нет.

А я сделал так:

  //this is added for this current tutorial.
  $items['firstmodul'] = array(
    'title' => 'Первый модуль',
    'page callback' => 'firstmodul_all',
    'access arguments' => array('access onthisdate content'),
    'type' => MENU_CALLBACK
  );

Изменилась только строчка

'access arguments' => array('access onthisdate content'),

И в Drupal 6.5 всё заработало.

Нет, все дело в строчке:

$items['firstmodul'] = array(

Название пункта меню не может совпадать с названием существующего установленного модуля, т.е. 'onthisdate' не катит, а 'onthisdatepage' да.

Post new comment

Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.