Drupal - 自定义模块 - 生成动态URL别名

时间:2017-03-30 20:01:14

标签: drupal drupal-7 drupal-modules

我有一个自定义drupal模块。我有一个针对不同API的演示页面。 (例如,host.com / android / abc或host.com/demo/bcd或host.com/demo/def ...)

hook_menu()

$items['demo/%'] = array(
        'page callback' => 'xxx',
        'page arguments' => array(1),
        'access callback' => 'xxx',
        ....
    ); 

我想将所有演示页面的URL更改为host.com/abc/demo。由于我不能一个开头的外卡(比如%/ demo)我正在考虑URL别名。但是如何为所有演示页面动态生成url别名?

1 个答案:

答案 0 :(得分:0)

最佳解决方案: http://www.zyxware.com/articles/3636/drupal-how-to-create-url-alias-for-custom-menu-implementation-of-hook-pathauto

否则:

在您需要知道可用的所有动态解决方案都不完全安全之前,请在使用之前注意。

使用url_alias可以试试这个,但是你必须按照定义的路径进行限制以避免洪水插入:

function mymodule_menu(){
  $items= array();
  $items['demo/%'] = array(
    'page callback' => 'xxx',
    'page arguments' => array(1),
    'access callback' => 'xxx',
    );
  return $items;
}
function mymodule_init(){
  global $language;
  $path_allowed = array(
    'abc',
    'dbe'
  ); // restrict to avoid flood
  if(arg(1) == 'demo' && in_array(arg(0), $path_allowed)) { // detect demo mode
    $path = arg(1).'/'.arg(0);
    $alias = arg(0).'/'.arg(1);
    $a = db_query('SELECT alias FROM url_alias WHERE source = :source AND alias = :alias', array(':source' => $path, ':alias' => $alias))->fetchField();
    if($a == null) ) {
      db_insert('url_alias')->fields(array(
        'source' => $path,
        'alias' => $alias,
        'language' => $language->language
      ))->execute();
    }
  }
}

否则,我不确定,但你也可以尝试这个,你可以从hook_init处理它,但它可能导致一些问题形成所有模块加载init

function mymodule_init(){
  if(arg(1) == 'demo') { // detect demo mode
    $mycallbacks = array( // define your callback related 
      'abc' => 'mymodule_callback1',
      'dbe' => 'mymodule_callback2',
    );
    if(isset($mycallbacks[arg(0)]) && function_exists($mycallbacks[arg(0)])) { // if  callback is available
      call_user_func($mycallbacks[arg(0)]); // call it
    }
  }
}

function mymodule_callback1(){ //do what you want }
function mymodule_callback2(){ //do what you want }

因此,mysite.com/abc/demo将执行mymodule_callback1()并且mysite.com/dbe/demo将执行mymodule_callback2()

等。

清除所有缓存并查看:)