You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.7 KiB
166 lines
4.7 KiB
<?php
|
|
|
|
/*
|
|
* The MIT License
|
|
*
|
|
* Copyright 2019 Blobt.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
|
|
namespace blobt\widgets;
|
|
|
|
use yii\widgets\InputWidget;
|
|
use Yii;
|
|
use yii\base\InvalidConfigException;
|
|
use yii\helpers\ArrayHelper;
|
|
use yii\helpers\Html;
|
|
use yii\web\JsExpression;
|
|
use yii\helpers\Json;
|
|
use blobt\web\DatepickBootstrapAsset;
|
|
use blobt\helpers\DatetimeHelper;
|
|
|
|
/**
|
|
* 此DatePicker只适用于使用Unix时间戳保存时间的model
|
|
*
|
|
* @author Blobt
|
|
* @email 380255922@qq.com
|
|
* @created Aug 19, 2019
|
|
*/
|
|
class DatePicker extends InputWidget {
|
|
|
|
/**
|
|
* @var string 日期显示格式
|
|
*/
|
|
public $format = "Y-m-d";
|
|
|
|
/**
|
|
* @var string datepicker的日期显示input框的id,只用做显示
|
|
*/
|
|
public $pickerInputId;
|
|
|
|
/**
|
|
* @var boll 是否自动填充当天日期
|
|
*/
|
|
public $autoFill = false;
|
|
|
|
/**
|
|
* @inheritdoc
|
|
* @throws InvalidConfigException
|
|
* @throws \ReflectionException
|
|
*/
|
|
public function run() {
|
|
$this->initSetting();
|
|
$this->registerAsset();
|
|
echo $this->renderHiddenInput();
|
|
echo $this->renderDatapickerInput();
|
|
}
|
|
|
|
/**
|
|
* 初始化小物件的配置
|
|
*/
|
|
protected function initSetting() {
|
|
//初始化日期格式
|
|
if (empty($this->format)) {
|
|
$this->format = Yii::$app->formatter->dateFormat;
|
|
}
|
|
|
|
//关闭自动完成
|
|
$this->options["autocomplete"] = "off";
|
|
|
|
//生成一个picker input的 id
|
|
$this->pickerInputId = $this->options['id'] . "_" . Yii::$app->security->generateRandomString(32);
|
|
}
|
|
|
|
/**
|
|
* 注册js和css
|
|
*/
|
|
protected function registerAsset() {
|
|
$view = $this->getView();
|
|
DatepickBootstrapAsset::register($view);
|
|
|
|
$options = [
|
|
"format" => $this->convertDateFormat($this->format),
|
|
"language" => "zh-CN"
|
|
];
|
|
$jsOptions = Json::encode($options);
|
|
|
|
|
|
$js = <<< SCRIPT
|
|
$('#{$this->pickerInputId}').datepicker({$jsOptions}).on('changeDate', function(e) {
|
|
$('#{$this->options['id']}').val(String(e.date.getTime()).substring(0,10));
|
|
});;
|
|
SCRIPT;
|
|
$view->registerJs($js);
|
|
}
|
|
|
|
/**
|
|
* 渲染一个用作保存Datepicker Unix时间错的hidden input
|
|
* @return string
|
|
*/
|
|
protected function renderHiddenInput() {
|
|
if ($this->hasModel()) {
|
|
return Html::activeInput('hidden', $this->model, $this->attribute, $this->options);
|
|
}
|
|
return Html::input('hidden', $this->name, $this->value, $this->options);
|
|
}
|
|
|
|
/**
|
|
* TODO:自动填充了今天为默认日期
|
|
* 渲染一个用作显示日期的字符格式 text input
|
|
* @return string
|
|
*/
|
|
protected function renderDatapickerInput() {
|
|
$value = '';
|
|
$options = $this->options;
|
|
$options['id'] = $this->pickerInputId;
|
|
|
|
if ($this->hasModel()) {
|
|
$timestamp = ArrayHelper::getValue($this->model, $this->attribute);
|
|
if (!empty($timestamp)) {
|
|
$value = date($this->format, $timestamp);
|
|
}
|
|
}
|
|
|
|
if (empty($timestamp) && $this->autoFill) {
|
|
$timestamp = time();
|
|
$value = date($this->format, $timestamp);
|
|
}
|
|
|
|
return Html::input('text', $this->name, $value, $options);
|
|
}
|
|
|
|
/**
|
|
* 转换php日期格式为bootstrap日期格式
|
|
*
|
|
* TODO:没有弄清所有格式的转换,后续添加
|
|
*
|
|
* @param string $format PHP日期格式字符串
|
|
* @return string
|
|
*/
|
|
protected static function convertDateFormat($format) {
|
|
$conversions = [
|
|
'd' => 'dd',
|
|
'm' => 'mm',
|
|
'Y' => 'yyyy',
|
|
];
|
|
return strtr($format, $conversions);
|
|
}
|
|
|
|
}
|