虽然用过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', ));
9.在使用ajaxButton时如何在controller中调用var_dump等来调试:
<?php echo CHtml::ajaxButton('保存', array('reviewd/create'), array(//'success'=>'js:function(data){alert(123);}', 'data'=>array('name'=>'...', 'department_id'=>'...'), 'type'=>'POST', 'update'=>'#review-d-form', //'return'=>true, ) ,array('class'=>'btn btn-success btn-normal') )?>
注释掉红色的部分。