2012-02-28 60 views
0

我在尋找Zend_Form元素,這將允許我輕鬆整合Zend_Date值。將小時/日期填充到Zend_Form_Element_Select中

例如,我需要在我的表單中使用一個小時選擇器和一個星期的選擇器。例如,小時選取器應顯示從上午12:00到下午11:00的所有小時值,並且每週的選取器應顯示所有可用的星期幾。

我正在尋找Zend_Form_Element_SelectZend_Date之間的某種集成,但是我找不到任何可以使用的元素。我想使用zend_date,因此我已經使用的本地化設置將在這裏使用。

理想情況下,這應該是我可以設置的值i需要的類型一個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); 
    } 

回答

2

我看看Zend_Dojo因爲這可能有一些接近你在找什麼元素。

尤其dijit.form.TimeTextBox,可能dijit.Calendar你可以從被選中禁用週末日期或dijit.form.select這是一個擴展的選擇框,你可以把平日裏,通過Zend_FormZend_Translate,平日的名字可以很容易地被翻譯成用戶的語言。

我相信大量的jQuery小部件可以做同樣的事情。如果你走的是這條路線,那麼你需要做更多的工作來儘可能地與Zend_Form緊密結合,但是你也可以製作自己的裝飾器和元素。

Zend Framework參考指南在Dojo表單元素TimeTextBox,DateTextBoxCombo/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());