将占位符属性添加到 Zend 2 中的日期输入

Add placeholder attribute to date input in Zend 2

我想在我的日期输入中添加一个占位符,以向使用 firefox 的访问者显示日期必须具有的格式。
使用 Zend Framework 2,我希望能够生成相当于 :

的输入
<input type="date" placeholder="yyyy-mm-dd">

在我的表单中 class。
这是我现在拥有的表格 class :

<?php
  namespace MyModule\Form;

  use Zend\Form\Form;

  class MyModuleForm extends Form {
      public function __construct($name = null) {
          parent::__construct('myModule');
          $this->add(array(
              'name' => 'TheDate',
              'type' => 'date',
              'attributes' => array(
                    'placeholder' => 'yyyy-mm-dd',
                    'class' => 'form-control',
               )
          ));
      }
  }
?>

但 Zend 似乎跳过了 "placeholder" 属性并只生成 :

<input class="form-control" type="date" value="" name="TheDate">

在最坏的情况下,我知道我也可以定义 "value" 属性(尽管我不想这样做,以防万一用户不注意并且不更改它) ,或使用 javascript 手动添加占位符。但是有没有更优雅的方式来完成我想通过 Zend 的 Form class 实现的目标?

由于焦点触发的 UI,您不能在日期输入中使用占位符。因此你必须hack/fake它。

'type' => 'date', 更改为 'type' => 'text',。您现在将看到占位符。 Javascript 将帮助您触发焦点上的日期字段,并保留占位符。

$('.form-control').on('focus', function() {
  $(this).attr('type', 'date') }
).on('blur', function() {
  $(this).attr('type'), 'text') }
)

编辑:感谢 this post

我找到了从一开始就在寻找的答案

解决方案是进入命名空间 Zend\Form\View\Helper 中的 AbstractHelper.php。

这里有一个受保护的属性数组,应该在全局范围内有效。

添加

'placeholder'        => true,

$validGlobalAttributes 修复了所有问题,这对我来说是一个足够好的答案。
更好的方法是通过继承来改变这个变量,而不是将其修改到框架中,但我现在没有足够的时间。

我猜,Zend FormDate 不支持占位符。你可以在 repo 上查看这个。例如,

每个表单元素在 (Zend\Form\View\Helper) 中都有一个 Helper,其中一些有 validTagAttributes 作为 class 元素。您可以为此查看 FormEmail 查看助手 class。

但是,FormDate dont have a validTagAttributes. So, your invalid attributes ignored in prepareAttributes()方法。

我想,如果你想在你的日期表单元素上占位符,你可以创建一个自定义的 FormDate 元素视图助手并使用它。