У меня есть вид с 3 виджетами. Два виджета TbButton
и один виджет TbExtendedGridView
. Кнопки используются для «вставить нового пользователя» и «создать pdf». TbExtendedGridView используется для отображения текущих пользователей и их атрибутов. TbExtendedGridView
фильтрация включена и работает нормально.
Контроллер простой. Он определяет, есть ли AjaxRequest. Если есть, фильтрует данные по переменным GET. Если нет, он отображает представление по умолчанию, которое показывает всех пользователей.
Что мне нужно, так это возможность создать PDF-файл этой таблицы.
Я установил расширения PDF и создал контроллер PDFReport. Когда пользователь нажимает кнопку «создать pdf», он переходит к тому контроллеру, который создает PDF. Все в порядке, пока я не хочу создать PDF из отфильтрованных данных.
Первое, что пришло мне в голову, это передать переменные из фильтров в ссылку кнопки «Создать pdf», чтобы после ее нажатия я отправил соответствующие данные в контроллер PDFReport, который затем смог бы фильтровать данные и создавать отфильтрованный PDF.
Проблема в том, что фильтрация выполняется через запрос AJAX и обновляет только таблицу. Виджеты кнопок не обновляются, и я не знаю, как отправить новую ссылку на кнопку «создать PDF».
Я понятия не имею, как это сделать.
Действие контроллера:
public function actionIndex()
{
// if submited by filters, get only filtered data
if( Yii::app()->request->isAjaxRequest && isset($_GET['users']))
{
$criteria=new CDbCriteria;
foreach ($_GET['users'] as $key => $value) {
if ($value != "") {
if (preg_match('/^(["\']).*\1$/m', $value)) {
$criteria->addInCondition($key,array($value),$operator='AND');
}
else
{
$criteria->addsearchCondition($key,$value,$like='LIKE');
}
}
}
$data=new CActiveDataProvider(
'users',
array(
'criteria'=>$criteria,
'pagination' => array('pageSize' => 30)
)
);
$createPDFurl = "test2";
$this->render('index',array('model'=>$data, 'createPDFurl' => $createPDFurl));
}
//else full table
else
{
$data=new CActiveDataProvider(
'users',
array('pagination' => array('pageSize' => 30))
);
$createPDFurl = "test1";
$this->render('index',array('model'=>$data, 'createPDFurl' => $createPDFurl));
}
}
и просмотр:
<?php
$this->widget(
'bootstrap.widgets.TbButton',
array(
'label' => 'Unos novog zaposlenika',
'type' => 'primary',
'url' => $createPDFurl,
)
);
$this->widget(
'bootstrap.widgets.TbButton',
array(
'label' => 'Kreiraj PDF',
'type' => 'primary',
'url' => $createPDFurl,
)
);
$godisnji_width = "100px";
$this->widget('bootstrap.widgets.TbExtendedGridView', array(
'fixedHeader' => true,
'headerOffset' => 40, // 40px is the height of the main navigation at bootstrap
'type' => 'striped bordered condensed',
'dataProvider' => $model,
'filter' => $model->model,
'responsiveTable' => true,
'template' => "{pager}{items}{summary}{pager}\n{extendedSummary}",
'ajaxUrl'=> $this->createUrl('/site/index'),
'pager' => array(
'nextPageLabel' => 'Sljedeća',
'prevPageLabel' => 'Prijašnja',
'firstPageLabel' => 'Prva',
'lastPageLabel' => 'Posljednja'
),
'summaryText' => 'Prikazano {start}-{end} od {count} unosa.',
'columns' => array(
'prezime',
'ime',
'radno_mjesto',
'odjel',
'broj_dana',
array('name'=>'godisnji', 'htmlOptions'=>array('width' => $godisnji_width), 'headerHtmlOptions'=>array('width' => $godisnji_width), 'filterHtmlOptions'=>array('width' => $godisnji_width)),
'stari_godisnji',
'bolovanje',
array(
'htmlOptions' => array('nowrap'=>'nowrap'),
'class'=>'bootstrap.widgets.TbButtonColumn',
),
),
));
echo $createPDFurl;
Когда вы загружаете индексную страницу 1-й, вы получаете 2 приятные кнопки и 1 красивую таблицу, полную данных и эха этой тестовой переменной: «test1». Когда я что-то ввожу в фильтр, моя таблица меняется, но тестовая переменная остается «test1». Я почти уверен, что знаю, почему, потому что Ajax изменяет только таблицу, и это хорошо, потому что Ajax существует, но как заставить его обновлять другие виджеты или как отправить эти новые данные на остальную часть страницы, я не знаю идея.