Jquery-UI Datepicker не работает js код

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Spot
Сообщения: 49
Зарегистрирован: 2013.04.09, 04:04

Jquery-UI Datepicker не работает js код

Сообщение Spot » 2019.06.13, 05:45

D _form.php в конце пишу:

Код: Выделить всё

...
    <?= $form->field($model, 'day')->widget(DatePicker::class, [
    'language' => 'ru',
    'dateFormat' => 'dd.MM.yyyy',]) ?>
...    
    <?php ActiveForm::end(); ?>
<?php
$script = <<< JS
         $('#zapisi-day').datepicker({
                onClose: function(date, datepicker) {
                    if (date != "") {
                      alert("You Have Selected the Date : " + date);
                    }
                }
            })
JS;
$this->registerJs($script, yii\web\View::POS_READY);
?>

</div>
HTML-код страницы:

Код: Выделить всё

...
<label class="control-label" for="zapisi-day">Дата</label>
<input type="text" id="zapisi-day" name="Zapisi[day]">
...
</script><script src="/assets/c075c338/jquery.js"></script>
<script src="/assets/7360098f/yii.js"></script>
<script src="/assets/7360098f/yii.validation.js"></script>
<script src="/assets/67de6cd2/jquery-ui.js"></script>
<script src="/assets/67de6cd2/ui/i18n/datepicker-ru.js"></script>
<script src="/assets/7360098f/yii.activeForm.js"></script>
<script src="/assets/5ddc2b1f/js/bootstrap.js"></script>
<script>jQuery(function ($) {
jQuery('#zapisi-day').datepicker($.extend({}, $.datepicker.regional['ru'], {"dateFormat":"dd.mm.yy"}));
jQuery('#w0').yiiActiveForm([{"id":"zapisi-id_spi","name":"id_spi","container":".field-zapisi-id_spi","input":"#zapisi-id_spi","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"СПИ cannot be blank."});yii.validation.number(value, messages, {"pattern":/^\s*[+-]?\d+\s*$/,"message":"СПИ must be an integer.","skipOnEmpty":1});}},{"id":"zapisi-day","name":"day","container":".field-zapisi-day","input":"#zapisi-day","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Дата cannot be blank."});}},{"id":"zapisi-vremya","name":"vremya","container":".field-zapisi-vremya","input":"#zapisi-vremya","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Время cannot be blank."});}},{"id":"zapisi-tel","name":"tel","container":".field-zapisi-tel","input":"#zapisi-tel","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Телефон cannot be blank."});yii.validation.string(value, messages, {"message":"Телефон must be a string.","max":10,"tooLong":"Телефон should contain at most 10 characters.","skipOnEmpty":1});}},{"id":"zapisi-fio","name":"fio","container":".field-zapisi-fio","input":"#zapisi-fio","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"ФИО cannot be blank."});yii.validation.string(value, messages, {"message":"ФИО must be a string.","max":99,"tooLong":"ФИО should contain at most 99 characters.","skipOnEmpty":1});}},{"id":"zapisi-status","name":"status","container":".field-zapisi-status","input":"#zapisi-status","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Статус cannot be blank."});yii.validation.string(value, messages, {"message":"Статус must be a string.","max":4,"tooLong":"Статус should contain at most 4 characters.","skipOnEmpty":1});}},{"id":"zapisi-date_create","name":"date_create","container":".field-zapisi-date_create","input":"#zapisi-date_create","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Дата создания cannot be blank."});}},{"id":"zapisi-date_end","name":"date_end","container":".field-zapisi-date_end","input":"#zapisi-date_end","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Дата удаления cannot be blank."});}},{"id":"zapisi-date_update","name":"date_update","container":".field-zapisi-date_update","input":"#zapisi-date_update","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Дата изменения cannot be blank."});}}], []);
         $('#zapisi-day').datepicker({
                onClose: function(date, datepicker) {
                    if (date != "") {
                      alert("You Have Selected the Date : " + date);
                    }
                }
            })
});</script></body>
</html>
Но алерт не выходит. А вот так алерт выходит:

Код: Выделить всё

...
<?php ActiveForm::end(); ?>
<?php
$script = <<< JS

alert("blablabla");

JS;
$this->registerJs($script, yii\web\View::POS_READY);
?>

</div>

masson
Сообщения: 425
Зарегистрирован: 2012.07.03, 15:59

Re: Jquery-UI Datepicker не работает js код

Сообщение masson » 2019.06.13, 09:28

Код: Выделить всё

onClose: function(date, datepicker) {
   console.log(date);
}
Что говорит?

Spot
Сообщения: 49
Зарегистрирован: 2013.04.09, 04:04

Re: Jquery-UI Datepicker не работает js код

Сообщение Spot » 2019.06.13, 11:01

Ничего в лог не выводит. А вот так выводит строку 'date':

Код: Выделить всё

$script = <<< JS

   console.log('date');

JS;

masson
Сообщения: 425
Зарегистрирован: 2012.07.03, 15:59

Re: Jquery-UI Datepicker не работает js код

Сообщение masson » 2019.06.13, 11:18

Код: Выделить всё

<?= $form->field($model, 'day')->widget(DatePicker::class, [
    'language' => 'ru',
    'dateFormat' => 'dd.MM.yyyy',]) 
    'clientOptions' => [
        'onClose' =>
    ]
?>
https://www.yiiframework.com/extension/ ... datepicker

Spot
Сообщения: 49
Зарегистрирован: 2013.04.09, 04:04

Re: Jquery-UI Datepicker не работает js код

Сообщение Spot » 2019.06.14, 09:59

Спасибо, masson!
Заработало.

Spot
Сообщения: 49
Зарегистрирован: 2013.04.09, 04:04

Re: Jquery-UI Datepicker не работает js код

Сообщение Spot » 2019.06.17, 08:41

А как сделать зависимые списки, но вместо первого списка был датепикер? Например, в зависимости от выбранной даты во втором раскрывающемся списке менялись данные?
Пытался сделать так:

Код: Выделить всё

<?= $form->field($model, 'day')->widget(DatePicker::class, [
	'language' => 'ru',
    'dateFormat' => 'dd.MM.yyyy',
	'clientOptions' => [
		'minDate' => 0,
		'maxDate' => '+30d',
                'beforeShowDay' => new yii\web\JsExpression('available'),
		'onClose' =>'function(data){
				$("select#idUniversity").html(data);
			}'
    ], 
]) ?>
Но говорит:

Код: Выделить всё

Uncaught TypeError: onClose.apply is not a function

masson
Сообщения: 425
Зарегистрирован: 2012.07.03, 15:59

Re: Jquery-UI Datepicker не работает js код

Сообщение masson » 2019.06.17, 13:53

Что генерится в HTML-е?

Попробуй так:

Код: Выделить всё

'onClose' => new JsExpression ('function(date) {
    var url = ...;    // возвращает строку в виде <option value="1">Val1</option><option value="2">Val2</option>
    $("#idUniversity").load(url, {date: date});   // select лучше убрать, оставить только #idUniversity
}');

Spot
Сообщения: 49
Зарегистрирован: 2013.04.09, 04:04

Re: Jquery-UI Datepicker не работает js код

Сообщение Spot » 2019.06.18, 03:40

В url что писать? В контроллере action создавать?
В модели есть функция, которая возвращает данные для второго списка.

Код: Выделить всё

	public function getTime($spi)
    {
		$times = Zapisi::find()
		->where(['id_spi' => $spi])
        ->orderBy('vremya')
        ->all();
		return $times;
    }
Как к нему обратиться за данными посредством ajax?
Пытался делать так, но тоже не знаю что в url писать:

Код: Выделить всё

    var data = $(this).serialize();
    $.ajax({
        url: ?????,
        type: 'POST',
        data: {id: $('#zapisi-id_spi').val()},
        success: function(res){
            alert(res);
        },
        error: function(){
            alert('Error!');
        }
    });

masson
Сообщения: 425
Зарегистрирован: 2012.07.03, 15:59

Re: Jquery-UI Datepicker не работает js код

Сообщение masson » 2019.06.18, 05:40

var data = $(this).serialize(); - это зачем? Ниже это нигде не используется

Модель:

Код: Выделить всё

	
public static function getTimeListData($spi)
    {
	$times = Zapisi::find()
	->select('time')
	->where(['id_spi' => $spi])
        ->orderBy('vremya')
        ->column();
        
        if (empty($times)) {
            return '';
        }
        
        array_walk($times, function(&$item)) {
            $item = '<option>' . $item . '</option>';
        }
        
	return implode('', $times);
    }
Контроллер:

Код: Выделить всё

public function actionTimeListData($date)
{
    return Model::getTimeListData($date)
}
Вьюха:

Код: Выделить всё

'onClose' => new JsExpression ('function(date) {
    var url = "controller/time-list-data"
    $("#idUniversity").load(url, {date: date}); 
}')

Spot
Сообщения: 49
Зарегистрирован: 2013.04.09, 04:04

Re: Jquery-UI Datepicker не работает js код

Сообщение Spot » 2019.06.18, 10:04

Спасибо!
Очень помогли!

masson
Сообщения: 425
Зарегистрирован: 2012.07.03, 15:59

Re: Jquery-UI Datepicker не работает js код

Сообщение masson » 2019.06.18, 10:37

Spot писал(а):
2019.06.18, 10:04
Спасибо!
Очень помогли!
Уточнение:

Код: Выделить всё

public static function getTimeListData($spi)
    {
	$times = Zapisi::find()
	->select('id', 'time')
	->where(['id_spi' => $spi])
        ->orderBy('vremya')
        ->asArray()->all();
        
        if (empty($times)) {
            return '';
        }
        
        array_walk($times, function(&$item)) {
            $item = '<option value="' . $item['id'] . '">' . $item['time'] . '</option>';
        }
        
	return implode('', $times);
    }

Spot
Сообщения: 49
Зарегистрирован: 2013.04.09, 04:04

Re: Jquery-UI Datepicker не работает js код

Сообщение Spot » 2019.06.18, 11:43

Возникли трудности с передачей данных.
Экшн:

Код: Выделить всё

	public function actionGettimes($a,$b)
	{
		return Zapisi::getTimeListData($a,$b);
	}
Вьюха:

Код: Выделить всё

$url=Url::to(['zapisi/gettimes']);
...
	var url = '".$url."';
    $('#zapisi-vremya').load(url, {a:1,b:2019-05-22});
Ответ:

Код: Выделить всё

POST http://localhost/zapisi/gettimes 400 (Bad Request): Missing required parameters: a, b
Если просто в адресной строке пишу запрос:

Код: Выделить всё

http://localhost/zapisi/gettimes?a=1&b=2019-06-20
Работает, ответ:

Код: Выделить всё

<option value='2019-06-20 13:00:00</option>

masson
Сообщения: 425
Зарегистрирован: 2012.07.03, 15:59

Re: Jquery-UI Datepicker не работает js код

Сообщение masson » 2019.06.18, 12:44

1. Посмотреть в дебаг-панели какой запрос уходит
2. {a:1,b:2019-05-22} - возможно надо в кавычках "1" и "2019-05-22"
3. <option value='2019-06-20 13:00:00</option> - у первой опции нет закрывающей кавычки, закрывающей угловой скобки и значения между <option> и </option>

Ответить