More or less I use auto-complete field for a form. CJuiAutoComplete is a yii widget for this purposes. The common use case is to make an ajax request and retrieve a list from the database. So in this case you have to write a controller action to return you a json encoded list. What if I had a generic action to do this work for me?
This is a class that extends CAction to do the work for me.
class EAutoCompleteAction extends CAction { public $model; public $attribute; private $results = array(); public function run() { if(isset($this->model) && isset($this->attribute)) { $criteria = new CDbCriteria(); $criteria->compare($this->attribute, $_GET['term'], true); $model = new $this->model; foreach($model->findAll($criteria) as $m) { $this->results[] = $m->{$this->attribute}; } } echo CJSON::encode($this->results); } }
Simple as that. I have placed this action in my extension folder like:
./webapp/protected/extensions/EAutoCompleteAction.php
And in my controller I declare this action in the public actions function:
class MyController extends CController { ... public function actions() { return array( 'aclist'=>array( 'class'=>'application.extensions.EAutoCompleteAction', 'model'=>'My', //My model's class name 'attribute'=>'my_name', //The attribute of the model i will search ), ); } ... }
So i have a form view like:
./webapp/protected/views/my/_form.php
I initialize my widget there like.
$this->widget('zii.widgets.jui.CJuiAutoComplete', array( 'attribute'=>'my_name', 'model'=>$model, 'sourceUrl'=>array('my/aclist'), 'name'=>'my_input_name', 'options'=>array( 'minLength'=>'3', ), 'htmlOptions'=>array( 'size'=>45, 'maxlength'=>45, ), ));
And I am done. Now I can use this CAction in whatever Controller I want for whatever model I want and get quick results.
Total 7 comments
Thanks for this wiki. Is there a reason $results is declared as a class property rather than a local variable to the run method?
Nice Wiki! Don't forget to add aclist to your accessRules function
I think, the default autocomplete, doesnot support unicode characters. if i type in english, its showing up. But for other languages it doesnt show up.
Is there any solution for this?
If you want to return several fields from the controller, you can use something like:
And in your view, you can get their values like:
This wiki initial purpose was to provides it says in the title "A simple action...". I would like to focus on the word simple. What i wanted to is provide a basic functionality for some ppl to start with, that's why I did not released this as an extension. Thank you for your comment will work on it.
It is lacking several fundamental features:
it should send back the id, value, and optionally label properties. It only sends back the value property. This prevents you from setting the value to a hidden field
It does a %term% style search, whereas a term% style search is more appropriate
it will probably be better performance using DAO
works well, easy setup.
only thing i'd change would be to allow multiple attributes to search on , and use the 'OR' operator in the compare function.
Leave a comment
Please login to leave your comment.