3

我想向用户编辑页面添加一个选项卡,即user/%/edit/foo使用 twitter 模块作为模型。在使用调试器进行大量探索和单步调试之后,我意识到我需要hook_user在我的模块中添加一个函数,以便%user_category菜单路由器路径的部分能够工作。

它现在按预期运行,但我对我刚刚做了什么并没有真正的了解,也没有在任何地方找到好的解释。

谁能给我解释一下它是关于什么的?

4

3 回答 3

1

如果给定一个不存在的类别,则 user_category_loads 将失败,这发生在 user/uid/edit/not_a_category,并且它将该类别传递给 user/uid/edit/is_a_category 进行访问检查,因此对这些类别的访问设置为 false,所以 bam , 不稳定的菜单:'(。

于 2011-02-04T19:58:42.273 回答
0

当您使用%user_category它时,意味着user_category_load使用该参数(uid)调用该函数。

该功能在用户模块中定义。这些函数用作验证,如果 False 它返回 FALSE,它将导致 404,但如果它返回其他内容,例如用户对象,则将传递给为该 url 运行的任何回调函数/表单。

在您的情况下,您可能会使用更简单的user_load%user来代替,并且您不需要做所有额外的事情来通过。user_category_load

概括

user_category_load两件事也是如此。

  1. 检查类别是否存在,这样您就不能执行 user/%/edit/foo.
  2. 缓存用户对象。
于 2010-02-23T12:00:57.927 回答
0

经过多次试验和错误,我能够使用如下代码让一个页面作为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菜单项定义路径中的位。

这是不必要的并发症吗?是的,看起来是这样。

编辑:我看到我的同事 hefox 在回答这个问题时打败了我。如果没有 Fox 的帮助,我将无法弄清楚这一切,这对 Fox 来说是如此疯狂的道具。

于 2011-02-04T23:48:16.183 回答