Php 从Yii上传图片显示endWiget()错误
嗨,我也有一个问题时,试图上传图片使用的方法 我的行动/模式:Php 从Yii上传图片显示endWiget()错误,php,yii,Php,Yii,嗨,我也有一个问题时,试图上传图片使用的方法 我的行动/模式: class Image extends CActiveRecord { public $foto; ... public function rules() { return array( ... array('foto', 'file', 'types'=>'jpg, gif, png'), ...
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()调用[由Ivan Misic解决]
ImageController的视图“/var/www/html/onlineshop-nimalogos/protected/views/image/_-form.php”中包含不正确嵌套的小部件标记。CActiveForm小部件没有endWidget()调用
问题2:
由于问题#1已解决,并且出现了另一个问题,因此图像未保存在我的“productimages”文件夹中
请帮我解决这个问题。非常感谢。您已经在某处打开了冗余的CActiveForm小部件,您应该查看视图和部分 Yii正在使用gii生成三个视图文件,它们是: create.php update.php | | | | +-------+-------+ | | _form.php create.php update.php | | | | +-------+-------+ | | _form.php create和update视图呈现的是相同的partial\u表单,因此您应该查看这三个视图以找到多余的beginWidget调用
您在问题中支持的视图应该是_form.php partial view。根据文件_form.php中的错误信息遵循本教程。该视图不会从控制器的此部分调用。我在创建和更新视图中找到了这个,感谢对renderpartial的描述。现在我明白了。因此,当我们两个或更多视图呈现相同的部分形式时,我们只需要在部分形式调用1个endWidget。是吗?没错,但我不确定这是否是一般规则,因为一些小部件可能支持嵌套。对于小部件CActiveForm,这是无法实现的,因为它仅仅是HTML表单标记的包装,本身不能包含另一个表单标记。可以将partial视为视图的一部分中的代码,这些代码可以在多个视图中重用,或者为了可读性而在单独的文件中移动。因此,您可以在“创建”视图中打开和关闭小部件,但随后需要在“更新”中复制代码,因此,将其放在两个视图都调用的_形式部分中是合乎逻辑的。renderPartial意味着它不会对渲染结果应用布局(不包括页眉和页脚)。为什么我们使用_表单,因为我们的创建和更新操作都有相同的表单。