У меня есть вид с 3-мя виджетами. Два TbButton
виджетов и один TbExtendedGridView
виджет. Кнопки используются для «вставки нового пользователя» и «создания pdf». TbExtendedGridView используется для отображения текущих пользователей и их атрибутов. TbExtendedGridView
имеет включенную фильтрацию и работает нормально.Обновите несколько виджетов, используя фильтрацию ajax 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, но как заставить ее обновлять другие виджеты или как перетаскивать эти новые данные в остальную часть страницы, у меня нет идея.
Вы жестко закодировали URL-адрес в кнопке или получили атрибут модели? –
Button url передается от контроллера. Когда фильтрация отсутствует, URL передается, и все работает нормально. Но как только я фильтрую, я не могу изменить этот url, так как фильтрация только обновляет (через AJAX) часть содержимого TbExtendedGridView и не влияет на часть TbButton. – Ljudotina
Если есть способ заставить полную перезагрузку страницы при фильтрации, я тоже буду счастлив. – Ljudotina