论坛: osCommerce カスタマイズ (Thread #23221)

複数商品を1ボタンでカゴに入れる仕組みを作成したい (2009-06-28 07:23 by 神代 #44598)

以前、「複数商品を1ボタンでカゴに入れる仕組みを作成したい」というタイトルで
質問を投稿させていただきまいたが、
非常にわかりにくい文章だと上司に指摘をされましたので
再度投稿させていただきました。


現在、子供服のオンラインショップの構築を検討しております。

以下の URL は、子供服の「ジボリー」というメーカーのオンラインショップの商品ページ(英語)ですが、
このページのように、購入したい商品の規格(サイズ)、数量を選択し、
1ボタンで複数の商品をまとめてカゴに入れる仕組みを作りたいと考えています。

http://www.gymboree.com/shop/dept_outfit.jsp?pick=NONE&FOLDER%3C%3Efolder_id=2534374306251873&PRODUCT%3C%3Eprd_id=845524445978263&bmUID=1245771888233&productSizeSelected=0

URL のページは、「カーディガン」、「2ピースセット」、「帽子」をまとめて購入できる商品ページで、
購入したい商品の規格(サイズ)、数量を選択し、「 Add to bag 」にチェックを入れ、
商品上部にある、「 Add Checked Items To Bag 」ボタンを押すことによって
複数の商品をまとめてカゴに入れるようになっています。

今回、「 Add to bag 」のかわりに、数量が0なら購入しない、
1以上なら購入の対象にする、としたいと考えています。

このページは、プログラムで自動で生成する必要はなく、
静的な HTML ( PHP )ファイルを手動で編集するというのでも問題ありません。

また、すべての商品の数量が0の状態でカゴに入れるボタンを押した場合は、
「商品が選択されていません。」のようなエラー画面が出るようにしたいと考えています。


数量だけを設定した状態で、複数の商品を1ボタンでカゴに入れれるものはありましたが、
規格(サイズ)、数量の両方を設定したものでは、
複数の商品を1ボタンでカゴに入れれるものは見つけることはできませんでした。

このような仕組みを作成する何かいい方法はありませんでしょうか。
よろしくお願いいたします。

回复到 #44598×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登录

RE: 複数商品を1ボタンでカゴに入れる仕組みを作成したい (2009-06-30 12:38 by 匿名 #44647)

発注部を静的に書くのは当然
osCには通常X-Sellくらいしか
商品グループ化手段が無いんだから

言ってる動作の実装は可能だけど
かなりの部分を独自に書く事になる

要は複数のpidとオプションと数量を
順番にadd_cartするだけなんだろ?
大して難しい事でもあるまい

先にも同じことを書いてるが
osC側はapplication_top.phpだけの
工事で受け入れ可能と思う

質問を細かく変えて繰り返しても
「いい方法」なんて聞いてる時点で
返事のしようがない

作成中の問題点を聞くならともかく
「いい方法」とか言われてもなぁ

大体何処まで解って何処から解らん
のか見当も付かんので何も言えん
自分で好きなように作ればいい

osC標準はカート追加後数量変更の
フローだから既存コードで使える
のは少なかろう

Add Multiple Productsは該当部分を
数行でさっくり書いてたけど
その辺はちゃんと読んだのか?
回复到 #44598

回复到 #44647×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登录

RE: 複数商品を1ボタンでカゴに入れる仕組みを作成したい (2009-07-25 12:01 by 匿名 #45131)


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

> 発注部を静的に書くのは当然
> osCには通常X-Sellくらいしか
> 商品グループ化手段が無いんだから

「 X-Sell 」について Google で検索してみたところ、
商品の詳細ページの下部に別の商品を掲載できるものだとわかりました。

しかし、このモジュールをそのまま使用しただけでは、
複数の商品を1ボタンでかごに入れる仕組みはできないのではないかと思いました。

このモジュールをそのまま使うのではなく、カスタマイズすることで、
複数の商品を1ボタンでかごに入れる仕組みを作ることができるのでしょうか。



「 Add Multiple Products 」に関しましては
別の投稿記事で紹介していただいた下記の URL から
投稿日の新しいものから3つのアーカイブをダウンロードしました。

その後、投稿日の古いものから順に
各アーカイブに入ってありました readme.txt を
翻訳しながら導入をしてみました。

http://addons.oscommerce.com/info/1129


結論としては、どのアーカイブでも、
カテゴリをクリックしても、商品が表示されない状態となりました。


試したアーカイブと、行った作業は以下の通りです。

●1つ目のアーカイブ「 Bug fix release (v1.2) 」

1.application_top.php の修正

1-1:1か所目
if (isset($HTTP_GET_VARS['action'])) {
if (DISPLAY_CART == 'true') {
$goto = FILENAME_SHOPPING_CART;
$parameters = array('action', 'cPath', 'products_id', 'pid');
} else {
$goto = basename($PHP_SELF);
if ($HTTP_GET_VARS['action'] == 'buy_now') {
$parameters = array('action', 'pid', 'products_id');
} else {
$parameters = array('action', 'pid');
}
}

上記の個所のすぐ下に、
///////////////////////////////////////// Products Multi //////////////////////
if ($HTTP_GET_VARS['action'] == 'add_multi') {
$parameters = array('action', 'pid', 'products_id');
}#
///////////////////////////////////////// Products Multi //////////////////////
を追加しました。

1-2:2か所目
switch ($HTTP_GET_VARS['action']) {

上記の個所のすぐ下に、
///////////////////////////////////////// Products Multi //////////////////////
// multi_product_add
case 'add_multi':
for ($i=0; $i<=sizeof($HTTP_POST_VARS['products_id']);$i++) {
if($_POST['add_id'][$i] >= 1)
$cart->add_cart($HTTP_POST_VARS['products_id'][$i], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'][$i], $HTTP_POST_VARS['id'][$i]))+($HTTP_POST_VARS['add_id'][$i]), $HTTP_POST_VARS['id'][$i]);
}
tep_redirect(tep_href_link(FILENAME_DEFAULT, tep_get_all_get_params($parameters), 'NONSSL'));
break;
///////////////////////////////////////// Products Multi //////////////////////
を追加しました。


2.product_listing_multi.php を product_listing.php にリネーム

catalog/includes/filenames.php ファイルの中にある

define('FILENAME_PRODUCT_LISTING', 'product_listing.php');

の行を

define('FILENAME_PRODUCT_LISTING', 'product_listing_multi.php')

と置き換えるようにと書かれていたのですが、
filenames.php というファイルが見つからなかったため、
product_listing_multi.php を product_listing.php にリネームしました。



●2つ目のアーカイブ「 Simplified Add Multi 」

1.includes/application_top.php の修正

1-1:1か所目
if (isset($HTTP_GET_VARS['action'])) {
if (DISPLAY_CART == 'true') {
$goto = FILENAME_SHOPPING_CART;
$parameters = array('action', 'cPath', 'products_id', 'pid');
} else {
$goto = basename($PHP_SELF);
if ($HTTP_GET_VARS['action'] == 'buy_now') {
$parameters = array('action', 'pid', 'products_id');
} else {
$parameters = array('action', 'pid');
}
}

上記の個所のすぐ下に、
///////////////////////////////////////// Products Multi //////////////////////
if ($HTTP_GET_VARS['action'] == 'add_multi') {
$parameters = array('action', 'pid', 'products_id');
}
///////////////////////////////////////// Products Multi //////////////////////
を追加しました。

1-2:2か所目

switch ($HTTP_GET_VARS['action']) {

上記の個所のすぐ下に、
///////////////////////////////////////// Products Multi //////////////////////
// multi_product_add
case 'add_multi':
for ($i=0; $i<=sizeof($HTTP_POST_VARS['products_id']);$i++) {
if($_POST['add_id'][$i] >= 1)
$cart->add_cart($HTTP_POST_VARS['products_id'][$i], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'][$i], $HTTP_POST_VARS['id'][$i]))+($HTTP_POST_VARS['add_id'][$i]), $HTTP_POST_VARS['id'][$i]);
}
tep_redirect(tep_href_link(FILENAME_DEFAULT, tep_get_all_get_params($parameters), 'NONSSL'));
break;
///////////////////////////////////////// Products Multi //////////////////////
を追加しました。


2.includes/modules/product_listing.php の修正
product_listing.php は、「Bug fix release (v1.2)」の時に
導入したファイルを使用しました。

これは、修正箇所のソースは、元のファイルには存在せず、
「Bug fix release (v1.2)」で置き換えたファイルには存在してるためです。

2-1:1か所目

Released under the GNU General Public License
*/

$listing_split = new splitPageResults($listing_sql, MAX_DISPLAY_SEARCH_RESULTS, 'p.products_id');

if ( ($listing_split->number_of_rows > 0) && ( (PREV_NEXT_BAR_LOCATION == '1') || (PREV_NEXT_BAR_LOCATION == '3') ) ) {
?>

上記の個所を、下記に置き換えました。

Released under the GNU General Public License
*/
?>
<form name="cart_multi" method="post" action="<?php echo tep_href_link(FILENAME_SHOPPING_CART, tep_get_all_get_params(array('action')) . 'action=add_multi', 'NONSSL'); ?>">

<?php
$listing_split = new splitPageResults($listing_sql, MAX_DISPLAY_SEARCH_RESULTS, 'p.products_sort_order');
//echo $listing_sql;

if ( ($listing_split->number_of_rows > 0) && ( (PREV_NEXT_BAR_LOCATION == '1') || (PREV_NEXT_BAR_LOCATION == '3') ) ) {
?>

2-2:2か所目

$lc_text = '<a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=buy_now&products_id=' . $listing['products_id']) . '">' . tep_image_button('button_buy_now.gif', IMAGE_BUTTON_BUY_NOW) . '</a>&nbsp;';

上記の個所を下記に置き換えるようにと書かれていました。

$lc_text = '<input type="text" name="add_id['.$number_of_products.']" value="" size="4">';
$lc_text .= '<input type="hidden" name="products_id['.$number_of_products.']" value="'.$listing['products_id'].'">';

しかし、上記の個所はコメントアウトされ、下記の置き換える箇所には

$lc_text = '<input type="text" name="add_id['.$number_of_products.']" value="0" size="4">';
$lc_text .= '<input type="hidden" name="products_id['.$number_of_products.']" value="'.$listing['products_id'].'">';

というソースが貼られていたので、置き換えるよう指示されたものに置き換えしました。

もう一か所、修正の指示がありましたが、
既に修正済みの状態になっておりました。



●3つ目のアーカイブ「 corrections 」

1.includes/application_top.php の修正

1-1:1か所目
if (isset($HTTP_GET_VARS['actnion'])) {
if (DISPLAY_CART == 'true') {
$goto = FILENAME_SHOPPING_CART;
$parameters = array('action', 'cPath', 'products_id', 'pid');
} else {
$goto = basename($PHP_SELF);
if ($HTTP_GET_VARS['action'] == 'buy_now') {
$parameters = array('action', 'pid', 'products_id');
} else {
$parameters = array('action', 'pid');
}
}

上記の個所のすぐ下に、
///////////////////////////////////////// Products Multi //////////////////////
if ($HTTP_GET_VARS['action'] == 'add_multi') {
$parameters = array('action', 'pid', 'products_id');
}
///////////////////////////////////////// Products Multi //////////////////////
を追加しました。

1-2:2か所目

switch ($HTTP_GET_VARS['action']) {

上記の個所のすぐ下に
///////////////////////////////////////// Products Multi //////////////////////
// multi_product_add
case 'add_multi':
for ($i=0; $i<=sizeof($HTTP_POST_VARS['products_id']);$i++) {
if($_POST['add_id'][$i] >= 1)
$cart->add_cart($HTTP_POST_VARS['products_id'][$i], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'][$i], $HTTP_POST_VARS['id'][$i]))+($HTTP_POST_VARS['add_id'][$i]), $HTTP_POST_VARS['id'][$i]);
}
tep_redirect(tep_href_link(FILENAME_DEFAULT, tep_get_all_get_params($parameters), 'NONSSL'));
break;
///////////////////////////////////////// Products Multi //////////////////////
を追加しました。


2.includes/modules/product_listing.php の修正
product_listing.php は、「Bug fix release (v1.2)」の時に
導入したファイルを使用しました。
「Simplified Add Multi」で使用したファイルは使用していません。

2-1:1か所目

Released under the GNU General Public License
*/

$listing_split = new splitPageResults($listing_sql, MAX_DISPLAY_SEARCH_RESULTS, 'p.products_id');

if ( ($listing_split->number_of_rows > 0) && ( (PREV_NEXT_BAR_LOCATION == '1') || (PREV_NEXT_BAR_LOCATION == '3') ) ) {
?>

上記の個所を、下記に置き換えました。

Released under the GNU General Public License
*/
?>
<form name="cart_multi" method="post" action="<?php echo tep_href_link(FILENAME_SHOPPING_CART, tep_get_all_get_params(array('action')) . 'action=add_multi', 'NONSSL'); ?>">

<?php
$listing_split = new splitPageResults($listing_sql, MAX_DISPLAY_SEARCH_RESULTS, 'p.products_id');
//echo $listing_sql;

if ( ($listing_split->number_of_rows > 0) && ( (PREV_NEXT_BAR_LOCATION == '1') || (PREV_NEXT_BAR_LOCATION == '3') ) ) {
?>

2-2:2か所目

$lc_text = '<a href="' . tep_href_link(basename($PHP_SELF), tep_get_all_get_params(array('action')) . 'action=buy_now&products_id=' . $listing['products_id']) . '">' . tep_image_button('button_buy_now.gif', IMAGE_BUTTON_BUY_NOW) . '</a>&nbsp;';

上記の個所を下記に置き換えるようにと書かれていました。

$lc_text = '<input type="text" name="add_id['.$number_of_products.']" value="" size="4">';
$lc_text .= '<input type="hidden" name="products_id['.$number_of_products.']" value="'.$listing[$x]['products_id'].'">';

しかし、上記の個所はコメントアウトされ、下記の置き換える箇所には

$lc_text = '<input type="text" name="add_id['.$number_of_products.']" value="0" size="4">';
$lc_text .= '<input type="hidden" name="products_id['.$number_of_products.']" value="'.$listing['products_id'].'">';

というソースが貼られていたので、置き換えるよう指示されたものに置き換えしました。


もう一か所、「corrections 」と同じ修正の指示がありましたが、
既に修正済みの状態になっておりました。


行った作業は以上になります。



作業を行った環境は以下の通りです。

osCommerce_jp : 2.2ms1j
サーバー OS: Linux 2.6.18-028stab060.2
データベース: MySQL 5.0.45
HTTP サーバー: Apache/2.2.3 (CentOS)
PHP バージョン: 5.1.6 (Zend: 2.1.0)


よろしくお願いいたします。
回复到 #44598

回复到 #45131×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登录

RE: 複数商品を1ボタンでカゴに入れる仕組みを作成したい (2009-07-25 12:02 by 神代 #45132)

#45131 の投稿は神代が投稿しました。
よろしくお願いいたします。
回复到 #44598

回复到 #45132×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登录

RE: 複数商品を1ボタンでカゴに入れる仕組みを作成したい (2009-07-27 16:41 by 匿名 #45158)

X-Sellもproduct_listing_multi.phpも使わないはず
なんだけどな

X-Sellはグループ化の例として書かれてるだけで
複数商品同時購入とかどこにも書いてない

filenames.phpはMS2以降のosCに含まれるファイルで
そもそも適合するバージョンが異なる模様
表示されない理由は主にこれだろ

MS1Jではapplication_top.phpが概ね相当

ただしグループ化しての表示を自前で行うなら
表示部であるproduct_listing_multi.php関連の
工事は必要ないと思う

必要な複数商品情報を投げるフォーム部と
データを受け取ってadd_cart処理する部分を
仕様を決めて自作しろとは読めないか?

add_cart()は単独投入しか考慮してないから
複数情報を受け取って回す処理を別に組まなきゃ
いけないという話なんだけど

case 'add_multi':
for ($i=0; $i<=sizeof($HTTP_POST_VARS['products_id']);$i++) {
if($_POST['add_id'][$i] >= 1)
$cart->add_cart($HTTP_POST_VARS['products_id'][$i], $cart->get_quantity(tep_get_uprid($HTTP_POST_VARS['products_id'][$i], $HTTP_POST_VARS['id'][$i]))+($HTTP_POST_VARS['add_id'][$i]), $HTTP_POST_VARS['id'][$i]);
}

例えばAdd Multiple Productsのこういう処理

自分の処理に適合するよう投げる側のフォームを
作りデータをまとめて投げるようにすれば良いと
思う

投げるフォームの作り方については
product_listing_multi.php
を参照すると良いと思う

勿論投げ方はAdd Multiple Products準拠でも
非準拠でもぜんぜん構わない

要はデータを正しく投げて受ければ良いだけ
自分の好きなように手で書けばいい
回复到 #45132

回复到 #45158×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登录