YII在非对象上调用成员函数getErrors()

时间:2013-03-01 00:16:07

标签: yii updatemodel

关注this教程;当我尝试将数据显示在表单中并更新

我的错误是:

$n = $this->loadModel($id);

我想用一个表单制作两个模型,这是我的更新代码:

控制器:

    public function actionUpdate($id)
{
    $n = new Noticias;
    $m = new Multimedia;

    $this->performAjaxValidation(array($n,$m));
    $n=$this->loadModel($id);


    if(isset($_POST['Noticias'],$_POST['Multimedia']))
    {
        $n->attributes=$_POST['Noticias'];
        $m->attributes=$_POST['Multimedia'];

        $m->ID_NOT=$n->ID;
        $m->setIsNewRecord(false);

        if($n->save())
            $this->redirect(array('admin','id'=>$n->ID));
    }

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

update.php

<?php echo $this->renderPartial('_form', array('n'=>$n, 'm'=>$m)); ?>

一些观点

//get Multimedia FK
<?php if ($n->isNewRecord==false) { 
    $m=Multimedia::model()->findByPk($n->ID);
} ?>

//Validation
<?php echo $form->errorSummary(array($n,$m)); ?>

//Field FOTO between other
<div class="row">
   <?php echo $form->labelEx($m,'FOTO_URL'); ?>
   <?php echo $form->textField($m,'FOTO_URL',array('size'=>25,'maxlength'=>100)); ?>
   <?php echo $form->error($m,'FOTO'); ?>
</div>

3 个答案:

答案 0 :(得分:0)

首先 - 不要在视图中加载模型

<?php if ($n->isNewRecord==false) { 
    $m=Multimedia::model()->findByPk($n->ID);
} ?>

这部分应该是控制器动作。 确保$m$n确实是模型。如果上述findByPk语句失败,则$m将为null,因此errorSummary会收到$m->getErrors()$n->getErrors()的错误。简而言之 - 确保$n $m已正确初始化 - 两者都必须是模型的实例,为空或从db填充,但在您的情况下,一个是{{ 1}}。最有可能是null

答案 1 :(得分:0)

当Noticias(即$ n是newrecord)或多媒体中找不到$n->ID时会发生此错误 你可以解决这个问题,如果你需要工作,即使你可以使用它的新记录。


if ($n->isNewRecord==false) {
    $m=Multimedia::model()->findByPk($n->ID);
}    
else
 $m=new Multimedia;

答案 2 :(得分:0)

您可以尝试在Controller中加载两个模型(例如,在actionUpdate中):

public function actionUpdate($id) 
{
   $n = new Noticias;
   $m = new Multimedia;

   $this->performAjaxValidation(array($n,$m));
   $n=$this->loadModelNoticias($id);
   $m=$this->loadModelMultimedia($n->ID);  //just put it here..


   if(isset($_POST['Noticias'],$_POST['Multimedia']))
   {
      $n->attributes=$_POST['Noticias'];
      $m->attributes=$_POST['Multimedia'];

      $m->ID_NOT=$n->ID;
      $m->setIsNewRecord(false);

      if($n->save())
          $this->redirect(array('admin','id'=>$n->ID));
   }

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

请注意,您还必须在同一个控制器中定义两个loadModel函数。

function loadModelNoticias($id){
   $model = Noticias::model()->findByPk($id);
   return $model;
}

function loadModelMultimedia($id){
   $model = Multimedia::model()->findByPk($id);
   return $model;
}