Динамическое меню подключения для перенаправления пользователя


Я пытаюсь по существу создать псевдоним для формы редактирования сущности, но на самом деле все, что мне нужно сделать, это перенаправить, но получить 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');
}
Author: kyletaylored, 2014-01-21

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');
}
 3
Author: kiamlaluno, 2014-01-22 15:41:23

При определении пути к меню, как вы это делали 'profile/%uid/edit', вы используете Auto-Loader Wildcards, который в основном под капотом вызывает функцию uid_load.

В определении пути следует использовать простой подстановочный знак:

$items['profile/%/edit'] = array(
 2
Author: Mike Vranckx, 2014-01-21 20:47:14