2015-09-20 3 views
2

Я хочу использовать PJax в Yii Grid View, а не с ассоциативным фильтром, который приходит внутри Grid View, но с фильтром поиска, что это вне его, так что он может фильтровать результаты внутри. enter image description hereAjax Фильтрация с GridView в Yii

Вот источник индексного файла:

<div class="cars-index"> 

<h1><?= Html::encode($this->title) ?></h1> 


<?php echo $this->render('_search', ['model' => $searchModel]); ?> 

<p> 
    <?= Html::a('Create Cars', ['create'], ['class' => 'btn btn-success']) ?> 
</p> 


<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'columns' => [ 
     'id', 
     'name', 
     ['attribute' => 'code', 
     'label' => 'Colour', 
     'format' => 'raw', 
     'value' => 'colour', 
     'contentOptions' => function ($model, $key, $index, $column){ 
      return ['style' => ' text-align: center; width: 100px;color:white;background-color:#'. $model -> code]; 
     }, 
     'headerOptions' => ['style' => 'text-align: center;'], 
     ], 
     'price', 
     ['class' => 'yii\grid\ActionColumn'], 
    ], 
]); ?> 

Я должен создать активную форму только для части я хочу фильтровать? Или есть другой способ?

ответ

2

Если Вы не можете просто добавить фильтр к вам таблицу, как этот

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'filterModel' => $searchModel, 

Я предлагаю вам использовать надлежащие меры и надлежащую функцию поиска вызывается Представлять на основе указанной активной форме

для действия вида например:

<?php $form = ActiveForm::begin([ 
    'id' => 'search-form', 
    'method' => 'post', 
    'action' => ['controller/yourAction'] 
]); ?> 

в контроллер

$model = new yourActiveForm(); 

    if ($model->load(Yii::$app->request->post())) { 

     $dataProvider = $searchModel->search([ 'yuorSearchModel'=> ['your_att1' => $model->yourValue1]]); 
    } 

тогда рендеринге

Соответствует yii2 doc

Pjax имеет дело только с содержанием, заключенным между его начать() и конца() вызывает, называется содержанием тела виджета. По умолчанию любая ссылка для отправки или отправки ссылки (для этих форм с атрибутом data-pjax ) в содержимом тела вызовет запрос AJAX. В сообщении , отвечая на запрос AJAX, Pjax отправит обновленному телу (на основе запроса AJAX) клиенту, который заменит старое содержимое новым. Затем URL-адрес браузера будет с использованием pushState. Весь процесс не требует перезагрузки макета или ресурсов (js, css).

Вы можете настроить $ linkSelector, чтобы указать, какие ссылки должны запускать pjax, а также настроить $ formSelector для указания того, какая форма может быть отправлена ​​ trigger pjax.

Вы должны добавить

<?php Pjax::begin(); ?> 
.... your active form 

<?php Pjax::end(); ?> 

и настроить правильную $ linkSelect и $ formSelector

+0

Вот что я подумал .. Спасибо –

+0

Спасибо, я вижу, что ваша работа идет хорошо Хорошо – scaisEdge

+0

:) Я свежую аспирантуру в компании по развитию. Я в основном графический дизайнер, но я изучаю Yii2, а также благодаря таким людям, как вы .. С уважением –

0

На ваш взгляд фильтра:

<div id="myFilter"> 
    <?php $form = ActiveForm::begin([ 
     'id' => 'myFilterForm', 
     'method' => 'post', 
     'action' => [...], 
    ]); ?> 
    ... 
</div> 

И убедитесь, что вы предоставляете фильтр между Pjax::begin и Pjax::end

Все же здесь идет трюк.Если сервер не отвечает в течение тайм-аута по умолчанию Pjax игнорируется и страница перезагружается, поэтому убедитесь, что timeout достаточно большой:

<?php Pjax::begin([ 
    'id'=>'myGrid', 
    'timeout' => 10000,     // <------------ THIS !!!!!!! 
    'formSelector' => '#myFilterForm' 
]); ?> 

<?= $this->render('myFilter', ['model' => $searchModel]); ?> 

<?= GridView::widget([ 
    ... 
]); ?> 
<?php Pjax::end(); ?> 

Также в вашем контроллере, вы можете «сбросить» модель поиска, так только данные из запроса, используемых атрибуты фактически используемых search:

public function actionSearch() 
{ 
    $searchModel = new MySearch(); 

    if ($searchModel->load(Yii::$app->request->post())) { 
     $searchModel = new MySearch(); // "reset" 
     $dataProvider = $searchModel->search(Yii::$app->request->post()); 
    } else { 
     $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 
    } 

    return $this->render('search', [ 
     'searchModel' => $searchModel, 
     'dataProvider' => $dataProvider, 
    ]); 
} 

Надеется, что это помогает. Ура!