0

データベースにテーブルなしでファイルアップロード検証ルールを作成したので、CFormModelを使用してそれを拡張しました。

これが私のコードです:

コントローラ

public function actionMaterials($pid)
{
    $projectMaterialFile = new ProjectMaterialFile;
    $this->render('project_materials',array(
        'projectMaterialFile'=>$projectMaterialFile,
    ));
}

VIEW(プロジェクト資料)

<div id="exportMaterialContent">
    <h4 style="text-align:left;">Export Material Document</h4>
    <?php echo CHtml::form($this->createUrl("project/export"),'post',array('enctype'=>'multipart/form-data')); ?>
    <?php echo CHtml::activeHiddenField( $projectMaterialFile,'idProject',array('value'=>$projectModel->idProject) ); ?>
    <?php echo CHtml::activeFileField($projectMaterialFile, 'document'); ?>
    <?php echo CHtml::submitButton("Export"); ?>
    <?php echo CHtml::endForm(); ?>
</div>

コントローラ-エクスポート(ビューからのフォームが送信された後)

public function actionExport()
{
    $model = new ProjectMaterialFile;
    $model->attributes = $_POST['ProjectMaterialFile'];
    if( $model->validate() ) {
        $model->document = CUploadedFile::getInstance($model,'document');
        $model->document->saveAs(Yii::getPathOfAlias('webroot')."/material_document/".$model->document->name);
        echo "correct";
    } else {
        echo "Invalid!";
    }
}

モデル

class ProjectMaterialFile extends CFormModel
{
    public $document;
    public $idProject;

    public function rules()
    {
        return array(
            array('document','file','types'=>'csv'),
            array('document', 'required'),
        );
    }

    public function attributeLabels()
    {
        return array(
            'document' => 'Project Material Document',
            'idProject' => 'Project ID',
        );
    }
}

だから私がここでしたことは、それが常に私のコントローラーのelseに実行されるということです。actionExport() 私がしようとしてもecho $model->validate();、それは何も出力しないので、それは常にelseステートメントに行きます。

あなたの助けは大歓迎です、そしてもちろん、報われます!

ありがとう!:)

4

1 に答える 1

1

モデルの検証ルールを次のように変更してみてください

public function rules()
{
   return array(
      array('document','file','types'=>'csv'),
      array('document', 'required'),
      array('document', 'length', 'max'=>200),
      array('idProject', 'length', 'max'=>200),
      array('document, idProject', 'safe'),
      );
}

次に、コントローラーパーツを次のように変更します

$model = new ProjectMaterialFile;
$model->attributes = $_POST['ProjectMaterialFile'];
$model->document = CUploadedFile::getInstance($model,'document');

if( $model->validate() )
{
   $model->document->saveAs(Yii::getPathOfAlias('webroot')
                ."/material_document/".$model->document->name);
    echo "Correct";
}
else
{
    echo "Invalid!";
}

リンクの例:http ://www.yiiframework.com/wiki/2/how-to-upload-a-file-using-a-model/

于 2012-09-28T16:43:11.727 に答える