斯贾克/yii2-fuzzydate

在 Yii2 中使用不完整日期。

安装: 203

依赖项: 0

建议者: 0

安全: 0

星标: 4

关注者: 2

分支: 1

开放问题: 0

类型:yii2-extension

1.2.3 2022-05-01 13:52 UTC

This package is auto-updated.

Last update: 2024-08-29 03:58:05 UTC


README

Latest Stable Version Total Downloads License

通常,在处理日期时,数据可能不完整。例如,可能知道某人生于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,并添加了一个模糊日期格式化函数。

DatePickerAssetDatePicker 的辅助类。

关于 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.phpconfig/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'一样。您可以在以下方式中在GridViewListViewDetailView中使用它

<?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,
]) ?>