Динамическое меню подключения для перенаправления пользователя
Я пытаюсь по существу создать псевдоним для формы редактирования сущности, но на самом деле все, что мне нужно сделать, это перенаправить, но получить Page Not Found error
.
function kidb_profile_menu() {
$items['profile/%uid/edit'] = array(
'page callback' => 'kidb_profile_redirect_user',
'page arguments' => array(1),
'access callback' => array('edit own main_profile profile'),
'type' => MENU_CALLBACK,
);
return $items;
}
function kidb_profile_redirect_user($uid) {
drupal_goto('profile-main_profile/'.$uid.'/edit');
}
2 answers
Поскольку вы используете подстановочный знак %uid в определении меню, ваш kidb_profile_redirect_user()
получает не идентификатор пользователя, а то, что будет возвращено uid_load()
. Эта функция не определена ни в одном модуле, и именно по этой причине вы получаете сообщение об ошибке "страница не найдена".
Список подстановочных знаков, определенных в Drupal 6, представлен в разделе Использование подстановочных знаков и подстановочных знаков ядра. Описание того, что такое подстановочные знаки автопогрузчика, приведено в hook_menu()
:
Подстановочные знаки в путях
Простые подстановочные знаки
Подстановочные знаки внутри путей также работают с подстановкой целых чисел. Например, ваш модуль может зарегистрировать путь "мой-модуль/%/редактировать":
$items['my-module/%/edit'] = array( 'page callback' => 'mymodule_abc_edit', 'page arguments' => array(1), );
Когда запрашивается путь "мой-модуль/foo/редактировать", целое число 1 будет заменено на "foo" и передано функции обратного вызова. Обратите внимание, что подстановочные знаки не могут использоваться в качестве первого компонента.
Подстановочные знаки автопогрузчика
Зарегистрированные пути также могут содержать специальные компоненты подстановочного знака "автозапуск" в виде "%mymodule_abc", где часть "%" означает, что этот компонент пути является подстановочным знаком, а часть "mymodule_abc" определяет префикс для функции загрузки, которая здесь будет называться
mymodule_abc_load()
. Когда запрашивается соответствующий путь, ваша функция загрузки получит в качестве своего первого аргумента компонент пути в позиции подстановочного знака; функции загрузки также могут быть переданы дополнительные аргументы (см. "Аргументы загрузки" в разделе возвращаемое значение ниже). Для например, ваш модуль может зарегистрировать путь "мой-модуль/%mymodule_abc/редактировать":$items['my-module/%mymodule_abc/edit'] = array( 'page callback' => 'mymodule_abc_edit', 'page arguments' => array(1), );
Когда запрашивается путь "мой-модуль/123/редактировать", ваша функция загрузки
mymodule_abc_load()
будет вызвана с аргументом "123" и должна загрузить и вернуть объект "abc" с внутренним идентификатором 123:function mymodule_abc_load($abc_id) { return db_query("SELECT * FROM {mymodule_abc} WHERE abc_id = :abc_id", array(':abc_id' => $abc_id))->fetchObject(); }
Вы, вероятно, хотели использовать %user, который вернет на вашу страницу обратный вызов объекта, возвращенного из user_load()
. Использование этого подстановочного знака позволяет избежать проверки в коде, что идентификатор пользователя является действительным (например, существует учетная запись пользователя с этим идентификатором), но также означает, что вы должны изменить свой код, чтобы он соответствовал следующему.
function kidb_profile_redirect_user($account) {
drupal_goto('profile-main_profile/' . $account->uid . '/edit');
}
При определении пути к меню, как вы это делали 'profile/%uid/edit'
, вы используете Auto-Loader Wildcards
, который в основном под капотом вызывает функцию uid_load
.
В определении пути следует использовать простой подстановочный знак:
$items['profile/%/edit'] = array(