17 通配符、占位符、参数替换

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

 向我们的菜单钩子中添加一个新的菜单项:

  $items['placeholder/%menu_wildcard_arg_optional'] = array(

    'title' => '占位符示例',

    'description' => '一个通配符用作占位符的菜单项.',

    'page callback' => 'menu_wildcard_callback_page',

'page arguments' => array(1),

'file' => 'menu_wildcard.pages.inc',

    'access callback' => TRUE,

  );

 

    并在module文件中添加一个新的函数:

function menu_wildcard_arg_optional_load($id){

  $mapped_value = "";

  $mappings = array(

  'a' => "美国",

'b' => "英国",

'c' => "中国",

);

  if (isset($mappings[$id])) {

    $mapped_value = $mappings[$id];

  }

  if(empty($mapped_value)){

$mapped_value = t('当前ID @id 没有对应的值',array('@id' => $id));

  }

  return $mapped_value;

}

 

     清空缓存,让我们访问路径placeholder/a/b/c/d,得到图3-20所示的结果。

图片1.png 

          图 3-20.页面参数被_load()函数替换了

 

    参数a被替换成了“美国”,神奇吧!路经placeholder/%menu_wildcard_arg_optional是怎么一回事呢?我们在这里详细的解释一下:

 

    1.使用/字符将路径切分成各个部分。

    2.在第2部分中,匹配从%到下一个可能的/字符之间的字符串。在这里,该字符串就是menu_wildcard_arg_optional

    3. 向该字符串上追加_load,来生成一个函数的名字。在这里,该函数的名字就是menu_wildcard_arg_optional_load

    4. 调用该函数,并将Drupal路径中通配符的值作为参数传递给它。所以,如果Drupal路径为placeholder/a/b/c/d,那么通配符匹配的第2部分就是a,那么调用的就是menu_wildcard_arg_optional_load ('a')

    5. 使用这个调用所返回的结果来替换通配符。这里的页面参数为array(1),在页面回调被调用时,我们没有传递Drupal路径中的部分1(a),而是传递了menu_wildcard_arg_optional_load ('a')返回的结果,也就是“美国”。我们可以把它看作,Drupal路径中的一部分被它对应的_load()函数替换了。

    6. 注意,标题回调和访问控制回调也可以使用这种替换方式。

 

    在Drupal中,这种占位符形式的参数替换是非常常见的,比如最核心的node/%node,user/%user,就采用了这种方式。为了更好的理解这种替换,以node/%node/edit为例,我们可以把它看作是node/%/edit,外加了一个隐藏指令:为通配符匹配的内容运行node_load()


Drupal版本: