Yii - 1在一个视图中形成2个模型

时间:2016-07-25 15:49:44

标签: php yii

我有维护控制器来获取学生和教师的属性,并在一个视图中进行,但值来自学生和教师模型不保存。

型号:学生

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

1 个答案:

答案 0 :(得分:0)

您好此规则会产生dublication

的问题
  array('studentid', 'unique'),// remove it if you didn't want