警告:无法打开流:没有此类文件或目录 - 使用两个模型呈现注册表单时


warning: failed to open stream: No such file or directory - When rendering registration form with two models

我按照指南使用两个模型(用户,用户信息)制作注册表,但是当我查看注册表时,弹出警告(包括(数据.php)[功能.include]:无法打开流:没有这样的文件或目录),我真的不明白是什么原因导致此警告。这是我的代码:

1. Register action:
 public function actionRegister(){
           $user=new User;
           $user_info=new UserInfo;
            if(isset($_POST['User'],$_POST['UserInfo'])){

             $user->attributes=$_POST['User'];
             $user_info->attributes=$_POST['UserInfo'];

              $valid=$user->validate();
              $valid=$user_info->validate() && $valid;
               if($valid){
                   $user->save(false);
                   $user_info->save(false);
                   $this->redirect(array('index'));

               }

           }
         $this->render('register', array('user'=>$user,'user_info'=>$user_info));
        }


    2. Register view:

         <?php $form=$this->beginWidget('CActiveForm', array(
            'action'=>$this->createUrl('Site/Register'), 
        'enableClientValidation'=>true,
        'enableAjaxValidation'=>false,
        'clientOptions'=>array(
            'validateOnSubmit'=>true,
        ),

           'htmlOptions'=>array('enctype'=>'multipart/form-data')
    )); ?>

        <p class="note">Fields with <span class="required">*</span> are required.</p>
        <?php echo $form->errorSummary(array($user,$user_info)); ?>
        <div class="row">
            <?php echo $form->labelEx($user,'username'); ?>
            <?php echo $form->textField($user,'username',array('size'=>60,'maxlength'=>300)); ?>
            <?php echo $form->error($user,'username'); ?>
        </div>


        3.PHP Warning: 

        include(data.php) [<a href='function.include'>function.include</a>]: failed
        to open stream: No such file or directory
        (C:'wamp'www'Yii-new'framework'YiiBase.php:427)
        Stack trace:
        #0 C:'wamp'www'Yii-new'framework'validators'CValidator.php(186): import()
        #1 C:'wamp'www'Yii-new'framework'base'CModel.php(287): createValidator()
        #2 C:'wamp'www'Yii-new'framework'base'CModel.php(260):
        UserInfo->createValidators()
        #3 C:'wamp'www'Yii-new'framework'web'widgets'CActiveForm.php(506):
        UserInfo->getValidators()
        #4 C:'wamp'www'Yii-new'project2'protected'views'site'register.php(50):
        CActiveForm->error()
        #5 C:'wamp'www'Yii-new'framework'web'CBaseController.php(126): require()
        #6 C:'wamp'www'Yii-new'framework'web'CBaseController.php(95):
        SiteController->renderInternal()
        #7 C:'wamp'www'Yii-new'framework'web'CController.php(869):
        SiteController->renderFile()
        #8 C:'wamp'www'Yii-new'framework'web'CController.php(782):
        SiteController->renderPartial()
        #9
        C:'wamp'www'Yii-new'project2'protected'controllers'SiteController.php(109):
        SiteController->render()
        #10 C:'wamp'www'Yii-new'framework'web'actions'CInlineAction.php(49):
        SiteController->actionRegister()
        #11 C:'wamp'www'Yii-new'framework'web'CController.php(308):
        CInlineAction->runWithParams()
        #12 C:'wamp'www'Yii-new'framework'web'CController.php(286):
        SiteController->runAction()
        #13 C:'wamp'www'Yii-new'framework'web'CController.php(265):
        SiteController->runActionWithFilters()
        #14 C:'wamp'www'Yii-new'framework'web'CWebApplication.php(282):
        SiteController->run()
        #15 C:'wamp'www'Yii-new'framework'web'CWebApplication.php(141):
        CWebApplication->runController()
        #16 C:'wamp'www'Yii-new'framework'base'CApplication.php(180):
        CWebApplication->processRequest()
        #17 C:'wamp'www'Yii-new'project2'index.php(13): CWebApplication->run()
        REQUEST_URI=/Yii-new/project2/site/register
        in C:'wamp'www'Yii-new'project2'protected'views'site'register.php (50)
        in C:'wamp'www'Yii-new'project2'protected'controllers'SiteController.php
        (109)
        in C:'wamp'www'Yii-new'project2'index.php (13)
          [1]: http://www.yiiframework.com/wiki/19/how-to-use-a-single-form-to-collect-data-for-two-or-more-models/

您没有为用户和/或用户信息创建模型。因此,请检查受保护/模型文件夹,有可用的用户.php和用户信息.php。

问题在于UserInfo模型。我已经删除了用户信息(模型、控制器、视图),然后使用 gii 再次创建了它,现在它工作正常。

这是正确的方法;

如果您需要更多数据,并且需要混合模型,请选择 1 个模型作为主要模型;

在该模型中,声明一些变量;

现在,当您初始化模型类的新实例时,默认属性将在那里,以及新添加的变量;

对于新变量,使用新的模型实例初始化它们;

例如:

您在 A 类中,您需要存储 B 类和 C 类的数据以供以后使用;

你初始化 A 类和所有属性;

您还可以使用extended_var1 = new Model();extended_var2 = new Model2();

您将此数据传递给表单;

你像往常一样处理标准变量,作为标准的 Yii 形式,当扩展变量出现时,请记住它们是对象或数组,但它们就在那里;

在这种情况下,您处于UrlController

public function actionUpdate($id, $type = 'update') {
    $model = $this->loadModel($id);
    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);
    if (isset($_POST['Url'])) {
        $model->attributes = $_POST['Url'];
        $model->website = $_POST['Website'];
        if ($model->save())
            if ($type == 'update')
                $this->redirect(array('view', 'id' => $model->id));
            else
                $this->redirect(array('/admin/url/approvePublicLink'));
    }
    $model_website = Website::model()->findByAttributes(array('id'=>$model->website_id));
    $this->render('update', array(
        'model' => $model,
        'model_website' => $model_website,
    ));
}

您的主模型类是Url

模型中的快速例如Url

class Url extends CActiveRecord {
    public $website = array();
...
    protected function afterSave() {
        $w = null;
        $w = Website::model()->findByAttributes(array('id' => $this->website_id));
        if($w)
        {
        $w->link = $this->website['link'];
        $w->domain = $this->website['domain'];
        $w->description = $this->website['description'];
        $w->save();
        }
        return parent::afterSave();
    }
}

这是我的观点:

<div class="form">
<?php
$form=$this->beginWidget('CActiveForm', array(
    'id'=>'url-form',
    'enableAjaxValidation'=>false,
));
?>
    <p class="note">Fields with <span class="required">*</span> are required.</p>
    <?php echo $form->errorSummary($model); ?>
<div style="position:relative;float:left;">
    <div style="float:left;padding:20px 20px;">
    <h1>URL</h1>
    <div class="row">
        <?php echo $form->labelEx($model,'link'); ?>
        <?php echo $form->textField($model,'link',array('size'=>60,'maxlength'=>255)); ?>
        <?php echo $form->error($model,'link'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($model,'title'); ?>
        <?php echo $form->textField($model,'title',array('size'=>60,'maxlength'=>255)); ?>
        <?php echo $form->error($model,'title'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($model,'description'); ?>
        <?php echo $form->textField($model,'description',array('size'=>60,'maxlength'=>255)); ?>
        <?php echo $form->error($model,'description'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($model,'important'); ?>
        <?php echo $form->dropDownList($model,'important',array(0=>'Normal',1=>'Important')); ?>
        <?php echo $form->error($model,'important'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($model,'views'); ?>
        <?php echo $form->textField($model,'views'); ?>
        <?php echo $form->error($model,'views'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($model,'created'); ?>
        <?php echo $model->created; ?>
        <?php echo $form->error($model,'created'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($model,'updated'); ?>
        <?php echo $model->updated; ?>
        <?php echo $form->error($model,'updated'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($model,'will_expire'); ?>
        <?php echo $form->dropDownList($model,'will_expire',array(0=>'No',1=>'Yes')); ?>
        <?php echo $form->error($model,'will_expire'); ?>
    </div>
    </div>
    <div style="float:left;padding:20px 20px;">
    <h1>WEBSITE</h1>
    <div class="row">
        <?php echo $form->labelEx($model,'website_id'); ?>
        <?php echo CHtml::link($model->relation_website->domain,$model->relation_website->link,array('class'=>'avia','target'=>'_blank')); ?>
        <?php echo $form->error($model,'website_id'); ?>
    </div>  
    <div class="row">
        <?php echo $form->labelEx($model_website,'link'); ?>
        <?php echo $form->textField($model_website,'link'); ?> ( ex: http://www.linkbook.co/ )
        <?php echo $form->error($model_website,'link'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($model_website,'domain'); ?>
        <?php echo $form->textField($model_website,'domain'); ?> ( ex: linkbook.co )
        <?php echo $form->error($model_website,'domain'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($model_website,'description'); ?>
        <?php echo $form->textField($model_website,'description'); ?>
        <?php echo $form->error($model_website,'description'); ?>
    </div>
    </div>
    </div>
    <div style="clear:both;"></div>
    <div class="row">
        <?php echo $form->labelEx($model,'status'); ?>
        <?php echo $form->dropDownList($model,'status',array(-1=>'Banned',0=>'Normal',1=>'Active')); ?>
        <?php echo $form->error($model,'status'); ?>
    </div>  
    <div class="row buttons">
        <?php echo CHtml::submitButton('Save'); ?>
    </div>
<?php $this->endWidget(); ?>
</div><!-- form -->