Выборочный ответ обратного вызова доступа пользователей Drupal

Пожалуйста, потерпите этого новичка в Drupal API, пока я объясню кое-что из предыстории!

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

function mymodule_menu_alter(&$items) {  
  $items["node/add/page/%"]['access callback'] = 'mymodule_access_callback';
}

function mymodule_access_callback(){
  if( user_access('open sesame') ){
    drupal_set_message("successfully intecepting new node creation");
    return true;
  }
  return false;
}

Узел / добавление / страница успешно заблокирован, но это происходит в обоих случаях. Оператор if определяет, есть ли у пользователя определенное разрешение, и в нем я добавил return true, что привело к следующей ошибке:

Неустранимая ошибка: require_once () [function.require]: Не удалось открыть '/node.pages.inc' (include_path = '.:') в /var/www/vhosts/mysite.co.uk/httpdocs/includes/menu .inc в строке 347

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


person sisko    schedule 02.12.2011    source источник
comment
Чтобы заметить, что Drupal не определяет никакого обратного вызова меню для node / add / page /%; вы изменяете элемент меню, которого не существует, и вам не следует использовать hook_menu_alter() в этом случае.   -  person apaderno    schedule 03.12.2011


Ответы (1)


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

function mymodule_menu_alter(&$items) {  
  $items["node/add/page/%"]['access callback'] = 'mymodule_access_callback';
  $items["node/add/page/%"]['file'] = drupal_get_path('module', 'node') . '/node.pages.inc';
}

ИЗМЕНИТЬ

Попробуйте изменить вторую строку выше на это:

$items["node/add/page"]['file'] = drupal_get_path('module', 'node') . '/node.pages.inc';

Это попытка явно указать путь к файлу для родительского элемента пути, который вы определяете.

Также это может быть глупо, но каждый раз, когда вы вносите изменения в hook_menu_alter(), убедитесь, что вы очищаете кеши Drupal, чтобы изменения были сохранены.

person Clive    schedule 02.12.2011
comment
Извините, это не имеет значения - person sisko; 02.12.2011
comment
На первый взгляд, причина в том, что в node.module не задан путь node/add/page/% (см. _ 3_), поэтому вы фактически ничего не меняете, просто добавляете новый пункт меню без page callback, поэтому вы получаете сообщение об ошибке. - person Clive; 02.12.2011
comment
Возможно, вы правы, но в случае, если в меню отсутствует обратный вызов, оно должно вернуться к функции обратного вызова ближайшего родителя, не так ли. По крайней мере, это то, что я прочитал на api.drupal.org /api/drupal/includes--menu.inc/group/menu/6 - person sisko; 02.12.2011
comment
Да, вы правы, объединение этого с сообщением об ошибке, которое вы получаете, привело меня к мысли, что путь file был установлен неправильно (относительно модуля узла, а не корня), следовательно, ответ выше: / Единственное, что я Можно подумать, попробовать это явно указать путь к родительскому элементу. Я отредактирую ответ выше, чтобы показать вам, что я имею в виду - person Clive; 02.12.2011
comment
Спасибо за ответ и код из вашего последнего обновления. Сегодня я смог попробовать ваше предложение, но это не имело никакого значения. Я получаю сообщение об ошибке, подобное моему исходному сообщению выше. Я просто недостаточно знаю об API, чтобы понять это :-( - person sisko; 06.12.2011
comment
Внимательно изучив ошибку, я понял, что проблема в неверном URL-адресе node.pages.inc. Он пытается найти его в 'modules / node / modules / node / modules / node.pages.inc' - person sisko; 06.12.2011