Revision #2 has been created by zaccaria on Mar 28, 2012, 7:21:47 AM with the memo:
security
« previous (#1) next (#3) »
Changes
Title
unchanged
History Autocomplete
Category
unchanged
How-tos
Yii version
unchanged
Tags
unchanged
autocomplete
Content
changed
[...]
Often you can solve with a foreign field, with an interface for add a new color. That's great if adding new color is a quite rare operation, if it happens too often and if the users are too stupid for remember how to add a color, it can be odd.
I propose an half way solution: a free text with autocomplete based on history values.
Add this to an CHtml We will use CJuiAutoComplete, what we need is a efficient way for perform searches.
Add this to your components/extension
s:
```php
class
ZHtmlSearchAction extends C
HtmlAction
{
public
function activeTextFieldHistory($model, $attribute, $htmlOptions=null)
$model;
public $attribute;
public $criteria=array('limit'=>5);
public function run()
{
$mod=$model;
$attr=$attribute;
self::resolveNameID($mod,$attr,$htmlOptions
$criteria=new CDbCriteria($this->criteria);
$criteria->addCondition("{$this->attribute} IS NOT NULL AND {$this->attribute} LIKE :param");
$
route=array('/site/search', 'model'=>get_class($model), 'attribute'=>$attr);
if (isset($htmlOptions['filcriteria->group=$this->attribute;
$criteria->order="COUNT({$this->attribute}) desc";
$criteria->params[':param']='%'.$_GET['ter
m']
)).'%';
{
$route['filter']=$htmlOptions['filter'];
unset($htmlOptions['filter']);
}$results=array();
foreach (CActiveRecord::model($this->model)->findAll($criteria) as $record)
$results[]=$record->{$this->attribute};
echo CJSON::encode($results);
$this->widget('zii.widgets.jui.CJuiAutoComplete',
array('model'=>$model,
'attribute'=>$attr,
'htmlOptions'=>$htmlOp}
}
```
Now we can configure a search action in our controller like that:
```php
public function actions()
{
return array(
'searchCompany'=>array(
'class'=>'SearchAction
s',
'sourceUrl'=>$route));
}
}'model'=>'Request',
'attribute'=>'company',
)
);
}
```
You can pass additional configuration for the search (e.g, some more condition limiting the search in a project/group, sorting or whatever else)
And add this to your SiteController:
```php
public function actionSearch()
{ using the property $criteria.
Now you can create your search textfield as:
$model=$_GET['model'];
$attribute= $_GET['attribute'];
$param=addslashes($_GET['term']);
$results=array();
$criteria=new CDbCriteria;
$criteria->condition="$attribute IS NOT NULL AND $attribute LIKE '%$param%' ";
if (isset($_GET['filter']))
$criteria->condition.=' AND '.$_GET['filter'];
$criteria->group=$attribute;
$criteria->order="COUNT($attribute) desc";
$criteria->limit=5;
$records=CActiveRecord::model($model)->findAll($criteria);
foreach ($records as $record)
$results[]=$record->$attribute;
echo CJSON::encode($results);
}
```
Now you can create your search textfield as:
```php
ZHtml::activeTextFieldHistory($model, 'color');
```php
<?php $this->widget('zii.widgets.jui.CJuiAutoComplete',
array('model'=>$model,
'attribute'=>'company',
'htmlOptions'=> array('maxlength'=>300, 'class'=>'text'),
'sourceUrl'=>'searchCompany'));?>
```
This method is quite efficient and usually customer like it, because is based on the laziness of the users.