hook_menu_alter() противоречивый ответ
Нужна помощь с этим фрагментом кода, который отвечает для пользователя #1, но не для других вошедших в систему или анонимных пользователей
function module_menu_alter(&$items) {
$items["node/add/page"]['access callback'] = 'module_access_callback';
}
function module_access_callback(){
die('responding here - test');
}
Может кто-нибудь сказать мне, что я делаю не так, пожалуйста?
2 ответа
ОК Оказывается, ответ на самом деле очень прост...
Ты звонишь menu_get_object()
получить узел, но на нем нет узла node/add/page
, На самом деле совсем наоборот; не имеет смысла иметь доступный узел на странице для добавления узла, так как он еще не был создан! 403 является побочным эффектом этого.
Вам нужно будет принять решение о доступе, основываясь на каком-то другом значении (обычно зарегистрированный пользователь вместе с разрешением, так как @kiamlaluno очень хорошо объяснил в своем ответе).
Также убедитесь, что вы вернетесь TRUE
или же FALSE
от вашего доступа обратного вызова, как @kiamlaluno также заявил:)
РЕДАКТИРОВАТЬ
Просто сказать, что это частично ответ на https://stackru.com/questions/8342169/drupal-hook-menu-alter-menu-get-object-error, который объясняет, почему в этом ответе упоминаются функции, которые не не упоминается в вопросе.
Если это код, который вы действительно используете, то функция обратного вызова доступа неверна, так как должна возвращать TRUE
когда пользователь, вошедший в систему, имеет доступ к меню, и FALSE
когда пользователь не имеет доступа к меню. Не использует die()
,
Вот что сообщается в документации для hook_menu ():
"обратный вызов доступа": функция, возвращающая
TRUE
если пользователь имеет права доступа к этому пункту меню, иFALSE
если не. Это также может быть логическая константа вместо функции, и вы также можете использовать числовые значения (будет приведено к логическому значению). По умолчанию используется user_access(), если значение не наследуется от родительского пункта меню; только элементы MENU_DEFAULT_LOCAL_TASK могут наследовать обратные вызовы доступа. Чтобы использоватьuser_access()
обратный вызов по умолчанию, вы должны указать разрешение для проверки в качестве "аргументов доступа".
Если вы не показываете код, который используете, то последующее может объяснить поведение, которое вы видите.
Первый пользователь, или пользователь № 1, является конкретным пользователем, потому что user_access() всегда возвращает TRUE
для этого пользователя. Это очевидно в коде этой функции, которая явно проверяет, что идентификатор пользователя равен 1.
// User #1 has all privileges:
if ($account->uid == 1) {
return TRUE;
}
Если обратный вызов доступа возвращается FALSE
для аутентифицированных пользователей, и он использует user_access()
это потому, что прошедшие проверку пользователи не имеют разрешения, переданного функции.
Также может быть, вы проверяете более одного разрешения, и вы используете user_access('first permission') && user_access('second permission')
, вместо user_access('first permission') || user_access('second permission')
(или наоборот). Для пользователя #1, который не имеет никакого значения, в результате user_access('first permission') && user_access('second permission')
а также user_access('first permission') || user_access('second permission')
всегда TRUE
, даже если вы передаете в функцию строку для разрешения, которое не определено ни в одном модуле.