заполнение часов / дат в Zend_Form_Element_Select - PullRequest
0 голосов
/ 28 февраля 2012

Я ищу Zend_Form элементы, которые позволят мне легко интегрировать Zend_Date значения.

Например, мне нужны средства выбора часов и дня недели в моих формах.например, средство выбора часов должно отображать все значения часов с 12:00 до 23: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);
    }

1 Ответ

2 голосов
/ 28 февраля 2012

Я бы взглянул на Zend_Dojo , поскольку некоторые элементы могут быть близки к тому, что вы ищете.

В частности, dijit.form.TimeTextBox , возможно dijit.Calendar , так как вы можете отключить выбор даты выходных, или dijit.form.select , который представляет собой расширенное поле выбора, в которое вы можете поместить дни недели. Через Zend_Form и Zend_Translate, названия дней недели можно легко перевести на язык пользователя.

Я уверен, что будет доступно множество виджетов jQuery для того же.Если бы вы пошли по этому пути, вам пришлось бы проделать немного больше работы, чтобы получить его настолько тесно связанным с Zend_Form, сколько вы захотите, но вы также можете сделать свои собственные декораторы и элементы.

Справочное руководство по Zend Framework содержит несколько основных примеров элементов формы Dojo TimeTextBox , DateTextBox и поля со списком / выделением .

Возможно использованиеэти богатые элементы пользовательского интерфейса даже излишни для того, что вы хотите, если это так, быстрый способ сделать то, что вы хотите с помощью предварительно заполненных элементов, - это создать вспомогательные методы для возврата массива значений (дней недели или времени), которые вы можетелегко вводить в 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());
...