Поиск в active record

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

Поиск в active record

Сообщение Spot »

Как сделать так, чтобы в Index GridView отображался, только если что-нибудь найдено, т.е. в начале было только поля для поиска?
Файл views\prest\index.php

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

<?php

use yii\helpers\Html;
use yii\grid\GridView;

/* @var $this yii\web\View */
/* @var $searchModel app\models\PrestSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = 'Prests';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="prest-index">

    <h1><?= Html::encode($this->title) ?></h1>
    <?php 
    echo $this->render('_search', ['model' => $searchModel]); ?>

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'Lastname',
            'Firstname',
            'Middlename',

            ['class' => 'yii\grid\ActionColumn',
            'template' => '{view}'
            ],
        ],
    ]); ?>
</div>
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Поиск в active record

Сообщение someweb »

Добавьте в searchModel условие andWhere('1=0') если поля поиска пустые.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Spot
Сообщения: 74
Зарегистрирован: 2013.04.09, 04:04

Re: Поиск в active record

Сообщение Spot »

Уже стоит

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

<?php

namespace app\models;

use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use app\models\Prest;

/**
 * PrestSearch represents the model behind the search form of `app\models\Prest`.
 */
class PrestSearch extends Prest
{
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['id'], 'integer'],
            [['Lastname', 'Firstname', 'Middlename', 'Birthdate', 'NRD', 'RDdate', 'UC', 'Mera', 'Init', 'Cat', 'Date'], 'safe'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }

    /**
     * Creates data provider instance with search query applied
     *
     * @param array $params
     *
     * @return ActiveDataProvider
     */
    public function search($params)
    {
        $query = Prest::find();
        
        // add conditions that should always apply here

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
             $query->where('0=1');
            return $dataProvider;
        }

        $query->andFilterWhere(['like', 'Lastname', $this->Lastname])
            ->andFilterWhere(['like', 'Firstname', $this->Firstname])
            ->andFilterWhere(['like', 'Middlename', $this->Middlename]);

        return $dataProvider;
    }
}

Spot
Сообщения: 74
Зарегистрирован: 2013.04.09, 04:04

Re: Поиск в active record

Сообщение Spot »

Обычно делали так: Если есть данные post, то выполняем запрос и показываем результат,
если пусто, то показываем форму.
Как это в Yii2 реализуется?
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Поиск в active record

Сообщение someweb »

Это не то условие.
Вам надо что то типа

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

    if (!$this->validate()) {
        // uncomment the following line if you do not want to return any records when validation fails
        $query->where('0=1');
        return $dataProvider;
    }
    if($this->Lastname || $this->Firstname || $this->Middlename) {
        $query->andFilterWhere(['like', 'Lastname', $this->Lastname])
            ->andFilterWhere(['like', 'Firstname', $this->Firstname])
            ->andFilterWhere(['like', 'Middlename', $this->Middlename]);
    } else {
        $query->where('0=1');
    }

    return $dataProvider;
Или сделать валидатор на эти поля, тогда сработает if (!$this->validate())
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Поиск в active record

Сообщение andku83 »

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

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
             $query->where('0=1');
            return $dataProvider;
        }
поменять на:

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

        if (!$this->load($params) || !$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
             $query->where('0=1');
            return $dataProvider;
        }
Spot
Сообщения: 74
Зарегистрирован: 2013.04.09, 04:04

Re: Поиск в active record

Сообщение Spot »

Спасибо!
Сделал так:

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

if (!$this->load($params) || !$this->validate()) {
А как по кнопке Reset очистить поля формы и скрыть грид?
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Поиск в active record

Сообщение andku83 »

один из множества вариантов:

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

<a href="<?= Url::to(['/currentController/currentAction']) ?>">
	<button>Reset</button>
</a>
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Поиск в active record

Сообщение ElisDN »

andku83 писал(а): 2018.09.24, 13:39 один из множества вариантов:

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

<?= Html::a('Reset', [''], ['class' => 'btn btn-default']) ?>
Spot
Сообщения: 74
Зарегистрирован: 2013.04.09, 04:04

Re: Поиск в active record

Сообщение Spot »

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

<a href="<?= Url::to(['/currentController/currentAction']) ?>">
	<button>Reset</button>
</a>
Class 'Url' not found

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

<?= Html::a('Reset', [''], ['class' => 'btn btn-default']) ?>
Grid все равно присутствует, но с надписью "Ничего не найдено"

Как сделать так, чтоб при загрузке страницы, также при нажатии кнопки reset была только форма поиска без никакого грида (пустого и непустого)?
И чтоб грид выводился, только если были отправлены post параметры
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Поиск в active record

Сообщение Loveorigami »

Так в чем проблема?
И чтоб грид выводился, только если были отправлены post параметры
Вам if else написать для копипаста?
Spot
Сообщения: 74
Зарегистрирован: 2013.04.09, 04:04

Re: Поиск в active record

Сообщение Spot »

Попробовал так:

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

    if (!$dataProvider){
    echo $this->render('_search', ['model' => $searchModel]); 
}
else ?>

    <?= 
    GridView::widget([
но dataprovider всегда непустой.

Если в actionIndex проверять

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

    public function actionIndex()
    {
        $searchModel = new PrestSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        if (Yii::$app->request->queryParams){
        return $this->render('index', [
            'dataProvider' => $dataProvider,
        ]);
		}
		else {
			return $this->render('index', [
            'searchModel' => $searchModel,
        ]);
		}
	
    }
то Undefined variable: dataProvider
Аватара пользователя
carono
Сообщения: 52
Зарегистрирован: 2018.04.28, 11:05

Re: Поиск в active record

Сообщение carono »

Проверяй не по существованию провайдера, а по его содержимому, $dataProvider->totalCount
Spot
Сообщения: 74
Зарегистрирован: 2013.04.09, 04:04

Re: Поиск в active record

Сообщение Spot »

В index делаю так:

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

<div class="prest-index">

    <h1><?= Html::encode($this->title) ?></h1>
    <?php 
    echo $dataProvider->getTotalCount();
    if ($dataProvider->getTotalCount()<=1)
    {
    echo $this->render('_search', ['model' => $searchModel]); 
}
else {
    
    GridView::widget([
        'dataProvider' => $dataProvider,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'Lastname',
            'Firstname',
            'Middlename',
            'Birthdate:date',
			
            ['class' => 'yii\grid\ActionColumn',
            'template' => '{view}'
            ],
        ],
    ]);
}?>
</div>
Когда $dataProvider->getTotalCount()=0 То нормально, форма выходит, грида нет.
Но когда заполняю форму и отправляю, выходит цифра 3 и грида нет
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Поиск в active record

Сообщение Loveorigami »

Есно
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Поиск в active record

Сообщение andku83 »

Spot писал(а): 2018.09.27, 05:00

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

...
    if ($dataProvider->getTotalCount()<=1)
...
по вашей логике если у вас будет один результат при поиске, то грид тоже не отобразится.
Spot
Сообщения: 74
Зарегистрирован: 2013.04.09, 04:04

Re: Поиск в active record

Сообщение Spot »

Это опечатка: должно быть <1
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Поиск в active record

Сообщение Loveorigami »

Spot писал(а): 2018.10.01, 10:38 Это опечатка: должно быть <1
тогда уж должно быть

if ($dataProvider->getTotalCount()) и поменять местами рендер поиска и грида
Ответить