Drupal 创建带有参数的视图的菜单链接
我正在尝试使用hook_菜单创建一个指向带有参数的视图的链接。但是,如果我使用已在视图中设置为路径的路径(在Drupal 创建带有参数的视图的菜单链接,drupal,menu,hyperlink,arguments,Drupal,Menu,Hyperlink,Arguments,我正在尝试使用hook_菜单创建一个指向带有参数的视图的链接。但是,如果我使用已在视图中设置为路径的路径(在$items[view path/%dest]中),则链接不会出现。我猜某处有路径冲突。有办法解决这个问题吗?或者我可以使用其他方法返回视图吗 我正在使用以下代码: /** * implementation of hook_menu(). */ function sign_custom_menu() { $items['view-path/%dest'] = array( '
$items[view path/%dest]
中),则链接不会出现。我猜某处有路径冲突。有办法解决这个问题吗?或者我可以使用其他方法返回视图吗
我正在使用以下代码:
/**
* implementation of hook_menu().
*/
function sign_custom_menu() {
$items['view-path/%dest'] = array(
'title' => 'Link to view',
'page callback' => 'sign_custom_hello',
'page arguments' => array(1), //(corrected typo from 'page arguements')
'access callback' => TRUE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'menu-student-links',
);
return $items;
}
function dest_to_arg() {
// would normally be dynamic to get view with correct argument
$arg = 73;
return $arg;
}
提前谢谢
附加
我对自定义模块中的通配符URL没有太多经验,但我在Pro Drupal开发书中研究了这个问题。从我在中所读到的内容来看,我认为您可能希望使用$items['view-path/%']。使用%dest显然会使drupal查找dest_加载函数。出现在菜单中的项不能由通配符路由器项创建:每个菜单项只对应一条路径。也就是说,如果您有一个路由器项是
foo/%bar
,并且%bar
可以有10个不同的值,Drupal的菜单系统不会根据一个路由器项定义创建10个新菜单项
所以,您需要做的是提前为每个可能的参数创建一个路由器项。否则,您将不得不查看Drupal的菜单系统之外,并考虑创建一个单独的视图块,它看起来像一个菜单,但实际上是一个视图无序的可用选项列表
要实现前者,您需要实现在所有其他操作之后添加自定义路由器项,包括您尝试覆盖的通配符路由器项。您的自定义路由器项将或多或少与通配符路由器项相同,但设置了一些通常从通配符派生的默认值
例如,如果我想为user/1/edit
创建一个新的路由器项,它覆盖内置的user/%user\u category/edit
,我将实现hook\u menu\u alter()
:
function mymodule_menu_alter(&$items) {
// user_edit and user_edit_access expect a user object
$account = user_load(array('uid' => 1));
$items['user/1/edit'] = array(
'type' => MENU_CALLBACK,
'page arguments' => array($account),
'access arguments' => array($account),
) + $items['user/%user_category/edit'];
}
在本例中,user/%user\u category/edit
分别调用页回调和访问回调,它们都试图使用通配符。由于路由器项中没有通配符,因此需要重写参数,以显示“检查用户1”
您将对通配符的每个可能值执行此操作
但这还不够:请注意,我使用了MENU\u CALLBACK
而不是MENU\u NORMAL\u项
。如果您使用菜单\u普通\u项
,您的路由器项将显示在导航菜单中,而不是自定义菜单中,即使您设置了菜单名
(我不知道为什么:它应该可以工作)。但是你可以通过使用
考虑以下实施:
在这个实现中,它检查自定义路由器是否已经创建,并且没有被修改。如果这是真的,它将在主链接菜单中创建一个菜单链接,该链接引用您的自定义路由器项
显然,由于这是在hook_init()
中,因此它将在每个页面上执行检查:这是为了确保它在重建菜单后激发。这本不应该是一个很大的性能打击,但它的东西要记住
正如您所见,这是一个漫长的过程:如果您不打算使用“视图”菜单路径,那么最好自己手动创建链接。我成功地回答了我的问题。基本上,我使用了与我在视图中设置的路径不同的路径,然后使用views_page()作为我的“页面回调”。我向它传递了视图的参数、页面ID和它自己的附加参数,以使视图工作。通过使用to_arg()函数,我可以在菜单项中使用通配符传递给视图,该函数与hook_menu()一起工作,以传递通配符。“页面参数”传入这三个参数。最后一个参数“1”是参数在路径中出现的位置的引用(从0开始) 工作守则是:
<?php
/**
* implementation of hook_menu().
*/
function sign_custom_menu() {
$items['view-path/%dest'] = array(
'title' => 'link to view',
'page callback' => 'views_page',
'page arguments' => array('view_name', 'page_1', 1),
'access callback' => TRUE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'menu-student-links',
);
return $items;
}
//this function is needed from the "%dest" argument in hook_menu above
function dest_to_arg() {
// would normally be dynamic to get view with correct argument
$arg = 73;
return $arg;
}
?>
您的$items
声明中有一个输入错误:在页面参数中的'u'后面没有'e'。您应该显示sign\u custom\u hello()的代码。
;没有看到代码就不可能给出正确的答案。马克-谢谢你。我不认为这是问题所在——我已经测试过了,没有任何区别。但是,当我将路径更改为与视图不同的路径时,链接工作正常。Kiamlaluno-我添加了代码,尽管我认为这不会影响链接。当我将$items[view path/%dest]中的路径更改为与视图不同的路径时,该链接将起作用。感谢您的回复。我有一本这本书。在第79页,它们显示了一个to_arg函数,用于将通配符参数传递给菜单项。这是我提出的最重要的论点。这将引用dest_to_arg(),它将参数传递给路径。无法单独使用%,因为Drupal不知道构建链接的价值。嗨,Mark,非常感谢您花时间回答我的问题。我设法找到了一种更简单的方法来解决使用通配符的问题(见下文)。这里有记录:。这里还有一个有用的例子:。嗨,马克,我在谷歌上搜索,想知道为什么我的菜单项总是被分配到“导航”而不是“菜单自定义”。出于某种原因,如果您显式地将类型设置为“菜单\正常\项”,它会自动使用“导航”作为目标菜单。但是,菜单项是默认类型。如果您设置了菜单名称而未设置类型,则菜单将显示在正确的位置。
function mymodule_init() {
$router_path = 'user/1/edit';
// Check to see if the custom router item has been added to menu_links.
// This is to ensure the menu has already been rebuilt.
$router_item = db_fetch_object(db_query("SELECT * FROM {menu_links} WHERE router_path = '%s'", $router_path));
// Only create a new menu item if the router item exists and it
// hasn't already been created (it's hidden until created).
if ($router_item && $router_item->hidden) {
$item = array(
'link_title' => 'Edit Administrator',
'link_path' => $router_path,
'menu_name' => 'primary-links',
'router_path' => $router_path,
'mlid' => $router_item->mlid,
);
// Save the menu item.
menu_link_save($item);
}
}
<?php
/**
* implementation of hook_menu().
*/
function sign_custom_menu() {
$items['view-path/%dest'] = array(
'title' => 'link to view',
'page callback' => 'views_page',
'page arguments' => array('view_name', 'page_1', 1),
'access callback' => TRUE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'menu-student-links',
);
return $items;
}
//this function is needed from the "%dest" argument in hook_menu above
function dest_to_arg() {
// would normally be dynamic to get view with correct argument
$arg = 73;
return $arg;
}
?>