2012-02-28 2 views
0

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

Например, мне нужны часовые инструменты и сборщик дней в моих формах. например, часовой стрелок должен отображать все часовые значения с 12:00 до 23:00, а на недельный день выборщик должен отображать все доступные дни недели.

Я искал некоторую интеграцию между Zend_Form_Element_Select и Zend_Date, но я не смог найти готовых к использованию элементов. Я хотел бы использовать zend_date, поэтому здесь будут использоваться настройки локализации, которые я уже использую.

В идеале, это должно быть форма Зенд элемент, который можно установить тип значения, мне нужно, что-то вроде:

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

ответ

2

Я принимаю бы взглянуть на 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.

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