2

2 つの選択ボックスを持つカスタム ブロックをプログラムで作成しています。最初の値は自動的に入力され、2 番目の値は最初の値に基づいて入力されます。理想的には AJAX を使用したいと考えており、AJAX を標準フォームに統合した経験がありますが、ブロック構成フォームには $form_state 変数が含まれておらず、機能が異なるようです。標準的な方法は使用できますか?

'#ajax'               => array(
  'callback'          => 'my_callback',
  'wrapper'           => 'the-id',
  'method'            => 'replace',
  'effect'            => 'fade',
),

コールバックはどのように機能しますか?

ありがとう、ハウィー

4

1 に答える 1

0

私はこれを試していませんが、うまくいくに違いありません: hook_form_alter() を使用して、ブロック構成フォームにアクセスします。そこに &$form_state があり、高度な AJAX を実行できるようになります (これを参照してください)。難しいのは、オルターフックでフォームのみを変更することです。可能な方法:

これが機能するかどうかはわかりません(最もエレガントな方法):

 function mymodule_form_alter(&$form,&$form_state,$form_id) {
      if ($form_id == 'block_admin_configure' ) {
        // Find the delta in the $form variable
        if ($form['delta'] == 'the_delta_you_are_looking_for') {
         //do fancy ajax stuff
        }
      }
    }

醜いが間違いなく可能:

function mymodule_form_alter(&$form,&$form_state,$form_id) {
  if ($form_id == 'block_admin_configure' && arg(4) == 'mymodule') {
       //do fancy ajax stuff
    }
  }
}

さらに醜いですが、可能性もあります:

function mymodule_block_configure($delta = '') {      
    $form = array();
    if ($delta == 'my_block') {
        $form["my_block_change_this"] = array(
            "#type" => "hidden",
            "#value" => "lalala",
        )
    }
}

function mymodule_form_alter(&$form,&$form_state,$form_id) {
    if ($form_id == 'block_admin_configure' ) {
        if (!empty($form['my_block_change_this'])) {
            //do fancy ajax stuff
        }
    }
}

ヒント: form_state-array を (alter フックで) 印刷して、そこにあるものを確認します (これは、FAPI の問題に遭遇したときに常に最初に行うことです)。お役に立てれば。

于 2014-04-15T17:28:06.357 に答える