An Easy Solution for Dependent dropDownList Using AJAX

Sometimes new Yii guys face problem to manage dependent dropDownList using AJAX. I am going to discuss an easy solution about this issue.

Example code:

Code in View

<?php                                   
  echo CHtml::dropDownList('region_id','', 
  array(2=>'New England',1=>'Middle Atlantic',3=>'East North Central'),
 
  array(
    'prompt'=>'Select Region',
    'ajax' => array(
    'type'=>'POST', 
    'url'=>Yii::app()->createUrl('YourController/loadcities'), //or $this->createUrl('loadcities') if '$this' extends CController
    'update'=>'#city_name', //or 'success' => 'function(data){...handle the data in the way you want...}',
  'data'=>array('region_id'=>'js:this.value'),
  ))); 
 
 
 
echo CHtml::dropDownList('city_name','', array(), array('prompt'=>'Select City'));
?>

Code in Controller

public function actionLoadcities()
{
   $data=RegionCity::model()->findAll('region_id=:region_id', 
   array(':region_id'=>(int) $_POST['region_id']));
 
   $data=CHtml::listData($data,'id','city_name');
 
   echo "<option value=''>Select City</option>";
   foreach($data as $value=>$city_name)
   echo CHtml::tag('option', array('value'=>$value),CHtml::encode($city_name),true);
}

I think this will help to understand actually how AJAX works in Yii for dependent dropDownList also AJAX working behavior in Yii framework.

在GridView中使用关联模型进行搜索和排序

在GridView中使用关联模型进行搜索和排序

首先我们有两个模型它们直接有关联:

class Author extends CActiveRecord {
...
}
 
class Post extends CActiveRecord {
...
    function relations() {
        return array(
            'author'=&gt;array( self::BELONGS_TO, 'Author', 'id_author' ),
        );
    }
...
}

当以网格形式显示所有 Post 时,我们希望显示作者的名字,并且可以通过作者名字中的关键字过滤 Post。提供这些功能的最好解决方式(在我看来)是:

首先需要在 Post 模型中添加一个新的属性,它用来保存搜索的字符串(即要搜索的作者名).也可以使用外键列来实现同样的效果,但是我不喜欢这么用,在搜索条件中保存搜索的字符串而不是外键 id.你还须在搜索条件中将这个新的属性的规则设置为 safe。

class Post extends CActiveRecord {
  public $author_search;
  ...
  public function rules() {
    return array(
      ...
      array( 'xxx,yyy,author_search', 'safe', 'on'=&gt;'search' ),
    );
  }

现在就可以在搜索条件(标准情况-每个模型都要一个 search 方法)中使用这个属性了。同时,我们需要使用条件的 ‘with’ 属性来指定我们的 Post 是通过哪个关系来获取作者(这种方式只需一次数据库查询而不是延迟加载中的多次查询)。

$criteria = new CDbCriteria;
$criteria-&gt;with = array( 'author' );
...
$criteria-&gt;compare( 'author.username', $this-&gt;author_search, true );
...

当我们修改搜索函数时,我们对返回的 CActiveDataProvider 添加一个新的功能

return new CActiveDataProvider( 'Post', array(
    'criteria'=&gt;$criteria,
    'sort'=&gt;array(
        'attributes'=&gt;array(
            'author_search'=&gt;array(
                'asc'=&gt;'author.username',
                'desc'=&gt;'author.username DESC',
            ),
            '*',
        ),
    ),
));

配置中排序部分的 attributes 允许我们覆盖默认值。当我们按 author_search 字段排序的时候,它将会按照指定的规则排序,最后的 * 表示其他字段按默认排序。通过这种方式我们也可以修改默认属性的排序(例如:用户指定按 last_name 列排序时,应该使用last_name和first_name结合排序).

到现在为止我们已经为我们的网格显示做好了前期准备

$this-&gt;widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=&gt;$model-&gt;search(),
    'filter'=&gt;$model,
    'columns'=&gt;array(
        'title',
        'post_time',
        array( 'name'=&gt;'author_search', 'value'=&gt;'$data-&gt;author-&gt;username' ),
        array(
            'class'=&gt;'CButtonColumn',
        ),
    ),
));

这就是所有,我们使用用户名代替用户ID外键列来排序,并且我们可以使用姓名关键字搜索.

转载自: 在GridView中使用关联模型进行搜索和排序