Что именно представляет собой пользовательская категория? - PullRequest
3 голосов
/ 23 февраля 2010

Я хотел добавить вкладку на страницу редактирования пользователя, т.е. user/%/edit/foo, и использовал модуль twitter в качестве модели. После много спелкинга и прохождения через отладчик я понял, что мне нужно добавить функцию hook_user в мой модуль, чтобы часть %user_category пути к маршрутизатору меню работала.

Сейчас он работает так, как ожидалось, но у меня нет четкого представления о том, что я только что сделал, и нигде не нашел хорошего объяснения.

Может кто-нибудь объяснить мне, о чем это?

Ответы [ 3 ]

1 голос
/ 04 февраля 2011

user_category_loads завершается ошибкой, если задана категория, которая не существует, что происходит в user / uid / edit / not_a_category, и она передает эту категорию для проверок доступа пользователю / uid / edit / is_a_category и, таким образом, доступ к ним устанавливается в false Бам, шутливое меню: '(.

0 голосов
/ 05 февраля 2011

После долгих проб и ошибок я смог заставить страницу работать как дочерний элемент пути user/%/edit, используя такой код:

<?php
/**
 * Implementation of hook_menu().
 */
function noc_profile_privacy_menu() {
  return array(
    'user/%user_category/edit/privacy' => array(
      'title' => 'Portfolio privacy',
      'page callback' => 'drupal_get_form',
      'page arguments' => array('noc_profile_privacy_form', 1),
      'access callback' => 'content_profile_page_access',
      'access arguments' => array('profile', 1),
      'type' => MENU_LOCAL_TASK,
      'load arguments' => array('%map', '%index'),
    ),
  );
}

/**
 * Implementation of hook_user().
 */
function noc_profile_privacy_user($op, &$edit, &$account, $category = NULL) {
  if ($op === 'categories') {
    return array(array(
      'name' => 'privacy',
      'title' => t('Profile privacy'),
      'weight' => 0,
    ));
  }
}

Обратите внимание, что ключ 'name' того, что я возвращаю в hook_user (), совпадает с ключом после user/%user/category/edit в моем определении hook_menu (). Я считаю, что это ключ. Вы также получите сообщение об ошибке, если пропустите элемент 'load arguments', имеющий именно это значение.

Поэтому я считаю, что в моем случае пользовательская категория будет 'privacy' - бит после edit в пути определения пункта меню.

Это ненужное осложнение? Да, так кажется.

Редактировать: Я вижу, как мой коллега Хефокс побил меня, чтобы я ответил на этот вопрос. Я бы не смог разобраться со всем этим без помощи Фокса, поэтому безумный реквизит для Фокса.

0 голосов
/ 23 февраля 2010

Когда вы используете %user_category, это означает, что функция user_category_load вызывается с этим аргументом (uid).

Функция определена в пользовательском модуле. Эти функции служат для проверки, если False возвращает FALSE, это приведет к 404, но если оно возвратит что-то еще, например, объект пользователя, оно будет передано любой функции / форме обратного вызова, запущенной для этого URL.

В вашем случае вы, вероятно, могли бы использовать %user вместо этого, который вызвал бы user_load , что более просто, и вам не пришлось бы делать все дополнительные операции, чтобы сделать user_category_load пройти.

Резюме

Итак, user_category_load делает две вещи.

  1. Убедитесь, что категория существует, поэтому вы просто не можете сделать user /% / edit / foo.
  2. Кэширует объект пользователя.
...