バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > LC_Page_Admin_Products_Product.phpのfunctionをLC_Page_FrontParts_Bloc_New_Products.phpで起動することは可能でしょうか。

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
aozora
投稿日時: 2013/4/9 6:12
対応状況: −−−
常連
登録日: 2013/3/21
居住地:
投稿: 40
LC_Page_Admin_Products_Product.phpのfunctionをLC_Page_FrontParts_Bloc_New_Products.phpで起動することは可能でしょうか。
お世話になっております。

以前以下のスレッドで商品登録画面にて商品を登録する際に、その商品における割引金額を、予め設定した割引率にその商品価格を掛け合わせた金額として算出し、DBに保存し新着商品ブロック等で引用したいという内容の質問をさせて頂き、ご教授頂きました。
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=12367&forum=10

それを商品登録の時だけでなく、サイトを開き新着商品ブロックを見た時には常に最新の割引金額が反映されているようにすることは可能でしょうか。

割引率を頻繁に変更する可能性があり、となるとその都度、商品登録の更新作業をしないと最新の割引金額が新着商品ブロック等で引用できない状況になって参りました。

この割引金額の算出とDBへの保存のための記述はLC_Page_Admin_Products_Product.phpのファイルのfunction lfRegistProductという箇所にて設定致しましたが、(厳密にはfunction lfInsertDummyProductClass)

新着商品を見る時には常にその作業(function)が起動されるように、新着商品用のファイルであるLC_Page_FrontParts_Bloc_New_Products.phpで呼び起こすようなことはできますでしょうか。

または他の方法等をご教授頂けませんでしょうか。宜しくお願いいたします。

[EC-CUBE]2.12.1
[データベース] MySQL
[WEBサーバ] Apache
[OS] XP 
[PHP] PHP 5.2.17
yuh
投稿日時: 2013/4/9 10:32
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1819
Re: LC_Page_Admin_Products_Product.phpのfunctionをLC_Page_FrontParts_Bloc_New_Products.phpで起動することは可能でしょうか。
できると思いますが、内容が把握できていないのでそのfunctionの内容を書いてもらえますか?
aozora
投稿日時: 2013/4/9 20:50
対応状況: −−−
常連
登録日: 2013/3/21
居住地:
投稿: 40
Re: LC_Page_Admin_Products_Product.phpのfunctionをLC_Page_FrontParts_Bloc_New_Products.phpで起動することは可能でしょうか。
yuh様、

いつもお世話になっております。ご返信頂きましてありがとうございます。

LC_Page_Admin_Products_Product.phpに以下の?のfunctionの記述があります。管理者画面から商品を登録する際に商品データを入力後、”確認ページへ”をクリックし、確認ページから”この内容で登録する”をクリックするとDBに商品データを登録するfunctionだと思いますが、その中に function lfInsertDummyProductClassというfunctionがあり、その中で割引率と商品価格を掛け合わせてDBに保存するという以下の?の作業をしておりました。 

この?の作業、厳密には?の作業を新着商品ブロックを開いたときには常に起動させるようにLC_Page_FrontParts_Bloc_New_Products.phpで呼び起こせないものかと思い質問させて頂きました。

? $rate1 = $objQuery->getCol('value', 'dtb_discount', 'discount_id = ?', array('1'));
$rate2 = $objQuery->getCol('value', 'dtb_discount', 'discount_id = ?', array('2'));
$rate3 = $objQuery->getCol('value', 'dtb_discount', 'discount_id = ?', array('3'));
$sqlval['price03'] = $sqlval['price02'] * $rate1[0];
$sqlval['price04'] = $sqlval['price02'] * $rate2[0];
$sqlval['price05'] = $sqlval['price02'] * $rate3[0];
$arrForm['rate1'] = $rate1[0];

? /**
* DBに商品データを登録する
*
* @param object $objUpFile SC_UploadFileインスタンス
* @param object $objDownFile SC_UploadFileインスタンス
* @param array $arrList フォーム入力パラメーター配列
* @return integer 登録商品ID
*/
function lfRegistProduct(&$objUpFile, &$objDownFile, $arrList) {




/**
* 規格を設定していない商品を商品規格テーブルに登録
*
* @param array $arrList
* @return void
*/
function lfInsertDummyProductClass($arrList) {
$objQuery =& SC_Query_Ex::getSingletonInstance();
$objDb = new SC_Helper_DB_Ex();

// 配列の添字を定義
$checkArray = array('product_class_id', 'product_id', 'product_code', 'stock', 'stock_unlimited', 'price01', 'price02', 'price03', 'sale_limit', 'deliv_fee', 'point_rate' ,'product_type_id', 'down_filename', 'down_realfilename');
$sqlval = SC_Utils_Ex::sfArrayIntersectKeys($arrList, $checkArray);
$sqlval = SC_Utils_Ex::arrayDefineIndexes($sqlval, $checkArray);

$sqlval['stock_unlimited'] = $sqlval['stock_unlimited'] ? UNLIMITED_FLG_UNLIMITED : UNLIMITED_FLG_LIMITED;
$sqlval['creator_id'] = strlen($_SESSION['member_id']) >= 1 ? $_SESSION['member_id'] : '0';

$rate1 = $objQuery->getCol('value', 'dtb_discount', 'discount_id = ?', array('1'));
$rate2 = $objQuery->getCol('value', 'dtb_discount', 'discount_id = ?', array('2'));
$rate3 = $objQuery->getCol('value', 'dtb_discount', 'discount_id = ?', array('3'));
$sqlval['price03'] = $sqlval['price02'] * $rate1[0];
$sqlval['price04'] = $sqlval['price02'] * $rate2[0];
$sqlval['price05'] = $sqlval['price02'] * $rate3[0];
$arrForm['rate1'] = $rate1[0];

if (strlen($sqlval['product_class_id']) == 0) {
$sqlval['product_class_id'] = $objQuery->nextVal('dtb_products_class_product_class_id');
$sqlval['create_date'] = 'CURRENT_TIMESTAMP';
$sqlval['update_date'] = 'CURRENT_TIMESTAMP';
// INSERTの実行
$objQuery->insert('dtb_products_class', $sqlval);
} else {
$sqlval['update_date'] = 'CURRENT_TIMESTAMP';
// UPDATEの実行
$objQuery->update('dtb_products_class', $sqlval, 'product_class_id = ?', array($sqlval['product_class_id']));

}
}



yuh
投稿日時: 2013/4/10 0:02
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1819
Re: LC_Page_Admin_Products_Product.phpのfunctionをLC_Page_FrontParts_Bloc_New_Products.phpで起動することは可能でしょうか。
単純に?の中にその処理を組み込むのじゃダメなんですか?
全部のページに適応させるのであれば
SC_ProductのgetListByProductIdsに書いてしまうという手もあると思います。
aozora
投稿日時: 2013/4/11 18:40
対応状況: −−−
常連
登録日: 2013/3/21
居住地:
投稿: 40
Re: LC_Page_Admin_Products_Product.phpのfunctionをLC_Page_FrontParts_Bloc_New_Products.phpで起動することは可能でしょうか。
yuh様

お世話になっております。ご連絡、ご教授頂きましてありがとうございます。

おっしゃる通り全ページの全ブロックに適応させたいので、また各ブロック毎に組み込むとなると大変な作業になりますから、SC_Product.phpに組み込もうと考え、試してみました。

以下の記述は各商品毎にその商品の金額に、予め設定した割引率をかけた金額である割引金額を割引率が更新され次第自動的に設定するという(つもり)の記述です。(管理者画面の商品登録のLC_Page_Admin_Products_Product.phpのロジックでは更新された割引率を反映させるにはその都度商品登録をする必要がある)

getListByProductIdsがどうゆう機能を果たすか理解しておりませんが、getListByProductIds内に前スレッドの?に相当するものをLC_Page_Admin_Products_Product.phpからコピーし追加いたしました。

結果は割引率が更新されているにもかかわらず金額に反映されておらず、商品詳細画面を開くとページ下にあるエラーがでます。まず方法(記述)自体はいいのでしょうか?ヒントだけでもお願い致します。

SC_Product.php

function getListByProductIds(&$objQuery, $arrProductId = array()) {
$objQuery =& SC_Query_Ex::getSingletonInstance();
$objDb = new SC_Helper_DB_Ex();
if (empty($arrProductId)) {
return array();
}

$where = 'alldtl.product_id IN (' . SC_Utils_Ex::repeatStrWithSeparator('?', count($arrProductId)) . ')';
$where .= ' AND alldtl.del_flg = 0';

$objQuery->setWhere($where, $arrProductId);
$arrProducts = $this->lists($objQuery);


// 配列のキーを商品IDに
$arrTmp = array();
foreach ($arrProducts as $arrProduct) {
$arrTmp[$arrProduct['product_id']] = $arrProduct;
}
$arrProducts =& $arrTmp;
unset($arrTmp);

// SC_Query::setOrder() の指定がない場合、$arrProductId で指定された商品IDの順に配列要素を並び替え
if (strlen($objQuery->order) === 0) {
$arrTmp = array();
foreach ($arrProductId as $product_id) {
$arrTmp[$product_id] = $arrProducts[$product_id];
}
$arrProducts =& $arrTmp;
unset($arrTmp);
}

**************この箇所を追加***********************
$objQuery =& SC_Query_Ex::getSingletonInstance();
$objDb = new SC_Helper_DB_Ex();

// 配列の添字を定義
$checkArray = array('product_class_id', 'product_id', 'product_code', 'stock', 'stock_unlimited', 'price01', 'price02', 'price03', 'price04', 'price05', 'sale_limit', 'deliv_fee', 'point_rate' ,'product_type_id', 'down_filename', 'down_realfilename');
$sqlval = SC_Utils_Ex::sfArrayIntersectKeys($arrList, $checkArray);
$sqlval = SC_Utils_Ex::arrayDefineIndexes($sqlval, $checkArray);

$sqlval['stock_unlimited'] = $sqlval['stock_unlimited'] ? UNLIMITED_FLG_UNLIMITED : UNLIMITED_FLG_LIMITED;
$sqlval['creator_id'] = strlen($_SESSION['member_id']) >= 1 ? $_SESSION['member_id'] : '0';

$rate1 = $objQuery->getCol('value', 'dtb_discount', ' discount_id = ?', array('1'));
$rate2 = $objQuery->getCol('value', 'dtb_discount', ' discount_id = ?', array('2'));
$rate3 = $objQuery->getCol('value', ' dtb_discount', 'currency_id = ?', array('3'));
$sqlval['price03'] = $sqlval['price02'] * $rate1[0];
$sqlval['price04'] = $sqlval['price02'] * $rate2[0];
$sqlval['price05'] = $sqlval['price02'] * $rate3[0];
$arrForm['rate1'] = $rate1[0];


if (strlen($sqlval['product_class_id']) == 0) {
$sqlval['product_class_id'] = $objQuery->nextVal('dtb_products_class_product_class_id');
$sqlval['create_date'] = 'CURRENT_TIMESTAMP';
$sqlval['update_date'] = 'CURRENT_TIMESTAMP';
// INSERTの実行
$objQuery->insert('dtb_products_class', $sqlval);
} else {
$sqlval['update_date'] = 'CURRENT_TIMESTAMP';
// UPDATEの実行
$objQuery->update('dtb_products_class', $sqlval, 'product_class_id = ?', array($sqlval['product_class_id']));

}
**********************************************

// 税込金額を設定する
SC_Product_Ex::setIncTaxToProducts($arrProducts);

return $arrProducts;
}

**エラーメッセージ

MDB2 Error: constraint violation
_doQuery: [Error message: Could not execute statement]
[Last executed query: EXECUTE mdb2_statement_mysql_3226e1abd5fe85137e5e2063cf57c93047b77342de USING @0, @1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15, @16, @17, @18, @19]
[Native code: 1062]
[Native message: Duplicate entry '0-0-0' for key 2]
・・・・・・・・・・・・
yuh
投稿日時: 2013/4/11 19:45
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1819
Re: LC_Page_Admin_Products_Product.phpのfunctionをLC_Page_FrontParts_Bloc_New_Products.phpで起動することは可能でしょうか。

/ INSERTの実行
$objQuery->insert('dtb_products_class', $sqlval);
} else {
$sqlval['update_date'] = 'CURRENT_TIMESTAMP';
// UPDATEの実行
$objQuery->update('dtb_products_class', $sqlval, 'product_class_id = ?', array($sqlval['product_class_id']));

}

まずこの部分ですが各ブロック毎に組み込む場合、そのブロックを開いた回数だけINSERT/UPDATEが走るのは問題があると思います。
おそらくSC_Productsに組み込む場合は必要ないと思います。

エラーはproduct_idとclasscategory_id1とclasscategory_id2が同じデータを入れようとした時に出ます。

やりたい事と組み込もうとしているコードがかけ離れて行ってるような気がします。
aozora
投稿日時: 2013/4/12 7:07
対応状況: −−−
常連
登録日: 2013/3/21
居住地:
投稿: 40
Re: LC_Page_Admin_Products_Product.phpのfunctionをLC_Page_FrontParts_Bloc_New_Products.phpで起動することは可能でしょうか。
Yuh様

お世話になっております。ご教授頂き感謝致します。
ご指摘の箇所を削除しただけでは勿論機能しておりません。

ただ下記の$rate1、$rate2、$rate3は正しい値を取得しております。

しかしながら$sqlval['price02']が値を取得できておらず、function getListByProductIdsの中で全ての商品のprice02に対して$rate1、$rate2、$rate3を掛けるという記述になっていないと思われます。(LC_Page_Admin_Products_Product.phpであれば商品毎の作業であるので下記の記述で良い)

このfunction getListByProductIdsの中でどのような記述にしたら、全ての商品のprice02に対して$rate1、$rate2、$rate3を掛けて、それぞれの商品におけるprice03、price04、price05として設定できるのでしょうか。ヒントだけでも宜しいのでお願い致します。

$rate1 = $objQuery->getCol('value', 'dtb_discount', ' discount_id = ?', array('1'));
$rate2 = $objQuery->getCol('value', 'dtb_discount', ' discount_id = ?', array('2'));
$rate3 = $objQuery->getCol('value', ' dtb_discount', 'currency_id = ?', array('3'));
$sqlval['price03'] = $sqlval['price02'] * $rate1[0];
$sqlval['price04'] = $sqlval['price02'] * $rate2[0];
$sqlval['price05'] = $sqlval['price02'] * $rate3[0];
$arrForm['rate1'] = $rate1[0];
yuh
投稿日時: 2013/4/12 11:06
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1819
Re: LC_Page_Admin_Products_Product.phpのfunctionをLC_Page_FrontParts_Bloc_New_Products.phpで起動することは可能でしょうか。

    function getListByProductIds(&$objQuery, $arrProductId = array()) {
        if (empty($arrProductId)) {
            return array();
        }

        $where = 'alldtl.product_id IN (' . SC_Utils_Ex::repeatStrWithSeparator('?', count($arrProductId)) . ')';
        $where .= ' AND alldtl.del_flg = 0';

        $objQuery->setWhere($where, $arrProductId);
        $arrProducts = $this->lists($objQuery);

        // 配列のキーを商品IDに
        $arrTmp = array();
        foreach ($arrProducts as $arrProduct) {
            $arrTmp[$arrProduct['product_id']] = $arrProduct;
        }
        $arrProducts =& $arrTmp;
        unset($arrTmp);

        // SC_Query::setOrder() の指定がない場合、$arrProductId で指定された商品IDの順に配列要素を並び替え
        
        $query = "SELECT value FROM dtb_discount WHERE discount_id = ?";
        $rate1 = $objQuery->getOne($query, array('1'));
        $rate2 = $objQuery->getOne($query, array('2'));
        $rate3 = $objQuery->getOne($query, array('3'));

        if (strlen($objQuery->order) === 0) {
            $arrTmp = array();
            foreach ($arrProductId as $product_id) {
                if($arrProducts[$product_id]["price02_max"]){
                    $arrProducts[$product_id]["price03_max"] = intval($arrProducts[$product_id]["price02_max"] * $rate1);
                    $arrProducts[$product_id]["price04_max"] = intval($arrProducts[$product_id]["price02_max"] * $rate2);
                    $arrProducts[$product_id]["price05_max"] = intval($arrProducts[$product_id]["price02_max"] * $rate3);
                }
                if($arrProducts[$product_id]["price02_min"]){
                    $arrProducts[$product_id]["price03_min"] = intval($arrProducts[$product_id]["price02_min"] * $rate1);
                    $arrProducts[$product_id]["price04_min"] = intval($arrProducts[$product_id]["price02_min"] * $rate2);
                    $arrProducts[$product_id]["price05_min"] = intval($arrProducts[$product_id]["price02_min"] * $rate3);
                }
                
                $arrTmp[$product_id] = $arrProducts[$product_id];
            }
            $arrProducts =& $arrTmp;
            unset($arrTmp);
        }else{
             foreach($arrProducts as $key => $value){
                if($value["price02_max"]){
                    $arrProducts[$key]["price03_max"] = intval($value["price02_max"] * $rate1);
                    $arrProducts[$key]["price04_max"] = intval($value["price02_max"] * $rate2);
                    $arrProducts[$key]["price05_max"] = intval($value["price02_max"] * $rate3);
                }
                if($value["price02_min"]){
                    $arrProducts[$key]["price03_min"] = intval($value["price02_min"] * $rate1);
                    $arrProducts[$key]["price04_min"] = intval($value["price02_min"] * $rate2);
                    $arrProducts[$key]["price05_min"] = intval($value["price02_min"] * $rate3);
                }
             }
        }
        // 税込金額を設定する
        SC_Product_Ex::setIncTaxToProducts($arrProducts);

        return $arrProducts;
    }

こんな感じですか?
aozora
投稿日時: 2013/4/12 18:11
対応状況: −−−
常連
登録日: 2013/3/21
居住地:
投稿: 40
Re: LC_Page_Admin_Products_Product.phpのfunctionをLC_Page_FrontParts_Bloc_New_Products.phpで起動することは可能でしょうか。
yuh様、

お世話になっております。ご教授頂きましてありがとうございます。

頂きました記述を適応いたしましたところ、見事に金額が反映されました。

ただ、それは商品詳細画面の“おすすめ商品”(商品登録時に関連商品表示で選択し、デザイン管理のレイアウト設定でおすすめ商品として追加したブロック)だけの様でございまして、
新着商品、最近チェックした商品、商品詳細画面等の金額には反映されていない模様でございます。

おすすめ商品tplを司るphpファイルを現在探しておりますが、tplファイル内の記述を確認したところ、以下の様な記述になっております。新着商品、商品詳細画面等ファイル側(tpl、php)での金額に関する記述を変更すれば宜しいのでしょうか。

<!--{if $arrRecommend}-->
<!--{foreach from=$arrRecommend item=arrItem name="arrRecommend"}-->

<!--{assign var=price03_min value=`$arrItem.price03_min_inctax`}-->
<span class="dl" >$<!--{$price03_min|number_format}--></span>
yuh
投稿日時: 2013/4/13 1:48
対応状況: −−−
登録日: 2013/1/9
居住地: 大阪
投稿: 1819
Re: LC_Page_Admin_Products_Product.phpのfunctionをLC_Page_FrontParts_Bloc_New_Products.phpで起動することは可能でしょうか。
SC_ProductsのgetListByProductIdsは基本ブロックで商品情報を読み出している部分と、一覧の画面での取得に使用しています。
商品詳細はgetListByProductIdsを関連商品にしか使用していないので、別途処理を組み込む必要があります。
新着商品、最近チェックした商品に関してはプラグインですか?
そこらへんは処理によって使ってない場合やテンプレートが対応していない場合は調整する必要がでてきます。
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

総メンバー数は89,035名です
総投稿数は110,020件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1296
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.