我正在創建一個表單,讓用戶在指定的日期,時間和時區安排事件。我想結合這三個表單域的輸入並將它們存儲在數據庫的一個日期時間列中。根據輸入我想將指定的日期和時間轉換爲UTC。用Zend Framework 2表格處理指定時區的日期和時間
但是我不完全確定如何爲此編寫表單代碼。我在寫擴展字段集一個字段類,添加三個字段此字段集:
<?php
namespace Application\Form\Fieldset;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterInterface;
use Zend\InputFilter\InputFilterProviderInterface;
use Zend\Stdlib\Hydrator\ClassMethods;
class SendDateFieldset extends Fieldset implements InputFilterProviderInterface
{
public function __construct()
{
parent::__construct('senddate');
$this->add(array(
'name' => 'date',
'type' => 'Text',
'options' => array(
'label' => 'Date to send:',
)
)
);
$this->add(array(
'name' => 'time',
'type' => 'Text',
'options' => array(
'label' => 'Time to send:',
)
)
);
$this->add(array(
'name' => 'timezone',
'type' => 'Select',
'options' => array(
'label' => "Recipient's timezone",
'value_options' => array(
-12 => '(GMT-12:00) International Date Line West',
-11 => '(GMT-11:00) Midway Island, Samoa',
-10 => '(GMT-10:00) Hawaii',
),
),
)
);
}
public function getInputFilterSpecification()
{
return array(
'date' => array(
'required' => true,
'filters' => array(
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'Date',
'break_chain_on_failure' => true,
'options' => array(
'message' => 'Invalid date'
),
),
),
),
'time' => array(
'required' => true,
'filters' => array(
array('name' => 'StringTrim'),
),
),
'timezone' => array(
'required' => true,
),
);
}
}
我那麼這個字段集添加到我的形式,像這樣:
<?php
namespace Application\Form;
use Zend\Form\Form;
class Order extends Form
{
public function __construct()
{
parent::__construct("new-order");
$this->setAttribute('action', '/order');
$this->setAttribute('method', 'post');
$this->add(
array(
'type' => 'Application\Form\Fieldset\SendDateFieldset',
'options' => array(
'use_as_base_fieldset' => false
),
)
);
}
}
我當然會等字段集添加到表單,訂單信息本身的基本字段集以及包含收件人信息的另一個字段集。
我對這個兩個問題:
什麼是處理三個字段和 它們存儲爲1個日期時間在數據庫(轉換爲UTC)最優雅的方式?我有 訂單服務對象也將負責處理 新訂單,所以我可以在負責處理該服務類中的新訂單的方法中負責處理該問題,或者有更好的方法嗎?
我只在 SendDate字段集中發佈了一小段時區列表。有沒有更清晰的方法來呈現這個列表?
你可能想看看['Zend \ Form \ Element \ DateTime'](https://github.com/zendframework/zf2/blob/master/library/Zend/Form/Element/DateTimeSelect.php )。實際上,你可能不得不擴展這個選項以允許選擇一個TimeZone,但實質上就是這樣。 Value-Output被定義在'filters'回調內部的底部;) – Sam
感謝Sam的建議。我看了一下,但它看起來依賴於HTML5 datetime表單元素。由於該網站將關注廣泛的受衆羣體,因此我無法依賴使用能夠呈現此內容的瀏覽器的用戶。我想我會堅持我的fieldset,並用jQuery日期和時間選擇器來處理事物的客戶端。如果我下定決心想出一個解決方案,我會在這裏發佈。 – Ruben
當沒有給出瀏覽器支持時,DateTimeElement(輸入)將被視爲普通的'type = text'。所以使用datetime元素是很安全的。然後,你可以使用'Modernizr'或類似的東西來檢查BrowserDateTimeElement的功能,當它沒有給出時,使用jQueryUI來代替:) – Sam