【问题标题】:YII Call to a member function getErrors() on a non-objecYII 调用成员函数在非对象上获取 Errors()
【发布时间】:2013-03-01 00:16:06
【问题描述】:

跟随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));
}

更新.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>

【问题讨论】:

  • 这意味着你没有得到任何数据......当你得到数据时再次检查
  • 请解释一下,您从哪里得到错误来自哪些部分?
  • 更具体一点肯定会有所帮助。您是否尝试单独加载模型?

标签: yii updatemodel


【解决方案1】:

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

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

这部分应该在控制器动作中。 确保 $m$n 是真正的模型。如果上面的findByPk 语句失败,$m 将是null,所以你会从调用$m-&gt;getErrors()$n-&gt;getErrors()errorSummary 得到错误。简而言之 - 确保 $n $m 已正确初始化 - 两者都必须是模型的实例,要么是空的,要么是从数据库中填充的,但在你的情况下,一个是 null。很可能是$m

【讨论】:

  • 但实例 $n = new Noticias; $m = 新多媒体; -- 我认为它也是空的,但也是满的
  • 但在您看来,$m 可能设置为 null。在//Validation之前的视图中尝试var_dump这个
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您可以尝试在 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 2012-04-20
      • 2015-05-01
      • 2014-08-07
      • 2013-12-01
      • 2015-12-23
      • 2015-08-29
      相关资源
      最近更新 更多