如何将 ZF2 日期选择"天"元素格式化为 2 位数字?



我想为出生日期做一个出生日期复合下拉菜单(即三个下拉菜单 - 一个用于天,一个用于月,一个用于年份)。有用的是,ZF2 内置了这个元素,称为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);

无论如何,day元素以j格式呈现(即没有前导零131的月份中的某天)。

如何告诉元素以d格式呈现日期(即月份中的某天,2 位数字,前导零0131)?

我已经检查了ZendFormElementDateSelect的源代码,它是视图助手ZendFormViewHelperFormDateSelect。渲染日期在查看助手中,但它没有使用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');

视图帮助程序ZendFormViewHelperFormDateSelect有一个函数getPattern,该函数使用IntlDateFormatter类生成模式:

$intl           = new IntlDateFormatter($this->getLocale(), $this->dateType, IntlDateFormatter::NONE);
$this->pattern  = $intl->getPattern();

似乎没有任何在元素级别设置模式的方法,因此我扩展了此视图助手,允许我指定自己的模式:

<?php
namespace RPKFormViewHelper;
use ZendFormViewHelperFormDateSelect 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的值是否是单个字母"d",如果是,则用双 d 替换它。

最新更新