0

Web サイトに画像を保存する動的入力を作成したいと考えています。私は yii2-dynamicform と Kartik 入力ファイル拡張子を使用しています。ただし、常に null として保存されます。ご協力ありがとうございました

Ps : ... は、この質問とは関係のない私のコードの他の部分です。:)

コントローラー内:

<?php

namespace frontend\controllers;

use Yii;
use common\models\Election;
use common\models\ElectionSearch;
use common\models\Model;
use common\models\Kandidat;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\data\ActiveDataProvider;
use yii\web\Session;
use yii\web\UploadedFile;
use yii\helpers\ArrayHelper;

class ElectionController extends Controller
{
    ...
    public function actionCreate()
    {
        $model = new Election();
        $modelsKandidat = [new Kandidat]; 

        if ($model->load(Yii::$app->request->post())){
            $model->save();

            $modelsKandidat = Model::createMultiple(Kandidat::classname());
            Model::loadMultiple($modelsKandidat, Yii::$app->request->post());

            // validate all models
            $valid = $model->validate();
            $valid = Model::validateMultiple($modelsKandidat) && $valid;

            if ($valid) {
                $transaction = \Yii::$app->db->beginTransaction();
                try {
                    if ($flag = $model->save(false)) {
                        foreach ($modelsKandidat as $modelKandidat) {
                            $modelKandidat->id_election = $model->id_election;

                            if($modelKandidat->file = UploadedFile::getInstance($modelKandidat,'file'))
                            {
                                $imageName = date('dmyhis_').$modelKandidat->id_election;
                                $modelKandidat->file->saveAs('../../common/file/fotokandidat/'.$imageName.'.'.$modelKandidat->file->extension);

                                $modelKandidat->foto = $imageName.'.'.$modelKandidat->file->extension;
                            }

                            if (! ($flag = $modelKandidat->save(false))) {
                                $transaction->rollBack();
                                break;
                            }
                        }
                    }
                    if ($flag) {
                        $transaction->commit();
                        return $this->redirect(['view', 'id' => $model->id_election]);
                    }
                } catch (Exception $e) {
                    $transaction->rollBack();
                }
            }
        } else {
            return $this->render('create', [
                'model' => $model,
                'modelsKandidat' => $modelsKandidat,
            ]);
        }
    }

    ...
}

知らせる :

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use kartik\file\FileInput;
use yii\helpers\ArrayHelper;
use dosamigos\datepicker\DatePicker;
use wbraganca\dynamicform\DynamicFormWidget;
?>

<div class="election-form">

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

    ...

    <!-- mulai input kandidat !-->
    <div class="row">
        <div class="panel panel-default">
            <div class="panel-heading"><h4><i class="glyphicon glyphicon-envelope"></i>Vote</h4></div>
            <div class="panel-body">
                 <?php DynamicFormWidget::begin([
                    'widgetContainer' => 'dynamicform_wrapper', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
                    'widgetBody' => '.container-items', // required: css class selector
                    'widgetItem' => '.item', // required: css class
                    'limit' => 4, // the maximum times, an element can be cloned (default 999)
                    'min' => 1, // 0 or 1 (default 1)
                    'insertButton' => '.add-item', // css class
                    'deleteButton' => '.remove-item', // css class
                    'model' => $modelsKandidat[0],
                    'formId' => 'dynamic-form',
                    'formFields' => [
                        'nama',
                        'deskripsi',
                        'riwayat',
                        'file',
                    ],
                ]); ?>

                <div class="container-items"><!-- widgetContainer -->
                <?php foreach ($modelsKandidat as $i => $modelsKandidat): ?>
                    <div class="item panel panel-default"><!-- widgetBody -->
                        <div class="panel-heading">
                            <h3 class="panel-title pull-left">Kandidat</h3>
                            <div class="pull-right">
                                <button type="button" class="add-item btn btn-success btn-xs"><i class="glyphicon glyphicon-plus"></i></button>
                                <button type="button" class="remove-item btn btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
                            </div>
                            <div class="clearfix"></div>
                        </div>
                        <div class="panel-body">
                            <?php
                                // necessary for update action.
                                if (! $modelsKandidat->isNewRecord) {
                                    echo Html::activeHiddenInput($modelsKandidat, "[{$i}]id_kandidat");
                                }
                            ?>
                            <div class="row">
                                <div class="col-sm-4">
                                    <?= $form->field($modelsKandidat, "[{$i}]nama")->textInput(['maxlength' => true]) ?>
                                </div>
                                <div class="col-sm-4">
                                    <?= $form->field($modelsKandidat, "[{$i}]deskripsi")->textarea(['rows' => 6]) ?>
                                </div>
                                <div class="col-sm-4">
                                    <?= $form->field($modelsKandidat, "[{$i}]riwayat")->textarea(['rows' => 6]) ?>
                                </div>
                                <div class="col-sm-4">
                                    <?= $form->field($modelsKandidat, "[{$i}]file")->fileInput() ?>
                                </div>
                            </div><!-- .row -->

                        </div>
                    </div>
                <?php endforeach; ?>
                </div>
                <?php DynamicFormWidget::end(); ?>
            </div>
        </div>
    </div>
    <!-- selesai input kandidat !-->

    ...

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

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

</div>
4

1 に答える 1

0

@shoara/@zahraj 回答からです: ファイルのインデックスを指定するのを忘れたと思います `

foreach ($modelsKandidat as $keyindex=>$modelKandidat) 
{
    $modelKandidat->id_election = $model->id_election; 
    if ($modelKandidat->file = UploadedFile::getInstance($modelKandidat, "[{$keyindex}]file")) { 
        .......
    }
}

デモコントローラーとフォームパーツを参照してください。デモで想像$modelCatalogOptionしてみてください。コントローラーで値を確認しようとすると、この問題を簡単に解決できると確信しています。アクション作成に注意$model = new Election();$modelsOptionValue$modelsKandidat = [new Kandidat];

于 2016-06-12T05:43:30.607 に答える