2016-07-25 320 views
0

我有維護控制器來獲取學生和教師的屬性,並將其製作在一個視圖中,但值來自學生和教師模型不保存。Yii - 1在一個視圖中形成2個模型

型號:學生

public function tableName() 
{ 
    return 'student'; 
} 

/** 
* @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('studentid', 'required'), 
     array('studentid', 'unique'), 
     array('studentid, year, cellphonenumber', 'numerical', 'integerOnly'=>true), 
     array('lastname, firstname, middlename, course, email', 'length', 'max'=>32), 
     // The following rule is used by search(). 
     // @todo Please remove those attributes that should not be searched. 
     array('studentid, lastname, firstname, middlename, course, year, cellphonenumber, email', '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(

    ); 
} 

/** 
* @return array customized attribute labels (name=>label) 
*/ 
public function attributeLabels() 
{ 
    return array(
     'studentid' => 'Studentid', 
     'lastname' => 'Lastname', 
     'firstname' => 'Firstname', 
     'middlename' => 'Middlename', 
     'course' => 'Course', 
     'year' => 'Year', 
     'cellphonenumber' => 'Cellphonenumber', 
     'email' => 'Email', 
    ); 
} 

/** 
* 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('studentid',$this->studentid); 
    $criteria->compare('lastname',$this->lastname,true); 
    $criteria->compare('firstname',$this->firstname,true); 
    $criteria->compare('middlename',$this->middlename,true); 
    $criteria->compare('course',$this->course,true); 
    $criteria->compare('year',$this->year); 
    $criteria->compare('cellphonenumber',$this->cellphonenumber); 
    $criteria->compare('email',$this->email,true); 

    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 Student the static model class 
*/ 
public static function model($className=__CLASS__) 
{ 
    return parent::model($className); 
} 

}

型號:導師

public function tableName() { return 'instructor'; }

/** 
* @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('instructorid', 'required'), 
     array('cellphone', 'numerical', 'integerOnly'=>true), 
     array('instructorid', 'length', 'max'=>16), 
     array('lastname, firstname, middlename, email', 'length', 'max'=>32), 
     // The following rule is used by search(). 
     // @todo Please remove those attributes that should not be searched. 
     array('instructorid, lastname, firstname, middlename, cellphone, email', '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(
    ); 
} 

/** 
* @return array customized attribute labels (name=>label) 
*/ 
public function attributeLabels() 
{ 
    return array(
     'instructorid' => 'Instructorid', 
     'lastname' => 'Lastname', 
     'firstname' => 'Firstname', 
     'middlename' => 'Middlename', 
     'cellphone' => 'Cellphone', 
     'email' => 'Email', 
    ); 
} 

/** 
* 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('instructorid',$this->instructorid,true); 
    $criteria->compare('lastname',$this->lastname,true); 
    $criteria->compare('firstname',$this->firstname,true); 
    $criteria->compare('middlename',$this->middlename,true); 
    $criteria->compare('cellphone',$this->cellphone); 
    $criteria->compare('email',$this->email,true); 

    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 Instructor the static model class 
*/ 
public static function model($className=__CLASS__) 
{ 
    return parent::model($className); 
} 

}

控制器:維護

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','users','createusers'), 
      '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), 
    )); 
} 

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

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

    if(isset($_POST['Users'])) 
    { 
     $model->attributes=$_POST['Users']; 
     if($model->save()) 
      $this->redirect(array('view','id'=>$model->username)); 
    } 

    $this->render('create',array(
     '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) 
{ 
    $model=$this->loadModel($id); 

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

    if(isset($_POST['Users'])) 
    { 
     $model->attributes=$_POST['Users']; 
     if($model->save()) 
      $this->redirect(array('view','id'=>$model->username)); 
    } 

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

/** 
* 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')); 
} 

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

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

    $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 Users the loaded model 
* @throws CHttpException 
*/ 
public function loadModel($id) 
{ 
    $model=Users::model()->findByPk($id); 
    if($model===null) 
     throw new CHttpException(404,'The requested page does not exist.'); 
    return $model; 
} 

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

//new action url 
public function actionUsers() 
{ 

// $model=new Users('search'); 
    $vm = (object) array();  
    $vm->Users=new Users('search'); 
    $vm->Student=new Student('search'); 
    $vm->Instructor=new Instructor('search'); 

    $this->render('users',array(
     'vm'=>$vm, 
    )); 
} 

public function actionCreateUsers() 
{ 


    $vm = (object) array(); 
$vm->Users=new Users; 
$vm->Student=new Student; 
$vm->Instructor=new Instructor; 
$holder; 

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

if(isset($_POST['Users'])) 
{ 
    $vm->Users->attributes=$_POST['Users']; 
    $vm->Users->save(); 
     if(isset($_POST['Student'])) 
      { 
      $vm->Student->attributes=$_POST['Student']; 
      $vm->Student->studentid = $vm->Users->username; 
       if($vm->Student->save()) 
        $vm->Student->unsetAttributes(); 
        else{ 
         print_r($vm->Student->getErrors());die;// to get errors 
         } 

      } 
     if(isset($_POST['Instructor'])) 
      { 
      $vm->Instructor->attributes=$_POST['Instructor']; 
      $vm->Instructor->instructorid = $vm->Users->username; 
       if($vm->Instructor->save()) 
        $vm->Instructor->unsetAttributes(); 
       else{ 
         print_r($vm->Instructor->getErrors());die;// to get errors 
         } 
      } 
     else { 
      return false; 
      } 
} 

     // echo 'saved'; 
     // $this->redirect(array('view','id'=>$model->username)); 

$vm->Users->unsetAttributes(); 
$vm->Student->unsetAttributes(); 
$vm->Instructor->unsetAttributes(); 
$this->render('users',array(
    'vm'=>$vm, 
)); 

} 

}

維護:_form enter image description here

回答

0

在這種規則是建立dublication

array('studentid', 'unique'),// remove it if you didn't want 
+0

CDbCommand的問題未能execu te SQL語句:SQLSTATE [23000]:完整性約束違規:1062鍵'PRIMARY'的重複條目'12333'。執行的SQL語句是:INSERT INTO'users'('username','password')VALUES(:yp0,:yp1)這是我的erroe –

相關問題