EC-CUBE 最近見た商品を実装する(1)

■最近見た商品を実装する(クッキーを用いた閲覧履歴)

■処理の流れ

・サイトにアクセス
  ↓
・商品詳細画面へ遷移するとクッキーに商品IDを保管
  ↓
・商品一覧画面に遷移するとクッキーを参照して閲覧した商品を一覧する

■要件定義

・クッキーに保管する商品数は10件までとする
・11件目は一番古い閲覧商品を1つ削除して新しい商品をセットする
・クッキーの有効期間は3分とする
・商品画像がない場合はノーイメージ画像を代わりに表示

■実装手順

定義ファイルにて下記を追記
/html/define.php

define('COOKIE_TICKET', time()+180);  // クッキーの有効期間
define('PRODUCT_HISTORY_MAX', 10);   // 最大閲覧表示数

クッキーに商品IDを設定する処理を実装する
/data/class_extends/page_extends/products/LC_Page_Products_Detail_Ex.php

    /**
     * Page のプロセス.
     *
     * @return void
     */
    function process()
    {
        parent::process();
        
        $product_id = parent::lfCheckProductId($this->objFormParam->getValue('admin'), $this->objFormParam->getValue('product_id'));
        $this->setItemHistory($product_id);
        
    }

  /**
   * 閲覧履歴を設定(Cookie利用)
   */
  function setItemHistory($__id)
  {
    
    $obj_product = new SC_Product_Ex();
    $data = $obj_product->getDetail($__id);
    
    if(is_null($data['product_id']) !== true)
    {
      // 商品詳細ページが存在する場合はクッキーに商品IDを保管する
      $history = array();
      $cookie_count = count($_COOKIE['history']);
      
      if(is_null($_COOKIE['history']) !== true)
      {
        $history = $_COOKIE['history'];
      }
      
      
      if(in_array($data['product_id'], $history) === false)
      {
        if($cookie_count >= PRODUCT_HISTORY_MAX)
        {
          // クッキーの保管限度数を超えたら先頭のクッキーを削除
          array_shift($history);
        }
        
        // 現在閲覧している商品IDををセット
        $history[] = $data['product_id'];
        
        // 
        foreach($history as $key=>$id)
        {
          setcookie('history['.$key.']', $id, COOKIE_TICKET);
        }
      }
      else
      {
        // クッキーに既に登録されている場合は処理しない
      }
      
    }
    else
    {
      // データ未存在
    }
  }

クッキーにセットされた商品を表示する処理を実装する
/data/class_extends/page_extends/products/LC_Page_Products_List_Ex.php

    /**
     * Page のプロセス.
     *
     * @return void
     */
    function process()
    {
        $this->mode = $this->getMode();
        
        switch ($this->getMode()) {
            case 'json':
                break;
            default:
              // 閲覧履歴を取得
              $this->getItemHistory();
              break;
        }
        
        parent::process();
    }
  
  /**
   * クッキーに保管されている閲覧履歴を取得
   */
  function getItemHistory()
  {
    if(isset($_COOKIE['history']))
    {
      // 最近見た商品が上に来るように配列を逆にする
      $history = array_reverse($_COOKIE['history']);
      
      $obj_product = new SC_Product_Ex();
      
      foreach($history as $id)
      {
        // クッキーに保管された情報を元にデータを取得する
        $products = $obj_product->getDetail($id);
        
        if(is_null($products['product_id']) !== true)
        {
          // 存在したら商品情報をセット
          $this->arrItemHistory[] = $products;
        }
      }
    }
  }

ec_cube_041
管理画面→『デザイン管理』→『PC』→『ブロック設定』で【最近見た商品(itemhistory)】を作成する

<!--{section name=cnt loop=$arrItemHistory}-->
<div>
<img src="/upload/save_image/<!--{$arrItemHistory[cnt].main_list_image}-->" />
<!--{$arrItemHistory[cnt].product_id}-->
<!--{$arrItemHistory[cnt].name}-->
</div>
<!--{/section}-->

ec_cube_042
管理画面→『デザイン管理』→『PC』→『レイアウト設定』で『商品一覧ページ』の【レイアウト】の編集リンクをクリックする

ec_cube_043
好きな所に【最近見た商品】のブロックをドラッグして配置する

ec_cube_044
商品一覧画面に遷移して動作を確認する

一応、動作はするが閲覧履歴から再度その商品を見た際に順番の繰り上げが実装されていない

Comments are closed.