Yii框架常见问题汇总

然用过Yii做了一个小项目了,但是过程中间解决的问题没有随手记下来,导致新项目开始后,以前碰到的问题还得在查一遍,干脆就记下来,以便不时之需。

有新的会随时更新。

1.如何显示ActiveRecord执行的sql语句

array(

  'class'=>'CFileLogRoute',

  'levels'=>'trace,error, warning',

),

// uncomment the following to show log messages on web pages

/*

array(

  'class'=>'CWebLogRoute',

),

*/

在项目的config/main.php中,找到上面的代码段,添加trace,取消底下一段的注释

 2.在生成的_search.php中,如何去掉必须输入项的 "*" 号:

   只需要加上一句代码:<?php CHtml::$afterRequiredLabel = '';?>

  3.如何处理Model关联的对象为空的情况。

  例如:显示员工所属部门,使用TbDetailView时,

  'attributes'=>array(......



    array('label'=>'所属部门','value'=>!empty($model->department)?CHtml::encode($model->department->name) : '未设置'),

4.如何在下拉列表中显示“未选择”。

<?php echo $form->dropDownListRow($model,'type',CHtml::listData(CodeType::model()->findAll(),'id','name'),array('prompt'=>'[未选择]')) ?>

5.如何在TbGridView中显示CStarRating控件:

<?php $this->widget('bootstrap.widgets.TbGridView',array(

'id'=>'program-grid',

'dataProvider'=>$model->search(),

'afterAjaxUpdate'=>'function(id,data){ $("[id^=\'rating\'] > input").rating({"required":true}); $("[id^=\'rating\'] > div").attr("disabled","disabled");  }', 

//'filter'=>$model,

'type'=>'striped bordered',

'columns'=>array(

        'id',

        'business_id',

        'business_name',

        'program_code.name::程序类型',

        'program_code1.name::开发语言',

         array('name'=>'level','type'=>'raw',

          'value'=>'$this->grid->controller->widget("CStarRating",

                                array("starCount"=>"5",

                                        "minRating"=>"1",

                                        "maxRating"=>"10",

                                        "allowEmpty"=>false, 

                                        "name"=>$data->id,

                                        "id"=>"rating_" .$data->id,"value"=>$data->level,

                                        

                                        ),true)',),

array(

'class'=>'bootstrap.widgets.TbButtonColumn',

),

),

)); ?>

6.怎样在Grid中对外键关联的字段进行排序:

例如:Model名为Product,在Model里:

public function relations()

{

        // NOTE: you may need to adjust the relation name and the related

        // class name for the relations automatically generated below.

        return array(

            'product_agent'=>array(self::BELONGS_TO,'Agent','manufacturer'),

        );

}
public function search()

{

        $criteria=new CDbCriteria;

        $criteria->with = array('product_agent');

        

        ...............



        return new CActiveDataProvider(get_class($this), array(

            'criteria'=>$criteria,

            'sort'=>array('attributes'=> array('id','register_date','product_name','manufacturer','product_agent.name','unit_price','library_count'            )),

        ));

}

在页面里:

<?php $this->widget('zii.widgets.grid.CGridView', array(

    'id'=>'product-grid',

    'dataProvider'=>$model->search(),

    //'filter'=>$model,

    'columns'=>array(

        'id',

        

        'product_agent.name::生产厂商',



        array(

            'class'=>'CButtonColumn',

            'afterDelete'=>'function(link,success,data){if(data != "") alert(data);};'

        ),

    ),

)); ?>

7.如何自定义验证:

比如,在出库时判断是否库存不足:

在model中:

public function rules()

{

        // NOTE: you should only define rules for those attributes that

        // will receive user inputs.

        return array(

            .......

            array('quantity', 'quantityValidator'),

        );

}
/*

    在库数的验证

    */

    public function quantityValidator($attribute,$params)

    {                

        if ( $this->quantity > $this->shipment_product->library_count ) {

            $this->addError('quantity', '库存不足!');

        }

    }

8.如何对一个Model中的日期字段按照一个指定范围进行查询:

在model里添加两个字段:

public $occurrence_date_start;

public $occurrence_date_end;

然后再search方法中:

public function search()

{

    $criteria=new CDbCriteria;



    $criteria->compare('id',$this->id);

    if((isset($this->occurrence_date_start) && trim($this->occurrence_date_start) != "")

        && (isset($this->occurrence_date_end) && trim($this->occurrence_date_end) != ""))

        $criteria->addBetweenCondition('occurrence_date', ''.$this->occurrence_date_start.'', ''.$this->occurrence_date_end.'');

        ......



    return new CActiveDataProvider(get_class($this), array(

            'criteria'=>$criteria,

            'sort'=>array('attributes'=>array('id','occurrence_date','shipment_customer.name','shipment_product.product_name','shipment_staff.name',

                    'shipment_code.code_name','quantity','total_amount','actual_back_section_date',)),

        ));

}

在前台页面,我这里用的是Yii内置的CJuiDatePicker:

<div class="row">

        <?php echo $form->label($model,'occurrence_date_start'); ?>

        <?php $this->widget('zii.widgets.jui.CJuiDatePicker', array(

        'model'=>$model,

        'attribute'=>'occurrence_date_start',

        // additional javascript options for the date picker plugin

        'options'=>array(

            'showAnim'=>'fold',

            'showMonthAfterYear'=>'false',

        ),

        'htmlOptions'=>array(

            'style'=>'height:20px;',

        ),



        'language'=>'zh_cn',

        ));

        ?>

    </div>

    <div class="row">

        <?php echo $form->label($model,'occurrence_date_end'); ?>

        <?php $this->widget('zii.widgets.jui.CJuiDatePicker', array(

        'model'=>$model,

        'attribute'=>'occurrence_date_end',

        // additional javascript options for the date picker plugin

        'options'=>array(

            'showAnim'=>'fold',

            'showMonthAfterYear'=>'false',

        ),

        'htmlOptions'=>array(

            'style'=>'height:20px;',

        ),



        'language'=>'zh_cn',

    ));

From: http://www.cnblogs.com/dahuzizyd/archive/2013/03/26/2983471.html

你可能感兴趣的:(yii框架)