我是Drupal开发新手。所以......我创建了一个新模块并将其命名为“应用”。Drupal中自定义模块的自定义网址?
该模块简单地查询我的数据库中的节点并显示它。要访问此模块,我访问http://domain/apps/1,其中1是节点ID。
我的问题是,
如何更改“应用”到别的东西不改变模块的名字吗?
我是Drupal开发新手。所以......我创建了一个新模块并将其命名为“应用”。Drupal中自定义模块的自定义网址?
该模块简单地查询我的数据库中的节点并显示它。要访问此模块,我访问http://domain/apps/1,其中1是节点ID。
我的问题是,
如何更改“应用”到别的东西不改变模块的名字吗?
使用“路径”模块,它包含在drupal distr。中,然后手动创建关联“apps”到别的别名。如果你想自动路径别名,Pathauto也会很有用。
这样的路径在hook_menu()中定义,你的情况应该在函数apps_menu()中。您可以简单地使用其他路径,尽管建议将其留在模块的名称空间内,以避免与其他模块发生冲突(请参阅注释以获取更多信息)。
看来你也可以使用wildcard loader argument。 如果你把%节点路径,它会自动调用node_load()和页面回调apps_view_node()收到满载节点对象。
/**
* Implementation of hook_menu.
*/
function apps_menu() {
$items = array();
// With this menu callback, apps_view_node() will receive a node object, instead of an integer.
$items['apps/%node/view'] = array(
'type' => MENU_CALLBACK,
'page callback' => 'apps_view_node_obj',
// 1 is the node object, 2 is 'view'.
'page arguments' => array(1, 2),
// Tells the load callback function, node_load(), what part of the URL to load, in this case the literal number 1.
'load arguments' => array(1),
);
// With this menu callback, apps_view_node() will receive an integer.
$items['apps/%/edit'] = array(
'type' => MENU_CALLBACK,
'page callback' => 'apps_view_node_int',
'page arguments' => array(1),
);
return $items;
}
/**
* Custom node view function.
* @param StdClass $node
* Fully loaded Drupal node object.
*/
function apps_view_node_obj($node) {
// Do something with the $node object.
$node->title = "Foo";
$node->body = "Bar";
node_save($node);
}
/**
* Custom node view function.
* @param int $id
* Node id.
*/
function apps_view_node_int($id) {
// Because we are receiving an id, we must manually load the node object.
$node = node_load($id);
$node->title = "Hello";
$node->body = "World";
node_save($node);
}
“您可以将其更改为任何您想要的,路径和模块名称之间没有任何关联。”技术上属实,但不好的做法。 Drupal没有命名空间,并且使用随机地址(与您的模块名称不完全匹配)会在某些时候导致难看的冲突。更好的办法是使用'/ modulename',然后使用pathauto最终将其更改为你所希望的。 – berkes 2011-03-14 08:55:15
当然,但别名和pathauto无法解决所有问题。例如,我们最近添加了一项功能来覆盖默认前缀(/ messages),因为有些网站希望将私人消息作为用户配置文件中的本地任务。没有办法通过使用别名来达到这一点。 – Berdir 2011-03-14 11:26:56
在这种情况下,您应该使用[hook_menu_alter](http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_menu_alter/6)。严重的是,我们最近不得不纠正并重写近2个月的工作,因为一些远程开发人员认为在整个地方使用'/ service'和'/ services'是一个好主意,我们需要在一个站点中实现它那实际上使用了服务模块。 – berkes 2011-03-15 14:37:56