2010-03-05 64 views
5

我确信这对jQuery专家来说很简单,但我是后端人员,并且找不到最好的方法来完成此操作。我在Drupal中有两个数组,一个是视图名称列表,另一个是包含每个视图显示列表的数组。下面的代码来填充两个数组: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 ['我最喜欢的视图']数组作为'view_display'字段的#选项。

回答

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')。这会将$array添加到Drupal.settings变量。
    2. 您可以通过AJAX获取选项。在这种情况下,您必须创建一个菜单项hook_menu
  3. 现在,您只需对视图的select中的更改做出反应,并相应地添加它们的选项,或者从ajax调用或js变量中获取它们。我会推荐使用变量方法。这可能看起来像这样:

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

    您需要将此js添加到您的表单中。你可以把它放在一个js文件,把它包在$(document).readydrupal_add_js

1

加它,你见过Hierarchical Select模块?这是一个CCK字段类型。

这个模块(从它的项目页面)更多的细节:

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

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