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 hook 处)并查看里面有什么(当我遇到 FAPI-Issues 时,这总是我做的第一件事)。希望这可以帮助。

于 2014-04-15T17:28:06.357 回答