У меня есть приложение Yii, которое связывается с другим приложением, и я хотел бы использовать функциональность критериев, которую я использую в CGridView, для сравнения значений с массивом вместо базы данных, если это имеет смысл.
Другими словами, я хотел бы, чтобы, если пользователь вводит слово в фильтр CGridView, он сравнивал бы это слово с массивом, который я предоставляю в функции search ().
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'project-grid',
'rowCssClassExpression'=>'"items[]_{$data->id}"',
'dataProvider'=>$model->search(),
'filter'=>$model,
'ajaxUpdate'=>'true',
'columns'=>array(
array(
'name'=>'Form Name',
'value'=>'CHtml::link(ucwords(str_replace("publish", "", str_replace("-", " ", $data->form_name))), "/request/update/$data->primaryKey")',
'filter'=>CHtml::textField('request[form_name]','', array('class'=>'form-control', 'placeholder'=>'Form Name...')),
'type'=>'raw'
),
array(
'name'=>'User Name',
'value'=>'CHtml::link(ucfirst($data->user_name), "/request/update/$data->primaryKey")',
'filter'=>CHtml::textField('request[user_name]','', array('class'=>'form-control', 'placeholder'=>'User Name...')),
'type'=>'raw'
),
array(
'name'=>'Company',
'value'=>'CHtml::link(frontuser::model()->getCompany($data->user_id), "/request/update/$data->primaryKey")',
'filter'=>CHtml::textField('request[company]','', array('class'=>'form-control', 'placeholder'=>'Company Name...')),
'type'=>'raw'
),
array(
'name'=>'Last Updated',
'value'=>'CHtml::link(date("d/m/Y", strtotime($data->updated)), "/request/update/$data->primaryKey")',
'filter'=>CHtml::textField('request[updated]','', array('class'=>'form-control', 'placeholder'=>'Last Updated...')),
'type'=>'raw'
),
array(
'name'=>'DKA Ref',
'value'=>'CHtml::link($data->dka_ref, "/request/update/$data->primaryKey")',
'filter'=>CHtml::textField('request[dka_ref]','', array('class'=>'form-control', 'placeholder'=>'DKA Reference...')),
'type'=>'raw'
),
array(
'name'=>'Required By',
'value'=>'request::model()->getRequiredDate($data->data)',
'filter'=>'',
'type'=>'raw'
),
array(
'name'=>'Status',
'value'=>'request::model()->getStatusColor($data->primaryKey)',
'filter'=>'
<!--<div class="circle green-circle filter-circle"></div>
<div class="circle amber-circle filter-circle margin-left"></div>
<div class="circle red-circle filter-circle margin-left-60"></div>-->
'.CHtml::dropDownList('request[status]', '12', array(''=>'','3'=>'Green','2'=>'Amber', '1'=>'Red'), array('class'=>'request-filter form-control')),
'type'=>'raw'
),array(
'class'=>'CButtonColumn',
'template'=>'{delete}',
'buttons'=>array(
'delete' => array(
'url'=>'$this->grid->controller->createUrl("request/delete/$data->primaryKey")',
),
),
),
)
));
Вот моя функция search (), которая передается в CGridView
public function search(/*$id = null*/){
$criteria=new CDbCriteria;
$criteria->compare('form_name',$this->form_name, true);
$criteria->compare('user_name',$this->user_name, true);
$criteria->compare('last_updated',$this->updated, true);
$criteria->compare('dka_ref',$this->dka_ref, true);
$criteria->compare('status', $this->status);
$criteria->addInCondition('company', array('0'=>'The Company')); // <-- this is what I would like to be able to do
$criteria->addCondition('status>0');
$criteria->order = 'id DESC';
$dataProvider=new CActiveDataProvider('request', array('criteria'=>$criteria, 'pagination'=>array(
'pageSize'=>'50',
'route'=>'request/index'
)));
/* foreach($dataProvider->data*/
return $dataProvider;
}
Спасибо, парни 🙂
Я думаю, вам здесь не нужно, но лучше используйте условие соединения.
Если вы присоединяетесь к названиям компаний, вы можете просто искать те, которые приводят к чему-то вроде запроса in.
(companyFilter — это временный атрибут, который он использует только для фильтрации, и я делаю некоторые предположения относительно вашей модели данных ;-))
if ( isset($this->companyFilter) && !empty($this->companyFilter)) {
$criteria->join = 'join tb_Company company on company.idCompany = t.idCompany';
$criteria->compare('company.name',$this->companyFilter);
}
Кроме того, мне немного грязно использовать $ критерии-> соединение вместо $ критериев-> с и отношения, но у меня не получается работать с таким подходом.
Других решений пока нет …