EC-CUBE【2.12】商品検索結果を任意の数値で並び変え

えー、色々と書きたいカスタマイズを施してきたんだけど、なかなか更新できず…。

今回の「EC-CUBEの商品検索結果を任意の数値で並び変える」のは、商品コードでとか更新順とかは結構あったんだけど、これはなかったんで、更新しておこうかなと。

では、早速。

Step.1

まず、データベースをいじくります。

「dtb_products 」に「sort_by(名前はなんでもOK)」を追加

step1_001

 

こんな感じで。

データベースはこれで終了

Step.2

お次は「LC_Page_Admin_Products_Product.php」の修正

場所↓
/data/class/pages/admin/products/LC_Page_Admin_Products_Product.php

「パラメーター情報の初期化」に以下を追加(「パラメーター情報の初期化」をメモ帳とかで検索するとラクだよ。)

$objFormParam->addParam('昇降順', 'sort_by', STEXT_LEN, 'n', array('NUM_CHECK', 'SPTAB_CHECK', 'MAX_LENGTH_CHECK'));

さらに、「配列の添字を定義」に以下を追加

$checkArray = array('name', 'status',
'main_list_comment', 'main_comment', 'freearea_1', 'freearea_2',
'deliv_fee', 'comment1', 'comment2', 'comment3',
'comment4', 'comment5', 'comment6', 'gedai', 'sort_by',

「freearea_1」とか「gedai」とかは、気にしんといて下さい。

最後に、そのすぐ下「INSERTする値を作成する。」に以下を追加

$sqlval['sort_by'] = $arrList['sort_by'];

これでこのファイルは完了

Step.3

お次は「SC_Product.php」の修正

場所↓
/data/class/SC_Product.php

これは1箇所。

「商品詳細の SQL を取得する」に以下追加

,dtb_products.sort_by

こんな感じで。

Step.4

「/data/Smarty/templates/admin/products/product.tpl」
「/data/Smarty/templates/admin/products/confirm.tpl」

この2つのファイルを修正。

これは、商品登録ページと確認ページ。

まず、商品登録ページ「product.tpl」

お好きな箇所に以下追加

<tr>
  <th>昇降順</th>
  <td>
    <span class="attention"><!--{$arrErr.sort_by}--></span>
    <input type="text" name="sort_by" value="<!--{$arrForm.sort_by|h}-->" maxlength="<!--{$smarty.const.STEXT_LEN}-->" style="<!--{if $arrErr.sort_by != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}-->;<!--{/if}-->" size="60" class="box60" />
  </td>
</tr>

商品確認ページ「confirm.tpl」

お好きな箇所に以下追加

<tr>
  <th>昇降順</th>
  <td><!--{$arrForm.sort_by|h}--></td>
</tr>

これで、昇降順の任意の数値を入力できるようになった。

ちなみにここまでは「http://blog.majili.com/creative/adds-an-item-to-the-product-information-on-ec-cube-2-12/」を参考にさせて頂いてます。
(数値を表に表示する必要がないので、このケースでは/data/Smarty/templates/default/products/detail.tplはさわらなくてOK)

Step.5

ここからは、商品一覧ページの編集

data/Smarty/templates/default/products/list.tpl

これを、

<!--▼ページナビ(本文)-->
<!--{capture name=page_navi_body}-->
    <div class="pagenumber_area clearfix">
        <div class="change">
            <!--{if $orderby != 'price'}-->
                <a href="javascript:fnChangeOrderby('price');">価格順</a>
            <!--{else}-->
                <strong>価格順</strong>
            <!--{/if}--> 
            <!--{if $orderby != "date"}-->
                    <a href="javascript:fnChangeOrderby('date');">新着順</a>
            <!--{else}-->
                <strong>新着順</strong>
            <!--{/if}-->

こうしちゃう↓

<!--▼ページナビ(本文)-->
<!--{capture name=page_navi_body}-->
    <div class="pagenumber_area clearfix">
        <div class="change">
            <!--{if $orderby != "sort_by"}-->
                    <a href="javascript:fnChangeOrderby('sort_by');">新着順</a>
            <!--{else}-->
                <strong>新着順</strong>
            <!--{/if}-->
            <!--{if $orderby != 'price'}-->
                <a href="javascript:fnChangeOrderby('price');">価格順</a>
            <!--{else}-->
                <strong>価格順</strong>
            <!--{/if}-->

これでOK

Step.6

これで、最後。

data/class/pages/products/LC_Page_Products_List.php

「表示順序」の「新着順」を以下に書き換え

// 新着順
case 'sort_by':
    $objProduct->setProductsOrder('sort_by', 'dtb_products', 'DESC');
    break;

最後の最後に、これをデフォルトにしたい場合、新着順の下にある「default」を以下に変更

default:
                if (strlen($searchCondition['where_category']) >= 1) {
                    $dtb_product_categories = '(SELECT * FROM dtb_product_categories WHERE '.$searchCondition['where_category'].')';
                    $arrOrderVal           = $searchCondition['arrvalCategory'];
                } else {
                    $dtb_product_categories = 'dtb_product_categories';
                }
                $order = <<< __EOS__
                    (
                        SELECT
                            T3.rank * 2147483648 + T2.rank
                        FROM
                            $dtb_product_categories T2
                            JOIN dtb_category T3
                              ON T2.category_id = T3.category_id
                        WHERE T2.product_id = alldtl.product_id
                        ORDER BY T3.rank DESC, T2.rank DESC
                        LIMIT 1
                    ) DESC
                    ,product_id DESC
__EOS__;
                    $objProduct->setProductsOrder('sort_by', 'dtb_products', 'DESC');
					$objQuery->setOrder($order);
                break;

下から3行目を追加しただけ。

これで、ほんとに終了。

ここまでは「http://webmage.pro/blog/archives/284」を参考にさせて頂きました。

これで、商品登録の際に昇降順に数値を入れて行けば、楽天のように(楽天とは逆だっけ!?)数値が大きい商品が上に表示されます。

ちなみに、今回は日付を入れて昇降順としているようです。

例)1309221147(2013年9月22日11時47分)

まぁ、やり方は各々で。

ちなみに、TIMESTAMPとかで、リアルに日付とかでできるのかなとかも思ったんだけど、楽天ライクにしたかったので、今回の感じになりました。

また、あまり専門知識はないので、探りながらの作業でしたので、おかしい所やもっといい改善点があれば、コメント頂ければと思います。

それでは。

コメント / トラックバック3件

  1. daishi より:

    お返事ありがとうございます。

    ユニフォームの件、了解です!ありがとうございます!

    何かあったらお気軽にメール下さい^^宜しくお願いします^^

  2. Daishi より:

    初めまして。
    エントリー違いで申し訳ないのですが、OKAフットボールの対応にムカつきまくって、ネットで《OKAフットボール 評判》で検索してたどり着きました。

    同じような方がいらっしゃって、少しホッとした部分もありました(自分だけに対してあの態度なのかと思いました。)

    とにかくやりとりが遅いし、言ってる事が的外れだしで本当にムカつきますよね!!!

    ちなみに、ユニフォームはどちらで制作されたのですか?当方も同じようにフットサルのユニフォームを制作したくて、業者さんをさがしております。もし良かったら教えて頂けませんか?

    サイトを拝見させて頂いてビックリしました!同じような趣味をおもちの用で、僕もDJしたりサイト制作したりしてます!w

    急にこんな話で申し訳ありません!失礼しました。

    • HARLEQUIN より:

      Daishiさん

      こんにちわ。
      コメントありがとうございます。

      結構、OKA絡みで訪れられる方が多いようで、何人か同じような事がありましたと連絡をいただいた事があります。

      そして、いまだにその腐りきった体制は変わらないようですね。

      「ウチには他に沢山客はいるんで、ひとりふたりくらいどうでもいい」といったような、商売の基本も分かっていない『自称超優良企業』なんでしょうね。

      さて、ユニフォームを作成した会社ですが、もう数年前になりますので、現在ではもっといい会社様があるかもしれません…。
      というのと、メールの履歴を見たのですが、メールが見当たらず…。

      力になれずすみません。

      少しあてがありますので、もし分かりましたらメールにて連絡と言う事でよろしいでしょうか?

      ところで、daishiさん。

      同じような趣味をお持ちの様で♪

      ちょっと、まだ言えないのですが、これから少し活動の幅を広げていくので、ブログをチェックしてくださいね。

      ブログもマメに更新していく予定なので。

コメントをどうぞ