Аргументы доступа hook_menu

Главные вкладки

Аватар пользователя sysdimon sysdimon 14 февраля 2013 в 16:36

Добрый день!

У меня вопрос по access_arguments в хуке hook_menu.

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

Ставлю
'access arguments' => array('administer site configuration'),
даю авторизованному пользователю соответствующее разрешение, однако ссылка и страница не показываются.

Спасибо!

Комментарии

Аватар пользователя sysdimon sysdimon 14 февраля 2013 в 17:30

Проблема решилась установкой
'access arguments' => array('administer nodes'),
и установкой разрешения Administer content.

Допустимо ли это?

И почему разрешения в хуке и в таблице не совпадают?

Аватар пользователя kalabro kalabro 14 февраля 2013 в 19:59

'administer nodes' дают не просто авторизованным пользователям, а вообще админам контента. ваша страница только для админов?

Аватар пользователя sysdimon sysdimon 14 февраля 2013 в 22:09

Нет, как раз страница должна быть для авторизованного пользователя, ну и для админа, соответственно. А неавторизованному она не видна.

Я вот тут не проследил, какая связь между аргументами доступа хука и разрешениями ролей. Не проясните?

Аватар пользователя kalabro kalabro 14 февраля 2013 в 22:51

Ну, хорошо.
1. Есть права, уже предоставленный ядром и модулями и любые какие вы придумаете с помощью hook_permission. Пример права: Просмотр опубликованных материалов (access content), Управление конфигурацией сайта (administer site configuration) и любое другое.
2. Есть роли пользователей. Например, неавторизованный пользователь, авторизованный, контент-менеджер, админ.
3. Есть связь роль ←→ права. У каждой роли свой набор прав. Настраивается это по адресу /admin/people/permissions
4. Когда друпал собирается совершить какое-то действие, он предпочитает проверить разрешение на это действие с помощью кода if (user_access(<код права>)) { . Вернет TRUE, если какая-нибудь из ролей текущего пользователя обладает правом <код права>.
5. В hook_menu есть 2 параметра. 'access callback' (по умолчанию user_access) и 'access arguments' (массив, передающийся в access callback).

Если вам просто нужно проверить, что пользователь авторизован, то вы можете не использовать систему прав, а просто задать 'access callback' => 'user_is_logged_in'.

Аватар пользователя sysdimon sysdimon 15 февраля 2013 в 10:05

Огромное спасибо за столь распространенное объяснение. До сего момента я чего-то более-менее толкового не встречал.

Картина, вроде как, выстроилась.

А вот этот <код права> должен соответствовать разрешению из /admin/people/permissions? По какому принципу?