我想要确定出生日期的出生日期复合下拉(即三次下降 - 一天一次,一个月一次,一年一次)。有用的是,ZF2附带了这个内置的元素,称为Model.post.findAll({include:[model.comment]}
以下是我将其添加到表单的方式:
DateSelect
要呈现我正在做的表单:
$this->add([
'name' => 'date_of_birth',
'type' => 'DateSelect',
'attributes' => [
'required' => true,
'value' => date('Y-m-d', strtotime('18 years ago')),
],
'options' => [
'label' => 'Date of Birth',
'max_year' => date('Y', strtotime('18 years ago')),
],
]);
无论如何,echo $this->form($form);
元素正在j
format呈现(即月份中没有前导零day
到1
)。
如何告诉元素以31
格式呈现日期(即每月的某一天,前导零d
到01
的2位数字?)
答案 0 :(得分:1)
我检查了Zend\Form\Element\DateSelect
的源代码,并查看帮助器Zend\Form\View\Helper\FormDateSelect
。渲染日期在视图助手上,但它没有使用date('j')
。它使用IntlDateFormatter
格式化日期,并根据给定的locale
日期格式模式输出日期格式。
https://github.com/zendframework/zend-form/blob/release-2.2.0/src/View/Helper/FormDateSelect.php#L90
因此,解决方案我们应该传递使用两位数日(dd
)的区域设置日期格式。对于国家/地区日期格式列表,可以在此处查看
https://en.wikipedia.org/wiki/Date_format_by_country
根据上面列表中的日期格式,印度使用DD-MM-YY
作为日期格式。我们可以使用此locale
来获取两位数的日期格式。
因此,请在您的视图帮助
上使用此功能echo $this->formDateSelect($form->get('date_of_birth'), IntlDateFormatter::MEDIUM, 'en_IN');
答案 1 :(得分:1)
视图帮助器Zend\Form\View\Helper\FormDateSelect
有一个函数getPattern
,可以使用IntlDateFormatter
类生成模式:
$intl = new IntlDateFormatter($this->getLocale(), $this->dateType, IntlDateFormatter::NONE);
$this->pattern = $intl->getPattern();
似乎没有任何在元素级别设置模式的方法,所以我扩展了这个视图助手,允许我指定自己的模式:
<?php
namespace RPK\Form\View\Helper;
use Zend\Form\View\Helper\FormDateSelect as ZendFormDateSelect;
class FormDateSelect extends ZendFormDateSelect
{
/**
* Parse the pattern
*
* @param bool $renderDelimiters
* @return array
*/
protected function parsePattern($renderDelimiters = true)
{
//Replace `day` value of "d" with "dd"
$pattern = parent::parsePattern($renderDelimiters);
if($pattern['day'] === 'd') {
$pattern['day'] = 'dd';
}
return $pattern;
}
}
非常基本上,它采用返回的模式数组(['day'=>'d', 'month' => 'MMMM', 'year' => 'yyyy']
),检查day
的值是否为单个字母&#34; d&#34;如果是的话,用双d替换它。