【EC-CUBE3】商品画像を消したと思ったら消えてなかった件。

EC-CUBE3で商品画像を消したと思ったら
枠だけ生き残っていたようです。

1.error

現象発生手順

1. 画像をアップロードして商品を登録
2. 1で編集した商品の編集画面を開く
3. 商品画像の×ボタンをクリックして画像を消す
4. 商品情報を更新する
5. 再描画されたときに消したはずの画像の枠が表示される←イマココ

原因は何か?

まぁ、おそらく画像自体は消してデータが消えてないってことでしょうね。
テーブルを確認しましょう。

2.dtb_products

商品テーブル(dtb_product)……には画像カラムないですね。
ってか、カラム数少なっ!EC-CUBE2のときより大分減ってますね!
ふむ、ということは、これは画像は関連テーブル化してますね。

3.dtb_product_image

あった。
product_idが1と2は最初に追加される商品なので、3ですね。
思ったとおり、データが3件あります。

ソースもっと見るよ!

構造が大幅に変わったせいでソースがどこかわからん!!
大体でアタリつけにいきましたが、実際の画像の削除処理はここでしょう。

\src\Eccube\Controller\Admin\Product\ProductController.php

// 画像の削除
$delete_images = $form->get('delete_images')->getData();
foreach ($delete_images as $delete_image) {
    $ProductImage = $app['eccube.repository.product_image']
        ->findOneBy(array('file_name' => $delete_image));
    // 追加してすぐに削除した画像は、Entityに追加されない
    if ($ProductImage instanceof \Eccube\Entity\ProductImage) {
        $Product->removeProductImage($ProductImage);
        $app['orm.em']->remove($ProductImage);
    }
    $app['orm.em']->persist($Product);

    // 削除
    $fs = new Filesystem();
    $fs->remove($app['config']['image_save_realdir'] . '/' . $delete_image);
}

ざっと見た感じだと「追加してすぐに削除した画像は、Entityに追加されない」ってコメントの処理が
テーブルに登録してある画像でも通ってない、ってのが一番ありえそうですね。
このコメントの処理がproduct_imageのデータを削除してそうですし。

上記想定の検証

上で考えたのが正しいか検証です。
余分なデータを直接DBから消しちゃいます。
そして、まずは画像(ペンギン)をアップロードします。

5.add_image

一回登録して、今度はペンギンさんを削除します。

6.del_image

あれ?

画像追加時のadd_imageのvalue値

class="form-control" value="0716174331_55a7d12339cd7.jpeg"

画像削除時のdelete_imageのvalue値

class="form-control" value="/0716174331_55a7d12339cd7.jpeg"

うん、スラッシュ多いね

このスラッシュがあるせいでfind時にデータが取得できずに
product_imageのデータを削除する処理が通らなかったわけですね。

原因がわかったから修正するよ

今回自分が修正するのは
『×ボタンをクリックしたときにファイル名を取得する部分』
にしようと思います。

\src\Eccube\Resource\template\admin\Product\product.twig

// 画像削除時
var count_del = 0;
$("#thumb").on("click", ".delete-image", function () {
    var $new_delete_image = $(proto_del.replace(/__name__/g, count_del));
    var src = $(this).prev().attr('src')
            .replace('{{ app.config.image_temp_urlpath }}', '')
            .replace('{{ app.config.image_save_urlpath }}', '');
    $new_delete_image.val(src);
    $("#thumb").append($new_delete_image);
    $(this).parent("li").remove();
    hideSvg();
    updateRank();
    count_del++;
});

たぶんここ。

×ボタンがクリックされて、prev().attr(‘src’)だから、画像のSRCを取得ですね。

画像パス:/eccube-3.0.1/html/upload/save_image/0716174331_55a7d12339cd7.jpeg

それでこの画像パスからimage_temp_urlpathを消す……tempだから違うので、飛ばして
image_save_urlpathを画像パスから削除します。
image_save_urlpathって値は何でしょう?

\src\Eccube\Resource\config\path.yml.dist

# urlpath
admin_urlpath: ${ROOT_URLPATH}/template/admin
front_urlpath: ${ROOT_URLPATH}/template/${TEMPLATE_CODE}
image_save_urlpath: ${ROOT_URLPATH}/upload/save_image
image_temp_urlpath: ${ROOT_URLPATH}/upload/temp_image
user_data_urlpath: ${ROOT_URLPATH}/user_data

画像パス:/eccube-3.0.1/html/upload/save_image/0716174331_55a7d12339cd7.jpeg
↓ 引く
image_save_urlpath: ${ROOT_URLPATH}/upload/save_image
↓ は
/0716174331_55a7d12339cd7.jpeg

……うん、スラッシュ残るね!

じゃあ、置換処理にスラッシュおきます。
\src\Eccube\Resource\template\admin\Product\product.twig

// 画像削除時
var count_del = 0;
$("#thumb").on("click", ".delete-image", function () {
    var $new_delete_image = $(proto_del.replace(/__name__/g, count_del));
    var src = $(this).prev().attr('src')
            .replace('{{ app.config.image_temp_urlpath }}/', '')
            .replace('{{ app.config.image_save_urlpath }}/', '');
    $new_delete_image.val(src);
    $("#thumb").append($new_delete_image);
    $(this).parent("li").remove();
    hideSvg();
    updateRank();
    count_del++;
});

これでうまくいくはず。
※テンプレートの修正するときはキャッシュ(\app\cache\twig\admin)を消しましょう。
 今回、結構キャッシュキツいです。

7.complete

商品画像が消せました!
これで、当面は大丈夫なはずですw



コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です