如何将 ZF2 DateSelect "day" 元素格式化为 2 位数字?

How to format ZF2 DateSelect "day" element to 2 digits?

我想为出生日期做一个出生日期复合下拉菜单(即三个下拉列表 - 一个用于日,一个用于月,一个用于年)。有用的是,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 format 中呈现(即月份中没有前导零 131)。

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

我已经检查了来自 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');

视图助手 Zend\Form\View\Helper\FormDateSelect 有一个函数 getPattern 可以使用 IntlDateFormatter class:

生成模式
$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 的值是否为单个字母 "d",如果是,则将其替换为双d.