Форма фильтра для listview без обновления страницы

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
sergvic
Сообщения: 81
Зарегистрирован: 2014.01.24, 17:25

Форма фильтра для listview без обновления страницы

Сообщение sergvic »

Суть задачи такая.
Нужно при нажатии в форме кнопки "поиск" вывести список адресов (listview widget) по критерию из формы и так же вывести их на яндекс карте. Считаем что карта уже выведена на страницу.
И нужно чтоб страница не перезагружалась полностью а только обновится должен список и данные на карте и данные в форме должны остаться.
Как правильно написать view и action ?

Заранее спасибо за советы.
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Re: Форма фильтра для listview без обновления страницы

Сообщение Demon_id »

иногда такое впечатление, что люди сюда приходят и просто ставят свои задачи. причём в большинстве случаев тривиальные, требующие построения архитектурной логики и мало касающиеся самого фреймворка.

Уважаемый, вы сами то уже что то начали делать? может покажете что у Вас конкретно не получается в данном вопросе?
sergvic
Сообщения: 81
Зарегистрирован: 2014.01.24, 17:25

Re: Форма фильтра для listview без обновления страницы

Сообщение sergvic »

Да пробою с помощью pjax по этому примеру http://www.yiiframework.com/wiki/772/pj ... view-yii2/
index.php

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

<?php
use yii\helpers\Html;
use yii\helpers\ArrayHelper;
use yii\widgets\ActiveForm;
use common\models\agct;
use yii\widgets\ListView;
use frontend\assets\AppAsset;
use yii\web\View;

AppAsset::register($this);

$js = "var map;\nvar myCollection;\nymaps.ready(init);\n";
$js .="function init(){
        map = new ymaps.Map('map', {
        center: [59.95, 30.34],
        zoom: 10,
        type: 'yandex#map',
        behaviors: ['default', 'scrollZoom']
    });
    myCollection = new ymaps.GeoObjectCollection();
    }";
Yii::$app->view->registerJs($js, View::POS_READY,'yandex-map');

?>
<div class="ugolAll darkgreen ovfw">
    <b class="ugol rt"></b><b class="ugol rb"></b><b class="ugol lt"></b><b class="ugol lb"></b>

    <div class="lightgreen otstup ovfw">
        <div class="otstup">
            <h1 class="PageName">Я ИЩУ</h1>

            <!--<div class="searchform">-->
            <?php yii\widgets\Pjax::begin(['id' => 'searchform']) ?>

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

            <?= $form->field($fmodel, 'whatSearch', [
                'template' => '{input}',
            ])->radioList([1 => 'Клиника', 2 => 'Доктор'],['id'=>'whatSearch']) ?>

            <?= $form->field($fmodel, 'IsAdult', [
                'template' => '{input}',
            ])->checkbox(['id' => 'checkIsAdult']); ?>
            <?= $form->field($fmodel, 'IsChild', [
                'template' => '{input}',
            ])->checkbox(['id' => 'checkIsChild']); ?>

            <div class="form-group">
                <?= Html::submitButton('Найти', ['class' => 'btn btn-primary']) ?>
            </div>

            <?php ActiveForm::end(); ?>
            <!--</div>-->
            <?php yii\widgets\Pjax::end() ?>
            <?

            ?>
        </div>
    </div>
    <div id="map"></div>
</div>
<h3> Список</h3>
<!--<div id="list">
</div>-->

<?php
yii\widgets\Pjax::begin(['id' => 'list']);

echo ListView::widget([
    'dataProvider' => $dataProvider,
    'itemView' => function ($model, $key, $index, $widget) {
        $substations=[];
        foreach($model->subStations as $obj) {
            $substations[] = $obj->name;
        }
        return '
<div class="fonemenu ovfw listing col-1-2">
    <div class="col2 otstup"><a href="/hospitals/centr-membrannogo-plazmafereza.htm">'.$model->hName.'</a></div>
    <div id="id_spec_data_1" class="otstupL show_off" style="display: block;">
        <div style="width:100px; height: 10px; float: right; margin-top: -25px;">
            <div class="ratingblock">
                <div id="unit_longo1939">
                    <ul id="unit_ulo1939" class="unit-rating" style="width:100px;">
                        <li class="current-rating" style="width:53.8px;">2.69/5</li>
                    </ul>
                    <div class="static" style="text-align:center;">Рейтинг: <strong> 2.7</strong> из 5<br>(72 голоса/ов)</div>
                </div>
            </div>
            <div style="color:#36AA3D; text-align: center; font-size: 11px;"><em>Суммарный рейтинг по Подразделениям</em></div>
        </div>
        район: '.$model->areacity->name.'<br>станции метро: '.implode(',',$substations).'<br>'.$model->hAddress.'<br>'.$model->hPhone.
        '</div>
</div>
            ';
    },
]);
yii\widgets\Pjax::end();
?>
controller

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

    public function actionIndex()
    {
        $SearchForm = new SearchForm();
        if ($SearchForm->load(Yii::$app->request->post())) {
            if ($SearchForm->whatSearch == 1) {
                $searchModel = new HospitalsSearch();
                $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
            }
            if ($SearchForm->whatSearch == 2) {
                $searchModel = new DoctorsSearch();
                $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
            }
        } else {
            $searchModel = new HospitalsSearch();
            $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
        }
        return $this->render('index',
            ['fmodel' => $SearchForm,
                'dataProvider' => $dataProvider,
            ]
        );
    }
 
В итоге у меня index вызывается 3 раза. Первый с данными формы через post, второй он вызывается с get _pjax='#list' и третий без параметров. После чего данные формы сбрасываются так как в третий раз не передается модель формы и так же не пойму как сохранить данные формы для последующей выборки .
Я новичок в yii и это мой первый крупный проект на нем, поэтому и есть много вопросов. Может я конечно где-то не до конца и сам разобрался поэтому и прошу помощи.
sergvic
Сообщения: 81
Зарегистрирован: 2014.01.24, 17:25

Re: Форма фильтра для listview без обновления страницы

Сообщение sergvic »

Да забыл через assetподключается js скрипт

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

$("document").ready(function () {
    $("#searchform").on("pjax:end", function () {
        $.pjax.reload({container: "#list"});  //Reload GridView
    });
})
Ответить