Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Drupal 创建带有参数的视图的菜单链接_Drupal_Menu_Hyperlink_Arguments - Fatal编程技术网

Drupal 创建带有参数的视图的菜单链接

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( '

我正在尝试使用hook_菜单创建一个指向带有参数的视图的链接。但是,如果我使用已在视图中设置为路径的路径(在
$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;
}
?>