hook_menu_alter () противоречивый ответ - PullRequest
1 голос
/ 30 ноября 2011

Нужна помощь с этим фрагментом кода, который отвечает для пользователя # 1, но не для других вошедших в систему или анонимных пользователей

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

function module_access_callback(){    
  die('responding here - test');
}

Может кто-нибудь сказать мне, что я делаю не так, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2011

ОК. Оказывается, ответ на самом деле очень прост ...

Вы вызываете menu_get_object(), чтобы получить узел, но на node/add/page нет узла. На самом деле совсем наоборот; не было бы смысла иметь доступный узел на странице для добавления узла, так как он еще не был создан! 403 является побочным эффектом этого.

Вам нужно будет принять решение о доступе на основе какого-то другого значения (обычно зарегистрированный пользователь вместе с разрешением, поскольку @kiamlaluno очень хорошо объяснил в своем ответе).

Также убедитесь, что вы возвращаете TRUE или FALSE из вашего обратного вызова доступа, как @kiamlaluno также заявил:)

EDIT

Просто сказать, что это частично ответ на https://stackoverflow.com/questions/8342169/drupal-hook-menu-alter-menu-get-object-error,, который объясняет, почему в этом ответе упоминаются функции, не упомянутые в вопросе.

0 голосов
/ 30 ноября 2011

Если это код, который вы действительно используете, то функция обратного вызова доступа неверна, так как она должна возвращать 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, даже если вы передаете в функцию строку для разрешения, которое не определено ни в одном модуле.

...