【问题标题】:How to implement kartik yii2 FileInput in form which is using different model如何以使用不同模型的形式实现kartik yii2 FileInput
【发布时间】:2014-05-30 07:22:47
【问题描述】:

这是位于 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”,其中包含产品图片路径和产品 ID 列。

如何为 ProductImage 模型中的图像设置 someAttributeName 属性,并且此表单使用 Product 模型。简而言之,我们如何在这里使用多个模型,我需要先创建产品,然后是图像路径,因为要保存图像路径,我需要由 mysql 自动生成的产品 id。

我已经从 Yii2 crud 生成了所有东西。

【问题讨论】:

    标签: php mysql frameworks widget yii2


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      相关资源
      最近更新 更多