バージョン選択

フォーラム

メニュー

オンライン状況

29 人のユーザが現在オンラインです。 (22 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 29
もっと...

サイト内検索

質問 > 管理機能 > 画像アップロードを管理画面に追加(綺麗な書き方を教えてください)

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
shiftbank
投稿日時: 2021/4/26 14:56
対応状況: −−−
新米
登録日: 2018/6/29
居住地:
投稿: 8
画像アップロードを管理画面に追加(綺麗な書き方を教えてください)
[EC-CUBE] 4.0.5
[PHP] 7.4
[データベース] Maria
[WEBサーバ] Apache

商品情報に画像を追加する、画像アップロード処理を書きました。一応動作してはいます。
ただ、手探りすぎてコードの置き場所や処理の流れなどグチャグチャになっている気がします。
違和感のある箇所、ご指摘いただけないでしょうか。

商品情報に追加の画像をアップロードする機能です。
※最初からある画像アップロード機能と分離させたいのは、表示する場所が違うからです。
カラム名が雑なのは目を瞑ってください。

大まかな実装内容は↓です
・ProductTraitで商品情報に画像用カラムを追加
・ProductControllerに画像保存用処理を追加
・ProductControllerへPOSTするためのHTMLを表示

ProductTrait - 画像保存用カラムの追加と、フォーム項目の追加

    /**
     * @ORM\Column(name="feature_1_image_1", type="string", nullable=true)
     * @Eccube\FormAppend(
     *  auto_render=true,
     *  type="\Symfony\Component\Form\Extension\Core\Type\FileType",
     *  form_theme="Form\admin_image.twig",
     *  options={
     *      "required": false,
     *      "label":"特徴1画像1",
     *      "data_class":null,
     *  }
     * )
     */
    public $feature_1_image_1;

    public function setFeature1Image1($feature_1_image_1)
    {
        $this->feature_1_image_1 = $feature_1_image_1;
    }

    public function getFeature1Image1()
    {
        return $this->feature_1_image_1;
    }

疑問1: form_themeで指定するtwigファイルの保存場所は4つのディレクトリがあるようですが、管理画面用twigを置くに適したディレクトリは対象外な点。

admin_image.twig - 画像アップロードフォームのテンプレート

{%- block form_row -%}
<div class="row">
    <div class="col-3">
        <span>{{ form.vars.label|trans }}</span>
    </div>
    <div class="col mb-2 image-group">
        <div>
            {{ form_widget(form, {'attr': {'class': 'image-upload-form'}}) }}
            {{ form_errors(form) }}
        </div>
        {% if form.vars.data %}
        <img src="{{ asset(form.vars.data, 'save_image') }}" class="image-uploaded" alt="">
        <label for="{{ form.vars.name }}_delete"><input type="checkbox" name="{{ form.vars.name }}_delete" id="{{ form.vars.name }}">削除</label>
        {% else %}
        <img src="" class="image-uploaded" alt="">
        {% endif %}
    </div>
</div>
{%- endblock form_row -%}


テンプレートを新たに作った理由
・アップロード時のJavaScriptでの処理にクラスやプレビュー要素を表示するHTMLが欲しかった
・削除フラグをPOSTに載せるためのinput要素が欲しかった

別途、JavaScriptにてimg.image-uploadedへのプレビューを行ったりしています。


ProductController - 画像の登録や削除


「// 画像の登録」処理の直前に以下を記述しました

$images = preg_grep('/feature_(.*?)_image_(.*?)/', array_keys($form->all()));

foreach ($images as $key) {
    $image = $form->get($key)->getData();
    $isDelete = $request->get($key.'_delete');
    if (!$isDelete) {
        if (!empty($image)) {
            /**
             * 画像が入力された場合
             */
            $file = new File($image->getPathName());
            $fileName = sha1(uniqid(mt_rand(),true)) . '.' . $image->guessExtension();
            $file->move($this->eccubeConfig['eccube_save_image_dir'], $fileName);
            $Product->setFeature1Image1($fileName);
        }else{
            /**
             * 画像が入力されなかった場合。
             */
            // 現在保存されている画像パスをそのままセットする
            $Product->setFeature1Image1($featureImages['feature_1_image_1']);
        }
    }else{
        /**
         * 削除
         *
         * 何もしなければ自動的に削除される
         */

    }
}

疑問点2: 「維持する」方法がわからず、再度セットするという荒技になってしまいました。
疑問点3: FormAppendアノテーションを経由せずに追加した***_delete要素が、
$builder->getForm()->get('hoge')では取得できないのは何故なのか

疑問点4: どの時点でどこまでの情報が保存されているのかイマイチよくわからない
疑問点5: 画像アップロードのようなよく使われる機能はどこかに用意されていそうだが見つけられなかった。


そもそも勘違いしている点が多々あるかと思います。
一部でも、ココはこうした方がいいよ等あれば教えて欲しいです。

よろしくお願いします。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は71,093名です
総投稿数は101,017件です

投稿数ランキング

1
seasoft
7333
2
468
2957
3
AMUAMU
2712
4
nanasess
2139
5
umebius
1973
6
yuh
1612
7
red
1443
8
h_tanaka
1079
9
tsuji
936
10
fukap
907
11
shutta
835
12
tao_s
793
13 ramrun 789
14 karin 689
15 sumida 641
16
homan
633
17 DELIGHT 572
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.