2012-02-28 7 views
0

私はZend_Form要素を探しています。Zend_Dateの値を簡単に統合できます。時間/日付をZend_Form_Element_Selectに入力する

たとえば、私のフォームには1時間ピッカーと1週間ピッカーが必要です。たとえば、時間ピッカーは、午前12時から午後11時までのすべての時間値を表示し、週日ピッカーは使用可能なすべての週の日数を表示する必要があります。

私はZend_Form_Element_SelectZend_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); 
    } 

答えて

2

これはあなたが探しているものに近いいくつかの要素を有することができるように私はZend_Dojoを見てみたいです。あなたが平日を置くことができ、拡張選択ボックス。Zend_FormZend_Translateスルーは、曜日名を簡単に変換することができている

あなたが選択されているから、週末の日付を無効にすることができますよう特に

dijit.form.TimeTextBox、おそらくdijit.Calendar、またはdijit.form.selectユーザーの言語

同じことをするためのjQueryウィジェットはたくさんあります。あなたがそのルートに行った場合は、あなたが望むかもしれないが、Zend_Formと緊密に結びついているようにするために少しだけ作業をしなければならないかもしれませんが、あなた自身のデコレータと要素を作ることもできます。

Zend Frameworkリファレンスガイドには、Dojoフォーム要素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()); 
関連する問題