我正在寻找能让我轻松集成Zend_Date
值的Zend_Form
元素。
例如,我的表单中需要一个小时选择器和一个星期选择器。例如,小时选取器应显示从12:00 AM到11:00 PM的所有小时值,而星期选取器应显示所有可用的工作日。
我一直在寻找Zend_Form_Element_Select
和Zend_Date
之间的某种集成,但我找不到任何现成的元素。我想使用zend_date,所以我已经使用的本地化设置将在这里使用。
理想情况下,这应该是一个zend form元素,我可以设置所需的值类型,如下所示:
$hour = new Form_Element_DateSelect('hour');
$hour->setDateFormat(Zend_Date:HOUR);
或
$weekday = new Form_Element_DateSelect('hour');
$hour->setDateFormat(Zend_Date:DAYOFWEEK);
我可以使用标准的Zend_Form_Element_Select
和预填充值来完成它,但是我很好奇是否有人为这些情况创建了元素,或者有了使这些元素可重用并支持多种日期格式的想法。
$hour = new Zend_Form_Element_Select('hour');
$hour->setRequired(true)
->setLabel('Hour:')
$this->addElement($hour);
$time = new Zend_Date();
$time->setTime('00:00:00');
for ($i=0;$i<=23;$i++) {
$hour->addMultiOption($time->get('HH:mm'), $time->toString(Zend_Date::TIME_SHORT));
$time->addHour(1);
}
发布于 2012-02-28 15:08:34
我会看一下Zend_Dojo,因为它可能有一些与您正在寻找的元素接近的元素。
特别是,dijit.form.TimeTextBox,可能是dijit.Calendar,因为您可以禁止选择周末日期,或者dijit.form.select,这是一个扩展的选择框,您可以在其中放入工作日。通过Zend_Form
和Zend_Translate
,可以轻松地将工作日名称转换为用户的语言。
我确信会有大量的jQuery小部件来做同样的事情。如果你这样做,你将不得不做更多的工作来使它与你想要的Zend_Form
紧密耦合,但是你也可以制作你自己的装饰器和元素。
Zend Framework reference guide提供了一些关于Dojo form元素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());
https://stackoverflow.com/questions/9477311
复制相似问题