1

Drupal 7 で「form_alter」フックを実装しています。タイプ「article」のノードを削除した後、Web を特定のノードにリダイレクトしたいと考えています。そうする適切な方法は次のようです。

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

    }

このコードをモジュールに配置すると、ノードの削除を確認した後にリダイレクトされますが、ノードは実際には削除されません。ホームページにアクセスすると、ノードはまだ生きています!

コードを削除すると、ノードは期待どおりに削除され、Web ページは通常どおりフロントページにリダイレクトされます。

私は何を間違っていますか?

更新:リダイレクトハンドラーを追加する前に、次の行を書き込むリダイレクトアクションの前に「node_delete_confirm_submit」を強制しました:

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

これで問題は解決します。

4

2 に答える 2

1

このタスクを達成する (しかもフックをまったく使用する必要がない) 最も簡単な方法は、Rulesモジュールを使用することです。これは、サイトで任意の数のアクションを実行するためのクリーンな方法であり、特定のタイプのコンテンツが削除された後にユーザーをリダイレクトするためのルールがあることを私は知っています.

于 2013-08-22T19:00:57.750 に答える
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';トリガーする必要があります。これで、削除とリダイレクトの両方がトリガーされます。

于 2013-11-19T12:00:44.797 に答える