我有一个自定义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别名?
答案 0 :(得分:0)
否则:
在您需要知道可用的所有动态解决方案都不完全安全之前,请在使用之前注意。
使用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()
等。
清除所有缓存并查看:)