我正在创建一个表单,让用户可以在指定的日期、时间和时区安排活动。我想组合这三个表单字段的输入并将它们存储在数据库的一个日期时间列中。根据输入,我想将指定的日期和时间转换为 UTC。
但是我不完全确定如何为此编写表单代码。我正在编写一个扩展 Fieldset 的 Fieldset 类,并将三个字段添加到该字段集中:
<?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)存储在数据库中的最优雅的方法是什么?我也有一个 Order 服务对象,它将负责处理新订单,所以我可以在负责处理该服务类中的新订单的方法中处理它,还是有更好的方法?
我只在 SendDate 字段集中发布了一小段时区列表。有没有更简洁的方法来渲染这个列表?