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機能をエミュレートするにはどうすればよいですか?