通配符和参数替换

在实际中,一个Drupal路径的一部分通常是用来查看或者修改一个对象的,比如一个节点对象或者一个用户对象。例如,路径node/%/edit用来编辑一个节点,而路径user/%则用来根据用户ID来查看用户的相关信息。让我们看一下后者的菜单项,你可以在modules/user/user.module中的hook_menu()实现中找到它。这个路径匹配的URL应该看起来是这样的http://example.com/?q=user/2375。在你的Drupal站点上点击查看“我的帐号”页面,就能看到这样的URL了。

 
 
$items['user/%user_uid_optional'] = array(
    'title' => 'My account',
    'title callback' => 'user_page_title',
    'title arguments' => array(1),
    'page callback' => 'user_view',
    'page arguments' => array(1),
    'access callback' => 'user_view_access',
    'access arguments' => array(1),
    'file' => 'user_pages.inc',
);
 
 
暂停一下!路经user/%user_uid_optional是怎么一回事呢?我们在这里详细的解释一下:
1.使用/字符将路径切分成各个部分。
2.在第2部分中,匹配从%到下一个可能的/字符之间的字符串。在这里,该字符串就是user_uid_optional。
3. 向该字符串上追加_load,来生成一个函数的名字。在这里,该函数的名字就是user_uid_optional_load。
4. 调用该函数,并将Drupal路径中通配符的值作为参数传递给它。所以,如果URL为http://example.com/?q=user/2375, Drupal路径为user/2375,而通配符匹配的第2部分就是2375,那么调用的就是user_uid_optional_load('2375')。
5. 使用这个调用所返回的结果来替换通配符。这里的标题参数为array(1),在标题回调被调用时,我们没有传递Drupal路径中的部分1(2375),而是传递了user_uid_optional_load('2375')返回的结果,也就是一个用户对象。我们可以把它看作,Drupal路径中的一部分被它所表示的对象替换了。
6. 注意,页面回调和访问回调也将使用替换对象。所以,在前面的菜单项中,user_view_access()用于访问控制,user_view()则用于生成页面内容,对于这两者,都会传递进来用户2375的用户对象。
 
提示 对于Drupal路径,比如node/%node/edit,如果你将%node看作是一个通配符%,并在其右边加上了一个注释的话(这里为node),那么会更容易的理解对象替换。换句话说,node/%node/edit实际上就是node/%/edit,外加了一个隐藏指令:为通配符匹配的内容运行node_load()。
 老葛的Drupal培训班 Think in Drupal

Drupal版本: