hamada
bungu****@leo*****
2004年 1月 28日 (水) 10:08:54 JST
こんにちわ。 この度当方もosCommerce 2.2 20021230版→MS1R5に移行するにあたり http://lists.sourceforge.jp/mailman/archives/tep-j-general/2003-June/000901.html の「全商品一覧HTML(静的)作成スクリプト mklist.php」を、MS1で動作するよ う修正しました。 当方AllProductsも併用してるんですが、クローラーやお客さんを呼び込む割合 を見るとどうもmklist.phpで静的生成したHTMLのほうが2〜3倍程度高い(負荷 も低い)ようなので、MS1に移行するならmklist.phpも移植せざるをえず。 (たぶん当方以外に実用されている方は居ないんだと思いますが:^^;) ・/catalog(default.phpと同じトコ)に設置 ・同じフォルダにlist.htmlというファイル(パーミッション666)がある ・./images/pixel_trans.gifという1x1の透明GIF画像がある ・「サーチエンジン対策のURLを使用(開発中)」がTrue ・日本語のみ ↑以上の環境を決め打ちしてます。で、cronで日に数度 php /var/www/html/catalog/mklist.php > /dev/null 2>&1 とかしてファイル生成を行う、と。 MS1ではリンクが改良されてまして /catalog/product_info.php/products_id/481 という単純形式のリンクでもちゃんとカテゴリーの階層を辿った /catalog/product_info.php/cPath/22_246_99/products_id/481 という(cPath=カテゴリの付いた)リンクと同等のサイドバー表示が行われる ようになってるみたいなんですが、残念ながらカテゴリーは /catalog/default.php/cPath/99 としても /catalog/default.php/cPath/22_246_99 と同様の表示にはしてくれないみたい(当たり前?)なんで、従来と同様に tep_get_product_path() を使い、各商品のカテゴリーパスを取得するようにしてます。 MS1のtep_db_fetch_array()は > return mysql_fetch_array($db_query, MYSQL_ASSOC); →連想添字の配列にしか値を入れてくれないようになってるんですが当方コレに なかなか気付けず、結構ハマりました。まぁ数値添字なんてのはバグの温床にな りますから、使わないに越したことはないんでしょうけど。 例によってHeadertags併用推奨ですが、 http://lists.sourceforge.jp/mailman/archives/tep-j-general/2003-August/001082.html ↑こちらのishiiさんのやり方も簡単で良いですね。実にシンプルに必要事項を 満たしておられまして、感心します。 はまだ mklist.php ------------------------------------------------------- <?php require('includes/application_top.php'); //スクリプトと同じパスにあるlist.htmlを開く $fp=fopen("list.html","w") or die("ファイルのオープンに失敗しました"); flock($fp,2); //書き込みに備えてファイルロック fwrite($fp,"<!doctype html public \"-//W3C//DTD HTML 4.01 Transitional//EN\">" ."\n"); fwrite($fp,"<html " . HTML_PARAMS . ">" ."\n"); fwrite($fp,"<head>" ."\n"); fwrite($fp,"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=" . CHARSET . "\">" ."\n"); //ロボットに一覧表をキャッシュさせたい場合はコメントアウト fwrite($fp,"<META NAME=\"ROBOTS\" CONTENT=\"NOARCHIVE\">" ."\n"); //スタイル指定の出力。適当に変えてください。 fwrite($fp,"<style TYPE=\"text/css\">" ."\n"); fwrite($fp,"<!--" ."\n"); fwrite($fp,"BODY { color: #444455;" ."\n"); fwrite($fp," background-color : #fafaff;}" ."\n"); fwrite($fp,"a:hover { color: #FF0000;" ."\n"); fwrite($fp," text-decoration: underline;}" ."\n"); fwrite($fp,"a:link { color: #3333ff;" ."\n"); fwrite($fp," text-decoration: none;}" ."\n"); fwrite($fp,"-->" ."\n"); fwrite($fp,"</style>" ."\n"); fwrite($fp,"<title>" . TITLE . " 全商品一覧</title>" ."\n"); fwrite($fp,"</head>" ."\n"); fwrite($fp,"" ."\n"); fwrite($fp," -- ココにヘッダー相当部分を記述 -- " ."\n"); fwrite($fp,"" ."\n"); //更新日付を出力。ついでに戻り先(top)として定義 $today = date("Y/m/d(D) H:i T"); //ジャンルを重複して登録された商品に付ける接頭記号 $redundancy = "◆"; //更新日付&検索フォームを生成 fwrite($fp,"<BLOCKQUOTE>" ."\n"); fwrite($fp,"<table width=\"640\"><tbody><tr><td>" ."\n"); fwrite($fp,"<form name=\"quick_find\" method=\"get\" action=\"advanced_search_result.php\">" ."\n"); //説明文からの検索が不要な場合はコメントアウト fwrite($fp,"<input type=\"hidden\" name=\"search_in_description\" value=\"1\">" ."\n"); fwrite($fp,"<input type=\"text\" name=\"keywords\" size=\"18\" maxlength=\"30\" value=\"\">" ."\n"); fwrite($fp,"<a href=\"advanced_search.php\"><b>商品検索</b></a></form>" ."\n"); fwrite($fp,"<TD align=\"right\">" ."\n"); fwrite($fp,"<A name=\"top\">リスト更新:$today</a></td>" ."\n"); fwrite($fp,"</td></tr></tbody></table>" ."\n"); // fwrite($fp,"</BLOCKQUOTE>" ."\n"); fwrite($fp,"\n"); //メーカー一覧表を生成。 //メーカー一覧表の幅や色等は直接指定してます→適当に書き換えてください。 $result = tep_db_query("SELECT manufacturers_id, manufacturers_name FROM manufacturers ORDER BY manufacturers_name"); //登録全メーカーを取得 $num_rows = tep_db_num_rows($result); //全メーカー数を取得 // fwrite($fp,"<BLOCKQUOTE>" ."\n"); fwrite($fp, "<table width=\"640\" border=\"0\" cellpadding=\"0\" cellspacing=\"1\" bgcolor=\"#f0f2ff\"><tbody>\n"); fwrite($fp,"<tr bgcolor=\"#dfe3ff\"><b>取扱いメーカー一覧</b> [" . $num_rows . "]</tr>" ."\n"); fwrite($fp,"<tr>" ."\n"); $i = 0; //列数カウンタをリセット while($row = tep_db_fetch_array($result)) { fwrite($fp, "<td>"); fwrite($fp, "<FONT size=\"1\"><a href=default.php/manufacturers_id/"); fwrite($fp, $row['manufacturers_id']); fwrite($fp, ">"); fwrite($fp, $row['manufacturers_name']); fwrite($fp, "</a></font>"); //下にメーカー一覧の列数をセット(デフォルトは5列) if($i+1 >= 5) { fwrite($fp, "</td></tr>\n<tr>\n"); $i = 0; }else { fwrite($fp, "</td>\n"); $i++; } } fwrite($fp, "</tr></tbody></table>\n<br>\n"); fwrite($fp,"</BLOCKQUOTE>" ."\n"); fwrite($fp,"<br>" ."\n"); //ここからメーカー毎商品の一覧作成。 //leftmargin="0"なので<blockquote>ではさむ fwrite($fp,"<BLOCKQUOTE>" ."\n"); fwrite($fp,"品名の先頭に" . $redundancy . "のついた商品は複数カテゴリーに(重複)登録されている商品です<br>" ."\n<br>\n"); //全メーカーをメーカー名順に取得 $result = tep_db_query("SELECT manufacturers_id, manufacturers_name FROM manufacturers ORDER BY manufacturers_name"); while ($myrow = tep_db_fetch_array($result)) { //メーカー毎の全商品を取得。カテゴリ→型番順 $products = tep_db_query("SELECT p.products_id, d.products_name, p.products_model, t.categories_id, c.categories_name, p.products_status FROM products p, products_description d, products_to_categories t, categories_description c WHERE p.manufacturers_id=" . $myrow['manufacturers_id'] . " and p.products_id=d.products_id and p.products_id=t.products_id and t.categories_id=c.categories_id ORDER BY c.categories_name , p.products_model"); $num_prod = tep_db_num_rows($products); //メーカー毎の商品数 //表の初期設定 $bgcolor = "#fafaff"; $bdcolor = "#bbbbbb"; $thcolor = "#eeeeee"; fwrite($fp,"<a href=default.php/manufacturers_id/" . $myrow['manufacturers_id'] . "><b>" . $myrow['manufacturers_name'] . "</b></a> [" . $num_prod . "]<br>" ."\n"); fwrite($fp,"<table bgcolor=\"" . $bgcolor . "\" border=\"1\" cellspacing=\"0\" cellpadding=\"1\" bordercolor=\"" . $bdcolor . "\">" ."\n"); fwrite($fp,"<tr><img height=\"1\" width=\"640\" src=\"images/pixel_trans.gif\"></tr>" ."\n"); fwrite($fp,"<tr bgcolor=\"" . $thcolor . "\"><th>品名</th><th>品番</th><th>カテゴリー</th></tr>" ."\n"); //ここから表の中身作成 while ($prod = tep_db_fetch_array($products)) { $p_path = tep_get_product_path($prod['products_id']); //商品のカテゴリーパス。重複登録されてるとnullが返る if ($prod['products_status'] == 0) //商品がオフ。 if ($p_path == "") //かつ重複登録商品 fwrite($fp,"<tr><td>" . $redundancy . $prod['products_id'] . "</td><td>" . $prod['products_model'] . "</td><td><a href=\"default.php/cPath/" . $prod['categories_id'] . "\">" . $prod['categories_name'] . "</a></td></tr>" ."\n"); else //重複登録商品ではない fwrite($fp,"<tr><td>" . $prod['products_name'] . "</td><td>" . $prod['products_model'] . "</td><td><a href=\"default.php/cPath/" . $p_path . "\">" . $prod['categories_name'] . "</a></td></tr>" ."\n"); //商品がオフでない。 elseif ($p_path == "") //重複登録商品はパスが取れない→単純パスで出力 fwrite($fp,"<tr><td>" . $redundancy . "<a href=\"product_info.php/products_id/". $prod['products_id'] ."\">" . $prod['products_name'] . "</a></td><td>" . $prod['products_model'] . "</td><td><a href=\"default.php/cPath/" . $prod['categories_id'] . "\">" . $prod['categories_name'] . "</a></td></tr>" ."\n"); else //それ以外。全部出力 fwrite($fp,"<tr><td><a href=\"product_info.php/cPath/" . $p_path . "/products_id/" . $prod['products_id'] . "\">" . $prod['products_name'] . "</a></td><td>" . $prod['products_model'] . "</td><td><a href=\"default.php/cPath/" . $p_path . "\">" . $prod['categories_name'] . "</a></td></tr>" ."\n"); } fwrite($fp,"</table>" ."\n"); fwrite($fp,"<A href=\"#top\">ページの先頭に戻る</A><br><br>" ."\n"); fwrite($fp,"" ."\n"); } fwrite($fp,"" ."\n"); fwrite($fp,"</BLOCKQUOTE>" ."\n"); fwrite($fp," 商品の入荷状況等により、予告なく販売を停止したり価格を改定する場合が有ります。" ."\n"); fwrite($fp,"<br>" ."\n"); fwrite($fp," -- ココにフッター相当部分を記述 -- " ."\n"); fwrite($fp,"</body>" ."\n"); fwrite($fp,"</html>" ."\n"); flock($fp,3); //ファイルロック解除 fclose($fp); //list.htmlをクローズ echo("Update works Completed!" . "\n"); ?>