5

我确信这对 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;
  }
}

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

$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(),
);

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

4

2 回答 2

4

做你所要求的并不是一项艰巨的任务。

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

    array(
      1 => 'a-a',
      2 => 'a-b',
      3 => 'a-c',
      4 => 'a-d',
      1 => 'b-a',
      2 => 'b-b',
    )
    
  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();
    

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

于 2010-03-06T07:52:59.740 回答
1

你见过分层选择模块吗?它是 CCK 字段类型。

有关此模块的更多详细信息(来自其项目页面):

... 定义了“hierarchical_select”表单元素,这是让用户在层次结构中选择项目的一种大大增强的方式。

分层选择能够保存选择的整个谱系或仅保存“最深”的选择。您可以将其配置为强制用户在树中尽可能深地进行选择,或者允许用户在树中的任何位置选择项目。可以标记级别,可以配置限制可以选择的项目数量,为 Dropbox 配置标题,选择站点范围的动画延迟等等。您甚至可以通过分层选择创建新项目和关卡!

于 2010-03-11T15:15:53.863 回答