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


15

を使用して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');
  }
}

「そのためのモジュールがあります」:ノード宛先(drupal.org/project/node_destination)が、D6でのみ使用可能です。たぶんそれを適応させることができます。
ベンジ

回答:


16
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()も効果はありません。送信ハンドラから設定する必要があります。

これをありがとう。注意&ではfunction custom_node_submit($form, &$form_state) {非常に重要です。そうしないと、状態を参照として渡しておらず、手動で行った編集が有効になりません。
ブラム

9

このコードは、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';
}

どの答えを#4と呼んでいますか?
ЕлинЙ.

なぜこれが機能しないのですか?私は同じコードを使用しています
ルビー14

キャッシュ@rubyをクリアしましたか?
コーダーマ

既存のノードの場合、先に宛先を設定解除することをお勧めします。宛先は通常、ページの編集ボタンdrupal.stackexchange.com/a/192271/15055をクリックするとURLに追加されます。admin/content
レイマンクス

4

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

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

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


フィードバックをありがとう@Shoaib Nawaz。$ form_state ['redirect']をhook_form_alterフックに追加しましたが、うまくいきませんでした。
Citricguy

私の人生では、どこでも$ form_state ['redirect']を有効にすることはできません。
Citricguy

ノードを追加または編集した後にリダイレクトしようとすると、これは機能しません。理由を確認するには、ノードフォームsubmitを見てください。TRUEと評価された$form_state['redirect']場合、割り当てた値はすべて上書き($node->nid)されます。
フリーラジカル

2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.