バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > 管理機能 > 複数の商品で共有している商品画像が商品削除のとき一緒に削除されてしまう。商品画像は残したい

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
Ahonda
投稿日時: 2021/4/14 13:02
対応状況: 解決済
新米
登録日: 2021/4/14
居住地:
投稿: 4
複数の商品で共有している商品画像が商品削除のとき一緒に削除されてしまう。商品画像は残したい
▼テンプレート
[EC-CUBE] 4.0.3正式版
[レンタルサーバ] 仮想環境Virtual Box利用
[OS] CentOS 7
[PHP] 7.2.25
[データベース] MySQL 14.14 Distrib 5.7.28
[WEBサーバ] Apache 2.4.6
[ブラウザ] Chrome 88.0.4324.190
[導入プラグインの有無] 商品画像一括アップロード
この商品について問い合わせる機能 for EC-CUBE4
[カスタマイズの有無] なし

[現象] 1つの商品画像を複数の商品で共有している。その商品の一つを削除すると商品画像も削除されてしまう。

ProductController.phpに「画像の削除」という処理があり、「他に同じ画像を参照する商品がなければ画像ファイルを削除」という条件処理もあるが、機能していない。

テストしたこと
(1)商品をCSVで一括アップロード。画像ファイル名は全て同一。
(2)商品画像一括アップロードプラグインで画像をアップロード。/html/upload/save_image/にアップロードされ、商品一覧にも画像が反映される。
(3)商品の一つを商品管理→商品一覧より削除。商品画像も上記フォルダより削除される。残った商品の画像欄には壊れたファイルのアイコン。
(4)商品画像をプラグインを使わず、直接上記フォルダにアップした場合も同様。商品一覧に画像が表示されるが、商品の一つを削除すると画像も削除される。
(5)商品一覧→商品登録で画像を登録した場合、アップされた画像ファイル名はシステムによって変更されてしまうため、他商品と共有ができず、一覧には登録した商品のみ画像が表示される。


実現したいことは、共有している画像を残すことです。CSVを使って1万件ほどの商品データを日々入れ替えます。画像は全て同じものであるため、商品を削除しても画像は削除せず、残っている商品で表示させます。

ご助言いただけますと大変たすかります。

当方、VBAを使ったエクセルのプログラミングやウェブサーバーの設定には親しんでいますが、PHPやオブジェクト指向には不慣れです。

本田
468
投稿日時: 2021/4/15 9:37
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3073
Re: 複数の商品で共有している商品画像が商品削除のとき一緒に削除されてしまう。商品画像は残したい
>「他に同じ画像を参照する商品がなければ画像ファイルを削除」という条件処理もあるが、機能していない。
デフォルトのソースを確認してみましたが、投稿いただいているような画像を削除するorしないのロジックは存在しないように見受けられる為、
運用に併せてカスタマイズを加えられているのではないでしょうか?

何かしら条件に合わずに画像を残せていないのではないかと思いますので
該当ロジックを正しい動きに修正されるのが良いのではないかと思います。

もし、カスタマイズされていたという事であれば
カスタマイズした人に確認するのが良いかと思います。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

Ahonda
投稿日時: 2021/4/15 12:44
対応状況: −−−
新米
登録日: 2021/4/14
居住地:
投稿: 4
Re: 複数の商品で共有している商品画像が商品削除のとき一緒に削除されてしまう。商品画像は残したい
Shiro8様、返信ありがとうございます。

引用:

468さんは書きました:
>「他に同じ画像を参照する商品がなければ画像ファイルを削除」という条件処理もあるが、機能していない。
デフォルトのソースを確認してみましたが、投稿いただいているような画像を削除するorしないのロジックは存在しないように見受けられる為、
運用に併せてカスタマイズを加えられているのではないでしょうか?


ご指摘の通りでした。インストールしてあるオリジナルのファイルを確認したところ上記の記載はありませんでした。。。。

私が投稿時に見ていたものはECCUBEのGithubに上がっていたコードで、下記の552行目になります。

https://github.com/EC-CUBE/ec-cube/blob/4.0/src/Eccube/Controller/Admin/Product/ProductController.php

大変お恥ずかしい。異なるものをみて、質問していたようです。ご指摘ありがとうございました。お時間を取らせてしまいすみません。
468
投稿日時: 2021/4/16 10:40
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3073
Re: 複数の商品で共有している商品画像が商品削除のとき一緒に削除されてしまう。商品画像は残したい
確かにリンク先のソースには記述がありますね。
この記述を移植してくれば、ご要望の機能は実現できるのではないでしょうか?


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

Ahonda
投稿日時: 2021/4/19 11:34
対応状況: −−−
新米
登録日: 2021/4/14
居住地:
投稿: 4
Re: 複数の商品で共有している商品画像が商品削除のとき一緒に削除されてしまう。商品画像は残したい
コメントありがとうございます。

引用:

468さんは書きました:
確かにリンク先のソースには記述がありますね。
この記述を移植してくれば、ご要望の機能は実現できるのではないでしょうか?



当該削除処理に関連している2つのファイル(CsvImportController.php とProductController.php )をHistoryを参考に書き換えおよび差し替えを試してみましたが実現できず、またエラーも発生してしまいました。

1.commitされたNov 12, 2020のファイルで書き換え

https://github.com/EC-CUBE/ec-cube/commit/8b42ca6e5405e6f42c2adbf77fecde95e5a1e8fd#diff-c9f3c3acc432b420e3909db1f3a521ecdf21f3e951a981c785830ee7dbcfcb35

productImageRepositoryというものを追加し、そこに商品画像のファイル名を入れておいて、削除するときにFindで比較する処理のようです。

→実現できず画像は削除されたまま。さらに管理画面の「商品CSV登録」という項目が開けなくなるというエラーも発生。

2.4.1beta2に採用されているファイルに差し替え

→1と同様。

3.エラーログの確認

CsvImportController.phpファイルに書かれている__construct()というPublic関数は、追記したProductImageRepositoryのインスタンスでなければならないのに、キャッシュの中のgetCsvImportController2Service.phpファイルで呼ばれているものはそうなっていない、ということかと思います。(違うかな?)

getCsvImportController2Service.phpファイルの15行目ではいろいろなRepositoryが出てきますが、追記したproductImageRepositoryの記載がありません。getCsvImportController2Service.phpは自動生成されているので、おそらく別のところでこのgetCsvImportController2Service.phpファイルにproductImageRepositoryを書き込む必要があるのでしょう。

Cache/prodディレクトリの中には「・・・generator.php」という名前のファイルもあることから、generateする仕組みについて調べる必要がありそうです。ちょっと大変だ

「Eccube repository」とググると自動的に生成される仕組みがあるようですね。


以下、エラーログです。

[2021-04-19 10:52:15] admin.ERROR [a6321647] [c60cd5a] [1] [Eccube\Log\Logger:log:64] - システムエラーが発生しました。 ["Type error: Argument 6 passed to Eccube\\Controller\\Admin\\Product\\CsvImportController::__construct() must be an instance of Eccube\\Repository\\ProductImageRepository, instance of Eccube\\Repository\\Master\\ProductStatusRepository given, called in /var/www/html/var/cache/prod/ContainerRxfcexj/getCsvImportController2Service.php on line 15","/var/www/html/src/Eccube/Controller/Admin/Product/CsvImportController.php",126,"#0 /var/www/html/var/cache/prod/ContainerRxfcexj/getCsvImportController2Service.php(15): Eccube\\Controller\\Admin\\Product\\CsvImportController->__construct(Object(Eccube\\Repository\\DeliveryDurationRepository), Object(Eccube\\Repository\\Master\\SaleTypeRepository), Object(Eccube\\Repository\\TagRepository), Object(Eccube\\Repository\\CategoryRepository), Object(Eccube\\Repository\\ClassCategoryRepository), Object(Eccube\\Repository\\Master\\ProductStatusRepository), Object(Eccube\\Repository\\ProductRepository), Object(TaxRuleRepository_f7111db), Object(Eccube\\Repository\\BaseInfoRepository), Object(Symfony\\Component\\Validator\\Validator\\RecursiveValidator))\n#1 /var/www/html/var/cache/prod/ContainerRxfcexj/EccubeProdProjectContainer.php(2094): require('/var/www/html/v...')\n#2 /var/www/html/vendor/symfony/dependency-injection/Container.php(304): ContainerRxfcexj\\EccubeProdProjectContainer->load('getCsvImportCon...')\n#3 /var/www/html/vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php(96): Symfony\\Component\\DependencyInjection\\Container->get('Eccube\\\\Controll...')\n#4 /var/www/html/vendor/symfony/framework-bundle/Controller/ControllerResolver.php(57): Symfony\\Component\\HttpKernel\\Controller\\ContainerControllerResolver->instantiateController('Eccube\\\\Controll...')\n#5 /var/www/html/vendor/symfony/http-kernel/Controller/ControllerResolver.php(182): Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerResolver->instantiateController('Eccube\\\\Controll...')\n#6 /var/www/html/vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php(63): Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver->createController('Eccube\\\\Controll...')\n#7 /var/www/html/vendor/symfony/framework-bundle/Controller/ControllerResolver.php(43): Symfony\\Component\\HttpKernel\\Controller\\ContainerControllerResolver->createController('Eccube\\\\Controll...')\n#8 /var/www/html/vendor/symfony/http-kernel/Controller/ControllerResolver.php(89): Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerResolver->createController('Eccube\\\\Controll...')\n#9 /var/www/html/vendor/symfony/http-kernel/Controller/ContainerControllerResolver.php(41): Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver->getController(Object(Symfony\\Component\\HttpFoundation\\Request))\n#10 /var/www/html/vendor/symfony/http-kernel/HttpKernel.php(134): Symfony\\Component\\HttpKernel\\Controller\\ContainerControllerResolver->getController(Object(Symfony\\Component\\HttpFoundation\\Request))\n#11 /var/www/html/vendor/symfony/http-kernel/HttpKernel.php(68): Symfony\\Component\\HttpKernel\\HttpKernel->handleRaw(Object(Symfony\\Component\\HttpFoundation\\Request), 1)\n#12 /var/www/html/vendor/symfony/http-kernel/Kernel.php(200): Symfony\\Component\\HttpKernel\\HttpKernel->handle(Object(Symfony\\Component\\HttpFoundation\\Request), 1, true)\n#13 /var/www/html/index.php(76): Symfony\\Component\\HttpKernel\\Kernel->handle(Object(Symfony\\Component\\HttpFoundation\\Request))\n#14 {main}"] [GET,****]
468
投稿日時: 2021/4/19 18:24
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3073
Re: 複数の商品で共有している商品画像が商品削除のとき一緒に削除されてしまう。商品画像は残したい
例えばProductController.phpの550行目付近の
$fs = new Filesystem();
$fs->remove($this->eccubeConfig['eccube_save_image_dir'].'/'.$delete_image);


// 他に同じ画像を参照する商品がなければ画像ファイルを削除
if (!$this->productImageRepository->findOneBy(['file_name' => $delete_image])) {
    $fs = new Filesystem();
    $fs->remove($this->eccubeConfig['eccube_save_image_dir'].'/'.$delete_image);
}

のように判定を追加するだけでファイルの削除は実行されなくなるのではないかと思ったのですが如何でしょうか?

CsvImportController.phpのエラーはfunction __construct()の書き方を何か間違えているような気がします。
ファイル全体を流用するのではなく、一部のみ流用する形が問題の切り分けがしやすいかと思います。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

Ahonda
投稿日時: 2021/4/20 10:35
対応状況: −−−
新米
登録日: 2021/4/14
居住地:
投稿: 4
Re: 複数の商品で共有している商品画像が商品削除のとき一緒に削除されてしまう。商品画像は残したい
ご指示ありがとうございました。おかげで実現できました

引用:

468さんは書きました:
例えばProductController.phpの550行目付近の
$fs = new Filesystem();
$fs->remove($this->eccubeConfig['eccube_save_image_dir'].'/'.$delete_image);


// 他に同じ画像を参照する商品がなければ画像ファイルを削除
if (!$this->productImageRepository->findOneBy(['file_name' => $delete_image])) {
    $fs = new Filesystem();
    $fs->remove($this->eccubeConfig['eccube_save_image_dir'].'/'.$delete_image);
}

のように判定を追加するだけでファイルの削除は実行されなくなるのではないかと思ったのですが如何でしょうか?


ずっと誤解していたのですが、CsvImportController.phpとProductController.phpは切り分けることができないと思っていました。

どういうことかと言うと、GitHub上ではCsvImportController.phpとProductController.phpの2つが同時に修正されており、条件処理にでてくるproductImageRepositoryという変数?インスタンス?は、CsvImportController.phpの方で宣言のように追加されています。なので、2つは連動しているものと思いました。

後になって、productImageRepositoryはProductController.phpの方にも4.0.5版の段階ですでに宣言されていることを見つけ、それぞれ独立して動くとはずだと気づきました。

そこで、CsvImportController.phpは元のままで、ProductController.phpの条件処理のみ修正してテストし、結局、GitHubの4.0ブランチの修正版では機能せず(画像は消えてしまうがエラーにはならない)、4.1-beta2のバージョンをそのまま流用したところ実現できました。


引用:

CsvImportController.phpのエラーはfunction __construct()の書き方を何か間違えているような気がします。
ファイル全体を流用するのではなく、一部のみ流用する形が問題の切り分けがしやすいかと思います。


この部分は何度も見比べたり、diffで差分を取ったりしましたが、判明せず、最終的にファイルを4.1-beta2版にまるまる差し替えたところ機能しました。

ひょっとして原因はテキストエディタではないかと思い、4.0ブランチの8b42ca6e54という修正時点のRawファイルを取ってきて差し替えても同様のエラーログが出ました。

お付き合いいただきご指示いただけて本当に助かりました。ECCUBEの中身を見るのは初めてのため大変時間がかかりましたが、とても勉強になりました。ありがとうございます。

本田
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

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

統計情報

総メンバー数は73,047名です
総投稿数は102,095件です

投稿数ランキング

1
seasoft
7333
2
468
3073
3
AMUAMU
2712
4
nanasess
2174
5
umebius
2030
6
yuh
1612
7
red
1453
8
h_tanaka
1090
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.