Страница 1 из 1

Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 07:56
espltdmh50
Ребят, всем привет. Есть стандартный виджет ListView который выводит записи из бд. Выше него на основе ActiveForm сделал поисковый фильтр, в зависимости от которого обновляется ListView. Но обновляется с перезагрузкой страницы. Хотел с помощью Pjax сделать все без перезагрузки., и пошло поехало(((

форму обернул pjax-ком, сам виджет ListView тоже обернул pjax-ком. У каждого контейнера pjax-ка свой id. Далее сделал так:

Код: Выделить всё

<?php 
$js = <<< JS
    $("#usedSearch").on("pjax:end", function() {
        $.pjax.reload({container:"#listUsed"});
    });
JS;
$this->registerJs( $js, $position = yii\web\View::POS_READY);
?>
запрос уходи, данные отправляются без перезагрузки, но нифига не хочет обновлять ListView отфильтрованными данными. Ощущение, что где-то что-то не дает им попасть в сам экшен. принтил post,get,request. в экшен словно не поступает ничего. Не могу разобраться.

вод код фильтра - файл filter.php:

Код: Выделить всё

<?php 

$js = <<< JS

    $("#usedSearch").on("pjax:end", function() {
        $.pjax.reload({container:"#listUsed"});
    });
JS;

$this->registerJs( $js, $position = yii\web\View::POS_READY);
?>
 
   

    <?php Pjax::begin(['id' => 'usedSearch']); ?>    
    <?php $form = ActiveForm::begin(['options' => ['data-pjax' => true]]); ?>

        <div class="col-md-2 col-lg-2">
            <?= $form->field($filterForm, 'Make')->dropDownList(FunctionsModel::getItemsMarkbrand(), ['prompt'=>'Выберите марку', 'options' => [@$_POST['FilterForm']['Make']=>['Selected'=>true] ]]); ?>           
        </div>
        
        <div class="col-md-2 col-lg-2">
            <?= $form->field($filterForm, 'Year')->dropDownList(FunctionsModel::__getAllYear(), ['prompt'=>'Выберите год', 'options' => [@$_POST['FilterForm']['Year']=>['Selected'=>true] ]]); ?>     
        </div>
        
        <div class="col-md-2 col-lg-2">
            <?= $form->field($filterForm, 'Owners')->dropDownList([1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8], ['prompt'=>'Выберите кол-во', 'options' => [@$_POST['FilterForm']['Owners']=>['Selected'=>true] ]]); ?>       
        </div>
        
        <div class="col-md-2 col-lg-2">
            <?= $form->field($filterForm, 'From')->dropDownList($probeg, ['prompt'=>'...', 'options' => [@$_POST['FilterForm']['From']=>['Selected'=>true] ]]); ?>      
        </div>
        
        <div class="col-md-2 col-lg-2">
            <?= $form->field($filterForm, 'To')->dropDownList($probeg, ['prompt'=>'...', 'options' => [@$_POST['FilterForm']['To']=>['Selected'=>true] ]]); ?>     
        </div>
        
        <div class="col-md-2 col-lg-2">
            <?= $form->field($filterForm, 'Transmission')->dropDownList(FunctionsModel::__getAllTransmission(), ['prompt'=>'Выберите', 'options' => [@$_POST['FilterForm']['Transmission']=>['Selected'=>true] ]]); ?>     
        </div>
        
        <div class="col-md-2 col-lg-2">            
            <?= $form->field($filterForm, 'PriceFrom')->textInput(['placeholder'=>'100000', 'value' => @$_POST['FilterForm']['PriceFrom'] ]); ?>      
        </div>
        
        <div class="col-md-2 col-lg-2">
            <?= $form->field($filterForm, 'PriceTo')->textInput(['placeholder'=>'500000', 'value' => @$_POST['FilterForm']['PriceTo'] ]); ?>            
        </div>              
        
        <div class="col-md-2 col-lg-2">
            <br />
            <?= Html::submitButton('Искать', ['class' => 'btn btn-primary btn-lg colorBtn', 'id'=>'sub', 'name' => 'filterAuto-button', 'style'=>'border:none;']) ?>            
        </div>
 
    <?php ActiveForm::end(); ?>
    <?php Pjax::end(); ?>


вот код виджета ListView - info.php

Код: Выделить всё



<?= $this->render('/inc/filter', ['filterForm'=>$filterForm]); ?>

<?php	
    $dataProvider = new ActiveDataProvider([
        'query' => $cars,
        'pagination' => [
            'pageSize' => 32,
        ],
    ]);
?>

<?php Pjax::begin(['id' => 'listUsed']); ?>
<?php
    echo ListView::widget([
        'dataProvider' => $dataProvider,
        'itemView' => '_listUsed',
        'options' => [
                //'id' => 'carsusedlistview'
        ],
        'pager' => [
            'firstPageLabel' => '««',
            'lastPageLabel' => '»»',
            'nextPageLabel' => '»',
            'prevPageLabel' => '«',        
            'maxButtonCount' => 10,
        ],
    ]);
?>
<?php Pjax::end(); ?>

экшен

Код: Выделить всё

public function actionUsed()
    {

		$brands = Auto::find()->select('Make')->groupBy('Make')->all(); //бренды авто
   
        $cars = Auto::find()->asArray(); //авто со всеми параметрами   
        
        //if( isset($_POST['FilterForm']) ){            
            //$filterForm = $_POST['FilterForm'];   
            //$cars = FunctionsModel::__getUsedFilter($filterForm);            
        //}  
        
        $filterForm = new FilterForm();   

        print '<pre>';
        print_r($_REQUEST);
        print '</pre>';

		return $this->render('used', ['cars'=>$cars, 'brands'=>$brands, 'filterForm'=>$filterForm]);
		
	}

вот отправил форму через pjax. в консоли браузера появились 2 ссылки.
Изображение

далее видно, что ушло название toyota
Изображение

перейдя на другую сгенерированную pjax-ком ссылку видно, что данных вроде как не передано.
Изображение

а в response получаю часть верстки.
Изображение

Ребят, что я делаю не так!???? В первой версии yii, можно было легко обновить listView просто с помощью

$.fn.yiiListView.update(

'ajaxListView',
{data: ajaxRequest}
)

а тут, я не пойму куда рыть, где ошибка!?? ПОМОГИТЕ ЛЮДИ!))))))) :)

Re: Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 09:25
yiiliveext
Попробуйте

Код: Выделить всё

$this->registerJs( $js, $position = yii\web\View::POS_READY);
заменить на

Код: Выделить всё

$this->registerJs($js);

Re: Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 09:32
espltdmh50
увы, не решило проблему!

Re: Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 09:39
yiiliveext
espltdmh50 писал(а): 2019.09.13, 09:32 увы, не решило проблему!
Посмотрите в консоли срабатывает ли событие

Код: Выделить всё

<?php 
$js = <<< JS
    $("#usedSearch").on("pjax:end", function() {
        console.log("usedSearch loaded");
        $.pjax.reload({container:"#listUsed"});
    });
JS;
$this->registerJs( $js, $position = yii\web\View::POS_READY);
?>

Re: Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 09:44
espltdmh50
событие срабатывает


Изображение

Re: Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 09:49
yiiliveext
Увеличте таймаут

Код: Выделить всё

 $.pjax.reload({container:"#listUsed", timeout: 10000});
    });

Re: Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 09:59
espltdmh50
не помогает. Ощущение, что он вообще на свой контейнер забил! причем пагинация у ListView после обертки пиджаком работает в режиме ajax как и положено.

Re: Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 10:10
yiiliveext

Код: Выделить всё

$.pjax.reload({container:"#listUsed", timeout: 10000, async: false});
А вообще я фильтр с pjax делаю обычно так

Код: Выделить всё

$("#filter").on("beforeSubmit", function(e){
    var $filter_form = $(this);
   
    $("#catalog").on("pjax:end", function(){
        $.pjax.reload({container:"#filter-row", timeout:5000});
    });
    $.pjax.reload({url: $filter_form.attr("action")+"?"+$filter_form.serialize(), container:"#catalog", timeout:5000});
    
    return false; 
});

Re: Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 10:36
Alexum
espltdmh50 писал(а): 2019.09.13, 09:59 не помогает. Ощущение, что он вообще на свой контейнер забил! причем пагинация у ListView после обертки пиджаком работает в режиме ajax как и положено.
При работе с фильтром текущий url страницы меняется? Либо он должен быть модифицированным, либо его нужно конкретно указывать как в примере выше у yiiliveext.

Re: Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 11:06
espltdmh50
нет. url не меняется. все на одном екшене, и сам фильтр, listview. отправка тоже на этот же екшн

Re: Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 11:21
espltdmh50
yiiliveext писал(а): 2019.09.13, 10:10

Код: Выделить всё

$.pjax.reload({container:"#listUsed", timeout: 10000, async: false});
А вообще я фильтр с pjax делаю обычно так

Код: Выделить всё

$("#filter").on("beforeSubmit", function(e){
    var $filter_form = $(this);
   
    $("#catalog").on("pjax:end", function(){
        $.pjax.reload({container:"#filter-row", timeout:5000});
    });
    $.pjax.reload({url: $filter_form.attr("action")+"?"+$filter_form.serialize(), container:"#catalog", timeout:5000});
    
    return false; 
});

спасибо большое!!! Ваш код мне помог!!! но я не до конца понял, что было не так? можно подробнее? Дело лишь в том, что я не указал что была отправлена форма и + надо было данные сериализовать? только в этом дело?

Re: Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 11:27
yiiliveext
Это просто альтернативный способ отправки формы pjax (вместо стандартного установкой data-pjax = true). Я уже точно не помню, но со стандарнтым есть какие-то нюансы, поэтому я предпочитаю перегружать pjax вручную в событии формы beforeSubmit. В вашем случае, кстати, перегружать надо методом POST, странно что у вас заработало)) Это в этом куске кода просто фильтруется через GET

Re: Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 11:55
espltdmh50
главное - работает)

Re: Проблема с PJAX, не обновляет содержимое. Нужна помощь!

Добавлено: 2019.09.13, 12:20
Alexum
espltdmh50 писал(а): 2019.09.13, 11:21 но я не до конца понял, что было не так? можно подробнее? Дело лишь в том, что я не указал что была отправлена форма и + надо было данные сериализовать? только в этом дело?
Нужно понимать как он в принципе работает, почитать на страничке самой библиотеки https://github.com/defunkt/jquery-pjax, посмотреть исходный код https://github.com/defunkt/jquery-pjax/ ... ax.js#L380 . С единичным использованием Pjax редко возникают проблемы, а вот когда контейнеров несколько приходится учитывать нюансы: таймауты, текущий url, кто и когда его будет перезаписывать и т.п.