斯贾克 / 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,
]) ?>