2014-09-03 41 views
0

您好我也有一个问题,当尝试使用this方法上传图片。从Yii的上传图片显示endWiget()错误

我的动作/型号:

class Image extends CActiveRecord 
{ 
    public $foto; 
    ... 

    public function rules() 
    { 
     return array(
      ... 
      array('foto', 'file', 'types'=>'jpg, gif, png'), 
      ... 
     ); 
    } 
} 

我的控制器:

class ImageController extends Controller 
{ 
    public function actionCreate() 
    { 
      $model=new Image; 

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

      if(isset($_POST['Image'])) 
      { 
        $model->attributes=$_POST['Image']; 
        $model->image=CUploadedFile::getInstance($model,'foto'); 
        if($model->save()) 
          $model->foto->saveAs('productimages'); 
          $this->redirect(array('view','id'=>$model->id)); 
      } 

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

我的观点:

<?php $form = $this->beginWidget(
      'CActiveForm', 
      array(
       'id' => 'upload-form', 
       'enableAjaxValidation' => false, 
       'htmlOptions' => array('enctype' => 'multipart/form-data'), 
      ) 
    ); ?> 

    <?php echo $form->labelEx($model, 'foto'); ?> 
    <?php echo $form->fileField($model, 'foto'); ?> 
    <?php echo $form->error($model, 'foto'); ?> 

    ... 

    <div class="row buttons"> 
      <?php echo CHtml::submitButton('Submit'); ?> 
    </div> 

    <?php $this->endWidget(); ?> 

但是当我运行,两个问题出现了:

问题#1: endWiget()调用[伊万米西奇解决]

ImageController它认为 “/var/www/html/onlineshop-nimalogos/protected/views/image/_form.php” 包含不正确嵌套插件标签。 CActiveForm小部件没有endWidget()调用。

问题#2: 由于问题#1解决了,出现了另一个问题,图像没有保存在我的'productimages'文件夹中。

请帮我的问题#2非常感谢..

+0

按照本教程http://www.yiiframework.com/wiki/624/upload-image-and-content-using-ajax-and-store-it-in-different-table/ – 2014-09-03 08:31:10

+0

根据消息的错误在文件_form.php中。该视图不会从控制器的这部分调用。 – 2014-09-03 09:50:02

回答

2

你在什么地方开了冗余CActiveForm小部件,你应该考虑的意见和谐音。

的Yii是generting与GII三种查看文件,而这些都是:

 
create.php  update.php 
    |    | 
    |    | 
    +-------+-------+ 
      | 
      | 
      _form.php 

创建和更新视图呈现相同的部分_form,所以你应该看看在所有三个找到冗余beginWidget电话。

你在你的问题支持的观点应该是_form.php这个局部视图。

+0

的RenderPartial( '_形式',阵列( '模型'=> $模型)); ?> 我在创建&更新视图中找到了这个感谢关于renderpartial的描述。现在我懂了。所以当我们2个或更多视图呈现相同的partial _form时,我们只需要在部分窗体中调用1个endWidget。对? – JoenMarz 2014-09-03 23:47:53

+0

这是对的,但我不确定它是否是一般规则,因为一些小部件可能支持嵌套。在小部件CActiveForm的情况下,这是无法完成的,因为它仅仅是HTML表单标记的包装,它本身不能包含另一个表单标记。将部分代码视为部分视图中的代码,可以在多个视图中重用,或者为了便于阅读而在单独的文件中移动。所以,你可以打开和关闭小工具在创建视图,但那么你就需要复制在更新的代码,这样的逻辑的地方,把它在_form部分是由两者的调用。 – 2014-09-04 09:50:50

+0

renderPartial表示它不将布局应用于渲染结果(不包括页眉和页脚)。 为什么我们使用_form 因为我们有相同的形式两个创建和更新操作。 – sprytechies 2014-09-10 06:23:35