我会看一下Zend_Dojo,因为它可能包含一些接近您正在寻找的元素。
特别是dijit.form.TimeTextBox,可能是dijit.Calendar,因为您可以禁用周末日期被选中,或者dijit.form.select是一个扩展的选择框,您可以将工作日放入其中。通过Zend_Form
和Zend_Translate
,工作日名称可以很容易被翻译成用户的语言。
我确信有很多 jQuery 小部件可以做同样的事情。如果你走这条路,你必须做更多的工作才能让它尽可能地紧密耦合Zend_Form
,但你也可以制作自己的装饰器和元素。
Zend Framework 参考指南有一些关于 Dojo 表单元素TimeTextBox、DateTextBox和Combo/Select Boxes的基本示例。
也许使用这些丰富的 UI 元素甚至对你想要的东西来说有点过头了,如果是这样的话,用预填充元素做你想做的事情的一种快速方法是创建帮助方法来返回值数组(工作日或时间)您可以轻松喂入Zend_Form_Element_Select::setMultiOptions()
.
例如
public function getWeekdays()
{
$locale = new Zend_Locale('en_US'); // or get from registry
$days = Zend_Locale::getTranslationList('Days', $locale);
return $days['format']['wide'];
}
public function getTimes($options = array())
{
$start = null; // time to start
$end = null; // time to end
$increment = 900; // increment in seconds
$format = Zend_Date::TIME_SHORT; // date/time format
if (is_array($options)) {
if (isset($options['start']) && $options['start'] instanceof Zend_Date) {
$start = $options['start'];
}
if (isset($options['end']) && $options['end'] instanceof Zend_Date) {
$end = $options['end'];
}
if (isset($options['increment']) && is_int($options['increment']) && (int)$options['increment'] > 0) {
$increment = (int)$options['increment'];
}
if (isset($options['format']) && is_string($options['format'])) {
$format = $options['format'];
}
}
if ($start == null) {
$start = new Zend_Date('00:00:00', Zend_Date::TIME_LONG);
}
if ($end == null) {
$end = new Zend_Date('23:59:00', Zend_Date::TIME_LONG);
}
$times = array();
$time = new Zend_Date($start);
while($time < $end) { // TODO: check $end > $time
$times[] = $time->toString($format);
$time->add($increment, Zend_Date::SECOND);
}
return $times;
}
打电话给他们:
$opts = array('start' => new Zend_Date('07:00:00', Zend_Date::TIME_LONG),
'end' => new Zend_Date('20:00:00', Zend_Date::TIME_LONG),
'increment' => 3600);
$element->setMultiOptions($form->getTimes($opts));
$element2->setMultiOptions($form->getWeekdays());