web-dev-qa-db-ja.com

ラジオボタンの選択時にコールハンドラを送信するにはどうすればよいですか?

私は advanced poll sモジュールをDrupal 7.で使用します。7。ラジオボタンが選択されるとすぐに(なしで)投票が送信されるように動作を変更しようとしていますVote)を押す必要があります。

モジュールはajaxコールバックを使用しています:

$form['submit'] = array(
'#type' => 'submit',
'#ajax' => array(
  'callback' => 'advpoll_form_submit',
  'wrapper' => 'advpoll-form-' . $values->nid,
  'name' => 'submit1',
),
'#id' => 'edit-submit-advpoll-' . $values->nid,
'#value' => t('Vote'),

);

このコールバックをラジオボタンで呼び出すにはどうすればよいですか?

時間は本当の要素なので、私はすばやく汚れたjavascript/jQueryソリューションに満足しています。

私はjQueryソリューションを試しました:

$('input[type="radio"]').change(function() {
  $('#advpoll-form-296').trigger('click');
});

ただし、これは期待どおりのアクションを呼び出していません。

ページをリロードしたくないので、submit()を呼び出すことができません。

.moduleファイルのajax配列にクリックイベントを追加することで、元のコードを起動できました。

advpoll.module:

function advpoll_choice_form($form, &$form_state, $values) {

$form['submit'] = array(
'#type' => 'submit',
'#ajax' => array(
  'callback' => 'advpoll_form_submit',
  'wrapper' => 'advpoll-form-' . $values->nid,
  'name' => 'submit1',
  'event' => 'click', //Added click event
),
'#id' => 'edit-submit-advpoll-' . $values->nid,
'#value' => t('Vote'),

);

モジュール内のコードをオーバーライドしないでください。これをテーマフックに入れるにはどうすればいいですか?

4
nickf

これはそれを行うはずです:

_$(function() {
  $('input[type="radio"]').on('change', function() {
    $(this).parents('form').submit();
  });
});
_

$('input[type="radio"]')のセレクターを、使用しているフォームのスコープに修飾したい場合があります。そうでない場合、これを多くの異なるページでアクセスされるJavaScriptファイルに含めると、間違いなく問題が発生します。 !

デモ: http://plnkr.co/edit/8448bjiywnVtbT3CV6s6?p=info

2
geekmuse

これが投稿されてからしばらく経ちましたが、この回答がとにかく役立つことを願っています

それを行うために見つけた簡単な方法(私はadvpollモジュールも使用しています)は、hook_form_alterを使用して、同じAJAXハンドラーをオプションドロップダウンに追加することです

だから、私のカスタムモジュールで:

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  // The submit form has ID advpoll_choice_form
  if ($form_id == 'advpoll_choice_form') {
    foreach ($form as $key => &$value) {
      // It seems that the radio buttons are under an array labelled 'choice_X' 
      // where X is the number of options you have, so this just checks
      // it's doing it to the correct one
      if (substr($key, 0, 7) == 'choice_') {
        // Apply the same AJAX handler the submit button has to the radio buttons
        $value['#ajax'] = $form['submit']['#ajax'];
      }
    }
  }
}

これが将来の誰かを助けることを願っています

1
Andrew Morris