web-dev-qa-db-ja.com

公開されたビューフォームに追加のボタンと送信ハンドラを追加するにはどうすればよいですか?

公開されたビューフォームに2番目のボタンを追加したいと思います。

ボタンを表示することはできますが、ボタン送信ハンドラーを呼び出すことはできません。代わりに、ビューが自動的に提供する標準の検索ボタンと同じように動作します。

2番目のボタンで別のハンドラーを呼び出すにはどうすればよいですか?

以下は私がやろうとしたことです。

(FWIW、私の具体的な目標は、ユーザーが公開されたビューフォームを使用して既存のノードを検索できるようにすることです。それが見つからない場合は、先に進んで新しいノードを投稿します。そのため、新しいノードをポストするアクション。)


function my_module_form_alter(&$form, &$form_state, $form_id) {
  switch ($form_id) {
    case 'views_exposed_form':
      if ($form['#id'] = 'views-exposed-form-my-module-page-1') {
        // Add a button
        $form['my_button']['#type'] = 'button';
        $form['my_button']['#value'] = t('My Extra Button');
        $form['my_button']['#submit'] = array('my_module_button_handler');
      }
      break;
  }
}

function my_module_button_handler($form, &$form_state) {
  // do something here
}
4
chipcleary

OK、私はそれを機能させました。

いくつかのことをする必要がありました:

1)フォームでAJAX=をオフにします(オンにすると、My Button($ form_state ['clicked_button'] ['#value']は常にデフォルトのボタンでした)。

2)my_module_button_handlerで、$ from_state ['redirect']だけでなく、$ form_state ['no_redirect'] = FALSEも設定します。

AJAX=をオンにして動作させる方法を知っているなら、ヒントをいただければ幸いです。

2
chipcleary

送信ハンドラは、フォームのapi要素タイプ「ボタン」ではデフォルトでは呼び出されません。ボタンで送信ハンドラを実行する場合は、追加する必要があります

$form['my_button']['#executes_submit_callback'] = TRUE;

補足として、#typeが 'submit'の場合は当てはまりません。execute_submit_callbackは、デフォルトでその要素タイプのtrueに等しいからです。

お役に立てれば。

2
ericduran