2011-03-14 103 views
1

我是Drupal开发新手。所以......我创建了一个新模块并将其命名为“应用”。Drupal中自定义模块的自定义网址?

该模块简单地查询我的数据库中的节点并显示它。要访问此模块,我访问http://domain/apps/1,其中1是节点ID。

我的问题是,

如何更改“应用”到别的东西不改变模块的名字吗?

回答

1

使用“路径”模块,它包含在drupal distr。中,然后手动创建关联“apps”到别的别名。如果你想自动路径别名,Pathauto也会很有用。

3

这样的路径在hook_menu()中定义,你的情况应该在函数apps_menu()中。您可以简单地使用其他路径,尽管建议将其留在模块的名称空间内,以避免与其他模块发生冲突(请参阅注释以获取更多信息)。

+0

“您可以将其更改为任何您想要的,路径和模块名称之间没有任何关联。”技术上属实,但不好的做法。 Drupal没有命名空间,并且使用随机地址(与您的模块名称不完全匹配)会在某些时候导致难看的冲突。更好的办法是使用'/ modulename',然后使用pathauto最终将其更改为你所希望的。 – berkes 2011-03-14 08:55:15

+1

当然,但别名和pathauto无法解决所有问题。例如,我们最近添加了一项功能来覆盖默认前缀(/ messages),因为有些网站希望将私人消息作为用户配置文件中的本地任务。没有办法通过使用别名来达到这一点。 – Berdir 2011-03-14 11:26:56

+0

在这种情况下,您应该使用[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

1

看来你也可以使用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); 
} 

链接到hook_menu documentation