Я обнаружил, что настройки по умолчанию в DatePicker не будут учитывать юлианские даты (т.е. европейские даты до 1582 года), но не нашел правильного способа решить эту проблему. Любое предложение?
Поддерживает ли yii\jui\DatePicker даты по юлианскому календарю?
Ответы (2)
Я бы, вероятно, реализовал Календарь Кейта Вудса для jQuery. Это может быть не так удобно для кода, как средство выбора даты по умолчанию, но назначение его $form->textInput()
должно быть достаточно простым.
Таким образом, сейчас DataPicker не может учитывать какой-либо другой календарь, кроме григорианского. Просто для протокола, я публикую свое решение, используя средство выбора даты мирового календаря Кейта Вуда:
1) Создал web/calendars/
и разархивировал в него пакет календарей.
2) Создал пакет ресурсов CalendarAsset.php
в папке assets
(я выбрал юлианский/григорианский (по умолчанию) календари и английскую/испанскую локализацию; вы можете выбрать другие языки и календари):
<?php
namespace app\assets;
use yii\web\AssetBundle;
class CalendarAsset extends AssetBundle
{
public $basePath = '@webroot';
public $baseUrl = '@web';
public $css = [
'calendars/humanity.calendars.picker.css',
];
public $js = [
'calendars/jquery.min.js',
'calendars/jquery.calendars.js',
'calendars/jquery.calendars.plus.js',
'calendars/jquery.plugin.js',
'calendars/jquery.calendars.picker.js',
'calendars/jquery.calendars.julian.js',
'calendars/jquery.calendars.picker-es.js',
'calendars/jquery.calendars-es.js',
];
public $jsOptions = [
'position' => \yii\web\View::POS_HEAD,
];
public $depends = [
'yii\web\YiiAsset',
'yii\bootstrap\BootstrapAsset',
];
}
?>
3) Затем я добавил web/calendars/jquery.mycalendar.calendars.js
, чтобы включить некоторые настройки по умолчанию, селектор календаря и общую реализацию, полностью скопированную из демонстраций Кита Вуда:
$.calendarsPicker.setDefaults({
dateFormat: 'yyyy-mm-dd',
defaultDate: '1478-06-24',
yearRange: 'c-120:c+120',
});
$('#selectCalendar').change(function() {
var calendar = $.calendars.instance($(this).val(), 'es');
var convert = function(value) {
return (!value || typeof value != 'object' ? value :
calendar.fromJD(value.toJD()));
};
$('.is-calendarsPicker').each(function() {
var current = $(this).calendarsPicker('option');
$(this).calendarsPicker('option', {calendar: calendar,
onSelect: null, onChangeMonthYear: null,
defaultDate: convert(current.defaultDate),
minDate: convert(current.minDate),
maxDate: convert(current.maxDate),
}).
calendarsPicker('option', {
onSelect: current.onSelect,
onChangeMonthYear: current.onChangeMonthYear
});
});
});
4) Наконец я привел все это в _form.php
вид:
<?php
use app\assets\CalendarAsset;
use yii\helpers\Html;
use yii\widgets\ActiveForm;
// Load Keith Wood's JQuery stuff selected in CalendarAsset.php.
CalendarAsset::register($this);
// Load my calendar defaults and implementation.
$this->registerJsFile('calendars/jquery.mycalendar.calendars.js');
// Link one calendar instantiation to id = "popupDatepicker" with Julian and spanish as defaults.
$this->registerJs("$('#popupDatepicker').calendarsPicker({calendar: $.calendars.instance('julian', 'es')});");
?>
...........
<?php $form = ActiveForm::begin(); ?>
<?= Html::label(Yii::t('app', 'Calendario'), 'selectCalendar', ['class' => 'control-label']) ?>
<div class="form-group">
<?= Html::dropDownList(null, null, [
'julian' => Yii::t('app', 'Calendario juliano'),
'gregorian' => Yii::t('app', 'Calendario Gregoriano'),
], ['id' => 'selectCalendar', 'class' => 'form-control']) ?>
</div>
<?= $form->field($model, 'fecha')->textInput(['id' => 'popupDatepicker', 'placeholder' => Yii::t('app', 'aaaa-mm-dd')]); ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Crear') : Yii::t('app', 'Actualizar'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
Hope it may be useful to someone.