AJAXコールバック後にフォームがレンダリングされるときにすべてのAJAX機能をエミュレートするにはどうすればよいですか?


7

Drupalフォームがありますが、AJAXコールバックの結果としてページに追加しています。

新しいコールバックをトリガーするには、このフォームが必要です。以下の私のコード:

      $form['#suffix'] = '<div id="form-return-message-box">this is the return box</div>';
  $form['#attached']['js'] = array('misc/ajax.js');

  $form['markup'] = array(
    '#type' => 'markup',
    '#markup' => '<h2>This is a form</h2>'
  );


  $form['button'] = array(
    '#type' => 'button',
    '#value' => t('Submit'),
    '#ajax' => array(
      'callback' => 'module_myform_callback',
      'wrapper' => 'form-return-message-box',
      'method' => 'replace',
      'effect' => 'fade',
    ),
  );

  $replace_layer = '#somelayer';

  $commands = array();
  $commands[] = ajax_command_replace($replace_layer, drupal_render($form));
  $page = array(
    '#type' => 'ajax',
    '#commands' => $commands,
  );

  ajax_deliver($page);

これが何が起こるかです:このフォームは、ページに既に存在する 'somelayer'と呼ばれるコンテナーに追加されます(コードのその部分は不要だと思ったので、追加しませんでした)。これは、「use-ajax」クラスとのリンクから呼び出されました。

そのため、リンクによってトリガーされるAJAXコールバックの後に、フォームは必要に応じてページにレンダリングされます。この部分は大丈夫です。

しかし、これは(非常に)トリッキーな部分です:新しいフォームのAJAX機能を維持したいと思います(配列の '#ajax'の部分を確認してください)。これは発生しません。フォームがレンダリングされた後、ボタンはAJAXコードをトリガーしません。クリックすると、ページが更新され、コールバック関数がトリガーされません(スペースを確保するためにここに追加されていません)。

AJAXを使用した通常のフォームページのソースコードを調べると、AJAX機能を有効にする次のようなコードが表示されます。

"ajax":{"edit-something":{"callback":"module_formname_callback","wrapper":"wrapper-name","method":"replaceWith","effect":"fade","event":"change","url":"\/spabear\/system\/ajax" ...

ページに追加されたフォームのソースコードを見る<script></script>と、動的に読み込まれたフォームにAJAXコールバックをトリガーするコードがないことがわかります。AJAXコールバック後にフォームがレンダリングされるときに、すべてのAJAX機能をエミュレートするにはどうすればよいですか?


1
これを解決しましたか?:私は非常に同様の問題抱えているdrupal.stackexchange.com/questions/155527/...
cambraca

たぶんdrupal.org/node/1781242に関連してますか?
berliner 2016年

1
これはdrupal 8ですか?
Matt

回答:



0

#ajaxに 'prevent' => 'click'を追加してみてください。これにより、フォームがページを送信したり更新したりできなくなります。その後、問題のデバッグが少し簡単になるはずです。

    $ form ['button'] = array(
      '#type' => 'button'、
      '#value' => t( '送信')、
      '#ajax' => array(
        'callback' => 'module_myform_callback'、
        'wrapper' => 'form-return-message-box'、
        'メソッド' => '置換'、
        '効果' => 'フェード'、
        '防止' => 'クリック'、
      )、
    );

0

フォームに適切なライブラリが添付されていることを確認してください。したがって、ページに読み込まれるときに、定義された動作でこれらのライブラリを確実に使用できるようになります。

あなたの元の質問によれば、あなたはD7にいると思います:

  $form['#attached']['library'][] = array('system', 'drupal.ajax');
  $form['#attached']['library'][] = array('system', 'jquery.form');

あなたのコード例ではわかりませんが、責任を分解するためにできるだけ多くのことを試す必要もあります。フォームを生成する1つの関数、フォームを送信する1つの関数、ajaxを介してフォームを読み込んで送信する1つの関数などが必要です。

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