web-dev-qa-db-ja.com

ノードが追加または編集された後にカスタムページにリダイレクトする

_hook_form_alter_を使用して、作成または編集されたノードの代わりにノードを作成または編集した後、ユーザーをカスタムページにリダイレクトするにはどうすればよいですか?

hook_form_alter()の現在のコードは次のとおりです。

_function custom_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#id'] == 'custom-node-form') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
  }
}
_
14
Citricguy
_function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}
_

コードは、フォームを送信するためにクリックされたボタンとは別にフォームをリダイレクトします。特定の送信ボタンがクリックされたときにのみフォームをリダイレクトする場合は、次のコードを使用する必要があります。

_function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['actions']['submit']['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}
_

  • フォームIDにはハイフンが含まれていません。フォームIDは、フォームを生成するPHP関数(別名、フォームビルダー))の名前であり、PHP関数は、その名前にハイフンを含めることはできません。
  • フォームIDは hook_form_alter()hook_form_BASE_FORM_ID_alter() 、および hook_form_FORM_ID_alter() の実装に渡されます。 hook_form_FORM_ID_alter()は特定のフォームに対して呼び出されるため、実際には必要ありませんが、他の2つのフックは複数のフォームに対して呼び出されます。
  • 最初の関数は hook_form_BASE_FORM_ID_alter() ;の実装です。この場合、ベースフォームIDは「node_form」で、ノード編集フォームのベースフォームです。
  • ノード編集フォームには、編集中のオブジェクトのノードオブジェクトである_$form['#node']_が含まれています。 「カスタム」は、ユーザーがノードを編集した後にユーザーをリダイレクトするコンテンツタイプの短いIDです。
  • _$form_state['redirect']_をhook_form_alter()から変更しても効果はありません。送信ハンドラから設定する必要があります。
16
kiamlaluno

このコードはDrupal 7サイトで動作します。

/**
 * Implements hook_form_alter()
 */

function custom_form_alter(&$form, &$form_state, $form_id) {    
  if ($form_id == 'article_node_form') {
    $form['actions']['submit']['#submit'][] = 'mysubmit_node_submit';
  }     
}

function mysubmit_node_submit($form, &$form_state) {
  $form_state['redirect'] = '/homepage';
}
9
sea26.2

これは、たとえば次のいずれかの行を使用して、_$form_state['redirect']_を設定することで実行できます。

_$form_state['redirect'] = "some-internal-path";
_
_$form_state['redirect'] = array($path, $options_array, $http_code);
_

drupal_goto() に渡す引数と同じです。

4
Shoaib Nawaz

これがオプションであるかどうかはわかりませんが、これがコンテンツタイプの場合は、特定のコンテンツタイプの更新または作成時にトリガーされるルールを設定することにより、Rulesモジュールを使用してこれをかなり迅速に達成できます。

2
Aaron Ortega