バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

バグ報告 > 管理機能 > チケット#2389「未登録のおすすめ商品の削除を行うと全商品が削除されたような表示となる」について

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
sumida
投稿日時: 2013/10/13 22:17
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
チケット#2389「未登録のおすすめ商品の削除を行うと全商品が削除されたような表示となる」について
直接の原因:
・「商品を選択する」で商品を選ぶ。
この段階で、HTML上
  おすすめ商品ID:なし
  商品ID:あり
  カテゴリID:0
  ランク:5
  コメント:なし
となっている。
また、DBには、登録されていない状態にある。

・「削除」を実行する。(DBに未登録のおすすめ商品を削除)
data/class/pages/admin/contents/LC_Page_Admin_Contents_Recommend.php

    public function lfInitParam(&$objFormParam)
    {
        $objFormParam->addParam('おすすめ商品ID', 'best_id', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('商品ID', 'product_id', INT_LEN, 'n', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('カテゴリID', 'category_id', INT_LEN, 'n', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('ランク', 'rank', INT_LEN, 'n', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('コメント', 'comment', LTEXT_LEN, 'KVa', array('EXIST_CHECK', 'MAX_LENGTH_CHECK'));
    }

になっており、この段階で、商品ID,コメントに対し、'EXIST_CHECK'でエラーになっている。

            case 'delete': // 商品を削除する。
                $this->arrErr = $this->lfCheckError($objFormParam);
                if (SC_Utils_Ex::isBlank($this->arrErr)) {
                    $this->deleteProduct($arrPost, $objRecommend);
                    $arrItems = $this->getRecommendProducts($objRecommend);
                }
                $this->tpl_onload = "window.alert('削除しました');";
                break;

この lfCheckError でエラーになっているにもかかわらず、「削除しました」となっている。
また、$arrItemsの読み直しが行われない。
そのため、他のおすすめ商品も表示されていないと思われる。

もし、lfCheckError のエラー条件を緩和し、回避させたとしても、
deleteProduct で、'best_id' がない(DBに未登録)場合、DBにアクセスしている。

    public function deleteProduct($arrPost, SC_Helper_BestProducts_Ex &$objRecommend)
    {
        if ($arrPost['best_id']) {
            $target = $arrPost['best_id'];
        } else {
            $recommend = $objRecommend->getByRank($arrPost['rank']);
            $target = $recommend['best_id'];
        }
        $objRecommend->deleteBestProducts($target);
    }

そのため、lfCheckError を実行しないようにする必要がある。

修正案
data/class/pages/admin/contents/LC_Page_Admin_Contents_Recommend.php

            case 'delete': // 商品を削除する。
// added
        if ($arrPost['best_id']) {
// added
                $this->arrErr = $this->lfCheckError($objFormParam);
                if (SC_Utils_Ex::isBlank($this->arrErr)) {
                    $this->deleteProduct($arrPost, $objRecommend);
                    $arrItems = $this->getRecommendProducts($objRecommend);
// added
                    $this->tpl_onload = "window.alert('削除しました');";
// added
                }
/* deleted
                $this->tpl_onload = "window.alert('削除しました');";
deleted */
// added
        } else {
            $arrItems = $this->getRecommendProducts($objRecommend);
            $this->tpl_onload = "window.alert('削除しました');";
        }
// added
                break;


さらに、並び替えの「上へ」「下へ」も、DBにアクセスしているので、
使用できないようにする必要がある。
(product_idは、存在するので、best_idで判断させる。)
data/Smarty/templates/admin/contents/recommend.tpl

                <td>
                    <!--{* 移動 *}-->
<!--{* changed
                    <!--{if $smarty.section.cnt.iteration != 1 && $arrItems[$smarty.section.cnt.iteration].product_id}-->
changed *}-->
                    <!--{if $smarty.section.cnt.iteration != 1 && $arrItems[$smarty.section.cnt.iteration].best_id}-->
<!-- {* changed *}-->
.
.
                    <!--{/if}-->
<!--{* changed
                    <!--{if $smarty.section.cnt.iteration != $tpl_disp_max && $arrItems[$smarty.section.cnt.iteration].product_id}-->
changed *}-->
                    <!--{if $smarty.section.cnt.iteration != $tpl_disp_max && $arrItems[$smarty.section.cnt.iteration].best_id}-->
<!-- {* changed *}-->
.
.


再検討事項として、
「商品を選択する」実行直後の場合は、「この内容で登録する」
既存のおすすめ商品の場合は、「この内容で登録する」という表現で良いのか否か。

追記:
「上へ」「下へ」について、動作する仕様として確定していない。
(例:おすすめ商品の1、2に登録していると仮定する)

(1)登録したおすすめ商品群の最後のおすすめ商品にある「下へ」を操作しても何も変化しない。
(例:おすすめ商品2の「下へ」を操作)

(2)「商品を選択する」直後に、「上へ」「下へ」を操作しても何も変化しない。
(例:おすすめ商品3で「商品を選択する」直後に、「下へ」を操作)

(3)おすすめ商品が飛び番号になっているところで、「商品を選択する」直後に、「下へ」を操作すると、画面からなくなる。
(例:おすすめ商品4を登録(この時点で、おすすめ商品の1、2、4が登録されている)し、おすすめ商品3で「商品を選択する」直後に、「下へ」を操作)
sumida
投稿日時: 2013/10/14 8:42
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
管理画面:おすすめ商品画面の仕様について
管理画面:おすすめ商品画面の仕様について検討してみました。

(1)「上へ」「下へ」

表示順位のある「支払方法」「配送方法」は、
「順位付けする画面」と「内容を登録する画面」とが別なので、
一覧表の最上段は、「上へ」の表示がなく、最下段は、「下へ」の表示がない。
「おすすめ商品」は、「順位付けする画面」と「内容を登録する画面」とが同じ画面にある。
そのため、内容を登録する段階で、順位付けを意識するようになる。
つまり、登録済みのおすすめ商品は、
「おすすめ商品(1)」〜「おすすめ商品(8)」の間を自由に移動したい。

(2)「商品を選択する」

商品を選択した直後は、画面上にあるだけで、DB上にはない。
そのため、「変更」「削除」「上へ」「下へ」が操作できるのは、「?」と思う。
(「商品を選択する」直後、「上へ」を実行すると、移動することなく、選択した商品がなくなる。)
むしろ、「選択の変更」「選択の取消」のような別の操作体系にし、
この部分は、クライアント側で実現したほうが、
サーバ側のclassファイルもすっきりすると思う。

(3)「削除」

おすすめ商品の中間位置にある商品を削除すると、以降のおすすめ商品のrankが繰り上がる。
(SC_Helper_DB.php:sfDeleteRankRecordで繰り上げ処理を行っている。)
そのため、表示は、常に前詰めされた表示になる。
しかし、おすすめ商品を跳んだ位置(おすすめ商品3までの時、おすすめ商品5)に登録しても、
おすすめ商品4は、空き地の状態である。
(1)も含めて仕様に、曖昧さが残る。


追記:
変に細工するより、他の画面同様に、
・画面上部を、「新規登録」「編集」領域とし、
・画面下部を、変更指示、「削除」「上へ」「下へ」の領域にする。
のもありかと思います。
この画面を触った時、第一印象は、「他の画面とは違う操作なんだ」と感じていました。
sumida
投稿日時: 2014/1/2 10:35
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: チケット#2389「未登録のおすすめ商品の削除を行うと全商品が削除されたような表示となる」について
このチケットについて、
チェンジセット23308
http://svn.ec-cube.net/open_trac/changeset/23308
で修正されていますが、

ロジック上、

$this->arrErr = $this->lfCheckError($objFormParam);

でエラーがあったとしても、
「削除しました。」を表示するのは問題があると思います。

また、最初に投稿したように、
「商品を選択する」の直後、関数 lfCheckError を実行することも、問題があると思います。
sumida
投稿日時: 2014/1/6 21:49
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: チケット#2389「未登録のおすすめ商品の削除を行うと全商品が削除されたような表示となる」について
しつこいようですが、コミッターの方の反応がないので、
再検討いただきたく。

このチケットに対し、再度修正が行われていますが、修正不十分と思いますので、
再度、投稿します。

現状の削除部分の処理では、
(1)おすすめ商品を選んだ直後の削除
(2)登録済みおすすめ商品の削除(エラーが発生する場合)
が同じ処理されている。
そのため、コメントに3000文字を超えて入力した状態で、「削除」を実行する。((2)のケース)

「削除しました。」と表示されながら、DBから削除されていない。
本来は、文字数が超えている旨のエラーメッセージを表示しないといけない。

(1),(2)を分けて処理しないといけない。(修正不十分とする根拠です。)



また、商品の登録の場合も似たような問題があり、
(3)おすすめ商品を選んだ直後の登録
(4)登録済みおすすめ商品の登録
コメントに3000文字を超えて入力した状態で、「この内容で登録する」を実行する。
「編集が完了しました。」と表示されながら、DBは、更新されていない。
本来は、文字数が超えている旨のエラーメッセージを表示しないといけない。

コメントエラーが発生した場合、現状とは異なる処理に修正しないといけない。
修正例:
data/class/pages/admin/contents/LC_Page_Admin_Contents_Recommend.php

            case 'regist': // 商品を登録する。
                $this->arrErr = $this->lfCheckError($objFormParam);
                // 登録処理にエラーがあった場合は商品選択の時と同じ処理を行う。
                if (SC_Utils_Ex::isBlank($this->arrErr)) {
                    $member_id = $_SESSION['member_id'];
                    $this->insertRecommendProduct($arrPost,$member_id,$objRecommend);
                    $arrItems = $this->getRecommendProducts($objRecommend);
// added
                    $this->tpl_onload = "window.alert('編集が完了しました');";
// added
                } else {
// added
                  $arrItems = $this->getRecommendProducts($objRecommend);
                  $rank = $arrPost['rank'];
                  $arrItems[$rank]['comment'] = $arrPost['comment'];;
                  if ($arrPost['best_id']) {
                  } else {
// added
                    $arrItems = $this->setProducts($arrPost, $arrItems);
                    $this->checkRank = $arrPost['rank'];
// added
                  }
// added
                }
/* deleted
                $this->tpl_onload = "window.alert('編集が完了しました');";
deleted */
                break;


なお、エラーメッセージ表示については、別にスレッドを立てました。
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=14056&forum=9&post_id=63090
nanasess
投稿日時: 2014/1/7 9:32
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2313
Re: チケット#2389「未登録のおすすめ商品の削除を行うと全商品が削除されたような表示となる」について
sumida 様、ありがとうございます。

とり急ぎ、チケットを差し戻しておきました。
http://svn.ec-cube.net/open_trac/ticket/2389#comment:8
sumida
投稿日時: 2014/1/7 21:17
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: チケット#2389「未登録のおすすめ商品の削除を行うと全商品が削除されたような表示となる」について
対応ありがとうございます。

ただ、おすすめ商品の登録は、lfCheckError を実行する必要がありますが、
削除では、lfCheckError を実行する必要があるのでしょうか。

今回は、コメントがエラーになるデータを用いましたが、
削除する場合、
・コメントの入力内容について無視しても良い。
・コメント以外の入力内容がエラーの場合、使用者の操作によるエラーではない。
  (EC-CUBE内の連携ミスによるエラー)
とすれば、lfCheckError を実行しなくても良いように思います。

            case 'delete': // 商品を削除する。
                if ($arrPost['best_id']) {
                    $this->deleteProduct($arrPost, $objRecommend);
                }
                $arrItems = $this->getRecommendProducts($objRecommend);
                $this->tpl_onload = "window.alert('削除しました');";
                break;

sumida
投稿日時: 2014/1/13 21:16
対応状況: 解決済
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: チケット#2389「未登録のおすすめ商品の削除を行うと全商品が削除されたような表示となる」について
「解決済」とさせていただきました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,704名です
総投稿数は109,948件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1638
8
red
1570
9
mcontact
1285
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

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

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