バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

その他 > その他 > 【告知】EC-CUBE 2.0.1正式版をリリース致しました。

その他

新規スレッドを追加する

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
pineray
投稿日時: 2007/12/7 11:07
対応状況: −−−
長老
登録日: 2006/9/9
居住地: 伊賀
投稿: 292
Re: 【告知】EC-CUBE 2.0.1正式版をリリース致しました。
引用:
本来であれば, 各 process() 関数にロジック部分は記述せず, ロジックはしっかりリファクタリングしてローカル関数化し, process() 関数は switch などで画面遷移をコントロールするのみにするべきだと思います.
しかし, 現状では 1.x 系列のロジックを, ほとんどそのまま持ってきているため, カスタマイズ時は冗長なコーディングをせざるおえないと思います.

〜〜〜 略 〜〜〜

上記のようなコードであれば, カスタマイズしたい場合, 一部の関数のみオーバーライドしてやれば良く, 表示処理も邪魔にならないと思います.

なるほどキレイなコードで拡張性や再利用性も高そうです
これなら表示処理もさほど気にせず割り込み処理を追加できます。
やはり手習いで覚えた生半可な知識では駄目ですね

引用:
すべてのコードを上記のようにするには, 大変な労力が必要ですが, 開発コミュニティやコミッターの頑張り次第ではないでしょうか. . .

いつも口先だけで面目ないのですが、
僕も微力ながら手助けしたいと思います。

引用:
できれば, objViewは道連れに. . . したくないですよね. . .

ええ、とっても...気持ちが悪いです
nanasess
投稿日時: 2007/12/7 1:11
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2314
Re: 【告知】EC-CUBE 2.0.1正式版をリリース致しました。
引用:

「邪魔になる」という表現が悪かったですね
例えば商品のデータを取得した後で表示するというprocess() 関数があった場合に、データの取得と表示の間に割り込ませたい処理があるとします。
現状では、親クラスの関数を使わずに、まるまるコピーした後で割り込ませたい処理を追加するだけの冗長なコーディングをせざるを得ません。
だとすると、今回のアーキテクチャ変更の恩恵が減少してしまうように感じるわけです。


本来であれば, 各 process() 関数にロジック部分は記述せず, ロジックはしっかりリファクタリングしてローカル関数化し, process() 関数は switch などで画面遷移をコントロールするのみにするべきだと思います.
しかし, 現状では 1.x 系列のロジックを, ほとんどそのまま持ってきているため, カスタマイズ時は冗長なコーディングをせざるおえないと思います.

現状:

function process() {
    $objView = new SC_SiteView();

    switch ($_POST['mode']) {

    case 'confirm':
        // confirm logic...
        break;
    case 'regist':
        // regist logic...
        break;
    default:
        // default logic...
    }

    $objView->assignobj($this);
    $objView->display(SITE_FRAME);
}


理想:

function process() {
    $objView = new SC_SiteView();

    switch ($_POST['mode']) {

    case 'confirm':
        $this->confirm();
        break;
    case 'regist':
        $this->regist();
        break;
    default:
        $this->default();
    }

    $objView->assignobj($this);
    $objView->display(SITE_FRAME);
}

function confirm() {
    // confirm logic...
}

function regist() {
    // regist logic...
}

function default() {
    // default logic...
}


上記のようなコードであれば, カスタマイズしたい場合, 一部の関数のみオーバーライドしてやれば良く, 表示処理も邪魔にならないと思います.

すべてのコードを上記のようにするには, 大変な労力が必要ですが, 開発コミュニティやコミッターの頑張り次第ではないでしょうか. . .

引用:

    function init() {
        parent::init();
        $this->objView = new SC_SiteView();
    }
    function process() {
//        parent::process();
        // レイアウトデザインを取得
        $layout = new SC_Helper_PageLayout_Ex();
        $layout->sfGetPageLayout($this, false, "index.php");

    }
    function display() {
        $this->objView->assignobj($this);
        $this->objView->display(SITE_FRAME);
    }

そして、index.phpを
$objPage->init();
$objPage->process();
$objPage->display();

としたところ、無事に表示されました。

テンプレートにアサインする段階で、objViewも道連れにアサインしちゃってますけど


できれば, objViewは道連れに. . . したくないですよね. . .
nanasess
投稿日時: 2007/12/7 0:37
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2314
Re: 【告知】EC-CUBE 2.0.1正式版をリリース致しました。
引用:

kvex2004さんは書きました:

それと、データ数についてですが、インスト直後のサンプルデータしか入っていない状態ですので、レコード数が多いわけでは無いと思うんですよね。なのでよけいに悩んでいました。


MySQL の内部構造に詳しくないので憶測ですが. . .

おそらく DISTINCT で結果をマージするためのメモリ確保ができないのではないでしょうか.
これは, レコード件数ではなく, カラム数が影響しているものと思われます.
DISTINCT するカラムを減らすことで解決するかもしれませんが, 表示できない項目が出たり, 他のエラーが発生する可能性があります.

# ORDER BY で使用するカラムは最低限必要です

はずしていたらごめんなさい.
kvex2004
投稿日時: 2007/12/7 0:14
対応状況: −−−
長老
登録日: 2007/10/31
居住地: 埼玉
投稿: 218
Re: 【告知】EC-CUBE 2.0.1正式版をリリース致しました。
えっと、先にも申し上げたとおり、本運用のほうでは動いてるのでさほど大げさにしているわけでは無いんです。
pgsqlで動くのは確認してますが、本運用がMySQLですので、ローカル環境でも動いて欲しかっただけです。

それと、データ数についてですが、インスト直後のサンプルデータしか入っていない状態ですので、レコード数が多いわけでは無いと思うんですよね。なのでよけいに悩んでいました。

xamppのせいかな?とか。
普通にApache、MySQL、PHPをインストールして試してみようかと思っています。
さっき違うPCにxamppを入れて試してみましたが、同じくdisinctのところでクエリが怒られます(涙
saratoga
投稿日時: 2007/12/6 9:42
対応状況: −−−
一人前
登録日: 2006/9/22
居住地: 大阪
投稿: 76
Re: 【告知】EC-CUBE 2.0.1正式版をリリース致しました。
saratogaです。

MySQL で OutOfMemory は初めて見ましたが、
私もチューニングを試す価値はあると思います。

細かい部分だと下記のサイトがわかりやすいです。
http://dsas.blog.klab.org/archives/50860867.html

また、EXPLAIN を使って、実行するクエリで
本当に意図したインデックスが使われているかなど、
クエリやテーブル構造のチューニングで
改善するパターンもあるかと思います。

EXPLAIN {実行したいクエリ}
nanasess
投稿日時: 2007/12/6 8:12
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2314
Re: 【告知】EC-CUBE 2.0.1正式版をリリース致しました。
大河内です.

引用:

kvex2004さんは書きました:
あぁ、すみません。
トピが変わったので、ちゃんと提示しないといけませんね。

以下のようなエラーです
価格順/新着順 ともに

snip...

[nativecode=1037 ** Out of memory; restart server and try again (needed 65528 bytes)]



エラーコードの意味は MySQL のマニュアルにあると思いますが, SQL の実行に必要なメモリを確保できないようです.
商品リスト初期表示が可能でしたら, おそらく, DISTINCT するカラムが多すぎるからでしょう.
EC-CUBE2.0.0 から, 複数カテゴリ対応の影響で, MySQL では非常に複雑な SQL が必要となってしまいました.

おそらく, EC-CUBE側で解決するのは難しいと思います.

# 複数カテゴリを捨てるというカスタマイズは有効かもしれませんが. . .

MySQL のチューニングをしてみてはいかがでしょうか.
また, PostgreSQL を試してみるという手もあります.
現在のバージョンでは, Windows でも比較的楽に導入可能かと思います.
kvex2004
投稿日時: 2007/12/6 0:10
対応状況: −−−
長老
登録日: 2007/10/31
居住地: 埼玉
投稿: 218
Re: 【告知】EC-CUBE 2.0.1正式版をリリース致しました。
あぁ、すみません。
トピが変わったので、ちゃんと提示しないといけませんね。

以下のようなエラーです
価格順/新着順 ともに

SELECT DISTINCT price02_min, product_id, product_code_min, product_code_max, name, comment1, comment2, comment3, main_list_comment, main_image, main_list_image, price01_min, price01_max, price02_max, stock_min, stock_max, stock_unlimited_min, stock_unlimited_max, point_rate, sale_limit, sale_unlimited, deliv_date_id, deliv_fee, status, product_flag, create_date, del_flg FROM (SELECT T1.product_id, product_code_min, product_code_max, price01_min, price01_max, price02_min, price02_max, stock_min, stock_max, stock_unlimited_min, stock_unlimited_max, del_flg, status, name, comment1, comment2, comment3, main_list_comment, main_image, main_list_image, product_flag, deliv_date_id, sale_limit, point_rate, sale_unlimited, create_date, deliv_fee, rank ,(SELECT rank AS category_rank FROM dtb_category AS T4 WHERE T1.category_id = T4.category_id) as category_rank ,(SELECT category_id AS sub_category_id FROM dtb_category T4 WHERE T1.category_id = T4.category_id) as category_id FROM (SELECT T0.product_id, T0.del_flg, T0.status, T0.name, T0.comment1, T0.comment2, T0.comment3, T0.main_list_comment, T0.main_image, T0.main_list_image, T0.product_flag, T0.deliv_date_id, T0.sale_limit, T0.point_rate, T0.sale_unlimited, T0.create_date, T0.deliv_fee, T00.category_id, T00.rank FROM dtb_products AS T0 LEFT JOIN dtb_product_categories AS T00 USING (product_id)) AS T1 RIGHT JOIN (SELECT product_id as product_id_sub, MIN(product_code) AS product_code_min, MAX(product_code) AS product_code_max, MIN(price01) AS price01_min, MAX(price01) AS price01_max, MIN(price02) AS price02_min, MAX(price02) AS price02_max, MIN(stock) AS stock_min, MAX(stock) AS stock_max, MIN(stock_unlimited) AS stock_unlimited_min, MAX(stock_unlimited) AS stock_unlimited_max FROM dtb_products_class GROUP BY product_id) AS T2 ON T1.product_id = T2.product_id_sub ) AS T1 WHERE del_flg = 0 AND status = 1 AND category_id IN ( ?,? ,? ,? ) ORDER BY price02_min ASC, product_id ASC LIMIT 15 OFFSET 0
DB Error: unknown error

SELECT DISTINCT price02_min, product_id, product_code_min, product_code_max, name, comment1, comment2, comment3, main_list_comment, main_image, main_list_image, price01_min, price01_max, price02_max, stock_min, stock_max, stock_unlimited_min, stock_unlimited_max, point_rate, sale_limit, sale_unlimited, deliv_date_id, deliv_fee, status, product_flag, create_date, del_flg FROM (SELECT T1.product_id, product_code_min, product_code_max, price01_min, price01_max, price02_min, price02_max, stock_min, stock_max, stock_unlimited_min, stock_unlimited_max, del_flg, status, name, comment1, comment2, comment3, main_list_comment, main_image, main_list_image, product_flag, deliv_date_id, sale_limit, point_rate, sale_unlimited, create_date, deliv_fee, rank ,(SELECT rank AS category_rank FROM dtb_category AS T4 WHERE T1.category_id = T4.category_id) as category_rank ,(SELECT category_id AS sub_category_id FROM dtb_category T4 WHERE T1.category_id = T4.category_id) as category_id FROM (SELECT T0.product_id, T0.del_flg, T0.status, T0.name, T0.comment1, T0.comment2, T0.comment3, T0.main_list_comment, T0.main_image, T0.main_list_image, T0.product_flag, T0.deliv_date_id, T0.sale_limit, T0.point_rate, T0.sale_unlimited, T0.create_date, T0.deliv_fee, T00.category_id, T00.rank FROM dtb_products AS T0 LEFT JOIN dtb_product_categories AS T00 USING (product_id)) AS T1 RIGHT JOIN (SELECT product_id as product_id_sub, MIN(product_code) AS product_code_min, MAX(product_code) AS product_code_max, MIN(price01) AS price01_min, MAX(price01) AS price01_max, MIN(price02) AS price02_min, MAX(price02) AS price02_max, MIN(stock) AS stock_min, MAX(stock) AS stock_max, MIN(stock_unlimited) AS stock_unlimited_min, MAX(stock_unlimited) AS stock_unlimited_max FROM dtb_products_class GROUP BY product_id) AS T2 ON T1.product_id = T2.product_id_sub ) AS T1 WHERE del_flg = 0 AND status = 1 AND category_id IN ( 1,'3' ,'4' ,'5' ) ORDER BY price02_min ASC, product_id ASC LIMIT 15 OFFSET 0 [nativecode=1037 ** Out of memory; restart server and try again (needed 65528 bytes)]

pineray
投稿日時: 2007/12/5 16:41
対応状況: −−−
長老
登録日: 2006/9/9
居住地: 伊賀
投稿: 292
Re: 【告知】EC-CUBE 2.0.1正式版をリリース致しました。
ご返答いただき誠にありがとうございます。
全く貢献していないのに文句ばかり言って申し訳ありません

引用:
nanasessさんは書きました:

以下のようなイメージでしょうか?


function process() {
    // logic.
    $this->variable = "variable";
    $this->foo();
}

function display() {
    $objView = new SC_SiteView();
    $objView->assignobj($this);
    $objView->display(SITE_FRAME);
}

はい、イメージとしては上記のような感じです。

引用:
上記のようにすると, process() 関数の途中で SC_SiteView のインスタンスに何らかの処理をしたい場合, 少々不便に感じます.
また, ほとんどの Page クラスで, 表示処理は上記の3行ほどなので, 邪魔になることはあまり無いのではないでしょうか.
class_extends 以下のクラスを使用してカスタマイズした場合, 冗長なコーディングとなりますが, さほど問題無いと思われます.

「邪魔になる」という表現が悪かったですね
例えば商品のデータを取得した後で表示するというprocess() 関数があった場合に、データの取得と表示の間に割り込ませたい処理があるとします。
現状では、親クラスの関数を使わずに、まるまるコピーした後で割り込ませたい処理を追加するだけの冗長なコーディングをせざるを得ません。
だとすると、今回のアーキテクチャ変更の恩恵が減少してしまうように感じるわけです。

引用:
# それよりも, 各 process() 関数をリファクタリングすべきかと...

それは確かに...

引用:
「こうしたらどうか」というコーディングの具体例がありましたら, ご提示頂ければ幸いです.
よろしくお願い致します.

LC_Page_Index_EX.phpで試してみました。
    function init() {
        parent::init();
        $this->objView = new SC_SiteView();
    }
    function process() {
//        parent::process();
        // レイアウトデザインを取得
        $layout = new SC_Helper_PageLayout_Ex();
        $layout->sfGetPageLayout($this, false, "index.php");

    }
    function display() {
        $this->objView->assignobj($this);
        $this->objView->display(SITE_FRAME);
    }

そして、index.phpを
$objPage->init();
$objPage->process();
$objPage->display();

としたところ、無事に表示されました。

テンプレートにアサインする段階で、objViewも道連れにアサインしちゃってますけど
nanasess
投稿日時: 2007/12/5 14:51
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2314
Re: 【告知】EC-CUBE 2.0.1正式版をリリース致しました。
引用:

この環境で、どうしても並べ替えでSQLがエラーになります。
本番サーバでは動いているので良いのですが、テスト環境はできればローカルのWindowsで行いたいのです。


どのような SQLエラーになるのでしょうか.
nanasess
投稿日時: 2007/12/5 14:50
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2314
Re: 【告知】EC-CUBE 2.0.1正式版をリリース致しました。
大河内です.

引用:

pinerayさんは書きました:

それは、元となるクラスのprocess()から、ページを表示する処理を外して欲しい、ということです。
というのも、process()の中で取得した値を利用したり、手を加えたりするようなカスタマイズが多くなると思うのですが、そうなるとprocess()の最後にある表示処理が邪魔になります

display()といった関数を別に用意して、ページ表示の処理をそちらにまとめ、process()の後に呼び出すようにすれば良いのではないかと思います。

ご検討いただければ幸いです。


以下のようなイメージでしょうか?


function process() {
    // logic.
    $this->variable = "variable";
    $this->foo();
}

function display() {
    $objView = new SC_SiteView();
    $objView->assignobj($this);
    $objView->display(SITE_FRAME);
}


上記のようにすると, process() 関数の途中で SC_SiteView のインスタンスに何らかの処理をしたい場合, 少々不便に感じます.
また, ほとんどの Page クラスで, 表示処理は上記の3行ほどなので, 邪魔になることはあまり無いのではないでしょうか.
class_extends 以下のクラスを使用してカスタマイズした場合, 冗長なコーディングとなりますが, さほど問題無いと思われます.

# それよりも, 各 process() 関数をリファクタリングすべきかと...

「こうしたらどうか」というコーディングの具体例がありましたら, ご提示頂ければ幸いです.
よろしくお願い致します.
« 1 (2) 3 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

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

投稿数ランキング

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