1

Upload Form私はカスタムモデルを作りましたModel。私は yii2 のドキュメントに基づいてコピーを作成しましたUploadedFileが、これまでのところ機能しているのは、アップロードされたファイルが .xml に保存されている場合ですweb/uploads。という名前のパブリック プロパティを作成しました$storeList。フォーム内の値を呼び出した後に$model->load((Yii::$app->request->post())割り当てられることを期待していまし$model->storeListたが、変数は空です。誰かが私がどこで間違っているか教えてもらえますか?

構造はこのようになります。index.phpが最初に読み込まれselect_package.php、レンダリングするタブを持つものが含まれますupload.php

index.php:

<div id="uploadStatusFrame" class="uploadStatusFrame">
    <?php
        include('layouts/select_package.php');
    ?>
</div>

<button id="uploadButton" class="btn btn-success" 
                style='position:relative; left:10px; top: -44px'>Upload to Server</button>

<script>
$('#uploadButton').click(function(){
    $("#submitButton").trigger("click");
});
</script>

select_package.php:

<?= 
    Tabs::widget([
        'id' => 'dashboardTab',
        'options' => ['id' => 'mainTab',
                    'class' => 'nav nav-tabs',
                        'style' => 'font-size: 14px; font-weight: bold;border-bottom: none;',
                    ],
        'items' => [
        [
            'label' => 'New Firmware',
            'active' => true,
                'style' => 'font-size: 14px; font-weight: bold',
            'options' => ['id' => 'tab1',
                        'class' => 'nav nav-tabs',
                        'style' => 'width:1044px;margin:1px;background:#428bca; 
                        height:453px;border:2px solid #428bca;'
                        ],
            'content' => $this->render('/upload-package/upload', [
                            'model' => $model,
                        ]),
        ],
    ]);
?>

UploadPackageController.php:

class UploadPackageController extends Controller
{
    public $layout = "default";

    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['post'],
                ],
            ],
        ];
    }

    /**
     * Lists all SystemConfig models.
     * @return mixed
     */
    public function actionIndex()
    {
        $model = new UploadForm;

        if ($model->load(Yii::$app->request->post())) {
            $model->imageFile = UploadedFile::getInstance($model, 'imageFile');
            $model->storeList = UploadedFile::getInstance($model, 'storeList');     // **<<-- How should I handle this?**

            if ($model->upload()){
                return $this->render('index', [
                    'model' => $model,
                    'storeList' => $model->storeList,
                ]);
            }
        }

        return $this->render('index', [
            'model' => $model,
            'storeList' => 'NONE',
        ]);
    }
}

UploadForm.php:

class UploadForm extends Model
{
    /**
     * @var UploadedFile
     */
    public $imageFile;
    public $storeList;

    public function rules()
    {
        return [

        ];
    }

    public function upload()
    {
        if ($this->validate()) {
            $this->imageFile->saveAs('uploads/' . $this->imageFile->baseName . '.' . $this->imageFile->extension);
            return true;
        } else {
            return false;
        }
    }
}

アップロード.php

    <?= $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data',
            'id' => 'fileSenderForm', 
            'name' => 'fileSenderForm', 
        ]]) ?>

    <?= $form->field($model, 'imageFile')->fileInput(); ?>

    <?= $form->field($model, 'storeList')->textInput(['value' => 'ANY_VALUE_HERE'])->label(); ?>

    <?= Html::submitButton('Submit', ['id' => 'submitButton']); ?>

    <?php ActiveForm::end() ?>
4

1 に答える 1

2

あなたの問題とその原因

リクエストの内容を確認すると、値は送信されていますが、モデルに割り当てられていないことがわかります。この理由は、Yii2 のセキュリティ機能です。-メソッドが行うことは、モデル属性のload()一括割り当てと呼ばれます。これは潜在的に危険である可能性があるため、Yii は一括割り当てされるすべての属性を

  • 検証済み
  • または「安全」と宣言されています(実際にはバリデーターでもあります)

解決

そのため...$model->load(Yii::$app->request->post())バリデーターを介して大量に割り当てたい属性を追加する必要があります。それ以外の場合はスキップされます。UploadedFile::getInstanceこの属性は明らかにファイルに関するものではないため、このフィールドの も削除します。

実際のバリデーターを使用するか、単に安全であると宣言することができます。rules-method は次のようになります。

public function rules() {
    return [
        [['storeList'], 'string', 'max'=>64],
    ];
}

または、「実際の」バリデーターを指定したくない場合は、属性を安全であると宣言するだけです。

public function rules() {
    return [
        [['storeList'], 'safe'],
    ];
}

これについて読む

これに関するすべての詳細は、こちらの公式ガイドで読むことができます。

http://www.yiiframework.com/doc-2.0/guide-structure-models.html#massive-assignment

于 2016-02-04T11:44:38.390 に答える