2

我为基于 Drupal 的 Web 应用程序构建了一个“快速链接”下拉选择框。选择框被实现为标准的 Drupal 表单,它出现在站点的所有页面上。当用户选择一个选项并提交表单时,我想将用户重定向到适当的页面,但让他们在完成后返回到原始页面。

例如,用户在 node/5 上,并选择了一个快速链接,将他们带到另一个表单。当他们完成此表格后,我希望他们返回到 node/5。

我已经在系统的其他部分实现了这一点,使用 drupal_get_destination 将 ?destination=node/5 查询字符串参数附加到目标表单,这很好用。但是,在我的快速链接表单提交处理程序中,我正在设置 form_state['redirect'] 来设置目标页面,如果我添加 ?destination= 参数,它会被 URL 编码,因此在我的目标时不会被拾取表单提交。

function dh_seo_quick_links_form_submit($form, &$form_state) {
  $form_state['redirect'] = $form['#link_targets'][$link].'?'.drupal_get_destination();
}

我是不是完全走错了路?这种重定向甚至可能吗?我可以直接用 $_REQUEST 变量做一些聪明的事情吗?

4

5 回答 5

12

这是 Drupal 7 的一个很好的解决方案,它允许您使用相对路径:

$form_state['redirect'] = array(
  'node/[node number]',
  array(
    'query' => array(
      'variable_name' => 'value',
    ),
    'fragment' => 'hash_fragment'
  ),    
);

此代码创建以下网址:

..?node/[node number]&variable_name=value#hash_fragment

这使您在利用 Drupal 框架的同时具有很大的灵活性。

于 2013-02-20T16:57:17.277 回答
5

好的 - 我已经解决了。似乎如果您在 $form_state['redirect'] 中设置相对 URL,它会进行 URL 编码,但绝对 URL 不会:

$form_state['redirect'] = 'myform?'.drupal_get_destination();

重定向到 myform%3Fdestination%3Dnode%252F5

global $base_url;
$form_state['redirect'] = $base_url.'/myform?'.drupal_get_destination();

重定向到 myform?destination=node/5,这正是我想要的。

于 2010-11-10T16:07:48.633 回答
3

您可以为目标查询提供一个数组$form_state['redirect']并将其作为第二个参数。例如:

$form_state['redirect'] = array(
 'myform', array('query' => drupal_get_destination()),
);
于 2012-05-01T16:54:11.253 回答
0

你的答案对我有用,马克。谢谢!

你也可以这样做:

global $base_url;
$form['#redirect'] = $base_url .'/'. $form['#redirect'] .'?test=hello';
于 2011-05-10T06:56:18.663 回答
0

最后我得到了这个解决方案:

global $base_url;
$form_state['redirect'] = $base_url . '/myform?' . drupal_get_destination();
于 2012-10-05T12:33:56.607 回答