0

我正在寻找 Zend_Form可以让我Zend_Date轻松整合价值观的元素。

例如,我的表单中需要一个小时选择器和一个工作日选择器。例如,小时选择器应显示从上午 12:00 到晚上 11:00 的所有小时值,而工作日选择器应显示所有可用的工作日。

Zend_Form_Element_Select我一直在寻找和之间的某种集成Zend_Date,但我找不到任何可以使用的元素。我想使用 zend_date,所以我已经在使用的本地化设置将在这里使用。

理想情况下,这应该是一个 zend 表单元素,我可以设置我需要的值类型,例如:

    $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);
    }
4

1 回答 1

2

我会看一下Zend_Dojo,因为它可能包含一些接近您正在寻找的元素。

特别是dijit.form.TimeTextBox,可能是dijit.Calendar,因为您可以禁用周末日期被选中,或者dijit.form.select是一个扩展的选择框,您可以将工作日放入其中。通过Zend_FormZend_Translate,工作日名称可以很容易被翻译成用户的语言。

我确信有很多 jQuery 小部件可以做同样的事情。如果你走这条路,你必须做更多的工作才能让它尽可能地紧密耦合Zend_Form,但你也可以制作自己的装饰器和元素。

Zend Framework 参考指南有一些关于 Dojo 表单元素TimeTextBoxDateTextBoxCombo/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());
于 2012-02-28T07:08:33.983 回答