Как реализовать kartik yii2 FileInput в форме, использующей другую модель

Вот код, расположенный в myyiiapp\backend\views\product_form.php

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use kartik\widgets\FileInput;

/**
 * @var yii\web\View $this
 * @var backend\models\Product $model
 * @var yii\widgets\ActiveForm $form
 */
?>

<div class="product-form">

    <?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'category_id')->textInput() ?>

    <?= $form->field($model, 'name')->textInput(['maxlength' => 255]) ?>

    <?= $form->field($model, 'description')->textarea(['rows' => 6]) ?>

    <?= $form->field($model, 'created')->textInput() ?>

    <?= $form->field($model, 'last_updated')->textInput() ?>

    <?= $form->field($model, 'documentation')->textInput(['maxlength' => 255]) ?>

    <?= $form->field($model, 'layout')->textInput() ?>

    <?=
    // Usage with ActiveForm and model
     $form->field($model, 'someAttributeName')->widget(FileInput::classname(), [
        'options' => ['accept' => 'image/*'],
    ]);

    ?>

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

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

</div>

У меня есть имя таблицы "product" и другое имя таблицы "product_images", которые содержат путь к изображению продукта и столбец идентификатора продукта.

Как я могу установить атрибут, где он говорит someAttributeName для изображения, которое находится в модели ProductImage, и эта форма использует модель Product. Короче говоря, как мы можем использовать здесь несколько моделей, и мне нужно сначала создать продукт, а затем путь к изображению, потому что для сохранения пути к изображению мне нужен идентификатор продукта, который будет автоматически сгенерирован mysql.

Я сгенерировал все из Yii2 crud.


person Tousif Ali    schedule 15.04.2014    source источник


Ответы (1)


Наконец, после слишком многих проб и ошибок, я нашел решение своего вопроса.

Вид: _form.php

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use kartik\widgets\FileInput;

/**
 * @var yii\web\View $this
 * @var backend\models\Product $model
 * @var yii\widgets\ActiveForm $form
 */
?>

<div class="product-form">

    <!--change here: This form option need to be added in order to work with multi file upload ['options' => ['enctype'=>'multipart/form-data']]-->
    <?php $form = ActiveForm::begin(['options' => ['enctype'=>'multipart/form-data']]); ?>

    <?= $form->field($model, 'category_id')->dropDownList($model->getCategoryList()) ?>

    <?= $form->field($model, 'name')->textInput(['maxlength' => 255]) ?>

    <?= $form->field($model, 'description')->textarea(['rows' => 6]) ?>

    <?= $form->field($model, 'created')->textInput() ?>

    <?= $form->field($model, 'last_updated')->textInput() ?>

    <?= $form->field($model, 'documentation')->textInput(['maxlength' => 255]) ?>

    <?= $form->field($model, 'layout')->textInput() ?>

    <?php

    // Usage with ActiveForm and model
    //change here: need to add image_path attribute from another table and add square bracket after image_path[] for multiple file upload.
     echo $form->field($productImages, 'image_path[]')->widget(FileInput::classname(), [
        'options' => ['multiple' => true, 'accept' => 'image/*'],
        'pluginOptions' => [
            'previewFileType' => 'image',
            //change here: below line is added just to hide upload button. Its up to you to add this code or not.
            'showUpload' => false
        ],
    ]);
    ?>

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

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

</div>

Контроллер

public function actionCreate()
    {
        $model = new Product;
        $productImages = new ProductImages;

        if($_POST){
            //below line will fetch all image related data and put it into $file as an object. Refer output of var_dump($file) after controller code.
            $file = UploadedFile::getInstances($productImages, 'image_path');
            var_dump($file);
        }

        //below code is where you will do your own stuff. This is just a sample code need to do work on saving files
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create', [
                'model' => $model,
                'productImages' => $productImages,
            ]);
        }
    }

var_dump($file) Это покажет выходные данные загруженного изображения.

array (size=3)
  0 => 
    object(yii\web\UploadedFile)[45]
      public 'name' => string '1.jpg' (length=5)
      public 'tempName' => string 'D:\wamp\tmp\php8E46.tmp' (length=23)
      public 'type' => string 'image/jpeg' (length=10)
      public 'size' => int 77593
      public 'error' => int 0
  1 => 
    object(yii\web\UploadedFile)[46]
      public 'name' => string '2.jpg' (length=5)
      public 'tempName' => string 'D:\wamp\tmp\php8E56.tmp' (length=23)
      public 'type' => string 'image/jpeg' (length=10)
      public 'size' => int 74896
      public 'error' => int 0
  2 => 
    object(yii\web\UploadedFile)[47]
      public 'name' => string '3.jpg' (length=5)
      public 'tempName' => string 'D:\wamp\tmp\php8E57.tmp' (length=23)
      public 'type' => string 'image/jpeg' (length=10)
      public 'size' => int 72436
      public 'error' => int 0
person Tousif Ali    schedule 17.04.2014