1) Список профессий
2) Список предметов, соответствующих выбранной профессии
3) Грид, который содержит материалы, соответствующие выбранному предмету
Обработчик события onchange для списка профессий обновляет список предметов и грид(вызовом $.fn.yiiGridView.update('stock-grid'))
Обработчик события onchange для списка предметов обновляет грид(вызовом $.fn.yiiGridView.update('stock-grid'))
Мне нужно отфильтровать ненужные записи из грида, как только загрузится документ используя $.fn.yiiGridView.update('stock-grid').
Проблема заключается в том, что эта функция прекрасно работает внутри обработчиков событий onchange для обоих списков, но не работает перед назначением обработчиков событий(после них тоже не работает).
В консоли браузера показывается ошибка Uncaught TypeError: Cannot read property 'ajaxType' of undefined, хотя я явно присваивал свойству ajaxType корректное значение GET при инициализации виджета грида.
Весь день убил на борьбу с этой проблемой, но так и не смог найти решение. Помогите пожалуйста.
Код: Выделить всё
<?php
/* @var $this StockController */
/* @var $model Stock */
Yii::app()->clientScript->registerScript('search', "
$('.search-button').click(function(){
$('.search-form').toggle();
return false;
});
$('.search-form form').submit(function(){
$('#stock-grid').yiiGridView('update', {
data: $(this).serialize()
});
return false;
});
");
$this->pageTitle = 'Дистанционное обучение';
?>
<?php
// вывести flash-сообщения
foreach(Yii::app()->user->getFlashes() as $key => $message) {
echo '<div class="flash-' . $key . '">' . $message . "</div>\n";
}
?>
<div class="pInsInfoBlock">
<div class="pInsInfoBlockTitle">
<span>Выберите профессию и предмет</span>
</div>
<div class="pInsInfoBlockCont">
<ul class="pInsInfoBlockContChoose">
<li>
<div class="row">
<?php echo CHtml::activeLabel($model,'id_profession'); ?>
<?php echo CHtml::activeDropDownList($model,'id_profession', array(), array('id'=>'profession')); ?>
</div>
</li>
<li>
<div class="row">
<?php echo CHtml::activeLabel($model,'id_subject'); ?>
<?php echo CHtml::activeDropDownList($model,'id_subject', array(), array('id'=>'subject')); ?>
</div>
</li>
</ul>
</div>
</div>
<?php
?>
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'stock-grid',
'dataProvider'=>$modelForGrid->search($criteria),
'filter'=>$modelForGrid,
'ajaxType'=>'GET',
'beforeAjaxUpdate'=>"
function(id, options){
var params = '';
var id_subject;
$('#subject').each(function(){
id_subject = (this.value) ? this.value : '';
});
params += '&Stock[id_subject]=' + id_subject;
//alert(params);
//encodeURIComponent();
options.data = params;
}
",
'columns'=>array(
'title',
array(
'class'=>'CDataColumn',
'header'=>'Вид материала',
'name'=>'id_stock_type',
'value'=>'$data->idStockType->title',
'filter' => CHtml::activeDropDownList(
$modelForGrid, // model
'id_stock_type', // attribute
CHtml::listData(
StockType::model()->findAll(),
'id_stock_type',
'title'
), // data
array('empty'=>'') // htmlOptions
),
),
array(
'class'=>'CDataColumn',
'header'=>'Предмет',
'name'=>'id_subject',
'value'=>'$data->idSubject->title',
'filter'=>'',
),
'idSubject.idProfession.title',
array(
'class'=>'CDataColumn',
'header'=>'Автор',
'name'=>'idAuthor.username',
),
array(
'class'=>'CButtonColumn',
'header'=>'Загрузка',
'buttons'=>array(
'download' => array(
'label'=>'Скачать', // text label of the button
'url'=>'Yii::app()->controller->createUrl("download",array("id"=>$data->primaryKey))',
'imageUrl'=>Yii::getPathOfAlias('webrootRel.images.icons').'/download.png',
)
),
'template'=>'{download}',
'deleteButtonImageUrl'=>Yii::getPathOfAlias('webrootRel.images.icons').'/delete.png',
),
),
)); ?>
<script type="text/javascript">
$(document).ready(function() {
// Обновляет список предметов при выборе профессии
function updateSubjects(){
var prof = document.getElementById('profession');
$.ajax({
async: false,
type: 'GET',
url: '<?php echo $this->createUrl('getSubjects'); ?>',
data: {id_profession: prof.value,},
dataType: 'json',
success: function (response, textStatus) {
var prof = document.getElementById('subject');
prof.innerHTML = '';
$(response).each(function() {
var opt = document.createElement('option');
opt.value = this.id_subject;
opt.innerHTML = this.title;
prof.appendChild(opt);
});
}
});
}
// Получить список профессий и записать в #profession
$.ajax({
async: false,
type: 'GET',
url: '<?php echo $this->createUrl('getProfessions'); ?>',
data: '',
dataType: 'json',
success: function (response, textStatus) {
var prof = document.getElementById('profession');
prof.innerHTML = '';
$(response).each(function() {
var opt = document.createElement('option');
opt.value = this.id_profession;
opt.innerHTML = this.title;
prof.appendChild(opt);
});
}
});
// Инициализация списка предметов профессии
// alert('Инициализация списка предметов профессии');
updateSubjects();
/**********************ВОТ ТУТ ПЕРЕСТАЕТ РАБОТАТЬ**********************/
$.fn.yiiGridView.update('stock-grid');
// Назначить обработчик события change для #profession
$('#profession').change(function(){
updateSubjects();
$.fn.yiiGridView.update('stock-grid');
});
// Назначить обработчик события change для #subject
$('#subject').change(function(){
$.fn.yiiGridView.update('stock-grid');
});
alert('xxx');
});
</script>