我花了一些时间调查这个问题,我有一个可行的解决方案。
首先我们需要了解Zope和
ZPT
工作当您使用类似于
created.query:record:list:date
您告诉Zope进行一些参数转换:
-
记录
,将变量转换为记录属性
-
列表
,将变量转换为Python列表
-
日期
,将字符串转换为DateTime对象
有关详细信息,请查看
Advanced Zope Scripting
.
因此,参数会自动转换为Python中的字典记录,如下所示:
'created': {'query': [DateTime('2014/07/09 00:00:00 GMT-3')], 'range': 'min'}
我的错误是假设我必须在一个请求变量上传递所有列表元素。
我在表单末尾添加的代码如下所示:
<input type="radio"
id="query-date-range"
name="created.query:record:list:date:ignore_empty"
tal:attributes="value python:'';
checked python:checked=='' and 'checked' or '';"
/>
<label for="query-date-range" i18n:translate="time_range">Time range</label>
<input type="text"
id="range-start"
name="created.query:record:list:date:ignore_empty">
<input type="text"
id="range-end"
name="created.query:record:list:date:ignore_empty">
<script>
var today = new Date();
var yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
var start = yesterday.toLocaleDateString().slice(0, 10);
var end = today.toLocaleDateString().slice(0, 10);
$(document).ready(function() {
$("#range-start").datepicker();
$("#range-end").datepicker();
$('#range-start').hide();
$('#range-end').hide();
});
$('input:radio').change(function() {
var option = $('input:radio:checked', '#searchform').val();
if (option === '') {
$('#range-start').val(start);
$('#range-start').show();
$('#range-end').val(end);
$('#range-end').show();
$('#range').val('min:max');
}
else {
$('#range-start').val('');
$('#range-start').hide();
$('#range-end').val('');
$('#range-end').hide();
$('#range').val('min');
};
});
</script>
特别注意以下事项:
-
开始和结束日期是与jQueryUI日期选择器小部件相关联的输入元素。
-
两个输入元素共享相同的名称(
created.query:record:list:date:ignore_empty
)另一个是Zope魔术发生的地方:具有相同名称的所有输入元素的值都转换为一个唯一的列表记录,如下所示:
'created': {'query': [DateTime('2014/07/15 00:00:00 GMT-3'), DateTime('2014/07/16 00:00:00 GMT-3')], 'range': 'min:max'}
-
我们设置了一个额外的参数转换器(
ignore_empty
),这只是避免了将没有值集的元素添加到列表中(我也将此转换器添加到其他输入元素中)。
-
当我们点击
query-date-range
元素,我们必须初始化日期选择器;当我们单击任何其他元素时,我们需要清除这些值,以避免将它们添加到列表中。
-
我们还更改
range
元素。
代码的JavaScript部分肯定会得到增强;我的技能真的很有限。