Source for file SC_Helper_DB.php

Documentation is available at SC_Helper_DB.php

  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.lockon.co.jp/
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License
  11.  * as published by the Free Software Foundation; either version 2
  12.  * of the License, or (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  22.  */
  23.  
  24. /**
  25.  * DB関連のヘルパークラス.
  26.  *
  27.  * @package Helper
  28.  * @author LOCKON CO.,LTD.
  29.  * @version $Id:SC_Helper_DB.php 15532 2007-08-31 14:39:46Z nanasess $
  30.  */
  31. class SC_Helper_DB {
  32.  
  33.     // {{{ properties
  34.  
  35.     /** ルートカテゴリ取得フラグ */
  36.     var $g_root_on;
  37.  
  38.     /** ルートカテゴリID */
  39.     var $g_root_id;
  40.  
  41.     /** 選択中カテゴリ取得フラグ */
  42.     var $g_category_on;
  43.  
  44.     /** 選択中カテゴリID */
  45.     var $g_category_id;
  46.  
  47.     // }}}
  48.     // {{{ functions
  49.  
  50.     /**
  51.      * データベースのバージョンを所得する.
  52.      *
  53.      * @param string $dsn データソース名
  54.      * @return string データベースのバージョン
  55.      */
  56.     function sfGetDBVersion($dsn ""{
  57.         $dbFactory SC_DB_DBFactory_Ex::getInstance();
  58.         return $dbFactory->sfGetDBVersion($dsn);
  59.     }
  60.  
  61.     /**
  62.      * テーブルの存在をチェックする.
  63.      *
  64.      * @param string $table_name チェック対象のテーブル名
  65.      * @param string $dsn データソース名
  66.      * @return テーブルが存在する場合 true
  67.      */
  68.     function sfTabaleExists($table_name$dsn ""{
  69.         $dbFactory SC_DB_DBFactory_Ex::getInstance();
  70.         $dsn $dbFactory->getDSN($dsn);
  71.  
  72.         $objQuery new SC_Query($dsntruetrue);
  73.         // 正常に接続されている場合
  74.         if(!$objQuery->isError()) {
  75.             list($db_typesplit(":"$dsn);
  76.             $sql $dbFactory->getTableExistsSql();
  77.             $arrRet $objQuery->getAll($sqlarray($table_name));
  78.             if(count($arrRet0{
  79.                 return true;
  80.             }
  81.         }
  82.         return false;
  83.     }
  84.  
  85.     /**
  86.      * カラムの存在チェックと作成を行う.
  87.      *
  88.      * チェック対象のテーブルに, 該当のカラムが存在するかチェックする.
  89.      * 引数 $add が true の場合, 該当のカラムが存在しない場合は, カラムの生成を行う.
  90.      * カラムの生成も行う場合は, $col_type も必須となる.
  91.      *
  92.      * @param string $table_name テーブル名
  93.      * @param string $column_name カラム名
  94.      * @param string $col_type カラムのデータ型
  95.      * @param string $dsn データソース名
  96.      * @param bool $add カラムの作成も行う場合 true
  97.      * @return bool カラムが存在する場合とカラムの生成に成功した場合 true,
  98.      *                   テーブルが存在しない場合 false,
  99.      *                   引数 $add == false でカラムが存在しない場合 false
  100.      */
  101.     function sfColumnExists($table_name$col_name$col_type ""$dsn ""$add false{
  102.         $dbFactory SC_DB_DBFactory_Ex::getInstance();
  103.         $dsn $dbFactory->getDSN($dsn);
  104.  
  105.         // テーブルが無ければエラー
  106.         if(!$this->sfTabaleExists($table_name$dsn)) return false;
  107.  
  108.         $objQuery new SC_Query($dsntruetrue);
  109.         // 正常に接続されている場合
  110.         if(!$objQuery->isError()) {
  111.             list($db_typesplit(":"$dsn);
  112.  
  113.             // カラムリストを取得
  114.             $arrRet $dbFactory->sfGetColumnList($table_name);
  115.             if(count($arrRet0{
  116.                 if(in_array($col_name$arrRet)){
  117.                     return true;
  118.                 }
  119.             }
  120.         }
  121.  
  122.         // カラムを追加する
  123.         if($add){
  124.             $objQuery->query("ALTER TABLE $table_name ADD $col_name $col_type ");
  125.             return true;
  126.         }
  127.         return false;
  128.     }
  129.  
  130.     /**
  131.      * インデックスの存在チェックと作成を行う.
  132.      *
  133.      * チェック対象のテーブルに, 該当のインデックスが存在するかチェックする.
  134.      * 引数 $add が true の場合, 該当のインデックスが存在しない場合は, インデックスの生成を行う.
  135.      * インデックスの生成も行う場合で, DB_TYPE が mysql の場合は, $length も必須となる.
  136.      *
  137.      * @param string $table_name テーブル名
  138.      * @param string $column_name カラム名
  139.      * @param string $index_name インデックス名
  140.      * @param integer|string$length インデックスを作成するデータ長
  141.      * @param string $dsn データソース名
  142.      * @param bool $add インデックスの生成もする場合 true
  143.      * @return bool インデックスが存在する場合とインデックスの生成に成功した場合 true,
  144.      *                   テーブルが存在しない場合 false,
  145.      *                   引数 $add == false でインデックスが存在しない場合 false
  146.      */
  147.     function sfIndexExists($table_name$col_name$index_name$length ""$dsn ""$add false{
  148.         $dbFactory SC_DB_DBFactory_Ex::getInstance();
  149.         $dsn $dbFactory->getDSN($dsn);
  150.  
  151.         // テーブルが無ければエラー
  152.         if (!$this->sfTabaleExists($table_name$dsn)) return false;
  153.  
  154.         $objQuery new SC_Query($dsntruetrue);
  155.         $arrRet $dbFactory->getTableIndex($index_name$table_name);
  156.  
  157.         // すでにインデックスが存在する場合
  158.         if(count($arrRet0{
  159.             return true;
  160.         }
  161.  
  162.         // インデックスを作成する
  163.         if($add){
  164.             $dbFactory->createTableIndex($index_name$table_name$col_name$length());
  165.             return true;
  166.         }
  167.         return false;
  168.     }
  169.  
  170.     /**
  171.      * データの存在チェックを行う.
  172.      *
  173.      * @param string $table_name テーブル名
  174.      * @param string $where データを検索する WHERE 句
  175.      * @param string $dsn データソース名
  176.      * @param string $sql データの追加を行う場合の SQL文
  177.      * @param bool $add データの追加も行う場合 true
  178.      * @return bool データが存在する場合 true, データの追加に成功した場合 true,
  179.      *                $add == false で, データが存在しない場合 false
  180.      */
  181.     function sfDataExists($table_name$where$arrval$dsn ""$sql ""$add false{
  182.         $dbFactory SC_DB_DBFactory_Ex::getInstance();
  183.         $dsn $dbFactory->getDSN($dsn);
  184.  
  185.         $objQuery new SC_Query($dsntruetrue);
  186.         $count $objQuery->count($table_name$where$arrval);
  187.  
  188.         if($count 0{
  189.             $ret true;
  190.         else {
  191.             $ret false;
  192.         }
  193.         // データを追加する
  194.         if(!$ret && $add{
  195.             $objQuery->exec($sql);
  196.         }
  197.         return $ret;
  198.     }
  199.  
  200.     /**
  201.      * 店舗基本情報を取得する.
  202.      *
  203.      * @return array 店舗基本情報の配列
  204.      */
  205.     function sf_getBasisData({
  206.         $objQuery new SC_Query();
  207.         $arrRet $objQuery->select('*''dtb_baseinfo');
  208.  
  209.         if (isset($arrRet[0])) return $arrRet[0];
  210.  
  211.         return array();
  212.     }
  213.  
  214.     /* 選択中のアイテムのルートカテゴリIDを取得する */
  215.     function sfGetRootId({
  216.  
  217.         if(!$this->g_root_on)    {
  218.             $this->g_root_on = true;
  219.             $objQuery new SC_Query();
  220.  
  221.             if (!isset($_GET['product_id'])) $_GET['product_id'"";
  222.             if (!isset($_GET['category_id'])) $_GET['category_id'"";
  223.  
  224.             if(!empty($_GET['product_id']|| !empty($_GET['category_id'])) {
  225.                 // 選択中のカテゴリIDを判定する
  226.                 $category_id $this->sfGetCategoryId($_GET['product_id']$_GET['category_id']);
  227.                 // ROOTカテゴリIDの取得
  228.                 $arrRet $this->sfGetParents($objQuery'dtb_category''parent_category_id''category_id'$category_id);
  229.                 $root_id = isset($arrRet[0]$arrRet[0"";
  230.             else {
  231.                 // ROOTカテゴリIDをなしに設定する
  232.                 $root_id "";
  233.             }
  234.             $this->g_root_id = $root_id;
  235.         }
  236.         return $this->g_root_id;
  237.     }
  238.  
  239.     /**
  240.      * 商品規格情報を取得する.
  241.      *
  242.      * @param array $arrID 規格ID
  243.      * @return array 規格情報の配列
  244.      */
  245.     function sfGetProductsClass($arrID{
  246.         list($product_id$classcategory_id1$classcategory_id2$arrID;
  247.  
  248.         if($classcategory_id1 == ""{
  249.             $classcategory_id1 '0';
  250.         }
  251.         if($classcategory_id2 == ""{
  252.             $classcategory_id2 '0';
  253.         }
  254.  
  255.         // 商品規格取得
  256.         $objQuery new SC_Query();
  257.         $col "product_id, deliv_fee, name, product_code, main_list_image, main_image, price01, price02, point_rate, product_class_id, classcategory_id1, classcategory_id2, class_id1, class_id2, stock, stock_unlimited, sale_limit, sale_unlimited";
  258.         $table "vw_product_class AS prdcls";
  259.         $where "product_id = ? AND classcategory_id1 = ? AND classcategory_id2 = ?";
  260.         $objQuery->setorder("rank1 DESC, rank2 DESC");
  261.         $arrRet $objQuery->select($col$table$wherearray($product_id$classcategory_id1$classcategory_id2));
  262.         return $arrRet[0];
  263.     }
  264.  
  265.     /**
  266.      * 支払い方法を取得する.
  267.      *
  268.      * @return void 
  269.      */
  270.     function sfGetPayment({
  271.         $objQuery new SC_Query();
  272.         // 購入金額が条件額以下の項目を取得
  273.         $where "del_flg = 0";
  274.         $objQuery->setorder("fix, rank DESC");
  275.         $arrRet $objQuery->select("payment_id, payment_method, rule""dtb_payment"$where);
  276.         return $arrRet;
  277.     }
  278.  
  279.     /**
  280.      * カート内商品の集計処理を行う.
  281.      *
  282.      * @param LC_Page $objPage ページクラスのインスタンス
  283.      * @param SC_CartSession $objCartSess カートセッションのインスタンス
  284.      * @param array $arrInfo 商品情報の配列
  285.      * @return LC_Page 集計処理後のページクラスインスタンス
  286.      */
  287.     function sfTotalCart(&$objPage$objCartSess$arrInfo{
  288.  
  289.         // 規格名一覧
  290.         $arrClassName $this->sfGetIDValueList("dtb_class""class_id""name");
  291.         // 規格分類名一覧
  292.         $arrClassCatName $this->sfGetIDValueList("dtb_classcategory""classcategory_id""name");
  293.  
  294.         $objPage->tpl_total_pretax 0;        // 費用合計(税込み)
  295.         $objPage->tpl_total_tax 0;        // 消費税合計
  296.         $objPage->tpl_total_point 0;        // ポイント合計
  297.  
  298.         // カート内情報の取得
  299.         $arrQuantityInfo_by_product array();
  300.         $cnt 0;
  301.         foreach ($objCartSess->getCartList(as $arrCart{
  302.             // 商品規格情報の取得
  303.             $arrData $this->sfGetProductsClass($arrCart['id']);
  304.             $limit "";
  305.             // DBに存在する商品
  306.             if (count($arrData0{
  307.  
  308.                 // 購入制限数を求める。
  309.                 if ($arrData['stock_unlimited'!= '1' && $arrData['sale_unlimited'!= '1'{
  310.                     $limit min($arrData['sale_limit']$arrData['stock']);
  311.                 elseif ($arrData['sale_unlimited'!= '1'{
  312.                     $limit $arrData['sale_limit'];
  313.                 elseif ($arrData['stock_unlimited'!= '1'{
  314.                     $limit $arrData['stock'];
  315.                 }
  316.  
  317.                 if($limit != "" && $limit $arrCart['quantity']{
  318.                     // カート内商品数を制限に合わせる
  319.                     $objCartSess->setProductValue($arrCart['id']'quantity'$limit);
  320.                     $quantity $limit;
  321.                     $objPage->tpl_message "※「" $arrData['name'"」は販売制限(または在庫が不足)しております。一度にこれ以上の購入はできません。\n";
  322.                 else {
  323.                     $quantity $arrCart['quantity'];
  324.                 }
  325.                 
  326.                 // (商品規格単位でなく)商品単位での評価のための準備
  327.                 $product_id $arrCart['id'][0];
  328.                 $arrQuantityInfo_by_product[$product_id]['product_id'$product_id;
  329.                 $arrQuantityInfo_by_product[$product_id]['quantity'+= $quantity;
  330.                 $arrQuantityInfo_by_product[$product_id]['sale_unlimited'$arrData['sale_unlimited'];
  331.                 $arrQuantityInfo_by_product[$product_id]['sale_limit'$arrData['sale_limit'];
  332.                 
  333.                 $objPage->arrProductsClass[$cnt$arrData;
  334.                 $objPage->arrProductsClass[$cnt]['quantity'$quantity;
  335.                 $objPage->arrProductsClass[$cnt]['cart_no'$arrCart['cart_no'];
  336.                 $objPage->arrProductsClass[$cnt]['class_name1'=
  337.                     isset($arrClassName[$arrData['class_id1']])
  338.                         ? $arrClassName[$arrData['class_id1']] "";
  339.  
  340.                 $objPage->arrProductsClass[$cnt]['class_name2'=
  341.                     isset($arrClassName[$arrData['class_id2']])
  342.                         ? $arrClassName[$arrData['class_id2']] "";
  343.  
  344.                 $objPage->arrProductsClass[$cnt]['classcategory_name1'=
  345.                     $arrClassCatName[$arrData['classcategory_id1']];
  346.  
  347.                 $objPage->arrProductsClass[$cnt]['classcategory_name2'=
  348.                     $arrClassCatName[$arrData['classcategory_id2']];
  349.  
  350.                 // 画像サイズ
  351.                 $main_image_path IMAGE_SAVE_DIR basename($objPage->arrProductsClass[$cnt]["main_image"]);
  352.                 if(file_exists($main_image_path)) {
  353.                     list($image_width$image_heightgetimagesize($main_image_path);
  354.                 else {
  355.                     $image_width 0;
  356.                     $image_height 0;
  357.                 }
  358.  
  359.                 $objPage->arrProductsClass[$cnt]["tpl_image_width"$image_width 60;
  360.                 $objPage->arrProductsClass[$cnt]["tpl_image_height"$image_height 80;
  361.                 // 価格の登録
  362.                 if ($arrData['price02'!= ""{
  363.                     $objCartSess->setProductValue($arrCart['id']'price'$arrData['price02']);
  364.                     $objPage->arrProductsClass[$cnt]['uniq_price'$arrData['price02'];
  365.                 else {
  366.                     $objCartSess->setProductValue($arrCart['id']'price'$arrData['price01']);
  367.                     $objPage->arrProductsClass[$cnt]['uniq_price'$arrData['price01'];
  368.                 }
  369.                 // ポイント付与率の登録
  370.                 if (USE_POINT !== false{
  371.                     $objCartSess->setProductValue($arrCart['id']'point_rate'$arrData['point_rate']);
  372.                 }
  373.                 // 商品ごとの合計金額
  374.                 $objPage->arrProductsClass[$cnt]['total_pretax'$objCartSess->getProductTotal($arrInfo$arrCart['id']);
  375.                 // 送料の合計を計算する
  376.                 $objPage->tpl_total_deliv_fee+= ($arrData['deliv_fee'$arrCart['quantity']);
  377.                 $cnt++;
  378.             else {
  379.                 // DBに商品が見つからない場合はカート商品の削除
  380.                 $objCartSess->delProductKey('id'$arrCart['id']);
  381.             }
  382.         }
  383.         
  384.         foreach ($arrQuantityInfo_by_product as $QuantityInfo{
  385.             if($QuantityInfo['sale_unlimited'!= '1' && $QuantityInfo['sale_limit'!= '' && $QuantityInfo['sale_limit'$QuantityInfo['quantity']{
  386.                 // カート内商品数を制限に合わせる
  387.                 $objPage->tpl_error "※「" $arrData['name'"」は個数「{$QuantityInfo['sale_limit']}」以下に販売制限しております。一度にこれ以上の購入はできません。\n";
  388.                 foreach (array_keys($objPage->arrProductsClassas $key{
  389.                     $ProductsClass =$objPage->arrProductsClass[$key];
  390.                     $ProductsClass['error'true;
  391.                 }
  392.             }
  393.         }
  394.         
  395.         // 全商品合計金額(税込み)
  396.         $objPage->tpl_total_pretax $objCartSess->getAllProductsTotal($arrInfo);
  397.         // 全商品合計消費税
  398.         $objPage->tpl_total_tax $objCartSess->getAllProductsTax($arrInfo);
  399.         // 全商品合計ポイント
  400.         $objPage->tpl_total_point $objCartSess->getAllProductsPoint();
  401.  
  402.         return $objPage;
  403.     }
  404.  
  405.     /**
  406.      * 受注一時テーブルへの書き込み処理を行う.
  407.      *
  408.      * @param string $uniqid ユニークID
  409.      * @param array $sqlval SQLの値の配列
  410.      * @return void 
  411.      */
  412.     function sfRegistTempOrder($uniqid$sqlval{
  413.         if($uniqid != ""{
  414.             // 既存データのチェック
  415.             $objQuery new SC_Query();
  416.             $where "order_temp_id = ?";
  417.             $cnt $objQuery->count("dtb_order_temp"$wherearray($uniqid));
  418.             // 既存データがない場合
  419.             if ($cnt == 0{
  420.                 // 初回書き込み時に会員の登録済み情報を取り込む
  421.                 $sqlval $this->sfGetCustomerSqlVal($uniqid$sqlval);
  422.                 $sqlval['create_date'"now()";
  423.                 $objQuery->insert("dtb_order_temp"$sqlval);
  424.             else {
  425.                 $objQuery->update("dtb_order_temp"$sqlval$wherearray($uniqid));
  426.             }
  427.         }
  428.     }
  429.  
  430.     /**
  431.      * 会員情報から SQL文の値を生成する.
  432.      *
  433.      * @param string $uniqid ユニークID
  434.      * @param array $sqlval SQL の値の配列
  435.      * @return array 会員情報を含んだ SQL の値の配列
  436.      */
  437.     function sfGetCustomerSqlVal($uniqid$sqlval{
  438.         $objCustomer new SC_Customer();
  439.         // 会員情報登録処理
  440.         if ($objCustomer->isLoginSuccess(true)) {
  441.             // 登録データの作成
  442.             $sqlval['order_temp_id'$uniqid;
  443.             $sqlval['update_date''Now()';
  444.             $sqlval['customer_id'$objCustomer->getValue('customer_id');
  445.             $sqlval['order_name01'$objCustomer->getValue('name01');
  446.             $sqlval['order_name02'$objCustomer->getValue('name02');
  447.             $sqlval['order_kana01'$objCustomer->getValue('kana01');
  448.             $sqlval['order_kana02'$objCustomer->getValue('kana02');
  449.             $sqlval['order_sex'$objCustomer->getValue('sex');
  450.             $sqlval['order_zip01'$objCustomer->getValue('zip01');
  451.             $sqlval['order_zip02'$objCustomer->getValue('zip02');
  452.             $sqlval['order_pref'$objCustomer->getValue('pref');
  453.             $sqlval['order_addr01'$objCustomer->getValue('addr01');
  454.             $sqlval['order_addr02'$objCustomer->getValue('addr02');
  455.             $sqlval['order_tel01'$objCustomer->getValue('tel01');
  456.             $sqlval['order_tel02'$objCustomer->getValue('tel02');
  457.             $sqlval['order_tel03'$objCustomer->getValue('tel03');
  458.             if (defined('MOBILE_SITE')) {
  459.                 $email_mobile $objCustomer->getValue('email_mobile');
  460.                 if (empty($email_mobile)) {
  461.                     $sqlval['order_email'$objCustomer->getValue('email');
  462.                 else {
  463.                     $sqlval['order_email'$email_mobile;
  464.                 }
  465.             else {
  466.                 $sqlval['order_email'$objCustomer->getValue('email');
  467.             }
  468.             $sqlval['order_job'$objCustomer->getValue('job');
  469.             $sqlval['order_birth'$objCustomer->getValue('birth');
  470.         }
  471.         return $sqlval;
  472.     }
  473.  
  474.     /**
  475.      * 会員編集登録処理を行う.
  476.      *
  477.      * @param array $array パラメータの配列
  478.      * @param array $arrRegistColumn 登録するカラムの配列
  479.      * @return void 
  480.      */
  481.     function sfEditCustomerData($array$arrRegistColumn{
  482.         $objQuery new SC_Query();
  483.  
  484.         foreach ($arrRegistColumn as $data{
  485.             if ($data["column"!= "password"{
  486.                 if($array$data['column'] ] != ""{
  487.                     $arrRegist$data["column"] ] $array$data["column"] ];
  488.                 else {
  489.                     $arrRegist$data['column'] ] NULL;
  490.                 }
  491.             }
  492.         }
  493.         if (strlen($array["year"]&& strlen($array["month"]&& strlen($array["day"]0{
  494.             $arrRegist["birth"$array["year"."/"$array["month"."/"$array["day"." 00:00:00";
  495.         else {
  496.             $arrRegist["birth"NULL;
  497.         }
  498.  
  499.         //-- パスワードの更新がある場合は暗号化。(更新がない場合はUPDATE文を構成しない)
  500.         if ($array["password"!= DEFAULT_PASSWORD$arrRegist["password"sha1($array["password"":" AUTH_MAGIC);
  501.         $arrRegist["update_date""NOW()";
  502.  
  503.         //-- 編集登録実行
  504.         $objQuery->begin();
  505.         $objQuery->update("dtb_customer"$arrRegist"customer_id = ? "array($array['customer_id']));
  506.         $objQuery->commit();
  507.     }
  508.  
  509.     /**
  510.      * 受注番号、利用ポイント、加算ポイントから最終ポイントを取得する.
  511.      *
  512.      * @param integer $order_id 受注番号
  513.      * @param integer $use_point 利用ポイント
  514.      * @param integer $add_point 加算ポイント
  515.      * @return array 最終ポイントの配列
  516.      */
  517.     function sfGetCustomerPoint($order_id$use_point$add_point{
  518.         $objQuery new SC_Query();
  519.         $arrRet $objQuery->select("customer_id""dtb_order""order_id = ?"array($order_id));
  520.         $customer_id $arrRet[0]['customer_id'];
  521.         if($customer_id != "" && $customer_id >= 1{
  522.     if (USE_POINT !== false{
  523.             $arrRet $objQuery->select("point""dtb_customer""customer_id = ?"array($customer_id));
  524.             $point $arrRet[0]['point'];
  525.             $total_point $arrRet[0]['point'$use_point $add_point;
  526.     else {
  527.         $total_point 0;
  528.             $point 0;
  529.     }
  530.         else {
  531.             $total_point "";
  532.             $point "";
  533.         }
  534.         return array($point$total_point);
  535.     }
  536.  
  537.     /**
  538.      * カテゴリツリーの取得を行う.
  539.      *
  540.      * @param integer $parent_category_id 親カテゴリID
  541.      * @param bool $count_check 登録商品数のチェックを行う場合 true
  542.      * @return array カテゴリツリーの配列
  543.      */
  544.     function sfGetCatTree($parent_category_id$count_check false{
  545.         $objQuery new SC_Query();
  546.         $col "";
  547.         $col .= " cat.category_id,";
  548.         $col .= " cat.category_name,";
  549.         $col .= " cat.parent_category_id,";
  550.         $col .= " cat.level,";
  551.         $col .= " cat.rank,";
  552.         $col .= " cat.creator_id,";
  553.         $col .= " cat.create_date,";
  554.         $col .= " cat.update_date,";
  555.         $col .= " cat.del_flg, ";
  556.         $col .= " ttl.product_count";
  557.         $from "dtb_category as cat left join dtb_category_total_count as ttl on ttl.category_id = cat.category_id";
  558.         // 登録商品数のチェック
  559.         if($count_check{
  560.             $where "del_flg = 0 AND product_count > 0";
  561.         else {
  562.             $where "del_flg = 0";
  563.         }
  564.         $objQuery->setoption("ORDER BY rank DESC");
  565.         $arrRet $objQuery->select($col$from$where);
  566.  
  567.         $arrParentID $this->sfGetParents($objQuery'dtb_category''parent_category_id''category_id'$parent_category_id);
  568.  
  569.         foreach($arrRet as $key => $array{
  570.             foreach($arrParentID as $val{
  571.                 if($array['category_id'== $val{
  572.                     $arrRet[$key]['display'1;
  573.                     break;
  574.                 }
  575.             }
  576.         }
  577.  
  578.         return $arrRet;
  579.     }
  580.  
  581.     /**
  582.      * カテゴリツリーの取得を複数カテゴリーで行う.
  583.      *
  584.      * @param integer $product_id 商品ID
  585.      * @param bool $count_check 登録商品数のチェックを行う場合 true
  586.      * @return array カテゴリツリーの配列
  587.      */
  588.     function sfGetMultiCatTree($product_id$count_check false{
  589.         $objQuery new SC_Query();
  590.         $col "";
  591.         $col .= " cat.category_id,";
  592.         $col .= " cat.category_name,";
  593.         $col .= " cat.parent_category_id,";
  594.         $col .= " cat.level,";
  595.         $col .= " cat.rank,";
  596.         $col .= " cat.creator_id,";
  597.         $col .= " cat.create_date,";
  598.         $col .= " cat.update_date,";
  599.         $col .= " cat.del_flg, ";
  600.         $col .= " ttl.product_count";
  601.         $from "dtb_category as cat left join dtb_category_total_count as ttl on ttl.category_id = cat.category_id";
  602.         // 登録商品数のチェック
  603.         if($count_check{
  604.             $where "del_flg = 0 AND product_count > 0";
  605.         else {
  606.             $where "del_flg = 0";
  607.         }
  608.         $objQuery->setoption("ORDER BY rank DESC");
  609.         $arrRet $objQuery->select($col$from$where);
  610.  
  611.         $arrCategory_id $this->sfGetCategoryId($product_id$status);
  612.  
  613.         $arrCatTree array();
  614.         foreach ($arrCategory_id as $pkey => $parent_category_id{
  615.             $arrParentID $this->sfGetParents($objQuery'dtb_category''parent_category_id''category_id'$parent_category_id);
  616.  
  617.             foreach($arrParentID as $pid{
  618.                 foreach($arrRet as $key => $array{
  619.                     if($array['category_id'== $pid{
  620.                         $arrCatTree[$pkey][$arrRet[$key];
  621.                         break;
  622.                     }
  623.                 }
  624.             }
  625.         }
  626.  
  627.         return $arrCatTree;
  628.     }
  629.  
  630.     /**
  631.      * 親カテゴリーを連結した文字列を取得する.
  632.      *
  633.      * @param integer $category_id カテゴリID
  634.      * @return string 親カテゴリーを連結した文字列
  635.      */
  636.     function sfGetCatCombName($category_id){
  637.         // 商品が属するカテゴリIDを縦に取得
  638.         $objQuery new SC_Query();
  639.         $arrCatID $this->sfGetParents($objQuery"dtb_category""parent_category_id""category_id"$category_id);
  640.         $ConbName "";
  641.  
  642.         // カテゴリー名称を取得する
  643.         foreach($arrCatID as $key => $val){
  644.             $sql "SELECT category_name FROM dtb_category WHERE category_id = ?";
  645.             $arrVal array($val);
  646.             $CatName $objQuery->getOne($sql,$arrVal);
  647.             $ConbName .= $CatName ' | ';
  648.         }
  649.         // 最後の | をカットする
  650.         $ConbName substr_replace($ConbName""strlen($ConbName22);
  651.  
  652.         return $ConbName;
  653.     }
  654.  
  655.     /**
  656.      * 指定したカテゴリーIDのカテゴリーを取得する.
  657.      *
  658.      * @param integer $category_id カテゴリID
  659.      * @return array 指定したカテゴリーIDのカテゴリー
  660.      */
  661.     function sfGetCat($category_id){
  662.         $objQuery new SC_Query();
  663.  
  664.         // カテゴリーを取得する
  665.         $arrVal array($category_id);
  666.         $res $objQuery->select('category_id AS id, category_name AS name''dtb_category''category_id = ?'$arrVal);
  667.  
  668.         return $res[0];
  669.     }
  670.  
  671.     /**
  672.      * 指定したカテゴリーIDの大カテゴリーを取得する.
  673.      *
  674.      * @param integer $category_id カテゴリID
  675.      * @return array 指定したカテゴリーIDの大カテゴリー
  676.      */
  677.     function sfGetFirstCat($category_id){
  678.         // 商品が属するカテゴリIDを縦に取得
  679.         $objQuery new SC_Query();
  680.         $arrRet array();
  681.         $arrCatID $this->sfGetParents($objQuery"dtb_category""parent_category_id""category_id"$category_id);
  682.         $arrRet['id'$arrCatID[0];
  683.  
  684.         // カテゴリー名称を取得する
  685.         $sql "SELECT category_name FROM dtb_category WHERE category_id = ?";
  686.         $arrVal array($arrRet['id']);
  687.         $arrRet['name'$objQuery->getOne($sql,$arrVal);
  688.  
  689.         return $arrRet;
  690.     }
  691.  
  692.     /**
  693.      * カテゴリツリーの取得を行う.
  694.      *
  695.      * $products_check:true商品登録済みのものだけ取得する
  696.      *
  697.      * @param string $addwhere 追加する WHERE 句
  698.      * @param bool $products_check 商品の存在するカテゴリのみ取得する場合 true
  699.      * @param string $head カテゴリ名のプレフィックス文字列
  700.      * @return array カテゴリツリーの配列
  701.      */
  702.     function sfGetCategoryList($addwhere ""$products_check false$head CATEGORY_HEAD{
  703.         $objQuery new SC_Query();
  704.         $where "del_flg = 0";
  705.  
  706.         if($addwhere != ""{
  707.             $where.= " AND $addwhere";
  708.         }
  709.  
  710.         $objQuery->setoption("ORDER BY rank DESC");
  711.  
  712.         if($products_check{
  713.             $col "T1.category_id, category_name, level";
  714.             $from "dtb_category AS T1 LEFT JOIN dtb_category_total_count AS T2 ON T1.category_id = T2.category_id";
  715.             $where .= " AND product_count > 0";
  716.         else {
  717.             $col "category_id, category_name, level";
  718.             $from "dtb_category";
  719.         }
  720.  
  721.         $arrRet $objQuery->select($col$from$where);
  722.  
  723.         $max count($arrRet);
  724.         for($cnt 0$cnt $max$cnt++{
  725.             $id $arrRet[$cnt]['category_id'];
  726.             $name $arrRet[$cnt]['category_name'];
  727.             $arrList[$idstr_repeat($head$arrRet[$cnt]['level']$name;
  728.         }
  729.         return $arrList;
  730.     }
  731.  
  732.     /**
  733.      * カテゴリーツリーの取得を行う.
  734.      *
  735.      * 親カテゴリの Value=0 を対象とする
  736.      *
  737.      * @param bool $parent_zero 親カテゴリの Value=0 の場合 true
  738.      * @return array カテゴリツリーの配列
  739.      */
  740.     function sfGetLevelCatList($parent_zero true{
  741.         $objQuery new SC_Query();
  742.  
  743.         // カテゴリ名リストを取得
  744.         $col "category_id, parent_category_id, category_name";
  745.         $where "del_flg = 0";
  746.         $objQuery->setoption("ORDER BY level");
  747.         $arrRet $objQuery->select($col"dtb_category"$where);
  748.         $arrCatName array();
  749.         foreach ($arrRet as $arrTmp{
  750.             $arrCatName[$arrTmp['category_id']] =
  751.                 (($arrTmp['parent_category_id'0)?
  752.                     $arrCatName[$arrTmp['parent_category_id']] "")
  753.                 . CATEGORY_HEAD $arrTmp['category_name'];
  754.         }
  755.  
  756.         $col "category_id, parent_category_id, category_name, level";
  757.         $where "del_flg = 0";
  758.         $objQuery->setoption("ORDER BY rank DESC");
  759.         $arrRet $objQuery->select($col"dtb_category"$where);
  760.         $max count($arrRet);
  761.  
  762.         for($cnt 0$cnt $max$cnt++{
  763.             if($parent_zero{
  764.                 if($arrRet[$cnt]['level'== LEVEL_MAX{
  765.                     $arrValue[$cnt$arrRet[$cnt]['category_id'];
  766.                 else {
  767.                     $arrValue[$cnt"";
  768.                 }
  769.             else {
  770.                 $arrValue[$cnt$arrRet[$cnt]['category_id'];
  771.             }
  772.  
  773.             $arrOutput[$cnt$arrCatName[$arrRet[$cnt]['category_id']];
  774.         }
  775.  
  776.         return array($arrValue$arrOutput);
  777.     }
  778.  
  779.     /**
  780.      * 選択中の商品のカテゴリを取得する.
  781.      *
  782.      * @param integer $product_id プロダクトID
  783.      * @param integer $category_id カテゴリID
  784.      * @return array 選択中の商品のカテゴリIDの配列
  785.      *
  786.      */
  787.     function sfGetCategoryId($product_id$category_id 0$closed false{
  788.         if ($closed{
  789.             $status "";
  790.         else {
  791.             $status "status = 1";
  792.         }
  793.  
  794.         if(!$this->g_category_on{
  795.             $this->g_category_on = true;
  796.             $category_id = (int) $category_id;
  797.             $product_id = (int) $product_id;
  798.             if(SC_Utils_Ex::sfIsInt($category_id&& $this->sfIsRecord("dtb_category","category_id"$category_id)) {
  799.                 $this->g_category_id = array($category_id);
  800.             else if (SC_Utils_Ex::sfIsInt($product_id&& $this->sfIsRecord("dtb_products","product_id"$product_id$status)) {
  801.                 $objQuery new SC_Query();
  802.                 $where "product_id = ?";
  803.                 $category_id $objQuery->getCol("dtb_product_categories""category_id""product_id = ?"array($product_id));
  804.                 $this->g_category_id = $category_id;
  805.             else {
  806.                 // 不正な場合は、空の配列を返す。
  807.                 $this->g_category_id = array();
  808.             }
  809.         }
  810.         return $this->g_category_id;
  811.     }
  812.  
  813.     /**
  814.      * 商品をカテゴリの先頭に追加する.
  815.      *
  816.      * @param integer $category_id カテゴリID
  817.      * @param integer $product_id プロダクトID
  818.      * @return void 
  819.      */
  820.     function addProductBeforCategories($category_id$product_id{
  821.  
  822.         $sqlval array("category_id" => $category_id,
  823.                         "product_id" => $product_id);
  824.  
  825.         $objQuery new SC_Query();
  826.  
  827.         // 現在の商品カテゴリを取得
  828.         $arrCat $objQuery->select("product_id, category_id, rank",
  829.                                     "dtb_product_categories",
  830.                                     "category_id = ?",
  831.                                     array($category_id));
  832.  
  833.         $max "0";
  834.         foreach ($arrCat as $val{
  835.             // 同一商品が存在する場合は登録しない
  836.             if ($val["product_id"== $product_id{
  837.                 return;
  838.             }
  839.             // 最上位ランクを取得
  840.             $max ($max $val["rank"]$val["rank"$max;
  841.         }
  842.         $sqlval["rank"$max 1;
  843.         $objQuery->insert("dtb_product_categories"$sqlval);
  844.     }
  845.  
  846.     /**
  847.      * 商品をカテゴリの末尾に追加する.
  848.      *
  849.      * @param integer $category_id カテゴリID
  850.      * @param integer $product_id プロダクトID
  851.      * @return void 
  852.      */
  853.     function addProductAfterCategories($category_id$product_id{
  854.         $sqlval array("category_id" => $category_id,
  855.                         "product_id" => $product_id);
  856.  
  857.         $objQuery new SC_Query();
  858.  
  859.         // 現在の商品カテゴリを取得
  860.         $arrCat $objQuery->select("product_id, category_id, rank",
  861.                                     "dtb_product_categories",
  862.                                     "category_id = ?",
  863.                                     array($category_id));
  864.  
  865.         $min 0;
  866.         foreach ($arrCat as $val{
  867.             // 同一商品が存在する場合は登録しない
  868.             if ($val["product_id"== $product_id{
  869.                 return;
  870.             }
  871.             // 最下位ランクを取得
  872.             $min ($min $val["rank"]$val["rank"$min;
  873.         }
  874.         $sqlval["rank"$min;
  875.         $objQuery->insert("dtb_product_categories"$sqlval);
  876.     }
  877.  
  878.     /**
  879.      * 商品をカテゴリから削除する.
  880.      *
  881.      * @param integer $category_id カテゴリID
  882.      * @param integer $product_id プロダクトID
  883.      * @return void 
  884.      */
  885.     function removeProductByCategories($category_id$product_id{
  886.         $sqlval array("category_id" => $category_id,
  887.                         "product_id" => $product_id);
  888.         $objQuery new SC_Query();
  889.         $objQuery->delete("dtb_product_categories",
  890.                           "category_id = ? AND product_id = ?"$sqlval);
  891.     }
  892.  
  893.     /**
  894.      * 商品カテゴリを更新する.
  895.      *
  896.      * @param array $arrCategory_id 登録するカテゴリIDの配列
  897.      * @param integer $product_id プロダクトID
  898.      * @return void 
  899.      */
  900.     function updateProductCategories($arrCategory_id$product_id{
  901.         $objQuery new SC_Query();
  902.  
  903.         // 現在のカテゴリ情報を取得
  904.         $arrCurrentCat $objQuery->select("product_id, category_id, rank",
  905.                                            "dtb_product_categories",
  906.                                            "product_id = ?",
  907.                                            array($product_id));
  908.  
  909.         // 登録するカテゴリ情報と比較
  910.         foreach ($arrCurrentCat as $val{
  911.  
  912.             // 登録しないカテゴリを削除
  913.             if (!in_array($val["category_id"]$arrCategory_id)) {
  914.                 $this->removeProductByCategories($val["category_id"]$product_id);
  915.             }
  916.         }
  917.  
  918.         // カテゴリを登録
  919.         foreach ($arrCategory_id as $category_id{
  920.             $this->addProductBeforCategories($category_id$product_id);
  921.         }
  922.     }
  923.  
  924.     /**
  925.      * カテゴリ数の登録を行う.
  926.      *
  927.      * @param SC_Query $objQuery SC_Query インスタンス
  928.      * @return void 
  929.      */
  930.     function sfCategory_Count($objQuery){
  931.  
  932.         //テーブル内容の削除
  933.         $objQuery->query("DELETE FROM dtb_category_count");
  934.         $objQuery->query("DELETE FROM dtb_category_total_count");
  935.  
  936.         $sql_where .= 'alldtl.del_flg = 0 AND alldtl.status = 1';
  937.         // 在庫無し商品の非表示
  938.         if (NOSTOCK_HIDDEN === true{
  939.             $sql_where .= ' AND (alldtl.stock_max >= 1 OR alldtl.stock_unlimited_max = 1)';
  940.         }
  941.  
  942.         //各カテゴリ内の商品数を数えて格納
  943.         $sql = <<< __EOS__
  944.             INSERT INTO dtb_category_count(category_id, product_count, create_date)
  945.             SELECT T1.category_id, count(T2.category_id), now()
  946.             FROM dtb_category AS T1
  947.                 LEFT JOIN dtb_product_categories AS T2
  948.                     ON T1.category_id = T2.category_id
  949.                 LEFT JOIN vw_products_allclass_detail AS alldtl
  950.                     ON T2.product_id = alldtl.product_id
  951.             WHERE $sql_where
  952.             GROUP BY T1.category_id, T2.category_id
  953. __EOS__;
  954.         
  955.         $objQuery->query($sql);
  956.  
  957.         //子カテゴリ内の商品数を集計する
  958.         
  959.         // カテゴリ情報を取得
  960.         $arrCat $objQuery->select('category_id''dtb_category');
  961.         
  962.         foreach ($arrCat as $row{
  963.             $category_id $row['category_id'];
  964.             $arrval array();
  965.             
  966.             $arrval[$category_id;
  967.             
  968.             list($tmp_where$tmp_arrval$this->sfGetCatWhere($category_id);
  969.             if ($tmp_where != ""{
  970.                 $sql_where_product_ids "alldtl.product_id IN (SELECT product_id FROM dtb_product_categories WHERE " $tmp_where ")";
  971.                 $arrval array_merge((array)$arrval(array)$tmp_arrval);
  972.             else {
  973.                 $sql_where_product_ids '0<>0'// 一致させない
  974.             }
  975.             
  976.             $sql = <<< __EOS__
  977.                 INSERT INTO dtb_category_total_count (category_id, product_count, create_date)
  978.                 SELECT
  979.                     ?
  980.                     ,count(*)
  981.                     ,now()
  982.                 FROM vw_products_allclass_detail AS alldtl
  983.                 WHERE ($sql_where) AND ($sql_where_product_ids)
  984. __EOS__;
  985.             
  986.             $objQuery->query($sql$arrval);
  987.         }
  988.     }
  989.  
  990.     /**
  991.      * 子IDの配列を返す.
  992.      *
  993.      * @param string $table テーブル名
  994.      * @param string $pid_name 親ID名
  995.      * @param string $id_name ID名
  996.      * @param integer $id ID
  997.      * @param array 子ID の配列
  998.      */
  999.     function sfGetChildsID($table$pid_name$id_name$id{
  1000.         $arrRet $this->sfGetChildrenArray($table$pid_name$id_name$id);
  1001.         return $arrRet;
  1002.     }
  1003.  
  1004.     /**
  1005.      * 階層構造のテーブルから子ID配列を取得する.
  1006.      *
  1007.      * @param string $table テーブル名
  1008.      * @param string $pid_name 親ID名
  1009.      * @param string $id_name ID名
  1010.      * @param integer $id ID番号
  1011.      * @return array 子IDの配列
  1012.      */
  1013.     function sfGetChildrenArray($table$pid_name$id_name$id{
  1014.         $objQuery new SC_Query();
  1015.         $col $pid_name "," $id_name;
  1016.          $arrData $objQuery->select($col$table);
  1017.  
  1018.         $arrPID array();
  1019.         $arrPID[$id;
  1020.         $arrChildren array();
  1021.         $arrChildren[$id;
  1022.  
  1023.         $arrRet $this->sfGetChildrenArraySub($arrData$pid_name$id_name$arrPID);
  1024.  
  1025.         while(count($arrRet0{
  1026.             $arrChildren array_merge($arrChildren$arrRet);
  1027.             $arrRet $this->sfGetChildrenArraySub($arrData$pid_name$id_name$arrRet);
  1028.         }
  1029.  
  1030.         return $arrChildren;
  1031.     }
  1032.  
  1033.     /**
  1034.      * 親ID直下の子IDをすべて取得する.
  1035.      *
  1036.      * @param array $arrData 親カテゴリの配列
  1037.      * @param string $pid_name 親ID名
  1038.      * @param string $id_name ID名
  1039.      * @param array $arrPID 親IDの配列
  1040.      * @return array 子IDの配列
  1041.      */
  1042.     function sfGetChildrenArraySub($arrData$pid_name$id_name$arrPID{
  1043.         $arrChildren array();
  1044.         $max count($arrData);
  1045.  
  1046.         for($i 0$i $max$i++{
  1047.             foreach($arrPID as $val{
  1048.                 if($arrData[$i][$pid_name== $val{
  1049.                     $arrChildren[$arrData[$i][$id_name];
  1050.                 }
  1051.             }
  1052.         }
  1053.         return $arrChildren;
  1054.     }
  1055.  
  1056.     /**
  1057.      * 所属するすべての階層の親IDを配列で返す.
  1058.      *
  1059.      * @param SC_Query $objQuery SC_Query インスタンス
  1060.      * @param string $table テーブル名
  1061.      * @param string $pid_name 親ID名
  1062.      * @param string $id_name ID名
  1063.      * @param integer $id ID
  1064.      * @return array 親IDの配列
  1065.      */
  1066.     function sfGetParents($objQuery$table$pid_name$id_name$id{
  1067.         $arrRet $this->sfGetParentsArray($table$pid_name$id_name$id);
  1068.         // 配列の先頭1つを削除する。
  1069.         array_shift($arrRet);
  1070.         return $arrRet;
  1071.     }
  1072.  
  1073.     /**
  1074.      * 階層構造のテーブルから親ID配列を取得する.
  1075.      *
  1076.      * @param string $table テーブル名
  1077.      * @param string $pid_name 親ID名
  1078.      * @param string $id_name ID名
  1079.      * @param integer $id ID
  1080.      * @return array 親IDの配列
  1081.      */
  1082.     function sfGetParentsArray($table$pid_name$id_name$id{
  1083.         $objQuery new SC_Query();
  1084.         $col $pid_name "," $id_name;
  1085.         $arrData $objQuery->select($col$table);
  1086.  
  1087.         $arrParents array();
  1088.         $arrParents[$id;
  1089.         $child $id;
  1090.  
  1091.         $ret SC_Utils::sfGetParentsArraySub($arrData$pid_name$id_name$child);
  1092.  
  1093.         while($ret != ""{
  1094.             $arrParents[$ret;
  1095.             $ret SC_Utils::sfGetParentsArraySub($arrData$pid_name$id_name$ret);
  1096.         }
  1097.  
  1098.         $arrParents array_reverse($arrParents);
  1099.  
  1100.         return $arrParents;
  1101.     }
  1102.  
  1103.     /**
  1104.      * カテゴリから商品を検索する場合のWHERE文と値を返す.
  1105.      *
  1106.      * @param integer $category_id カテゴリID
  1107.      * @return array 商品を検索する場合の配列
  1108.      */
  1109.     function sfGetCatWhere($category_id{
  1110.         // 子カテゴリIDの取得
  1111.         $arrRet $this->sfGetChildsID("dtb_category""parent_category_id""category_id"$category_id);
  1112.         $tmp_where "";
  1113.         foreach ($arrRet as $val{
  1114.             if($tmp_where == ""{
  1115.                 $tmp_where.= " category_id IN ( ?";
  1116.             else {
  1117.                 $tmp_where.= ",? ";
  1118.             }
  1119.             $arrval[$val;
  1120.         }
  1121.         $tmp_where.= " ) ";
  1122.         return array($tmp_where$arrval);
  1123.     }
  1124.  
  1125.     /**
  1126.      * 受注一時テーブルから情報を取得する.
  1127.      *
  1128.      * @param integer $order_temp_id 受注一時ID
  1129.      * @return array 受注一時情報の配列
  1130.      */
  1131.     function sfGetOrderTemp($order_temp_id{
  1132.         $objQuery new SC_Query();
  1133.         $where "order_temp_id = ?";
  1134.         $arrRet $objQuery->select("*""dtb_order_temp"$wherearray($order_temp_id));
  1135.         return $arrRet[0];
  1136.     }
  1137.  
  1138.     /**
  1139.      * SELECTボックス用リストを作成する.
  1140.      *
  1141.      * @param string $table テーブル名
  1142.      * @param string $keyname プライマリーキーのカラム名
  1143.      * @param string $valname データ内容のカラム名
  1144.      * @return array SELECT ボックス用リストの配列
  1145.      */
  1146.     function sfGetIDValueList($table$keyname$valname{
  1147.         $objQuery new SC_Query();
  1148.         $col "$keyname$valname";
  1149.         $objQuery->setwhere("del_flg = 0");
  1150.         $objQuery->setorder("rank DESC");
  1151.         $arrList $objQuery->select($col$table);
  1152.         $count count($arrList);
  1153.         for($cnt 0$cnt $count$cnt++{
  1154.             $key $arrList[$cnt][$keyname];
  1155.             $val $arrList[$cnt][$valname];
  1156.             $arrRet[$key$val;
  1157.         }
  1158.         return $arrRet;
  1159.     }
  1160.  
  1161.     /**
  1162.      * ランキングを上げる.
  1163.      *
  1164.      * @param string $table テーブル名
  1165.      * @param string $colname カラム名
  1166.      * @param string|integer$id テーブルのキー
  1167.      * @param string $andwhere SQL の AND 条件である WHERE 句
  1168.      * @return void 
  1169.      */
  1170.     function sfRankUp($table$colname$id$andwhere ""{
  1171.         $objQuery new SC_Query();
  1172.         $objQuery->begin();
  1173.         $where "$colname = ?";
  1174.         if($andwhere != ""{
  1175.             $where.= " AND $andwhere";
  1176.         }
  1177.         // 対象項目のランクを取得
  1178.         $rank $objQuery->get($table"rank"$wherearray($id));
  1179.         // ランクの最大値を取得
  1180.         $maxrank $objQuery->max($table"rank"$andwhere);
  1181.         // ランクが最大値よりも小さい場合に実行する。
  1182.         if($rank $maxrank{
  1183.             // ランクが一つ上のIDを取得する。
  1184.             $where "rank = ?";
  1185.             if($andwhere != ""{
  1186.                 $where.= " AND $andwhere";
  1187.             }
  1188.             $uprank $rank 1;
  1189.             $up_id $objQuery->get($table$colname$wherearray($uprank));
  1190.             // ランク入れ替えの実行
  1191.             $sqlup "UPDATE $table SET rank = ? WHERE $colname = ?";
  1192.             if($andwhere != ""{
  1193.                 $sqlup.= " AND $andwhere";
  1194.             }
  1195.             $objQuery->exec($sqluparray($rank 1$id));
  1196.             $objQuery->exec($sqluparray($rank$up_id));
  1197.         }
  1198.         $objQuery->commit();
  1199.     }
  1200.  
  1201.     /**
  1202.      * ランキングを下げる.
  1203.      *
  1204.      * @param string $table テーブル名
  1205.      * @param string $colname カラム名
  1206.      * @param string|integer$id テーブルのキー
  1207.      * @param string $andwhere SQL の AND 条件である WHERE 句
  1208.      * @return void 
  1209.      */
  1210.     function sfRankDown($table$colname$id$andwhere ""{
  1211.         $objQuery new SC_Query();
  1212.         $objQuery->begin();
  1213.         $where "$colname = ?";
  1214.         if($andwhere != ""{
  1215.             $where.= " AND $andwhere";
  1216.         }
  1217.         // 対象項目のランクを取得
  1218.         $rank $objQuery->get($table"rank"$wherearray($id));
  1219.  
  1220.         // ランクが1(最小値)よりも大きい場合に実行する。
  1221.         if($rank 1{
  1222.             // ランクが一つ下のIDを取得する。
  1223.             $where "rank = ?";
  1224.             if($andwhere != ""{
  1225.                 $where.= " AND $andwhere";
  1226.             }
  1227.             $downrank $rank 1;
  1228.             $down_id $objQuery->get($table$colname$wherearray($downrank));
  1229.             // ランク入れ替えの実行
  1230.             $sqlup "UPDATE $table SET rank = ? WHERE $colname = ?";
  1231.             if($andwhere != ""{
  1232.                 $sqlup.= " AND $andwhere";
  1233.             }
  1234.             $objQuery->exec($sqluparray($rank 1$id));
  1235.             $objQuery->exec($sqluparray($rank$down_id));
  1236.         }
  1237.         $objQuery->commit();
  1238.     }
  1239.  
  1240.     /**
  1241.      * 指定順位へ移動する.
  1242.      *
  1243.      * @param string $tableName テーブル名
  1244.      * @param string $keyIdColumn キーを保持するカラム名
  1245.      * @param string|integer$keyId キーの値
  1246.      * @param integer $pos 指定順位
  1247.      * @param string $where SQL の AND 条件である WHERE 句
  1248.      * @return void 
  1249.      */
  1250.     function sfMoveRank($tableName$keyIdColumn$keyId$pos$where ""{
  1251.         $objQuery new SC_Query();
  1252.         $objQuery->begin();
  1253.  
  1254.         // 自身のランクを取得する
  1255.         $rank $objQuery->get($tableName"rank""$keyIdColumn = ?"array($keyId));
  1256.  
  1257.         $max $objQuery->max($tableName"rank"$where);
  1258.  
  1259.         // 値の調整(逆順)
  1260.         if($pos $max{
  1261.             $position 1;
  1262.         else if($pos 1{
  1263.             $position $max;
  1264.         else {
  1265.             $position $max $pos 1;
  1266.         }
  1267.  
  1268.         //入れ替え先の順位が入れ換え元の順位より大きい場合
  1269.         if$position $rank $term "rank - 1";
  1270.  
  1271.         //入れ替え先の順位が入れ換え元の順位より小さい場合
  1272.         if$position $rank $term "rank + 1";
  1273.  
  1274.         // XXX 入れ替え先の順位が入れ替え元の順位と同じ場合
  1275.         if (!isset($term)) $term "rank";
  1276.  
  1277.         // 指定した順位の商品から移動させる商品までのrankを1つずらす
  1278.         $sql "UPDATE $tableName SET rank = $term WHERE rank BETWEEN ? AND ?";
  1279.         if($where != ""{
  1280.             $sql.= " AND $where";
  1281.         }
  1282.  
  1283.         if$position $rank $objQuery->exec$sqlarray$rank 1$position ));
  1284.         if$position $rank $objQuery->exec$sqlarray$position$rank ));
  1285.  
  1286.         // 指定した順位へrankを書き換える。
  1287.         $sql  "UPDATE $tableName SET rank = ? WHERE $keyIdColumn = ? ";
  1288.         if($where != ""{
  1289.             $sql.= " AND $where";
  1290.         }
  1291.  
  1292.         $objQuery->exec$sqlarray$position$keyId ) );
  1293.         $objQuery->commit();
  1294.     }
  1295.  
  1296.     /**
  1297.      * ランクを含むレコードを削除する.
  1298.      *
  1299.      * レコードごと削除する場合は、$deleteをtrueにする
  1300.      *
  1301.      * @param string $table テーブル名
  1302.      * @param string $colname カラム名
  1303.      * @param string|integer$id テーブルのキー
  1304.      * @param string $andwhere SQL の AND 条件である WHERE 句
  1305.      * @param bool $delete レコードごと削除する場合 true,
  1306.      *                      レコードごと削除しない場合 false
  1307.      * @return void 
  1308.      */
  1309.     function sfDeleteRankRecord($table$colname$id$andwhere "",
  1310.                                 $delete false{
  1311.         $objQuery new SC_Query();
  1312.         $objQuery->begin();
  1313.         // 削除レコードのランクを取得する。
  1314.         $where "$colname = ?";
  1315.         if($andwhere != ""{
  1316.             $where.= " AND $andwhere";
  1317.         }
  1318.         $rank $objQuery->get($table"rank"$wherearray($id));
  1319.  
  1320.         if(!$delete{
  1321.             // ランクを最下位にする、DELフラグON
  1322.             $sqlup "UPDATE $table SET rank = 0, del_flg = 1 ";
  1323.             $sqlup.= "WHERE $colname = ?";
  1324.             // UPDATEの実行
  1325.             $objQuery->exec($sqluparray($id));
  1326.         else {
  1327.             $objQuery->delete($table"$colname = ?"array($id));
  1328.         }
  1329.  
  1330.         // 追加レコードのランクより上のレコードを一つずらす。
  1331.         $where "rank > ?";
  1332.         if($andwhere != ""{
  1333.             $where.= " AND $andwhere";
  1334.         }
  1335.         $sqlup "UPDATE $table SET rank = (rank - 1) WHERE $where";
  1336.         $objQuery->exec($sqluparray($rank));
  1337.         $objQuery->commit();
  1338.     }
  1339.  
  1340.     /**
  1341.      * 親IDの配列を元に特定のカラムを取得する.
  1342.      *
  1343.      * @param SC_Query $objQuery SC_Query インスタンス
  1344.      * @param string $table テーブル名
  1345.      * @param string $id_name ID名
  1346.      * @param string $col_name カラム名
  1347.      * @param array $arrId IDの配列
  1348.      * @return array 特定のカラムの配列
  1349.      */
  1350.     function sfGetParentsCol($objQuery$table$id_name$col_name$arrId {
  1351.         $col $col_name;
  1352.         $len count($arrId);
  1353.         $where "";
  1354.  
  1355.         for($cnt 0$cnt $len$cnt++{
  1356.             if($where == ""{
  1357.                 $where "$id_name = ?";
  1358.             else {
  1359.                 $where.= " OR $id_name = ?";
  1360.             }
  1361.         }
  1362.  
  1363.         $objQuery->setorder("level");
  1364.         $arrRet $objQuery->select($col$table$where$arrId);
  1365.         return $arrRet;
  1366.     }
  1367.  
  1368.     /**
  1369.      * カテゴリ変更時の移動処理を行う.
  1370.      *
  1371.      * @param SC_Query $objQuery SC_Query インスタンス
  1372.      * @param string $table テーブル名
  1373.      * @param string $id_name ID名
  1374.      * @param string $cat_name カテゴリ名
  1375.      * @param integer $old_catid 旧カテゴリID
  1376.      * @param integer $new_catid 新カテゴリID
  1377.      * @param integer $id ID
  1378.      * @return void 
  1379.      */
  1380.     function sfMoveCatRank($objQuery$table$id_name$cat_name$old_catid$new_catid$id{
  1381.         if ($old_catid == $new_catid{
  1382.             return;
  1383.         }
  1384.         // 旧カテゴリでのランク削除処理
  1385.         // 移動レコードのランクを取得する。
  1386.         $where "$id_name = ?";
  1387.         $rank $objQuery->get($table"rank"$wherearray($id));
  1388.         // 削除レコードのランクより上のレコードを一つ下にずらす。
  1389.         $where "rank > ? AND $cat_name = ?";
  1390.         $sqlup "UPDATE $table SET rank = (rank - 1) WHERE $where";
  1391.         $objQuery->exec($sqluparray($rank$old_catid));
  1392.         // 新カテゴリでの登録処理
  1393.         // 新カテゴリの最大ランクを取得する。
  1394.         $max_rank $objQuery->max($table"rank""$cat_name = ?"array($new_catid)) 1;
  1395.         $where "$id_name = ?";
  1396.         $sqlup "UPDATE $table SET rank = ? WHERE $where";
  1397.         $objQuery->exec($sqluparray($max_rank$id));
  1398.     }
  1399.  
  1400.     /**
  1401.      * 配送時間を取得する.
  1402.      *
  1403.      * @param integer $payment_id 支払い方法ID
  1404.      * @return array 配送時間の配列
  1405.      */
  1406.     function sfGetDelivTime($payment_id ""{
  1407.         $objQuery new SC_Query();
  1408.  
  1409.         $deliv_id "";
  1410.         $arrRet array();
  1411.  
  1412.         if($payment_id != ""{
  1413.             $where "del_flg = 0 AND payment_id = ?";
  1414.             $arrRet $objQuery->select("deliv_id""dtb_payment"$wherearray($payment_id));
  1415.             $deliv_id $arrRet[0]['deliv_id'];
  1416.         }
  1417.  
  1418.         if($deliv_id != ""{
  1419.             $objQuery->setorder("time_id");
  1420.             $where "deliv_id = ?";
  1421.             $arrRet$objQuery->select("time_id, deliv_time""dtb_delivtime"$wherearray($deliv_id));
  1422.         }
  1423.  
  1424.         return $arrRet;
  1425.     }
  1426.  
  1427.     /**
  1428.      * 都道府県、支払い方法から配送料金を取得する.
  1429.      *
  1430.      * @param integer $pref 都道府県ID
  1431.      * @param integer $payment_id 支払い方法ID
  1432.      * @return string 指定の都道府県, 支払い方法の配送料金
  1433.      */
  1434.     function sfGetDelivFee($arrData{
  1435.         $pref $arrData['deliv_pref'];
  1436.         $payment_id = isset($arrData['payment_id']$arrData['payment_id'"";
  1437.  
  1438.         $objQuery new SC_Query();
  1439.  
  1440.         $deliv_id "";
  1441.  
  1442.         // 支払い方法が指定されている場合は、対応した配送業者を取得する
  1443.         if($payment_id != ""{
  1444.             $where "del_flg = 0 AND payment_id = ?";
  1445.             $arrRet $objQuery->select("deliv_id""dtb_payment"$wherearray($payment_id));
  1446.             $deliv_id $arrRet[0]['deliv_id'];
  1447.         // 支払い方法が指定されていない場合は、先頭の配送業者を取得する
  1448.         else {
  1449.             $where "del_flg = 0";
  1450.             $objQuery->setOrder("rank DESC");
  1451.             $objQuery->setLimitOffset(1);
  1452.             $arrRet $objQuery->select("deliv_id""dtb_deliv"$where);
  1453.             $deliv_id $arrRet[0]['deliv_id'];
  1454.         }
  1455.  
  1456.         // 配送業者から配送料を取得
  1457.         if($deliv_id != ""{
  1458.  
  1459.             // 都道府県が指定されていない場合は、東京都の番号を指定しておく
  1460.             if($pref == ""{
  1461.                 $pref 13;
  1462.             }
  1463.  
  1464.             $objQuery new SC_Query();
  1465.             $where "deliv_id = ? AND pref = ?";
  1466.             $arrRet$objQuery->select("fee""dtb_delivfee"$wherearray($deliv_id$pref));
  1467.         }
  1468.         return $arrRet[0]['fee'];
  1469.     }
  1470.  
  1471.     /**
  1472.      * 集計情報を元に最終計算を行う.
  1473.      *
  1474.      * @param array $arrData 各種情報
  1475.      * @param LC_Page $objPage LC_Page インスタンス
  1476.      * @param SC_CartSession $objCartSess SC_CartSession インスタンス
  1477.      * @param array $arrInfo 店舗情報の配列
  1478.      * @param SC_Customer $objCustomer SC_Customer インスタンス
  1479.      * @return array 最終計算後の配列
  1480.      */
  1481.     function sfTotalConfirm($arrData&$objPage&$objCartSess$arrInfo$objCustomer ""{
  1482.         // 未定義変数を定義
  1483.         if (!isset($arrData['deliv_pref'])) $arrData['deliv_pref'"";
  1484.         if (!isset($arrData['payment_id'])) $arrData['payment_id'"";
  1485.         if (!isset($arrData['charge'])) $arrData['charge'"";
  1486.         if (!isset($arrData['use_point'])) $arrData['use_point'"";
  1487.  
  1488.         // 税金の取得
  1489.         $arrData['tax'$objPage->tpl_total_tax;
  1490.         // 小計の取得
  1491.         $arrData['subtotal'$objPage->tpl_total_pretax;
  1492.  
  1493.         // 合計送料の取得
  1494.         $arrData['deliv_fee'0;
  1495.  
  1496.         // 商品ごとの送料が有効の場合
  1497.         if (OPTION_PRODUCT_DELIV_FEE == 1{
  1498.             // 全商品の合計送料を加算する
  1499.             $this->lfAddAllProductsDelivFee($arrData$objPage$objCartSess);
  1500.         }
  1501.  
  1502.         // 配送業者の送料が有効の場合
  1503.         if (OPTION_DELIV_FEE == 1{
  1504.             // 都道府県、支払い方法から配送料金を加算する
  1505.             $this->lfAddDelivFee($arrData);
  1506.         }
  1507.  
  1508.         // 送料無料の購入数が設定されている場合
  1509.         if (DELIV_FREE_AMOUNT 0{
  1510.             // 商品の合計数量
  1511.             $total_quantity $objCartSess->getTotalQuantity(true);
  1512.             
  1513.             if($total_quantity >= DELIV_FREE_AMOUNT{
  1514.                 $arrData['deliv_fee'0;
  1515.             }
  1516.         }
  1517.  
  1518.         // 送料無料条件が設定されている場合
  1519.         if($arrInfo['free_rule'0{
  1520.             // 小計が無料条件を超えている場合
  1521.             if($arrData['subtotal'>= $arrInfo['free_rule']{
  1522.                 $arrData['deliv_fee'0;
  1523.             }
  1524.         }
  1525.  
  1526.         // 合計の計算
  1527.         $arrData['total'$objPage->tpl_total_pretax;    // 商品合計
  1528.         $arrData['total']+= $arrData['deliv_fee'];        // 送料
  1529.         $arrData['total']+= $arrData['charge'];            // 手数料
  1530.         // お支払い合計
  1531.         $arrData['payment_total'$arrData['total'($arrData['use_point'POINT_VALUE);
  1532.         // 加算ポイントの計算
  1533.         $arrData['add_point'SC_Utils::sfGetAddPoint($objPage->tpl_total_point$arrData['use_point']$arrInfo);
  1534.             
  1535.             if($objCustomer != ""{
  1536.                 // 誕生日月であった場合
  1537.                 if($objCustomer->isBirthMonth()) {
  1538.                     $arrData['birth_point'BIRTH_MONTH_POINT;
  1539.                     $arrData['add_point'+= $arrData['birth_point'];
  1540.             }
  1541.         }
  1542.  
  1543.         if($arrData['add_point'0{
  1544.             $arrData['add_point'0;
  1545.         }
  1546.         return $arrData;
  1547.     }
  1548.  
  1549.     /**
  1550.      * レコードの存在チェックを行う.
  1551.      *
  1552.      * @param string $table テーブル名
  1553.      * @param string $col カラム名
  1554.      * @param array $arrval 要素の配列
  1555.      * @param array $addwhere SQL の AND 条件である WHERE 句
  1556.      * @return bool レコードが存在する場合 true
  1557.      */
  1558.     function sfIsRecord($table$col$arrval$addwhere ""{
  1559.         $objQuery new SC_Query();
  1560.         $arrCol split("[, ]"$col);
  1561.  
  1562.         $where "del_flg = 0";
  1563.  
  1564.         if($addwhere != ""{
  1565.             $where.= " AND $addwhere";
  1566.         }
  1567.  
  1568.         foreach($arrCol as $val{
  1569.             if($val != ""{
  1570.                 if($where == ""{
  1571.                     $where "$val = ?";
  1572.                 else {
  1573.                     $where.= " AND $val = ?";
  1574.                 }
  1575.             }
  1576.         }
  1577.         $ret $objQuery->get($table$col$where$arrval);
  1578.  
  1579.         if($ret != ""{
  1580.             return true;
  1581.         }
  1582.         return false;
  1583.     }
  1584.  
  1585.     /**
  1586.      * メーカー商品数数の登録を行う.
  1587.      *
  1588.      * @param SC_Query $objQuery SC_Query インスタンス
  1589.      * @return void 
  1590.      */
  1591.     function sfMaker_Count($objQuery){
  1592.         $sql "";
  1593.  
  1594.         //テーブル内容の削除
  1595.         $objQuery->query("DELETE FROM dtb_maker_count");
  1596.  
  1597.         //各メーカーの商品数を数えて格納
  1598.         $sql " INSERT INTO dtb_maker_count(maker_id, product_count, create_date) ";
  1599.         $sql .= " SELECT T1.maker_id, count(T2.maker_id), now() ";
  1600.         $sql .= " FROM dtb_maker AS T1 LEFT JOIN dtb_products AS T2";
  1601.         $sql .= " ON T1.maker_id = T2.maker_id ";
  1602.         $sql .= " WHERE T2.del_flg = 0 AND T2.status = 1 ";
  1603.         $sql .= " GROUP BY T1.maker_id, T2.maker_id ";
  1604.         $objQuery->query($sql);
  1605.     }
  1606.  
  1607.     /**
  1608.      * 選択中の商品のメーカーを取得する.
  1609.      *
  1610.      * @param integer $product_id プロダクトID
  1611.      * @param integer $maker_id メーカーID
  1612.      * @return array 選択中の商品のメーカーIDの配列
  1613.      *
  1614.      */
  1615.     function sfGetMakerId($product_id$maker_id 0$closed false{
  1616.         if ($closed{
  1617.             $status "";
  1618.         else {
  1619.             $status "status = 1";
  1620.         }
  1621.  
  1622.         if(!$this->g_maker_on{
  1623.             $this->g_maker_on true;
  1624.             $maker_id = (int) $maker_id;
  1625.             $product_id = (int) $product_id;
  1626.             if(SC_Utils_Ex::sfIsInt($maker_id&& $this->sfIsRecord("dtb_maker","maker_id"$maker_id)) {
  1627.                 $this->g_maker_id array($maker_id);
  1628.             else if (SC_Utils_Ex::sfIsInt($product_id&& $this->sfIsRecord("dtb_products","product_id"$product_id$status)) {
  1629.                 $objQuery new SC_Query();
  1630.                 $where "product_id = ?";
  1631.                 $maker_id $objQuery->getCol("dtb_products""maker_id""product_id = ?"array($product_id));
  1632.                 $this->g_maker_id $maker_id;
  1633.             else {
  1634.                 // 不正な場合は、空の配列を返す。
  1635.                 $this->g_maker_id array();
  1636.             }
  1637.         }
  1638.         return $this->g_maker_id;
  1639.     }
  1640.  
  1641.     /**
  1642.      * メーカーの取得を行う.
  1643.      *
  1644.      * $products_check:true商品登録済みのものだけ取得する
  1645.      *
  1646.      * @param string $addwhere 追加する WHERE 句
  1647.      * @param bool $products_check 商品の存在するカテゴリのみ取得する場合 true
  1648.      * @return array カテゴリツリーの配列
  1649.      */
  1650.     function sfGetMakerList($addwhere ""$products_check false{
  1651.         $objQuery new SC_Query();
  1652.         $where "del_flg = 0";
  1653.  
  1654.         if($addwhere != ""{
  1655.             $where.= " AND $addwhere";
  1656.         }
  1657.  
  1658.         $objQuery->setoption("ORDER BY rank DESC");
  1659.  
  1660.         if($products_check{
  1661.             $col "T1.maker_id, name";
  1662.             $from "dtb_maker AS T1 LEFT JOIN dtb_maker_count AS T2 ON T1.maker_id = T2.maker_id";
  1663.             $where .= " AND product_count > 0";
  1664.         else {
  1665.             $col "maker_id, name";
  1666.             $from "dtb_maker";
  1667.         }
  1668.  
  1669.         $arrRet $objQuery->select($col$from$where);
  1670.  
  1671.         $max count($arrRet);
  1672.         for($cnt 0$cnt $max$cnt++{
  1673.             $id $arrRet[$cnt]['maker_id'];
  1674.             $name $arrRet[$cnt]['name'];
  1675.             $arrList[$id].= $name;
  1676.         }
  1677.         return $arrList;
  1678.     }
  1679.  
  1680.     /**
  1681.      * 全商品の合計送料を加算する
  1682.      */
  1683.     function lfAddAllProductsDelivFee(&$arrData&$objPage&$objCartSess{
  1684.         $arrData['deliv_fee'+= $this->lfCalcAllProductsDelivFee($arrData$objCartSess);
  1685.     }
  1686.  
  1687.     /**
  1688.      * 全商品の合計送料を計算する
  1689.      */
  1690.     function lfCalcAllProductsDelivFee(&$arrData&$objCartSess{
  1691.         $objQuery new SC_Query();
  1692.         $deliv_fee_total 0;
  1693.         $max $objCartSess->getMax();
  1694.         for ($i 0$i <= $max$i++{
  1695.             // 商品送料
  1696.             $deliv_fee $objQuery->getOne('SELECT deliv_fee FROM dtb_products WHERE product_id = ?'array($_SESSION[$objCartSess->key][$i]['id'][0]));
  1697.             // 数量
  1698.             $quantity $_SESSION[$objCartSess->key][$i]['quantity'];
  1699.             // 累積
  1700.             $deliv_fee_total += $deliv_fee $quantity;
  1701.         }
  1702.         return $deliv_fee_total;
  1703.     }
  1704.  
  1705.     /**
  1706.      * 都道府県、支払い方法から配送料金を加算する.
  1707.      *
  1708.      * @param array $arrData 
  1709.      */
  1710.     function lfAddDelivFee(&$arrData{
  1711.         $arrData['deliv_fee'+= $this->sfGetDelivFee($arrRet);
  1712.     }
  1713.  
  1714. }
  1715. ?>

Documentation generated on Tue, 28 Apr 2009 18:13:27 +0900 by phpDocumentor 1.4.2