2013-08-22 48 views
1

我在Drupal 7中实现'form_alter'钩子。我想在删除节点类型'文章'后将网络重定向到特定节点。 看来,这样做的正确方法是:节点删除后的重定向不会删除节点

function mymodule_form_alter(&$form, &$form_state, $form_id){ 

     switch ($form_id){ 
      case 'node_delete_confirm': 
      if($form['#node']->type == 'article'){ 
      $form['actions']['submit']['#submit'][] = '_mymodule_redirect'; 
      } 
      break; 
     } 

    } 

    function _mymodule_redirect($form, &$form_state){ 

      $form_state['redirect'] = 'node/60';  

    } 

当我把这个代码我的模块中它并确认节点删除后重定向,但该节点实际上并未删除,如果我去的主页它仍然活着!

如果我删除代码,则按预期方式删除该节点,并将网页像往常一样重定向到首页。

我在做什么错?

更新:我被迫重定向操作前的“node_delete_confirm_submit”加入我的重定向处理之前写下面一行:

$form['actions']['submit']['#submit'][] = 'node_delete_confirm_submit'; 

这解决了问题。

回答

1

完成此任务(而不必使用挂钩)的最简单方法是使用Rules模块。这是在您的网站上执行任意数量操作的一种很好的干净方式,我知道在删除特定类型的内容之后重定向用户有一条规则。

+0

我会给规则一个机会。你知道任何例子吗(使用Rules Api来做类似的事情)?我不介意使用任何模块作为我的模块的依赖项,但我不想从管理界面设置它。我仍然困惑为什么我的代码不工作。 – user2708473

+1

我终于找到了一个简单的解决方案。我添加了$ form ['actions'] ['submit'] ['#submit'] [] ='node_delete_confirm_submit';在添加重定向回调之前。感谢EJK提出的建议,我会在其他情况下考虑这一点。 – user2708473

0

只是为了澄清我重复整个正确答案:

/** 
* Implements hook_form_alter() 
*/ 
function MYMODULE_form_alter(&$form, &$form_state, $form_id){ 
    switch ($form_id) { 
    case 'node_delete_confirm': 
     // replace 'article' in next line with your node type machine name 
     if($form['#node']->type == 'article') { 
     $form['actions']['submit']['#submit'][] = 'node_delete_confirm_submit'; 
     $form['actions']['submit']['#submit'][] = '_MYMODULE_redirect'; 
     } 
    break; 
    } 
} 

function _MYODULE_redirect($form, &$form_state){ 
    // replace 'node/123' in next line with node you like redirect to 
    $form_state['redirect'] = 'node/123'; 
} 

只做$form['actions']['submit']['#submit'][] = '_MYMODULE_redirect';是不够的。仍然需要触发$form['actions']['submit']['#submit'][] = 'node_delete_confirm_submit';。现在删除和重定向都被触发。