Yii2:如何从 searchModel 回显参数
Yii2 : how to echo parameters from searchModel
我在 index.php
中渲染 _search.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
]);
?>
我使用了 explode 函数来获取我通过的日期,并且我得到了一个真实的数据,它工作正常。
我的 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
特别是日期范围。我不知道我的问题是什么。
看起来你的 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' ] ,
];
}
如果此字段不是数据库的一部分 table 并且只是为了搜索目的而创建,那么您应该在 searchModel
中将此字段声明为 public 属性 的 class
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 //
}
我在 index.php
_search.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
]);
?>
我使用了 explode 函数来获取我通过的日期,并且我得到了一个真实的数据,它工作正常。 我的 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
特别是日期范围。我不知道我的问题是什么。
看起来你的 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' ] ,
];
}
如果此字段不是数据库的一部分 table 并且只是为了搜索目的而创建,那么您应该在 searchModel
中将此字段声明为 public 属性 的 class
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 //
}