0

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

在此处输入图像描述

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

$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);
    }
}

任何帮助将不胜感激。

4

2 回答 2

1

我曾经对 EJuiComboBox 也有同样的错误。每当发现 NO 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 的数据中没有成员时。

于 2013-03-11T00:30:10.327 回答
0

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

于 2013-03-12T15:49:38.590 回答