Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用jQuery在Drupal6中创建动态表单?_Jquery_Forms_Drupal_Dynamic_Selector - Fatal编程技术网

如何使用jQuery在Drupal6中创建动态表单?

如何使用jQuery在Drupal6中创建动态表单?,jquery,forms,drupal,dynamic,selector,Jquery,Forms,Drupal,Dynamic,Selector,我有一个Drupal表单,当然是用PHP编写的,它有两个选择器。第一个是Drupal主题列表,第二个是可用区域列表。在Drupal中,某些主题具有某些区域,可以将块放入其中,因此当选择主题时,我希望区域选择器由与所选主题关联的可用选项填充 我希望我的javascript文件使用jQuery来侦听主题选择器,以便在发生更改时更新区域选择器 我已经设置了PHP模块,这样就有了一个2D值数组,比如array['theme']=可能的区域值数组。像这样: Array ( [garland] =>

我有一个Drupal表单,当然是用PHP编写的,它有两个选择器。第一个是Drupal主题列表,第二个是可用区域列表。在Drupal中,某些主题具有某些区域,可以将块放入其中,因此当选择主题时,我希望区域选择器由与所选主题关联的可用选项填充

我希望我的javascript文件使用jQuery来侦听主题选择器,以便在发生更改时更新区域选择器

我已经设置了PHP模块,这样就有了一个2D值数组,比如array['theme']=可能的区域值数组。像这样:

Array
(
[garland] => Array
    (
        [left] => left
        [] => 
        [right] => right
    )

[zen] => Array
    (
        [] => 
        [sidebar_first] => sidebar_first
        [sidebar_second] => sidebar_second
    )
)
这是由以下代码完成的:

$themeQuery = db_query('SELECT DISTINCT theme from {blocks}');
    while($row = db_fetch_object($themeQuery)){ 
        $regionQuery = db_query('SELECT DISTINCT region from {blocks} WHERE theme="%s"',$row->theme);
     while($regions = db_fetch_object($regionQuery)){
        $regionOptions[$row->theme][$regions->region] = $regions->region;
     }
     $themeOptions[$row->theme] = $row->theme;
  }
以下是表格:

$form = array();
 $form['title'] = array(
     '#type'    => 'markup',
     '#value'   => '<br/><h4>Update block: <strong>'.$module.': '.$delta.'</strong></h4>'
  );
 $form['theme'] = array(
    '#title'            => 'Theme',
    '#type'             => 'select',
    '#options'          => drupal_map_assoc($themeOptions),
    '#default_value'            => $currentTheme,
  );
  $form['region'] = array(
    '#title'            => 'Region',
    '#type'             => 'select',
    '#options'          => array(''),
    '#default_value'    => $currentRegion,
  );
下面是我在PHP代码中尝试drupal_add_js的过程:

drupal_add_js(array('regions' => $regionOptions),'setting');
如果我尝试执行以下操作,此函数将起作用:

drupal_add_js(array('regions' => 'test'),'setting');
然后调用javascript:

alert(Drupal.settings.regions);
它会发出警报“测试”


我希望我问对了,谢谢你:

我想明白了!所以我想在这里把我的研究结果分享给任何想知道的人

drupal_add_js函数将javascript直接添加到页面的输出中。您可以使用它来设置变量,就像您在javascript中编码时直接做的那样

下面是我模块中的php代码,它添加了javascript以及位于同一目录中名为“simple_block_selector.JS”的JS文件

// creates outside array
   drupal_add_js("var regions = new Array();",'inline');  
   foreach($regionOptions as $t=>$theme){
        // creates new array for within regions array
        drupal_add_js("var ".$t."= new Array();",'inline');
        drupal_add_js("regions['".$t."']=".$t.";",'inline');
        $counter = 0;
        foreach($theme as $region){
            if($region != ''){
                drupal_add_js("regions['".$t."']['".$counter."'] = '".$region."';",'inline');
            }
            else{
                drupal_add_js("regions['".$t."']['".$counter."'] = 'none';",'inline');
            }
            $counter++;
        }
   }
  drupal_add_js(drupal_get_path('module','simple_block').'/simple_block_selector.js');
正如您在代码中看到的,您只需使用“drupal_add_js”,然后使用引号在javascript中键入您通常会键入的内容。当必须将PHP变量传递给它时,可以使用字符串和变量之间的“.”来连接它。如果为空,我将其指定为显示“无”,以便用户更好地理解选择。“内联”表示脚本应内联放置

然后在我的javascript文件中,我让它首先删除第二个选择器中的所有选项。然后根据选择的主题选择特定区域数组。然后它通过该数组进行解析,将每个值添加到另一个选择器中,如下所示:

$(document).ready(function(){
$('#edit-theme').change(function(){
    $('#edit-region').find('option').remove();
    for(var i=0; i<regions[$(this).val()].length;i++)
        {
            $('#edit-region').append($('<option>').text(regions[$(this).val()][i])); 
        }
});
})

如果您不知道选择器的id,您可以转到页面,右键单击以执行“查看源”操作,查看它们作为id提供的内容


就这些!我确实让模块检查表单的当前值是基于块的id的,并将它们设置为表单上的默认值。它还查找与块的默认主题关联的区域,并在第一次显示页面时显示这些区域。我想粘贴完整的代码,但我觉得没有必要,因为这些部分解释了我是如何回答我的问题的。

不知道这是否有帮助,但Drupal有一些内置的ajax功能,您可以利用:谢谢!我确实知道如何只用PHP和jQuery来实现它,我在下面解释了我的步骤
$(document).ready(function(){
$('#edit-theme').change(function(){
    $('#edit-region').find('option').remove();
    for(var i=0; i<regions[$(this).val()].length;i++)
        {
            $('#edit-region').append($('<option>').text(regions[$(this).val()][i])); 
        }
});