Yii2-如何使用kartik日期时间选择器搜索gridview记录
我在Yii2-如何使用kartik日期时间选择器搜索gridview记录,gridview,filter,yii2,yii2-advanced-app,Gridview,Filter,Yii2,Yii2 Advanced App,我在yii2框架中工作。我的索引视图中有两个日期时间选择器。我想用它们来搜索记录 <section class="content"> <div class="box"> <div class="box-body"> <p> <?= Html::a('Update Record', ['create'], ['class' => 'btn btn-success']) ?>
yii2
框架中工作。我的索引
视图中有两个日期时间选择器。我想用它们来搜索记录
<section class="content">
<div class="box">
<div class="box-body">
<p>
<?= Html::a('Update Record', ['create'], ['class' => 'btn btn-success']) ?>
</p>
<div class="div1" style="float: left; text-align: right; width: 25%;">
<span style="padding-bottom: 10px; border-bottom: 1px solid black">
<?php
echo DateTimePicker::widget([
'name' => 'startTime',
'options' => ['placeholder' => 'Select Start Time ...'],
'convertFormat' => true,
'pluginOptions' => [
'format' => 'yyyy-dd-MM HH:i:ss',
//'startDate' => '01-Mar-2014 12:00 AM',
'todayHighlight' => true
]
]);
?>
</span>
</div>
<div class="div2" style="float: left; text-align: right; width: 25%;">
<span style="padding-bottom: 10px; border-bottom: 1px solid black">
<?php
echo DateTimePicker::widget([
'name' => 'endTime',
'options' => ['placeholder' => 'Select End Time ...'],
'convertFormat' => true,
'pluginOptions' => [
'format' => 'yyyy-dd-MM HH:i:ss',
// 'startDate' => '01-Mar-2014 12:00 AM',
'todayHighlight' => true
]
]);
?>
</span>
</div>
<p>
<?= Html::a('Search Record', ['index','id','name'=>'search'], ['class' => 'btn btn-info']) ?>
</p>
<?php Pjax::begin(); ?>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'meter_msn',
[
'label' => 'Meter Type',
'value' => function ($d) {
if(is_object($d))
return $d->meter_type;
return ' - ';
},
'filter' => Html::activeDropDownList($searchModel, 'meter_type', \app\models\Meters::getMeterTypeValues(), ['prompt' => "Meter Type", 'class' => 'form-control']),
],
'sub_div_code',
[
'label' => 'Sub Division Name',
'value' => function ($d) {
if(is_object($d->subdiv))
return $d->subdiv->name;
return ' - ';
},
'filter' => Html::activeDropDownList($searchModel, 'sub_div_code', \common\models\SurveyHescoSubdivision::toArrayList(), ['prompt' => "Sub-Div", 'class' => 'form-control']),
],
'meter_ping_date_time',
'start_date_time',
'end_date_time',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
<?php Pjax::end(); ?>
</div>
</div>
现在我想在用户选择开始和结束日期时间并单击搜索按钮时搜索记录。i、 e.我必须传递日期时间值,然后搜索记录。下面是我的搜索模型
public function rules()
{
return [
[['id', 'meter_id'], 'integer'],
[['meter_msn', 'sub_div_code','meter_type', 'sub_div_name'], 'safe'],
];
}
public function scenarios()
{
// bypass scenarios() implementation in the parent class
return Model::scenarios();
}
public function search($params)
{
$query = MeterPing::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;
}
// grid filtering conditions
$query->andFilterWhere([
'id' => $this->id,
'meter_id' => $this->meter_id,
'meter_ping_date_time' => $this->meter_ping_date_time,
'start_date_time' => $this->start_date_time,
'end_date_time' => $this->end_date_time,
'meter_type' => $this->meter_type,
]);
$query->andFilterWhere(['like', 'meter_msn', $this->meter_msn])
->andFilterWhere(['like', 'sub_div_code', $this->sub_div_code])
->andFilterWhere(['like', 'sub_div_name', $this->sub_div_name]);
return $dataProvider;
}
更新1
根据给出的答案,我已尝试更改代码
<section class="content">
<div class="box">
<div class="box-body">
<p>
<?= Html::a('Update Record', ['create'], ['class' => 'btn btn-success']) ?>
</p>
<?php Pjax::begin(); ?>
<?php $form = ActiveForm::begin([
'action' => ['index'],
'method' => 'get',
'options' => [
'data-pjax' => 1
],
]); ?>
<div class="div1" style="float: left; text-align: right; width: 25%;">
<span style="padding-bottom: 10px; border-bottom: 1px solid black">
<?php
echo DateTimePicker::widget([
'model' => $searchModel,
'attribute'=>'start_date_time',
'options' => ['placeholder' => 'Select Start Time ...'],
'convertFormat' => true,
'pluginOptions' => [
'format' => 'yyyy-dd-MM HH:i:ss',
// 'startDate' => '01-Mar-2014 12:00 AM',
'todayHighlight' => true
]
]);
?>
</span>
</div>
<div class="div2" style="float: left; text-align: right; width: 25%;">
<span style="padding-bottom: 10px; border-bottom: 1px solid black">
<?php
echo DateTimePicker::widget([
'model' => $searchModel,
'attribute'=>'end_date_time',
'options' => ['placeholder' => 'Select End Time ...'],
'convertFormat' => true,
'pluginOptions' => [
'format' => 'yyyy-dd-MM HH:i:ss',
//'startDate' => '01-Mar-2014 12:00 AM',
'todayHighlight' => true
]
]);
?>
</span>
</div>
<p>
<?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
</p>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
//'id',
//'meter_id',
'meter_msn',
[
'label' => 'Meter Type',
'value' => function ($d) {
if(is_object($d))
return $d->meter_type;
return ' - ';
},
'filter' => Html::activeDropDownList($searchModel, 'meter_type', \app\models\Meters::getMeterTypeValues(), ['prompt' => "Meter Type", 'class' => 'form-control']),
],
'sub_div_code',
[
'label' => 'Sub Division Name',
'value' => function ($d) {
if(is_object($d->subdiv))
return $d->subdiv->name;
return ' - ';
},
'filter' => Html::activeDropDownList($searchModel, 'sub_div_code', \common\models\SurveyHescoSubdivision::toArrayList(), ['prompt' => "Sub-Div", 'class' => 'form-control']),
],
'meter_ping_date_time',
'start_date_time',
'end_date_time',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
<?php ActiveForm::end(); ?>
<?php Pjax::end(); ?>
</div>
</div>
</section>
点击按钮后,它并没有给我想要的结果
更新2
下面是我更新的搜索模型
/**
* @inheritdoc
*/
public function rules()
{
return [
[['id', 'meter_id'], 'integer'],
[['meter_msn', 'sub_div_code','meter_type', 'sub_div_name','start_date_time','end_date_time'], '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 = MeterPing::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;
}
// grid filtering conditions
$query->andFilterWhere ( [
'id' => $this->id ,
'meter_id' => $this->meter_id ,
'meter_ping_date_time' => $this->meter_ping_date_time ,
] );
if ( $this->start_date_time !== '' ) {
$query->andFilterWhere ( [ '>=' , 'DATE_FORMAT(start_date_time,"%Y-%m-%d %h:%i:%s")' , date ( 'Y-m-d h:i:s' , strtotime ( $this->start_date_time ) ) ] );
}
if ( $this->end_date_time !== '' ) {
$query->andFilterWhere ( [ '<=' , 'DATE_FORMAT(end_date_time,"%Y-%m-%d %h:%i:%s")' , date ( 'Y-m-d h:i:s' , strtotime ( $this->end_date_time ) ) ] );
}
$query->andFilterWhere ( [ 'like' , 'meter_type' , $this->meter_type ] );
return $dataProvider;
}
/**
*@doc
*/
公共职能规则()
{
返回[
[['id','meter_id'],'integer'],
[['meter\u msn'、'sub\u div\u code'、'meter\u type'、'sub\u div\u name'、'start\u date\u time'、'end\u date\u time'、'safe'],
];
}
/**
*@doc
*/
公共功能场景()
{
//在父类中绕过scenarios()实现
返回模型::场景();
}
/**
*创建应用搜索查询的数据提供程序实例
*
*@param数组$params
*
*@return-ActiveDataProvider
*/
公共函数搜索($params){
$query=MeterPing::find();
//在此处添加应始终适用的条件
$dataProvider=新的ActiveDataProvider([
'query'=>$query,
] );
$this->load($params);
如果(!$this->validate()){
//如果您不想在验证失败时返回任何记录,请取消对以下行的注释
//$query->where('0=1');
返回$dataProvider;
}
//网格过滤条件
$query->andFilterWhere([
'id'=>this->id,
“仪表id”=>this->meter\u id,
“计量日期时间”=>this->meter\u ping\u date\u time,
] );
如果($this->start\u date\u time!=''){
$query->andFilterWhere(['>=','DATE_格式(开始日期时间,“%Y-%m-%d%h:%i:%s”),'DATE('Y-m-d h:i:s',strotime('this->开始日期时间)));
}
如果($this->end\u date\u time!=''){
$query->andFilterWhere(['您应该使用searchModel对象创建活动字段,并用表单标记包装字段,因为日期选择器也在索引操作的视图中。将html更改为以下内容,我假设您的表单位于pjax
容器
上面将搜索start\u date\u time
和end\u date\u time
与表单字段中准确输入的日期和时间匹配的记录,如果您只想匹配日期部分,您可能需要在$query->and filterwhere([
搜索模型内的条件)中格式化列和匹配值
'DATE_FORMAT('%Y-%d-%m',start_date_time)' => date("Y-d-m",strtotime($this->start_date_time)),
'DATE_FORMAT('%Y-%d-%m',end_date_time)' => date("Y-d-m",strtotime($this->end_date_time)),
编辑
如果我的假设正确,您希望输入的开始时间和结束时间获取开始时间和结束时间在此范围内的所有记录,如果我的假设正确的话
除去
'DATE_FORMAT('%Y-%d-%m',start_date_time)' => date("Y-d-m",strtotime($this->start_date_time)),
'DATE_FORMAT('%Y-%d-%m',end_date_time)' => date("Y-d-m",strtotime($this->end_date_time)),
并更改搜索功能,如下所示
// grid filtering conditions
$query->andFilterWhere([
'id' => $this->id,
'meter_id' => $this->meter_id,
'meter_ping_date_time' => $this->meter_ping_date_time,
'meter_type' => $this->meter_type,
]);
$query->andFilterWhere(['<=','DATE_FORMAT(start_date_time,"%Y-%m-%d")',date('Y-m-d',strtotime($this->start_date_time))]);
$query->andFilterWhere(['>=','DATE_FORMAT(end_date_time,"%Y-%m-%d")',date('Y-m-d',strtotime($this->end_date_time))]);
$query->andFilterWhere(['like', 'meter_msn', $this->meter_msn])
->andFilterWhere(['like', 'sub_div_code', $this->sub_div_code])
->andFilterWhere(['like', 'sub_div_name', $this->sub_div_name]);
return $dataProvider;
你有什么问题?当用户选择开始和结束日期时间并单击搜索按钮时,我想搜索记录。例如,我必须将日期时间值传递给我的搜索模型,然后搜索记录。让我们来看看。
<?php $form = ActiveForm::begin([
'action' => ['index'],
'method' => 'get',
'options' => [
'data-pjax' => 1
],
]); ?>
<div class="div1" style="float: left; text-align: right; width: 25%;">
<span style="padding-bottom: 10px; border-bottom: 1px solid black">
<?php
echo DateTimePicker::widget([
'model' => $searchModel,
'attribute'=>'start_date_time',
'options' => ['placeholder' => 'Select Start Time ...'],
'convertFormat' => true,
'pluginOptions' => [
'format' => 'yyyy-dd-MM HH:i:ss',
// 'startDate' => '01-Mar-2014 12:00 AM',
'todayHighlight' => true
]
]);
?>
</span>
</div>
<div class="div2" style="float: left; text-align: right; width: 25%;">
<span style="padding-bottom: 10px; border-bottom: 1px solid black">
<?php
echo DateTimePicker::widget([
'model' => $searchModel,
'attribute'=>'end_date_time',
'options' => ['placeholder' => 'Select End Time ...'],
'convertFormat' => true,
'pluginOptions' => [
'format' => 'yyyy-dd-MM HH:i:ss',
//'startDate' => '01-Mar-2014 12:00 AM',
'todayHighlight' => true
]
]);
?>
</span>
</div>
<p>
<?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
</p>
<?php ActiveForm::end(); ?>
public function actionIndex()
{
$searchModel = new MeterpingSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
'DATE_FORMAT('%Y-%d-%m',start_date_time)' => date("Y-d-m",strtotime($this->start_date_time)),
'DATE_FORMAT('%Y-%d-%m',end_date_time)' => date("Y-d-m",strtotime($this->end_date_time)),
'DATE_FORMAT('%Y-%d-%m',start_date_time)' => date("Y-d-m",strtotime($this->start_date_time)),
'DATE_FORMAT('%Y-%d-%m',end_date_time)' => date("Y-d-m",strtotime($this->end_date_time)),
// grid filtering conditions
$query->andFilterWhere([
'id' => $this->id,
'meter_id' => $this->meter_id,
'meter_ping_date_time' => $this->meter_ping_date_time,
'meter_type' => $this->meter_type,
]);
$query->andFilterWhere(['<=','DATE_FORMAT(start_date_time,"%Y-%m-%d")',date('Y-m-d',strtotime($this->start_date_time))]);
$query->andFilterWhere(['>=','DATE_FORMAT(end_date_time,"%Y-%m-%d")',date('Y-m-d',strtotime($this->end_date_time))]);
$query->andFilterWhere(['like', 'meter_msn', $this->meter_msn])
->andFilterWhere(['like', 'sub_div_code', $this->sub_div_code])
->andFilterWhere(['like', 'sub_div_name', $this->sub_div_name]);
return $dataProvider;
public function search( $params ) {
$query = MeterPing::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;
}
// grid filtering conditions
$query->andFilterWhere ( [
'id' => $this->id ,
'meter_id' => $this->meter_id ,
'meter_ping_date_time' => $this->meter_ping_date_time ,
] );
if ( $this->start_date_time !== '' && !is_null($this->start_date_time) ) {
$query->andFilterWhere ( [ '>=' , 'DATE_FORMAT(start_date_time,"%Y-%m-%d %H:%i:%s")' , date ( 'Y-m-d H:i:s' , strtotime ( $this->start_date_time ) ) ] );
}
if ( $this->end_date_time !== '' && !is_null($this->end_date_time) ) {
$query->andFilterWhere ( [ '<=' , 'DATE_FORMAT(end_date_time,"%Y-%m-%d %H:%i:%s")' , date ( 'Y-m-d H:i:s' , strtotime ( $this->end_date_time ) ) ] );
}
$query->andFilterWhere ( [ 'like' , 'meter_type' , $this->meter_type ] );
return $dataProvider;
}