• 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',
        ));

     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')
    )?>

    注释掉红色的部分。

  • 相关阅读:
    84. Largest Rectangle in Histogram
    881. Boats to Save People
    148. Sort List
    830. Positions of Large Groups
    279. Perfect Squares
    15. 3Sum
    430. Flatten a Multilevel Doubly Linked List
    JS的所有字符串操作都在这里啦
    如何使DIV居中
    最齐全的vue公共函数给你们放出来啦
  • 原文地址:https://www.cnblogs.com/dahuzizyd/p/2983471.html
Copyright © 2020-2023  润新知