2

私は Yii で FileField を使用しています。作成時には問題なく動作していますが、更新時に問題が発生しています。

誰かがフォーム名の市区町村とファイルフィールドに画像を保存したが、タイプを入力するのを忘れたので、フォームを更新し、タイプを編集して再度保存するとします。ここで問題が発生します。更新を保存する時点で、ファイルフィールドは以前にアップロードした画像を削除します。いくつかのコードを見つけましたが、画像を保存して削除する代わりに、次のエラーが表示されます:

致命的なエラー: オブジェクト以外でメンバー関数 saveAs() を呼び出します。

ここに私のフォームがあります:

<?php 
Yii::app()->user->setFlash('success', '<strong>Well done!</strong> You successfully read this important alert message.');
$this->widget('bootstrap.widgets.TbAlert', array(
    'block'=>true, // display a larger alert block?
    'fade'=>true, // use transitions?
    'closeText'=>'×', // close link text - if set to false, no close link is displayed
    'alerts'=>array( // configurations per alert type
        'error'=>array('block'=>true, 'fade'=>true, 'closeText'=>'×'), // success, info, warning, error or danger
    ),
));
?>

<div class="form">

        <?php $form=$this->beginWidget('CActiveForm', array(
        'id'=>'reportes-form',
        'enableAjaxValidation'=>false,
        'htmlOptions' => array('enctype' => 'multipart/form-data'),
        )); ?>
        <?php echo $form->errorSummary($model); ?>
        <p class="help-block">Fields with <span class="required">*</span> are required.</p>

    <div class="row">
        <?php echo $form->labelEx($model, 'name'); ?>
        <?php echo $form->textField($model,'name'); ?>
        <?php echo $form->error($model, 'name'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($model, 'city'); ?>
        <?php echo $form->textField($model,'city'); ?>
        <?php echo $form->error($model, 'city'); ?>
    </div>

    <div class="row">
        <?php echo $form->labelEx($model,'id_type'); ?>
        <?php $datos = CHtml::listData(Types::model()->findAll(array('condition'=>'', 'order'=>'')), 'id', 'name');
            echo CHtml::activeDropDownList($model,'id_type',$datos,array('prompt'=>'Select', 'disabled'=> '')); 
        ?>
    </div>
    <div class="row" >
        <?php echo $form->labelEx($model, 'description'); ?>
        <?php echo $form->textArea($model,'description'); ?>
        <?php echo $form->error($model, 'description'); ?>
    </div>

    <div class="row">

        <?php echo $form->labelEx($model, 'image'); ?>
        <?php if ($model->image): ?>
            <div>Existing image: <?php echo CHtml::encode($model->image); ?></div>
            <div>
                <img src="<?php echo Yii::app()->request->baseUrl.'/images/uploads/'.$model->image?>" width="180" height="180" />
            </div>
        <?php endif; ?>

        <?php  echo $form->fileField($model, 'image'); ?>
        <?php echo $form->error($model, 'image'); ?>
    </div>

<div class="form-actions">
    <?php $this->widget('bootstrap.widgets.TbButton', array(
            'buttonType'=>'submit',
            'type'=>'primary',
            'label'=>$model->isNewRecord ? 'Create' : 'Save',
        )); ?>
</div>

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

これが私のコントローラーの更新です:

public function actionUpdate($id)
    {   
        $model=$this->loadModel($id);


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

        if(isset($_POST['Restaurants']))
        {
            $model->attributes=$_POST['Restaurants'];
            $oldFileName    = $_POST['Restaurants']['image'];
            $model->image= CUploadedFile::getInstanceByName('Restaurants[image]');
            $path = Yii::getPathOfAlias('webroot')."/images/uploads/";




            if($model->save()) {
                if($model->image == null){

                    $model->image->saveAs(Yii::getPathOfAlias('webroot')."/images/uploads/".$oldFileName);
                    $this->redirect(array('view','id'=>$model->id));
                }
                else
                {
                    $model->image->saveAs(Yii::getPathOfAlias('webroot')."/images/uploads/".$model->image);
                    chmod( $path.$model->image, 0777 );
                    $this->redirect(array('view','id'=>$model->id));


                }

            }
        }

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

の作成は私var_dumpに送信し、最初にアップロードされた画像の名前を持っています。したがって、これは問題なく古い名前を保存する必要があると思います。私は何が欠けていますか?$model->filenull$oldFileName$model->image

4

1 に答える 1

2

(コメントと編集で回答済み。回答のない質問を参照してください。ただし、コメントで問題は解決されています (またはチャットで拡張されています) )

@Martin Komara は次のように書いています。

$model->image->saveAsif $model->imageisを呼び出すことができないことは明らかだと思いますnull(条件のためです)。何を達成しようとしていますか?以前アップロードしたファイルを削除しますか?

このウィキをチェックしてください: http://www.yiiframework.com/wiki/349/how-to-upload-image-photo-and-path-entry-in-datebase-with-update-functionality/

モデルを更新する必要があります。つまり、$model->image = 'path to image'; $model->save();

OP は次のように書いています。

私の更新コントローラーは現在正常に動作しています:

public function actionUpdate($id)
{

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

    if(isset($_POST['Restaurants']))
    {
        $_POST['Restaurants']['image'] = $model->image;
        $model->attributes=$_POST['Restaurants'];

        $uploadedFile=CUploadedFile::getInstance($model,'image');

        if($model->save())
        {
            if(!empty($uploadedFile))  // check if uploaded file is set or not
            {
                $uploadedFile->saveAs(Yii::getPathOfAlias('webroot')."/images/uploads/".$model->image);
            }
            $this->redirect(array('view','id'=>$model->id));
        }

    }

    $this->render('update',array(
        'model'=>$model,
    ));
}
于 2015-01-26T16:14:34.263 に答える