Обновите несколько виджетов с помощью фильтрации ajax TbExtendedGridView.

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


person Ljudotina    schedule 11.02.2014    source источник
comment
Вы жестко закодировали URL-адрес в кнопке или получили атрибут модели?   -  person Rafay Zia Mir    schedule 11.02.2014
comment
URL кнопки передается от контроллера. Когда нет фильтрации, url передается и все работает нормально. Но как только я фильтрую, я не могу изменить этот URL-адрес, так как фильтрация только обновляет (через AJAX) часть страницы TbExtendedGridView и не влияет на часть TbButton.   -  person Ljudotina    schedule 11.02.2014
comment
Если есть способ принудительно перезагрузить страницу при фильтрации, я тоже был бы счастлив.   -  person Ljudotina    schedule 11.02.2014
comment
хорошо, арендуйте свой код действия, в котором вы фильтруете dataProvider, также опубликуйте код в файле представления, где вы передаете данные в действие для вызова ajax   -  person Rafay Zia Mir    schedule 11.02.2014
comment
Вот вам м8. Спасибо за ваше время.   -  person Ljudotina    schedule 12.02.2014


Ответы (1)


Поскольку мой ответ довольно длинный, я добавляю ответ, а не добавляю комментарий под вопросом.
Первая вещь для вашего кода: вы используете свойство responsiveTable=true. это свойство не позволит gridView реагировать, а изменит эффект, как вы можете видеть, когда вы уменьшите ширину браузера вручную, он покажет TbGridView, но с обратными эффектами. Это исказит ориентацию столбцов и строк. это сами.
На ваш вопрос Поскольку TbExtendedGridView является продолжением TbGridView. А TbGridView является продолжением CgridView и TbDataColumn. Теперь у CgridView есть некоторые общедоступные свойства, касающиеся ajax. указано как

  • публичный $ajaxUpdate;
  • публичный $ajaxUpdateError;
  • публичный $ajaxVar='ajax';
  • публичный $ajaxUrl;
  • общедоступный $beforeAjaxUpdate;
  • публичный $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. Я взял выше строки из официальной документации yii. Я надеюсь, что это поможет вам.

person Rafay Zia Mir    schedule 12.02.2014
comment
ОМГ чувак! Вот и все! ЭТО ЧУДО! ПОСЛЕ ТРЕХ ЧЕРТОВЫХ ДНЕЙ ПЫТОК!!!! Все, что мне нужно было сделать, это отключить его и пых! ОНО РАБОТАЕТ! - person Ljudotina; 12.02.2014
comment
Теперь, когда я остыл... действительно спасибо. Вы не только решили мою проблему, но теперь я знаю, как глубже заглянуть внутрь Yii и его расширений/компонентов. - person Ljudotina; 12.02.2014
comment
рад, если мой ответ поможет. - person Rafay Zia Mir; 12.02.2014
comment
Есть ли система PM в stackoverflow? Мне нужно спросить у тебя кое-что личное. - person Ljudotina; 12.02.2014
comment
нет, я думаю, что нет системы PM, но вы можете написать мне по электронной почте. - person Rafay Zia Mir; 12.02.2014
comment
[email protected]. Тот, что в моем профиле старый, я им не пользуюсь - person Rafay Zia Mir; 12.02.2014
comment
Просто дополнительные данные для нубов Yii вроде меня. Вам даже не нужно отключать ajax, все, что мне нужно было сделать, это: 1) дать каждому виджету в этом представлении его уникальный идентификатор, например: 'id'=›'user-grid', а затем в виджете, который фильтрует, вы просто говорите ajax какие виджеты нужно обновить (в моем случае): 'ajaxUpdate' => 'user-grid, PDF-button', и вот, вы идете ... вы не теряете магию ajax. Еще раз спасибо Рафаю - person Ljudotina; 12.02.2014