斯贾克 / yii2-fuzzydate
在 Yii2 中使用不完整日期。
Requires
- yiisoft/yii2: ~2.0.14
- yiisoft/yii2-jui: *
README
通常,在处理日期时,数据可能不完整。例如,可能知道某人生于1980年,或在1980年4月,但不知道确切日期。
我称这些日期为模糊日期。以下是一些在 Yii 2.x PHP 框架中处理这些日期的类。
模糊日期表示
在数据库中
在数据库中,每个模糊日期由两个“正常”日期表示。这两个日期的字段名称分别来自模糊日期的属性名称,分别附加 '1'
和 '2'
。
因此,如果模糊日期的属性名称为 'born'
,则在数据库中表示它的字段将是 'born1'
和 'born2'
。
- 如果我们知道日期是确切的,那么两个日期字段的值是相等的。
- 如果我们知道日期的“粒度”为一个月,第一个字段的值是月份的第一天,第二个字段的值是月份的最后一天。
- 如果我们只知道年份,第一个字段的值是一年的第一天,第二个字段的值是一年的最后一天。
换句话说,给定一个模糊日期 'xyz'
,可能的“实际”日期范围由 'xyz1'
和 'xyz2'
给出。
例如,2008年12月3日的确切日期(顺便说一句,这是 Yii 发布的日子)将表示为(假设 MySQL 格式)
born1 = "2008-12-03"
born2 = "2008-12-03"
如果日期是2008年12月,我们将有
born1 = "2008-12-01"
born2 = "2008-12-31"
最后,如果日期是2008年
born1 = "2008-01-01"
born2 = "2008-12-31"
在 PHP 中
在 PHP 中,模糊日期由一个包含三个成员的数组表示,其中未知值设置为 null
。如下所示
<?php
// December 3, 2008
$born = [
'y' => 2008,
'm' => 12,
'd' => 3
];
// December, 2008
$born = [
'y' => 2008,
'm' => 12,
'd' => null
];
// 2008
$born = [
'y' => 2008,
'm' => null,
'd' => null
];
Yii2 Fuzzydate 类
Yii2 Fuzzydate 由三个类组成,用于处理模糊日期
- FuzzyDateBehavior 模型/ActiveRecord 行为,用于将数据库格式转换为 PHP 格式,反之亦然;
- DatePicker 模糊日期的输入小部件;
- Formatter 继承自
yii\i18n\Formatter
,并添加了一个模糊日期格式化函数。
DatePickerAsset 是 DatePicker 的辅助类。
关于 Yii2 Fuzzydate 套件的一个演示示例,请点击此处:这里。
安装
安装 Yii2 Fuzzydate 的首选方法是通过 Composer。请将以下内容添加到您的 composer.json
文件的 require 部分中
"sjaakp/yii2-fuzzydate": "*"
或者运行
composer require sjaakp/yii2-fuzzydate "*"
您可以通过 下载 ZIP 格式的源代码 来手动安装 Yii2 Fuzzydate。
FuzzyDateBehavior
具有模糊日期属性 'born'
和 'died'
的 Hero
类应具有数据库字段 'born1'
、'born2'
、'died1'
和 'died2'
。设置方式如下
<?php
namespace app\models;
use sjaakp\fuzzydate\FuzzyDateBehavior;
class Hero extends ActiveRecord {
public function rules() {
return [
[['born', 'died'], 'safe'],
// ...
];
}
public function behaviors()
{
return [
'fuzzydate' => [
'class' => FuzzyDateBehavior::class,
'attributes'=> [
'born',
'died'
]
]
];
}
// ...
}
之后,类 Hero
有两个“虚拟属性”,即 'born'
和 'died'
。
注意:不要忘记在方法 rules()
中声明属性为 safe。
该行为向模型类添加了虚拟模糊日期属性,可以像普通属性一样读取和写入。底层属性(如 'born1'
、'born2'
)也是可访问的。
属性
$attributes
模糊日期属性名称的数组。
$format
用于使用PHP DateTime格式化底层“真实”日期的格式字符串。默认值为MySQL的DATE格式:'Y-m-d'
。如果您使用MySQL,则没有必要更改此设置。
格式化工具
此类扩展了Yii的标准格式化类yii\i18n\Formatter。
通过将其设置为应用程序配置文件中的组件(通常是config/web.php
或config/main.php
)来使用它
<?php
// ...
$config = [
// ... lots of other configurations ...
'components' => [
// ... other components ...
'formatter' => [
'class' => 'sjaakp\fuzzydate\Formatter'
],
/// ..
],
// ...
];
// ...
另一种方法是使用
<?php
Yii::$app->set('formatter', 'sjaakp\fuzzydate\Formatter');
之后,'fuzzyDate'
只是另一种格式化选项,就像'text'
或'html'
一样。您可以在以下方式中在GridView
、ListView
或DetailView
中使用它
<?php
<?= DetailView::widget([
'model' => $model,
'attributes' => [
'date:fuzzyDate',
// ...
],
]) ?>
或者,您可以使用如下代码格式化模糊日期
<?php
$formattedFuzzyDate = Yii::$app->formatter->asFuzzyDate($model->date, 'full');
您将得到相同的结果
<?php
$formattedFuzzyDate = Yii::$app->formatter->format($model->date, [ 'fuzzyDate', 'full' ]);
文本'fuzzyDate'
不区分大小写。'fuzzydate'
同样有效。
属性
$fuzzyDateFormat
-
如果为字符串:
'short'
、'medium'
、'long'
或'full'
。格式化工具会尝试根据标准日期的格式来确定模糊日期的格式。对于大多数区域设置,这可以正常工作,但对于某些区域设置,结果可能不太令人满意。 -
如果为数组:键为
'full'
、'month'
和'year'
,对应于模糊日期的粒度。值为ICU日期格式。示例[ 'full' => 'MM/dd/yyyy', 'month' => 'MM/yyyy', 'year' => 'yyyy' ]
$fuzzyDateFormat的默认值为'medium'
。
方法
asFuzzyDate
public function asFuzzyDate($value, $format = null)
格式化由具有FuzzyDateBehavior
的模型提供的模糊日期。
- $value:要格式化的模糊日期;
- $format:可以具有与
$fuzzyDateFormat
相同的值;如果为null
(默认),则使用$fuzzyDateFormat
; - 返回:格式化的模糊日期。
DatePicker
这是一个用于处理模糊日期的输入小部件。它由一个年份的旋转控件、一个月份的下拉列表、一个日期选择器和可选的“今天”按钮组成。月份和日期都可以为空,表示日期不完整。
DatePicker
具有所有InputWidget
的属性和方法,以及以下属性。
属性
$minYear, $maxYear
年份旋转控件的最小和最大年份。如果为null
(默认),则设置为当前年份。通常至少设置其中一个值而不是null
。
$controlClass
将此设置为控件元素的使用(Bootstrap)类。例如:对于大元素,您可能将其设置为'form-control input-lg'
。默认为'form-control'
。
$monthFormat
设置下拉列表中月份名称的格式。
'LLLL'
(默认)为长名称'LLL'
为短名称'LL'
为两位数字
这些都是ICU格式字符串。
$today
“今天”按钮的选项。
- 如果为字符串:为“今天”按钮的文本。在渲染之前不会对其进行HTML编码。
- 如果为数组:为“今天”按钮的HTML选项。具有键
'content'
的数组值将显示为文本,并且不会进行HTML编码;其他选项将进行编码。 - 如果为
null
:则不渲染“今天”按钮。
默认:'Today'
。
用法
像任何其他InputWidget一样使用DatePicker
。例如
<?= $form->field($model, 'date')->widget(DatePicker::class, [
'minYear' => 1970,
]) ?>