Yii2: как отобразить параметры из searchModel - PullRequest
0 голосов
/ 26 апреля 2018

после рендеринга _search.php в index.php

Я использовал Kartik DateRange для получения данных между датами буксировки.Вот мой код:

<?= $form->field($model, 'date', [
    'addon'=>['prepend'=>['content'=>'<i class="glyphicon glyphicon-calendar"></i>']],
    'options'=>['class'=>'drp-container form-group']
        ])->widget(DateRangePicker::classname(), [
            'useWithAddon'=>true
        ]);
 ?>

Я использовал функцию разнесения, чтобы получить даты, которые я прошел, и я получил реальные данные, все работает отлично.мой код searchModel:

<?php

namespace app\models;

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

class patientservicesSearch extends patientservices
{

public function rules()
{
    return [
        [['id',  'price'], 'integer'],
        [['patient_id', 'doctor_id','service_id','date','state'], 'safe'],
    ];
}
public function scenarios()
{
    return Model::scenarios();
}

public function search($params)
{     
    $query = patientservices::find();
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'pagination' => array('pageSize' => 150),
    ]);

    $this->load($params);

    if (!$this->validate()) {

      if ( ! is_null($this->date) && strpos($this->date, ' - ') !== false ) {
            list($start_date, $end_date) = explode(' - ', $this->date);
            $query->andFilterWhere(['between', 'date', $start_date, $end_date]);
            $this->date = null;
            }  

        return $dataProvider;
    }

    $query->joinWith('patient');
    $query->joinWith('service');
    $query->joinWith('doctor');
    $query->andFilterWhere([
        'patient_services.id' => $this->id,
        'patient_services.price' => $this->price,

    ]);
    $query->andFilterWhere(['like','patient.patient_name',$this->patient_id]);
    $query->orFilterWhere(['=','patient.patient_id',$this->patient_id]);
    $query->andFilterWhere(['like','services.service_name',$this->service_id]);
    $query->andFilterWhere(['like','doctors.doctor_name',$this->doctor_id]);
    if ( ! is_null($this->date) && strpos($this->date, ' - ') !== false ) {
           list($start_date, $end_date) = explode(' - ', $this->date);
           $query->andFilterWhere(['between', 'date', $start_date, $end_date]);
           $this->date = null;
           }  

    $total = 0;
        if (!empty($dataProvider->getModels())) {
            foreach ($dataProvider->getModels() as $key => $val) {
                $total += $val->price;
            }
        }

    return $dataProvider;
}
}

после того, как я отправляю форму, передающую параметры в searchModel, а затем, как мы знаем, диапазон дат становится пустым, другие поля не становятся пустыми, мне нужно повторитьпараметры, которые я передал searchModel Особенно диапазон дат.Я не знаю, в чем моя проблема здесь.

1 Ответ

0 голосов
/ 27 апреля 2018

Похоже, что ваше значение date не загружается в searchModel, иначе оно будет отображаться в поле, даже если вы вручную присвоите значение полю, как показано ниже, непосредственно перед вызовом view.я принимаю имя searchModel как ProductSearch

$params['ProductSearch']['date']='2018-05-20 - 2018-05-23';
$dataProvider=$model->search($params);
$this->render('search',['model'=>$model]);

, поэтому перейдите к вашей модели и добавьте поле date к вашим safe правилам вместе с другими перечисленными

public function rules() {
    return [
        [ [ 'id' ] , 'integer' ] ,
        [ [ 'some_field', 'some_other_field', 'date' ] , 'safe' ] ,
    ];
}

и если это поле не является частью таблицы базы данных и просто создано для целей поиска, то вы должны объявить это поле внутри searchModel как открытое свойство класса

public $date;

EDIT

После добавления модели поиска кажется, что вы устанавливаете поле date на null, поэтому очевидно, что оно не будет отображаться после успешного поиска, поэтому внутри вашей функции search($params)в конце, прежде чем вычислять $total, удалите строку $this->date=null; из условия

  $query->andFilterWhere(['like','doctors.doctor_name',$this->doctor_id]);
  if ( ! is_null($this->date) && strpos($this->date, ' - ') !== false ) {
       list($start_date, $end_date) = explode(' - ', $this->date);
        $query->andFilterWhere(['between', 'date', $start_date, $end_date]);

    //----->  $this->date = null;  //REMOVE THIS LINE //

  }  
...