Drupal动态选择表单

Jus*_*ime 5 javascript php jquery drupal form-api

我确信这对jQuery专家来说很简单,但我是一个后端人,并且找不到最好的方法来做到这一点.我在Drupal中有两个数组,一个是视图名称列表,另一个是包含每个视图的显示列表的数组.这是填充两个数组的代码:

 //load list of views in to array for select lists
$views = views_get_all_views();
$viewnames = array();
$viewdisplays = array();
foreach ($views as $view) {
  $viewnames[$view->name] = $view->name; 
  foreach ($view->display as $k) {
    $id = $k->id;
    $title = $k->display_title;
    $viewdisplays[$view->name]['id'] = $id;
    $viewdisplays[$view->name]['title'] = $title;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的表单的片段:

$form['view'] = array(
  '#type' => 'select',
  '#title' => t('Select the view to be used for display'),
  '#options' => $viewnames,
);
$form['view_display'] = array(
  '#type' => 'select',
  '#title' => t('Select the display of the gallery view to be used'),
  '#options' => array(),
);
Run Code Online (Sandbox Code Playgroud)

我想要做的是,使用适当的值动态填充view_display选择框.如果用户从"视图"选择中选择"我最喜欢的视图",我想将$ viewdisplays ['我最喜欢的视图']数组显示为'view_display'字段的#options.

goo*_*orp 4

完成你所要求的事情并不是一件困难的事情。

  1. Drupal 知道选择的表单项有哪些选项,因为它保留了表单的副本。因此,您需要使用它可以具有的所有选项来预先填充要更改的选择的选项。此外,您还需要确保它们的值是唯一的,这样您就不会得到如下所示的数组:

    array(
      1 => 'a-a',
      2 => 'a-b',
      3 => 'a-c',
      4 => 'a-d',
      1 => 'b-a',
      2 => 'b-b',
    )
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在你有两个选择
    1. 您可以使用 向 javascript 发送每个视图的选项
      drupal_add_js($array, 'setting')。这会将 添加到变量$arrayDrupal.settings
    2. 您可以通过 AJAX 获取选项。在这种情况下,您必须使用 来创建一个菜单项hook_menu
  3. 现在,您只需对视图选择中的更改做出反应,并相应地添加它们的选项,无论是从 ajax 调用还是从 js 变量获取它们。我建议使用变量方法。这可能看起来像这样:

    $("#edit-view").change(function(){
        $("#edit-view_display").html(Drupal.settings.myVariable[$(this).val()]);
    }).change();
    
    Run Code Online (Sandbox Code Playgroud)

    您需要将此 js 添加到您的表单中。您可以将其放入 js 文件中,将其包装$(document).ready并添加drupal_add_js