Yii 致命错误:调用成员函数isAttributeRequired()

Yii 致命错误:调用成员函数isAttributeRequired(),yii,Yii,运行我的站点时发生以下错误。知道发生了什么吗?我是Yii和框架的新手,我不知道这个错误意味着什么,也不知道它在哪里。我已经发布了我的控制器以及错误。我一直在进行更新操作 致命错误:在C:\xampp\framework\web\helpers\CHtml.php第1414行的非对象上调用成员函数isAttributeRequired() 看法 堆栈跟踪 Application Log Timestamp Level Category Message 15:23:06.388200

运行我的站点时发生以下错误。知道发生了什么吗?我是Yii和框架的新手,我不知道这个错误意味着什么,也不知道它在哪里。我已经发布了我的控制器以及错误。我一直在进行更新操作

致命错误:在C:\xampp\framework\web\helpers\CHtml.php第1414行的非对象上调用成员函数isAttributeRequired()

看法

堆栈跟踪

Application Log
Timestamp   Level   Category    Message
15:23:06.388200     trace   system.CModule  

Loading "log" application component
in C:\xampp\htdocs\index.php (13)

15:23:06.400199     trace   system.CModule  

Loading "request" application component
in C:\xampp\htdocs\index.php (13)

15:23:06.409199     trace   system.CModule  

Loading "urlManager" application component
in C:\xampp\htdocs\index.php (13)

15:23:06.436199     trace   system.web.filters.CFilterChain     

Running filter BookingController.filteraccessControl()
in C:\xampp\htdocs\index.php (13)

15:23:06.439199     trace   system.CModule  

Loading "user" application component
in C:\xampp\htdocs\index.php (13)

15:23:06.447200     trace   system.CModule  

Loading "session" application component
in C:\xampp\htdocs\index.php (13)

15:23:06.453200     trace   system.CModule  

Loading "clientScript" application component
in C:\xampp\protected\controllers\BookingController.php (181)
in C:\xampp\htdocs\index.php (13)

15:23:06.483200     trace   system.db.ar.CActiveRecord  

Booking.findByPk()
in C:\xampp\protected\controllers\BookingController.php (285)
in C:\xampp\protected\controllers\BookingController.php (189)
in C:\xampp\htdocs\index.php (13)

15:23:06.483200     trace   system.CModule  

Loading "db" application component
in C:\xampp\protected\controllers\BookingController.php (285)
in C:\xampp\protected\controllers\BookingController.php (189)
in C:\xampp\htdocs\index.php (13)

15:23:06.488199     trace   system.db.CDbConnection     

Opening DB connection
in C:\xampp\protected\controllers\BookingController.php (285)
in C:\xampp\protected\controllers\BookingController.php (189)
in C:\xampp\htdocs\index.php (13)

15:23:07.536200     trace   system.db.CDbCommand    

Querying SQL: SHOW FULL COLUMNS FROM `booking`
in C:\xampp\protected\controllers\BookingController.php (285)
in C:\xampp\protected\controllers\BookingController.php (189)
in C:\xampp\htdocs\index.php (13)

15:23:07.556200     trace   system.db.CDbCommand    

Querying SQL: SHOW CREATE TABLE `booking`
in C:\xampp\protected\controllers\BookingController.php (285)
in C:\xampp\protected\controllers\BookingController.php (189)
in C:\xampp\htdocs\index.php (13)

15:23:07.562200     trace   system.db.CDbCommand    

Querying SQL: SELECT * FROM `booking` `t` WHERE `t`.`Id`=23 LIMIT 1
in C:\xampp\protected\controllers\BookingController.php (285)
in C:\xampp\protected\controllers\BookingController.php (189)
in C:\xampp\htdocs\index.php (13)

15:23:07.573199     trace   system.db.ar.CActiveRecord  

Booking.update()
in C:\xampp\protected\controllers\BookingController.php (191)
in C:\xampp\htdocs\index.php (13)

15:23:07.573199     trace   system.db.ar.CActiveRecord  

Booking.updateByPk()
in C:\xampp\protected\controllers\BookingController.php (191)
in C:\xampp\htdocs\index.php (13)

15:23:07.574199     trace   system.db.CDbCommand    

Executing SQL: UPDATE `booking` SET `Id`=:yp0, `customerId`=:yp1,
`date`=:yp2 WHERE `booking`.`Id`=23
in C:\xampp\protected\controllers\BookingController.php (191)
in C:\xampp\htdocs\index.php (13)

15:23:07.666199     trace   system.db.ar.CActiveRecord  

BookingRoom.findByAttributes()
in C:\xampp\protected\controllers\BookingController.php (77)
in C:\xampp\protected\controllers\BookingController.php (200)
in C:\xampp\htdocs\index.php (13)

15:23:07.666199     trace   system.db.CDbCommand    

Querying SQL: SHOW FULL COLUMNS FROM `bookingRoom`
in C:\xampp\protected\controllers\BookingController.php (77)
in C:\xampp\protected\controllers\BookingController.php (200)
in C:\xampp\htdocs\index.php (13)

15:23:07.685199     trace   system.db.CDbCommand    

Querying SQL: SHOW CREATE TABLE `bookingRoom`
in C:\xampp\protected\controllers\BookingController.php (77)
in C:\xampp\protected\controllers\BookingController.php (200)
in C:\xampp\htdocs\index.php (13)

15:23:07.688199     trace   system.db.CDbCommand    

Querying SQL: SELECT * FROM `bookingRoom` `t` WHERE `t`.`roomId`=:yp0 AND
`t`.`bookingId`=:yp1 AND `t`.`startDate`=:yp2 AND `t`.`endDate`=:yp3 LIMIT
1
in C:\xampp\protected\controllers\BookingController.php (77)
in C:\xampp\protected\controllers\BookingController.php (200)
in C:\xampp\htdocs\index.php (13)

15:23:07.695199     trace   system.CModule  

Loading "widgetFactory" application component
in C:\xampp\protected\views\booking\update.php (34)
in C:\xampp\protected\controllers\BookingController.php (224)
in C:\xampp\htdocs\index.php (13)

BookingController::getItemsToUpdate中存在问题:

$items[] = BookingRoom::model()->findByAttributes(array('roomId' => $item['roomId'], 'bookingId' => $item['bookingId'], 'startDate' => $item['startDate'], 'endDate' => $item['endDate']));
您可以更改此查询逻辑或重写代码:

$model = BookingRoom::model()->findByAttributes(array('roomId' => $item['roomId'], 'bookingId' => $item['bookingId'], 'startDate' => $item['startDate'], 'endDate' => $item['endDate']));
if ($model) {
    $items[] = $model;
}

请发布您的视图和模型文件,以及完整的堆栈跟踪,CHTML是html helper类,当前您的错误消息在呈现红星以显示字段是否为必填字段时出现问题,这可能是由代码中的多种错误引起的,如果没有跟踪、视图和模型文件,则无法找到问题。这可能是因为您的模型为空。我已上载视图和模型文件以及完整的堆栈跟踪。星号仍不显示,因此我已删除我的最后评论。星号不显示在房间号旁边,但显示在其余必填字段旁边。该字段仍包含在验证中。所有功能都在那里,但星号不会显示。
<?php

/**
 * This is the model class for table "room".
 *
 * The followings are the available columns in table 'room':
 * @property integer $id
 * @property integer $beds
 */
class Room extends CActiveRecord
{
/**
 * @return string the associated database table name
 */
public function tableName()
{
    return 'room';
}

/**
 * @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('id, beds', 'required'),
        array('id, beds', 'numerical', 'integerOnly'=>true),
        // The following rule is used by search().
        // @todo Please remove those attributes that should not be searched.
        array('id, beds', '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(
               //'bookingrooms' => array(self::HAS_MANY, 'BookingRoom', 'roomId'),
                'bookings' => array(self::MANY_MANY, 'Booking','bookingroom(bookingId, roomId)'),
    );
}

/**
 * @return array customized attribute labels (name=>label)
 */
public function attributeLabels()
{
    return array(
        'id' => 'ID',
        'beds' => 'Beds',
    );
}

/**
 * Retrieves a list of models based on the current search/filter conditions.
 *
 * Typical usecase:
 * - Initialize the model fields with values from filter form.
 * - Execute this method to get CActiveDataProvider instance which will filter
 * models according to data in model fields.
 * - Pass data provider to CGridView, CListView or any similar widget.
 *
 * @return CActiveDataProvider the data provider that can return the models
 * based on the search/filter conditions.
 */
public function search()
{
    // @todo Please modify the following code to remove attributes that should not be searched.

    $criteria=new CDbCriteria;

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

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));
}

/**
 * Returns the static model of the specified AR class.
 * Please note that you should have this exact method in all your CActiveRecord descendants!
 * @param string $className active record class name.
 * @return Room the static model class
 */
public static function model($className=__CLASS__)
{
    return parent::model($className);
}
}
class BookingController extends Controller
{
/**
 * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
 * using two-column layout. See 'protected/views/layouts/column2.php'.
 */
public $layout='//layouts/column2';

/**
 * @return array action filters
 */
public function filters()
{
    return array(
        'accessControl', // perform access control for CRUD operations
        'postOnly + delete', // we only allow deletion via POST request
    );
}

/**
 * Specifies the access control rules.
 * This method is used by the 'accessControl' filter.
 * @return array access control rules
 */
public function accessRules()
{
    return array(
        array('allow',  // allow all users to perform 'index' and 'view' actions
            'actions'=>array('index','view', 'display'),
            'users'=>array('*'),
        ),
        array('allow', // allow authenticated user to perform 'create' and 'update' actions
            'actions'=>array('create','update'),
            'users'=>array('@'),
        ),
        array('allow', // allow admin user to perform 'admin' and 'delete' actions
            'actions'=>array('admin','delete'),
            'users'=>array('admin'),
        ),
        array('deny',  // deny all users
            'users'=>array('*'),
        ),
    );
}



/**
 * Displays a particular model.
 * @param integer $id the ID of the model to be displayed
 */
public function actionView($id)
{
    $this->render('view',array(
        'model'=>$this->loadModel($id),
    ));
}


    public function getItemsToUpdate($id){
        // create an empty list of records
        $items = array();

            // Iterate over each item from the submitted form                        
            if (isset($_POST['BookingRoom']) && is_array($_POST['BookingRoom'])) {  

                foreach ($_POST['BookingRoom'] as $item) {                        

                    //$item['bookingId'] = $id;
                     // If item id is available, read the record from database 
                    if (( array_key_exists('bookingId', $item) && array_key_exists('roomId', $item) ) && ( array_key_exists('startDate', $item) && array_key_exists('endDate', $item) )){

                        //$items[] = BookingRoom::model()->findByPk($item['bookingId']);
                    //$items[] = BookingRoom::model()->find('bookingId=:bookingId', array(':bookingId'=>$id));
                      $items[] = BookingRoom::model()->findByAttributes(array('roomId' => $item['roomId'], 'bookingId' => $item['bookingId'], 'startDate' => $item['startDate'], 'endDate' => $item['endDate']));
                      //var_dump($items);
                    // Otherwise create a new record
                    } else {

                        $items[] = new BookingRoom();
                    }
            }

                    } 
             else {

                $items = BookingRoom::model()->findAll('bookingId=:bookingId', array(':bookingId'=>$id));

            } 
            return $items;                     
    }



/**
 * Creates a new model.
 * If creation is successful, the browser will be redirected to the 'view' page.
 */
public function actionCreate()
{

    $model=new Booking;
            //$BookingRoom=new BookingRoom;
            $items=$this->getItemsToUpdate();

            if (isset($_POST['Booking'])){
            $model->attributes=$_POST['Booking'];
            }
            //var_dump($items);
    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);                                                                              


            if(isset($_POST['BookingRoom']))
              {

                $valid=true;
                foreach($items as $i=>$item)
                {
                    if(isset($_POST['BookingRoom'][$i]))
                    $item->attributes=$_POST['BookingRoom'][$i];
                    $valid=$item->validate() && $valid;
                }

                $valid=$model->validate() && $valid;


                if($valid){

                }                                                                          
              }


    $this->render('create',
                    array('items'=>$items, 'model'=>$model));

}

/**
 * Updates a particular model.
 * If update is successful, the browser will be redirected to the 'view' page.
 * @param integer $id the ID of the model to be updated
 */
public function actionUpdate($id)
{
    $baseUrl = Yii::app()->baseUrl; 
            $cs = Yii::app()->getClientScript();
            $cs->registerScriptFile($baseUrl.'/js/functions.js');

// first time round
        if (!isset($_POST['Booking'])) {
            $model=$this->loadModel($id);
        } else {

          $model = $this->loadModel($id);
          $model->attributes=$_POST['Booking'];              
          $model->update();
        }

            $items = array();

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);                                                                              


             $items=$this->getItemsToUpdate($id);

            if(isset($_POST['BookingRoom']))
              {

                $valid=true;

                foreach($items as $item)
                {

                }                    

                //$valid=$model->validate() && $valid;

                if($valid){
                        // construct sql save the booking



                }                                                                         
              }

    $this->render('update',
                    array('model'=>$model, 'items'=>$items));

}

/**
 * Deletes a particular model.
 * If deletion is successful, the browser will be redirected to the 'admin' page.
 * @param integer $id the ID of the model to be deleted
 */
public function actionDelete($id)
{
    $this->loadModel($id)->delete();

    // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
    if(!isset($_GET['ajax']))
        $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
}

    public function actionDisplay()
{
    $dataProvider=new CActiveDataProvider('Booking');
    $this->render('index',array(
        'dataProvider'=>$dataProvider,
    ));
}

/**
 * Lists all models.
 */
public function actionIndex()
{
    $dataProvider=new CActiveDataProvider('Booking');
    $this->render('index',array(
        'dataProvider'=>$dataProvider,
    ));
}

/**
 * Manages all models.
 */
public function actionAdmin()
{
    $model=new Booking('search');
    $model->unsetAttributes();  // clear any default values
    if(isset($_GET['Booking']))
        $model->attributes=$_GET['Booking'];

    $this->render('admin',array(
        'model'=>$model,
    ));
}

/**
 * Returns the data model based on the primary key given in the GET variable.
 * If the data model is not found, an HTTP exception will be raised.
 * @param integer $id the ID of the model to be loaded
 * @return Booking the loaded model
 * @throws CHttpException
 */
public function loadModel($id)
{                        
    $model=Booking::model()->findByPk($id);
            /*
            $criteria=new CDbCriteria;
            $criteria->condition='bookingId=:bookingId';
            $criteria->select = 'roomId';
            $criteria->params=array(':bookingId'=>$_GET['id']);
            $bookingRooms = BookingRoom::model()->findAll($criteria);

            $rooms = array();
            foreach ($bookingRooms as $room) {
                $rooms[] = $room->roomId;
            }

            $model->rooms = $rooms;
            */
    if($model===null) {
        throw new CHttpException(404,'The requested page does not exist.');
            }
    return $model;




}

/**
 * Performs the AJAX validation.
 * @param Booking $model the model to be validated
 */
protected function performAjaxValidation($model)
{
    if(isset($_POST['ajax']) && $_POST['ajax']==='booking-form')
    {
        echo CActiveForm::validate($model);
        Yii::app()->end();
    }
}


}
Application Log
Timestamp   Level   Category    Message
15:23:06.388200     trace   system.CModule  

Loading "log" application component
in C:\xampp\htdocs\index.php (13)

15:23:06.400199     trace   system.CModule  

Loading "request" application component
in C:\xampp\htdocs\index.php (13)

15:23:06.409199     trace   system.CModule  

Loading "urlManager" application component
in C:\xampp\htdocs\index.php (13)

15:23:06.436199     trace   system.web.filters.CFilterChain     

Running filter BookingController.filteraccessControl()
in C:\xampp\htdocs\index.php (13)

15:23:06.439199     trace   system.CModule  

Loading "user" application component
in C:\xampp\htdocs\index.php (13)

15:23:06.447200     trace   system.CModule  

Loading "session" application component
in C:\xampp\htdocs\index.php (13)

15:23:06.453200     trace   system.CModule  

Loading "clientScript" application component
in C:\xampp\protected\controllers\BookingController.php (181)
in C:\xampp\htdocs\index.php (13)

15:23:06.483200     trace   system.db.ar.CActiveRecord  

Booking.findByPk()
in C:\xampp\protected\controllers\BookingController.php (285)
in C:\xampp\protected\controllers\BookingController.php (189)
in C:\xampp\htdocs\index.php (13)

15:23:06.483200     trace   system.CModule  

Loading "db" application component
in C:\xampp\protected\controllers\BookingController.php (285)
in C:\xampp\protected\controllers\BookingController.php (189)
in C:\xampp\htdocs\index.php (13)

15:23:06.488199     trace   system.db.CDbConnection     

Opening DB connection
in C:\xampp\protected\controllers\BookingController.php (285)
in C:\xampp\protected\controllers\BookingController.php (189)
in C:\xampp\htdocs\index.php (13)

15:23:07.536200     trace   system.db.CDbCommand    

Querying SQL: SHOW FULL COLUMNS FROM `booking`
in C:\xampp\protected\controllers\BookingController.php (285)
in C:\xampp\protected\controllers\BookingController.php (189)
in C:\xampp\htdocs\index.php (13)

15:23:07.556200     trace   system.db.CDbCommand    

Querying SQL: SHOW CREATE TABLE `booking`
in C:\xampp\protected\controllers\BookingController.php (285)
in C:\xampp\protected\controllers\BookingController.php (189)
in C:\xampp\htdocs\index.php (13)

15:23:07.562200     trace   system.db.CDbCommand    

Querying SQL: SELECT * FROM `booking` `t` WHERE `t`.`Id`=23 LIMIT 1
in C:\xampp\protected\controllers\BookingController.php (285)
in C:\xampp\protected\controllers\BookingController.php (189)
in C:\xampp\htdocs\index.php (13)

15:23:07.573199     trace   system.db.ar.CActiveRecord  

Booking.update()
in C:\xampp\protected\controllers\BookingController.php (191)
in C:\xampp\htdocs\index.php (13)

15:23:07.573199     trace   system.db.ar.CActiveRecord  

Booking.updateByPk()
in C:\xampp\protected\controllers\BookingController.php (191)
in C:\xampp\htdocs\index.php (13)

15:23:07.574199     trace   system.db.CDbCommand    

Executing SQL: UPDATE `booking` SET `Id`=:yp0, `customerId`=:yp1,
`date`=:yp2 WHERE `booking`.`Id`=23
in C:\xampp\protected\controllers\BookingController.php (191)
in C:\xampp\htdocs\index.php (13)

15:23:07.666199     trace   system.db.ar.CActiveRecord  

BookingRoom.findByAttributes()
in C:\xampp\protected\controllers\BookingController.php (77)
in C:\xampp\protected\controllers\BookingController.php (200)
in C:\xampp\htdocs\index.php (13)

15:23:07.666199     trace   system.db.CDbCommand    

Querying SQL: SHOW FULL COLUMNS FROM `bookingRoom`
in C:\xampp\protected\controllers\BookingController.php (77)
in C:\xampp\protected\controllers\BookingController.php (200)
in C:\xampp\htdocs\index.php (13)

15:23:07.685199     trace   system.db.CDbCommand    

Querying SQL: SHOW CREATE TABLE `bookingRoom`
in C:\xampp\protected\controllers\BookingController.php (77)
in C:\xampp\protected\controllers\BookingController.php (200)
in C:\xampp\htdocs\index.php (13)

15:23:07.688199     trace   system.db.CDbCommand    

Querying SQL: SELECT * FROM `bookingRoom` `t` WHERE `t`.`roomId`=:yp0 AND
`t`.`bookingId`=:yp1 AND `t`.`startDate`=:yp2 AND `t`.`endDate`=:yp3 LIMIT
1
in C:\xampp\protected\controllers\BookingController.php (77)
in C:\xampp\protected\controllers\BookingController.php (200)
in C:\xampp\htdocs\index.php (13)

15:23:07.695199     trace   system.CModule  

Loading "widgetFactory" application component
in C:\xampp\protected\views\booking\update.php (34)
in C:\xampp\protected\controllers\BookingController.php (224)
in C:\xampp\htdocs\index.php (13)
$items[] = BookingRoom::model()->findByAttributes(array('roomId' => $item['roomId'], 'bookingId' => $item['bookingId'], 'startDate' => $item['startDate'], 'endDate' => $item['endDate']));
$model = BookingRoom::model()->findByAttributes(array('roomId' => $item['roomId'], 'bookingId' => $item['bookingId'], 'startDate' => $item['startDate'], 'endDate' => $item['endDate']));
if ($model) {
    $items[] = $model;
}