我所拥有的是一个Drupal表单,用PHP编写,当然有两个选择器。第一个是Drupal主题列表,第二个是可用区域列表。在Drupal中,某些主题具有可用于放置块的某些区域,因此当选择主题时,我希望区域选择器由与所选主题相关联的可用选项填充。
我希望我的javascript文件使用jQuery来监听主题选择器,以便在更改时,它将更新区域选择器。
我已经设置了PHP模块,因此存在一个2D数组值,使得array ['theme'] = array()可能的区域值。像这样:
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,
);
我真正需要做的就是将2D数组$ regionOptions放入javascript中!我试过drupal_to_js和drupal_add_js,但它不起作用!
到目前为止javascript是这样的:
$(document).ready(function(){
$('#edit-theme').change(function(){
alert(Drupal.settings.regions[$(this).val()]);
});
});
这是我对drupal_add_js的尝试(在PHP代码中):
drupal_add_js(array('regions' => $regionOptions),'setting');
如果我尝试这个功能,这个功能有效:
drupal_add_js(array('regions' => 'test'),'setting');
然后在javascript中调用:
alert(Drupal.settings.regions);
警告'测试'。
我希望我问这个问题,谢谢你。)
答案 0 :(得分:0)
好吧我明白了!所以我想在这里与其他想要了解的人分享我的成果。
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变量传递给它时,你使用连接(在字符串和变量之间使用'。'来附加它)。如果它是空白的,我将其指定为显示“无”,以便用户可以更好地理解选择。 'inline'表示脚本应该内联。
然后在我的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,并将它们设置为表单上的默认值。它还会找到与块的默认主题关联的区域,并在首次显示页面时显示它们。我会粘贴完整的代码,但我觉得没有必要,因为这些部分解释了我如何回答我的问题。