2014-02-11 2 views
1

У меня есть вид с 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, но как заставить ее обновлять другие виджеты или как перетаскивать эти новые данные в остальную часть страницы, у меня нет идея.

+0

Вы жестко закодировали URL-адрес в кнопке или получили атрибут модели? –

+0

Button url передается от контроллера. Когда фильтрация отсутствует, URL передается, и все работает нормально. Но как только я фильтрую, я не могу изменить этот url, так как фильтрация только обновляет (через AJAX) часть содержимого TbExtendedGridView и не влияет на часть TbButton. – Ljudotina

+0

Если есть способ заставить полную перезагрузку страницы при фильтрации, я тоже буду счастлив. – Ljudotina

ответ

0

Как мой ответ скорее предложение длинное, что я добавляю ответ вместо добавления комментария под вопросом.
Первое, что подходит для вашего кода, Вы используете недвижимость responsiveTable = true. это свойство не позволит gridView реагировать, а наоборот, будет отменять эффект, как вы можете видеть, когда вы уменьшаете ширину вашего браузера вручную, он отобразит TbGridView, но с обратными эффектами. Он будет искажать ориентацию столбцов и rows.try это сам.
На ваш вопрос Как TbExtendedGridView распространяется от TbGridView. И TbGridView распространяется от CgridView и TbDataColumn. Теперь CgridView имеет некоторые публичные свойства в отношении ajax.перечисленные как

  • public $ ajaxUpdate;
  • общественный $ ajaxUpdateError;
  • public $ ajaxVar = 'ajax';
  • public $ ajaxUrl;
  • public $ beforeAjaxUpdate;
  • public $ afterAjaxUpdate;

Как вы уже использовали $ ajaxUrl в своем коде. Теперь я думаю, $ajaxUpdate является собственностью, которую вы ищете.

@var mixed the ID of the container whose content may be updated with an AJAX response. 
    * Defaults to null, meaning the container for this grid view instance. 
    * If it is set false, it means sorting and pagination will be performed in normal page requests 
    * instead of AJAX requests. If the sorting and pagination should trigger the update of multiple 
    * containers' content in AJAX fashion, these container IDs may be listed here (separated with comma). 

Выше линии около $ajaxUpdate .I приняли выше строки из официальной документации юй. Надеюсь, это поможет вам.

+0

OMG чувак! Это оно! ЭТО ПРОТИВ! ПОСЛЕ 3 СНЯТИЯ ДНЕЙ ПЫТОК ДАМЫ !!!! Все, что мне нужно было сделать, это отключить его и puf! ОНО РАБОТАЕТ! – Ljudotina

+0

Теперь, когда я рухнул ... действительно спасибо. Вы не только решили мою проблему, но и теперь я знаю, как глубже заглядывать в Yii, и это расширения/компоненты. – Ljudotina

+0

чувство радости, если мой ответ помогает. –