2013-04-20 142 views
0

我正在渲染表單以將類(課程)添加到數據庫。班級有一定的開始時間和結束時間。兩者都是一天中的時間。我創建該類的字段集:基於其他表單元素的表單元素驗證

<?php 
namespace Admin\Form; 

use Zend\Form\Fieldset; 
use Zend\InputFilter\InputFilterInterface; 
use Zend\InputFilter\InputFilterProviderInterface; 

class ArtClassFieldset extends Fieldset implements InputFilterProviderInterface 
{ 
    public function __construct() 
    { 
     parent::__construct('artclass'); 

     $this->add(array(
      'name'   => 'dayofweek', 
      'type'   => 'Zend\Form\Element\Select', 
      'options'  => array(
       'label'    => 'Day of week:', 
       'value_options'  => array(
        1   => 'Monday', 
        2   => 'Tuesday', 
        3   => 'Wednesday', 
        4   => 'Thursday', 
        5   => 'Friday', 
        6   => 'Saturday', 
       ), 
      ), 
     )); 

     $this->add(array(
       'name' => 'starttime', 
       'type' => 'Zend\Form\Element\Time', 
       'options' => array(
        'label' => 'Start time:', 
        'format' => 'H:ia', 
       ), 
      ) 
     ); 

     $this->add(array(
       'name' => 'endtime', 
       'type' => 'Zend\Form\Element\Time', 
       'options' => array(
        'label' => 'End time:', 
        'format' => 'H:ia', 
       ), 
      ) 
     ); 

     $this->add(array(
       'name' => 'teacher', 
       'type' => 'Admin\Form\TeacherSelectorFieldset', 
       'options' => array(
        'label' => 'Teacher:', 
       ) 
      ) 
     ); 
    } 

    public function getInputFilterSpecification() 
    { 
     return array(
       'dayofweek' => array(
        'required' => true, 
        'filters' => array(
         array('name' => 'Int'), 
        ), 
        'validators' => array(
         array(
          'name' => 'Between', 
          'break_chain_on_failure' => true, 
          'options' => array(
           'min' => 1, 
           'max' => 6, 
          ), 
         ), 
        ), 
       ), 
       'starttime' => array(
        'required' => true, 
       ), 
       'endtime' => array(
        'required' => true, 
       ), 
       'teacher' => array(
       ), 
     ); 
    } 
} 

在我的Form類,我只是這個字段集添加到我的表格:

<?php 
namespace Admin\Form; 

use Zend\Form\Form; 

class ArtClassAdd extends Form 
{ 
    public function __construct() 
    { 
     parent::__construct("artclass-add"); 
     $this->setAttribute('action', '/admin/artclass/add'); 
     $this->setAttribute('method', 'post'); 

     $this->add(array(
       'type' => 'Admin\Form\ArtClassFieldset', 
       'options' => array('use_as_base_fieldset' => true) 
      ) 
     ); 

     $this->add(array(
       'name' => 'submit', 
       'attributes' => array(
        'type' => 'submit', 
        'value' => 'Save'     
       ) 
      ) 
     ); 
    } 
} 

兩個時間字段的格式是「H:IA」,讓意味着我會得到'11:00am'之類的東西。我現在想要做的是驗證開始時間是否在結束時間之前。問題是我該怎麼做?我想我應該使用Zend \ Validator \ Callback,但不確定。

回答

2

你在正確的軌道上。您必須使用Callback驗證程序。使用這樣的endtime輸入規格:

return array(
    'endtime' => array(
     'required' => true, 
     'validators' => array(
      array(
       'name' => 'Callback', 
       'options' => array(
        'callback' => function($value, $context) 
        { 
         $endtime = DateTime::createFromFormat'H:ia', $value); 
         $starttime = DateTime::createFromFormat('H:ia', $context['starttime']); 
         return $endtime > $starttime; 
        } 
       ), 
      ), 
     ), 
    ), 
); 
+0

真棒作品就像一個魅力,謝謝! – Ruben 2013-04-20 00:52:11

相關問題