Ejuicombobox在特定模型属性上抛出未定义的偏移错误

时间:2013-03-10 19:56:41

标签: autocomplete combobox yii

我使用自动完成功能下载了可编辑的组合框控件并添加了扩展名。我遇到了模型的patient_id和problem_definition_id属性的问题。适用于problem_duration_id和其他一些属性。当我将它们用于组合框时,我收到以下错误:

enter image description here

以下是我在视图中使用的代码:

$this->widget('ext.combobox.EJuiComboBox', array(
    'model' => $PatientProblem,
    'attribute' => 'problem_definition_id',
    'id'=>'eeed',
    'data'=>Yii::app()->cache->get('PATIENT_PROBLEM'),
    // options passed to plugin
    'assoc'=>true,
    'options' => array(
        'allowText' => false,),
    // Options passed to the text input
    'htmlOptions' => array('size' => 6),
));

以下是我的模特:

<?php

/**
 * This is the model class for table "patient_problem".
 *
 * The followings are the available columns in table 'patient_problem':
 * @property integer $problem_id
 * @property integer $problem_definition_id
 * @property integer $patient_id
 * @property integer $curr_or_history
 * @property integer $patient_visit_id
 * @property string $problem_notes
 * @property string $chronic
 * @property string $alert_on_dashboard
 * @property integer $problem_duration_id
 * @property integer $create_acc_id
 * @property integer $create_user_id
 * @property string $create_date
 * @property integer $create_acc_assign_id
 * @property integer $update_acc_id
 * @property integer $update_user_id
 * @property string $update_date
 * @property integer $update_acc_assign_id
 *
 * The followings are the available model relations:
 * @property Patient $patient
 * @property ListOfValues $currOrHistory
 * @property PatientVisit $patientVisit
 * @property ListOfValues $problemDefinition
 * @property ListOfValues $problemDuration
 */
class PatientProblem extends CActiveRecord
{
        /**
         * Returns the static model of the specified AR class.
         * @param string $className active record class name.
         * @return PatientProblem the static model class
         */
        public static function model($className=__CLASS__)
        {
                return parent::model($className);
        }

        /**
         * @return string the associated database table name
         */
        public function tableName()
        {
                return 'patient_problem';
        }

        /**
         * @return array validation rules for model attributes.
         */
        public function rules()
        {
                // NOTE: you should only define rules for those attributes that
                // will receive user inputs.
                return array(
                        array('problem_definition_id, patient_id, curr_or_history, patient_visit_id, problem_duration_id, create_acc_id, create_user_id, create_acc_assign_id, update_acc_id, update_user_id, update_acc_assign_id', 'numerical', 'integerOnly'=>true),
                        array('chronic, alert_on_dashboard', 'length', 'max'=>1),
                        array('problem_notes, problem_reported_date, create_date, update_date', 'safe'),
                        // The following rule is used by search().
                        // Please remove those attributes that should not be searched.
                        array('problem_id, problem_definition_id, patient_id, curr_or_history, patient_visit_id, problem_notes, problem_reported_date, chronic, alert_on_dashboard, problem_duration_id, create_acc_id, create_user_id, create_date, create_acc_assign_id, update_acc_id, update_user_id, update_date, update_acc_assign_id', 'safe', 'on'=>'search'),
                );
        }

        /**
         * @return array relational rules.
         */
        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(
                        'patient' => array(self::BELONGS_TO, 'Patient', 'patient_id'),
                        'currOrHistory' => array(self::BELONGS_TO, 'ListOfValues', 'curr_or_history'),
                        'patientVisit' => array(self::BELONGS_TO, 'PatientVisit', 'patient_visit_id'),
                        'problemDefinition' => array(self::BELONGS_TO, 'ListOfValues', 'problem_definition_id'),
                        'problemDuration' => array(self::BELONGS_TO, 'ListOfValues', 'problem_duration_id'),
                );
        }

        /**
         * @return array customized attribute labels (name=>label)
         */
        public function attributeLabels()
        {
                return array(
                        'problem_id' => 'Problem',
                        'problem_definition_id' => 'Problem Definition',
                        'patient_id' => 'Patient',
                        'curr_or_history' => 'Curr Or History',
                        'patient_visit_id' => 'Patient Visit',
                        'problem_notes' => 'Problem Notes',
                        'problem_reported_date'=>'Report Date',
                        'chronic' => 'Chronic',
                        'alert_on_dashboard' => 'Alert On Dashboard',
                        'problem_duration_id' => 'Problem Duration',
                        'create_acc_id' => 'Create Acc',
                        'create_user_id' => 'Create User',
                        'create_date' => 'Create Date',
                        'create_acc_assign_id' => 'Create Acc Assign',
                        'update_acc_id' => 'Update Acc',
                        'update_user_id' => 'Update User',
                        'update_date' => 'Update Date',
                        'update_acc_assign_id' => 'Update Acc Assign',
                );
        }

        /**
         * Retrieves a list of models based on the current search/filter conditions.
         * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
         */
        public function search()
        {
                // Warning: Please modify the following code to remove attributes that
                // should not be searched.

                $criteria=new CDbCriteria;

                $criteria->compare('problem_id',$this->problem_id);
                $criteria->compare('problem_definition_id',$this->problem_definition_id);
                $criteria->compare('patient_id',$this->patient_id);
                $criteria->compare('curr_or_history',$this->curr_or_history);
                $criteria->compare('patient_visit_id',$this->patient_visit_id);
                $criteria->compare('problem_notes',$this->problem_notes,true);
                $criteria->compare('problem_reported_date',$this->problem_reported_date,true);
                $criteria->compare('chronic',$this->chronic,true);
                $criteria->compare('alert_on_dashboard',$this->alert_on_dashboard,true);
                $criteria->compare('problem_duration_id',$this->problem_duration_id);
                $criteria->compare('create_acc_id',$this->create_acc_id);
                $criteria->compare('create_user_id',$this->create_user_id);
                $criteria->compare('create_date',$this->create_date,true);
                $criteria->compare('create_acc_assign_id',$this->create_acc_assign_id);
                $criteria->compare('update_acc_id',$this->update_acc_id);
                $criteria->compare('update_user_id',$this->update_user_id);
                $criteria->compare('update_date',$this->update_date,true);
                $criteria->compare('update_acc_assign_id',$this->update_acc_assign_id);

                return new CActiveDataProvider($this, array(
                        'criteria'=>$criteria,
                ));
        }
        /* The code till this line is Gii generated. All the code beyond this point is cutom code. */
        public function beforeSave(){
                $retval=false;
                if ($this->isNewRecord){
                        //Handling duplicate Entries for Problem in one visit.
                        $criteria = new CDbCriteria;
                        $criteria->compare('problem_definition_id', $this->problem_definition_id);
                        $criteria->compare('patient_id', $this->patient_id);
                        $criteria->compare('patient_visit_id', $this->patient_visit_id);
                        $PatientProblem = $this->model()->findAll($criteria);
                        if (count($PatientProblem)==0){
                                $retval=true;
                                $this->setAttribute('create_date',date("Y-m-d H:i:s"));
                                $this->setAttribute('create_user_id',Yii::app()->user->id);
                                $this->setAttribute('create_acc_id',Yii::app()->user->assigner_account_id);
                                $this->setAttribute('create_acc_assign_id',Yii::app()->user->acc_assign_id);
                        }
                        else{
                                $errorMsg='';
                                $criteria = new CDbCriteria;
                                $criteria->compare('mCode','VISIT_PROBLEM_EXISTS');
                                $criteria->compare('mLang',Yii::app()->user->account_lang);
                                $SysMsgs=SystemMessages::model()->findAll($criteria);
                                if (count($SysMsgs)>0){
                                        $errorMsg='"'.$this->problemDefinition->group_display_val.'"'.$SysMsgs[0]->mDesc.' Code['.$SysMsgs[0]->mId.']';
                                }
                                else{
                                        $errorMsg=$this->problemDefinition->group_display_val.' already recorded.';
                                }
                                throw new Exception($errorMsg);
                                $retval=false;  
                        }
                }
                else{
                        $this->setAttribute('update_date',date("Y-m-d H:i:s"));
                        $this->setAttribute('update_user_id',Yii::app()->user->id);
                        $this->setAttribute('update_acc_id',Yii::app()->user->assigner_account_id);
                        $this->setAttribute('update_acc_assign_id',Yii::app()->user->acc_assign_id);
                        $retval=true;
                }
                return $retval;
        }

        public function getProb_def_id(){
                return $this->problem_definition_id;
        }

        public function setProb_def_id($val){
                $this->problem_definition_id=$val;
        }

        public function getProblemFlaged(){
                return $this->alert_on_dashboard=='1' ?  CHtml::image(Yii::app()->baseUrl .'/images/Flagredicon.png') : '';  

        }
        public function getProblemFlagSrc(){
                return $this->alert_on_dashboard=='1' ?  Yii::app()->baseUrl .'/images/Flagredicon.png' :'';
        }
        public function getProblemChronic(){
                return $this->chronic=='1' ?  CHtml::image(Yii::app()->baseUrl .'/images/tickedS.jpg') : '';  

        }

        public function getProblemDel(){
                return '&nbsp<a class="delete" title="Delete"  onclick="DeletePatProblem('.$this->problem_id.'); return false; " href="#"><img src="/webapp/assets/50005a14/gridview/delete.png" alt="Delete" /></a>&nbsp<a class="delete" title="Update"  onclick="UpdatePatProblem(this,'.$this->problem_id.','.$this->problem_definition_id.','.$this->curr_or_history.',\''.$this->problem_notes.'\','.$this->problem_duration_id.','.$this->chronic.','.$this->alert_on_dashboard.'); return false; " href="#"><img src="/webapp/assets/50005a14/gridview/update.png" alt="Update" /></a>';        
        }

}

以下是EJuiComboBox.php的代码

<?php

/**
 * jQuery combobox Yii extension
 * 
 * Allows selecting a value from a dropdown list or entering in text.
 * Also works as an autocomplete for items in the select.
 *
 * @copyright © Digitick <www.digitick.net> 2011
 * @license GNU Lesser General Public License v3.0
 * @author Ianaré Sévi
 * @author Jacques Basseck
 *
 */
Yii::import('zii.widgets.jui.CJuiInputWidget');

/**
 * Base class.
 */
class EJuiComboBox extends CJuiInputWidget
{
        /**
         * @var array the entries that the autocomplete should choose from.
         */
        public $data = array();
        public $assoc;
        /**
         * @var string A jQuery selector used to apply the widget to the element(s).
         * Use this to have the elements keep their binding when the DOM is manipulated
         * by Javascript, ie ajax calls or cloning.
         * Can also be useful when there are several elements that share the same settings,
         * to cut down on the amount of JS injected into the HTML.
         */
        public $scriptSelector;
        public $defaultOptions = array('allowText' => true);

        protected function setSelector($id, $script, $event=null)
        {
                if ($this->scriptSelector) {
                        if (!$event)
                                $event = 'focusin';
                        $js = "jQuery('body').delegate('{$this->scriptSelector}','{$event}',function(e){\$(this).{$script}});";
                        $id = $this->scriptSelector;
                }
                else
                        $js = "jQuery('#{$id}').{$script}";
                return array($id, $js);
        }

        public function init()
        {
                $cs = Yii::app()->getClientScript();
                $assets = Yii::app()->getAssetManager()->publish(dirname(__FILE__) . '/assets');
                $cs->registerScriptFile($assets . '/jquery.ui.widget.min.js');
                $cs->registerScriptFile($assets . '/jquery.ui.combobox.js');

                parent::init();
        }

        /**
         * Run this widget.
         * This method registers necessary javascript and renders the needed HTML code.
         */
        /*
        public function run()
        {
                list($name, $id) = $this->resolveNameID();

                if (is_array($this->data) && !empty($this->data)){
                        $data = array_combine($this->data, $this->data);
                        array_unshift($data, null);
                }
                else
                        $data = array();

                echo CHtml::dropDownList(null, null, $data, array('id' => $id . '_select'));

                if ($this->hasModel())
                        echo CHtml::activeTextField($this->model, $this->attribute, $this->htmlOptions);
                else
                        echo CHtml::textField($name, $this->value, $this->htmlOptions);

                $this->options = array_merge($this->defaultOptions, $this->options);

                $options = CJavaScript::encode($this->options);

                $cs = Yii::app()->getClientScript();

                $js = "combobox({$options});";

                list($id, $js) = $this->setSelector($id, $js);
                $cs->registerScript(__CLASS__ . '#' . $id, $js);
        }
        */
public function run()
    {
        list($name, $id) = $this->resolveNameID();

        if (is_array($this->data) && !empty($this->data)){
            //if $data is not an assoc array make each value its key
            if($this->assoc){
                $data=$this->data;      
            }
            else{
                $data=array_combine($this->data, $this->data);

            }
            //does the same as array_unshift($data,null) but does not break assoc arrays
            $data=array(""=>"")+$data;
        }
        else
            $data = array();

        if ($this->hasModel())
            echo CHtml::activeDropDownList($this->model,$this->attribute,$data);
        else
            echo CHtml::dropDownList($name, $this->value, $data);

        echo CHtml::textField(null,($this->hasModel()?($data[$this->model->{$this->attribute}]):$data[$this->value]),array('id'=>$id.'_combobox'));

        $this->options = array_merge($this->defaultOptions, $this->options);

        $options = CJavaScript::encode($this->options);

        $cs = Yii::app()->getClientScript();

        $js = "combobox({$options});";

        list($id, $js) = $this->setSelector($id.'_combobox', $js);
        $cs->registerScript(__CLASS__ . '#' . $id, $js);
    }
}

任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:1)

我曾经也为EJuiComboBox犯了同样的错误。只要没有找到DATA来提供组合框中的Textfield就会发生这种情况,这是一个PHP错误..我对EJuiComboBox的run方法进行了以下更改,以防止在没有找到数据时抛出此PHP错误

public function run()
{
        list($name, $id) = $this->resolveNameID();

        if (is_array($this->data) && !empty($this->data)){
                //if $data is not an assoc array make each value its key
                $data=($this->assoc)?$this->data:array_combine($this->data, $this->data);

                //does the same as array_unshift($data,null) but does not break assoc arrays
                $data=array(""=>"")+$data;
        }

        else
                $data = array();

        if ($data == array()) {
            echo "No hay registros";
            return;
        }

        if ($this->hasModel())
                echo CHtml::activeDropDownList($this->model,$this->attribute,$data,$this->selectHtmlOptions);
        else
                echo CHtml::dropDownList($name, $this->value, $data,$this->selectHtmlOptions);

        echo CHtml::textField(null,($this->hasModel()?($data[$this->model->{$this->attribute}]):$data[$this->value]),array('id'=>$id.'_combobox'));

        $this->options = array_merge($this->defaultOptions, $this->options);

        $options = CJavaScript::encode($this->options);

        $cs = Yii::app()->getClientScript();

        $js = "combobox({$options});";

        list($id, $js) = $this->setSelector($id.'_combobox', $js);
        $cs->registerScript(__CLASS__ . '#' . $id, $js);
}

使用此方法将导致“未找到数据!”的简单渲染。只要ComboBox的数据中没有成员。

答案 1 :(得分:0)

我解决了这个问题。默认情况下,Yii在运行时从数据库获取列的Not Null属性,因此如果在数据库中将列标记为Not Null,则它将零(0)作为其默认值。当“$ this-&gt; model-&gt; {$ this-&gt; attribute}”被执行时,它正在放置“0”而不是“problem_definition_id”,这就是抛出错误。在数据库中将列设置为Nullable后,错误消失了。但是,因为这似乎不是一个好的解决方案。因此,在创建$ PatientProblem对象后,我将problem_definition_id显式设置为null,并解决了错误。