2

我一直在使用 HtmlHelper 为我的 cakePHP 应用程序制作一些基本的 CRUD 页面。这对于构建表单很方便,但是对于日期输入,助手默认会为日期生成 3 个选择框,使用起来非常麻烦。

HTML5 引入了 HTML5 input[type=date],现在大多数浏览器都包含一些很好的原生接口来处理它;例如,Chrome 为日期输入生成了一个不错的日期选择器。

我知道可以通过执行以下操作使 HtmlHelper 只使输入text框而不是 3 下拉列表:

echo $this->Form->input('my_date', array('type' => 'text'));

但是当我这样做时

echo $this->Form->input('my_date', array('type' => 'date'));

它忽略了第二个争论并返回到 3 个选择。

有没有办法让助手进行日期输入?

4

6 回答 6

4

似乎 HtmlHelper 还没有发展到使用“日期”输入。

如果您告诉助手将日期输入生成为文本字段,则添加 jQuery 单行器可以将其转换为日期输入。

所以:

echo $this->Form->input('my_date', array('type' => 'text'));

生成字段。然后:

$('#idOfMyDate').attr('type', 'date');

将其更改为日期输入。

如果有人有更好的方法,我很想听听。

于 2013-09-19T12:26:19.477 回答
3

CakePHP FormHelper 使用小部件来呈现不同的输入类型。对于“日期时间”类型,它默认使用 DateTimeWidget。

要获得带有属性的常规输入type="date",您只需告诉 CakePHP 使用哪个小部件。

在 View(通常是 App\AppView.php)中,可以配置 FormHelper:

<?php

namespace App\View;

use Cake\View\View;

class AppView extends View
{
    public function initialize() {
        $this->loadHelper('Form', [
            'widgets' => [
                'datetime' => ['Basic'],
            ],
        ]);
    }
}

?>

BasicWidget 是最基本的小部件,用于呈现常规文本输入。

然后,在您看来,您可以'type' => 'date'按预期使用:

echo $this->Form->input('my_date', array('type' => 'date'));

或者,由于 CakePHP 已经将类型设置为“日期”,因为数据库列是日期时间字段,您可以像这样保留它:

echo $this->Form->input('my_date');

结果是带有 的常规文本输入type="date"


对于未来的读者:在最新版本的 CakePHP 中,您将使用方法Form::control而不是Form::input. 其他一切仍然适用。

于 2018-09-24T09:37:00.667 回答
1

试试这个:

    echo $this->Form->text('my_date',array('type' => 'date');
于 2015-07-22T17:04:26.773 回答
0

像这样它会作为一个魅力

<div class="form-group">
            <label for="Description"><?php echo __('Date'); ?></label>
            <div class='input-group date' id='datetimepicker1'>
                <?php echo $this->Form->input('scheduled_date', array('label'=> false, 'div' => false, 'class'=>'form-control', 'type' => 'text')); ?>
                <span class="input-group-addon">
                     <span class="glyphicon glyphicon-calendar"></span>
                </span>
            </div>
        </div>

一些解释:

  • 'div' => false: 必须禁用 input() FormHelper 函数渲染的 div

  • 'label' => false:必须禁用 input() FormHelper 函数呈现的标签

查看cake PHP form helper doc了解更多详情

于 2015-08-24T13:24:43.137 回答
0

我用jquery解决了这个问题

PHP

<?= $this->Form->control('birth_date', ['value' => $birth_date->i18nFormat('yyyy-MM-dd'), 'type' => 'text']); ?>

JS

$('#birth-date').attr('type', 'date');
于 2020-08-06T20:58:59.740 回答
-1

很明显,Cake 的 FormHelper 搞砸了<input type "date">. 因此我通过以下方式解决了这个问题(在 CakePHP 2.x 中)

  • 复制FormHelper.phplib\Cake\View\Helper\
  • 粘贴到app\View\Helper. 现在 Cake 将使用你的Form Helper 而不是它自己的。
  • 打开新的FormHelper.php,转到protected function _getInput($args) {,搜索case 'date':并更改它:

    case 'date':
        $options += array('value' => $selected);
        return $this->dateTime($fieldName, $dateFormat, null, $options);
    

    到:

    case 'date':
        return $this->{$type}($fieldName, $options);
    

Cake 现在将停止转换<input type="date">为选择框。

请记住,在 Cake 2.x 的每个未来版本中,您都必须手动将 Cake 的 Form Helper 中可能发生的更改转移到您自己的 Form Helper 中。

于 2018-09-19T09:30:48.503 回答