1

最初は - 私は Yii フレームワークは初めてです。私は自分でいくつかの調査を行いましたが、私の問題に対する正確な解決策を見つけることができませんでした.

Product と Image という 2 つの関連モデルがあるとします。1 つの製品に複数の画像が割り当てられている場合があります。この種のスキームを管理できる作成/更新フォームを作成するための最良のアプローチは何ですか?

画像モデルは、画像ファイルへのパスとともにさまざまなフィールドで構成されているため、パス自体の単なる「コンテナー」ではありません。さらに、アップロードされたすべての画像とそのパスに対してサムネイルを生成し、同じモデル内に保存する必要があります。

私が達成する必要があるのは、Django で知られている管理インライン機能とほとんど同じです。製品の作成/更新フォームに、ユーザーがイメージを追加/変更/削除できるセクションが必要です。

multimodelform 拡張機能を試しましたが、ファイルのアップロードが機能しませんでした。ファイルアップロード対応の複数モデルフォーム構造全体を手動で構築する必要がなく、それを実現する最良の方法は何ですか?

4

1 に答える 1

0

詳細な解決策は、CActiveForm または CHtml フォームを使用しているかどうかによって異なります。関連する 2 つのモデルがあるため、CActiveForm を使用していると仮定し、留意すべき点を指摘します。

この例では、いくつかの定義 Product をフィールド id、name Product で、ProductImage の「images」と 1 対 MANY の関係を持ち、フィールド id、productId、path を含む ProductImage と仮定します。

また、アップロード/編集は1回ですが、複数の削除があると想定しています

ビューは次のとおりです。

$form = $this->beginWidget(
    'CActiveForm',
    array(
        'id' => 'upload-form',
        'enableAjaxValidation' => false,
        'htmlOptions' => array('enctype' => 'multipart/form-data'),
    )
);

echo $form->labelEx($product, 'name');
echo $form->fileField($product, 'name');
echo $form->error($product, 'name');

echo $form->checkBoxList($product, 'path', $product->images);


echo $form->labelEx($productImage, 'path');
echo $form->fileField($productImage, 'path');
echo $form->error($productImage, 'path');


$this->endWidget();

そしてあなたの行動

public function actionUpdate($productId) {

    $product = Product::model()->findByPk($productId)->with('images');
    $productImage = new ProductImage();

    if(isset($_POST['Item']))
    {
        $product->attributes=$_POST['Product'];

        foreach($product->images as $im) {
            if(in_array($im->path, $_POST['Item']['Image']))
                $im->delete();
        }
        $productImage->image=CUploadedFile::getInstance($productImage,'path');
        if($productImage->save())
        {
            $productImage->image->saveAs('some/new/path');
            // redirect to success page
        }
    }
    $this->render('update', array(
            'product'=>$product,
            'productImage'=>$productImage,
        ));
}

このソリューションはテストされていないため、バグがあることに注意してください。ただし、独自のフォームを作成する方法についてのアイデアが得られるはずです。

リソース: http://www.yiiframework.com/wiki/2/how-to-upload-a-file-using-a-model/

http://www.yiiframework.com/wiki/384/creating-and-updating-model-and-its-related-models-in-one-form-inc-image

于 2013-01-08T12:57:47.007 に答える