一覧ページに拡張テーブルの項目を追加する

困った時はこちらで質問してください。回答を担当する人は特に決まっていませんので、分かる方は回答をお願いします。
アバター
wakaba99
記事: 22
登録日時: 2010/8/09 13:59

一覧ページに拡張テーブルの項目を追加する

投稿記事by wakaba99 » 2010/10/07 17:56

product_book_extraを作成し、項目を拡張しています。

商品情報詳細ページ(tpl_product_book_info_display.php)へ
DB項目を読み込むphpはmain_template_vars.php ですが、
全商品一覧・新着一覧・おすすめ一覧および、トップページに表示する 新商品・おすすめ・もうすぐ入荷 の欄に、
拡張テーブルから追加した項目を読み込むためにはどのphpを修正すればいいのでしょうか。

main_template_vars.php に記述している以下のようなソースをどこかに
書き込めばいいと思うのですが該当ファイルがわかりませんでした :(
よろしくお願いいたします。

コード: 全て選択

   $sql = "select * from " . TABLE_PRODUCT_BOOK_EXTRA . "
            where products_id = '" . (int)$_GET['products_id'] . "'";
    $book_extras = $db->Execute($sql);
    $book_test = $book_extras->fields['test'];

項目を呼び出したいphp
 tpl_modules_featured_products.php
 tpl_modules_upcoming_products.php
 tpl_modules_whats_new.php
 tpl_modules_products_all_listing.php
 tpl_modules_products_featured_listing.php
 tpl_modules_products_new_listing.php
アバター
kimono
記事: 1995
登録日時: 2005/9/27 13:30
お住まい: 大阪府大阪市天王寺区上本町
連絡を取る:

Re: 一覧ページに拡張テーブルの項目を追加する

投稿記事by kimono » 2010/10/11 17:01

こんにちわ。kimonoです :)

ページの新着なら、
includes/modules/pages/products_new/header_php.php
トップページの新着なら
includes/modules/new_products.php

という感じになっていると思いますね。
アバター
wakaba99
記事: 22
登録日時: 2010/8/09 13:59

Re: 一覧ページに拡張テーブルの項目を追加する

投稿記事by wakaba99 » 2010/10/12 12:01

お世話になっております。wakaba99です。

新着一覧ページ /index.php?main_page=products_new
(テンプレートは tpl_modules_products_new_listing.php)
に追加項目を表示するためには、
includes/modules/pages/products_new/header_php.php
にDBを読み込むソースを記述するという理解で合っていますか?

該当phpの最後にソースを追加したのですが、$book_test の値は表示されないままでした。

私の理解が間違っているのでしょうか?
アバター
wakaba99
記事: 22
登録日時: 2010/8/09 13:59

Re: 一覧ページに拡張テーブルの項目を追加する

投稿記事by wakaba99 » 2010/10/12 13:25

追記です。

コード: 全て選択

   $sql = "select * from " . TABLE_PRODUCT_BOOK_EXTRA . "
            where products_id = '" . (int)$_GET['products_id'] . "'";
    $book_extras = $db->Execute($sql);
    $book_test = $book_extras->fields['test'];

のソースをtpl_modules_products_new_listing.phpに記述してみたところ、やはり読み込み失敗という結果に……。

何か根本的に間違えている気がしてきたのですがどうすればいいのか解りません。
もう少し悩んでみます… :|
アバター
kimono
記事: 1995
登録日時: 2005/9/27 13:30
お住まい: 大阪府大阪市天王寺区上本町
連絡を取る:

Re: 一覧ページに拡張テーブルの項目を追加する

投稿記事by kimono » 2010/10/12 14:08

$products_new_query_raw
にて、TABLE_MANUFACTURERSとかTABLE_PRODUCTS_DESCRIPTIONみたいにリレーションで追加したらいいのではないでしょうか?

もしかしたら、違うかも?
こっちかな?

includes/index_filters/default_filter.php
でデーターベースを作り、
includes/modules/product_listing.php
にて生成しているかな。
アバター
mmochi
記事: 328
登録日時: 2006/9/04 12:53
お住まい: 静岡県静岡市
連絡を取る:

Re: 一覧ページに拡張テーブルの項目を追加する

投稿記事by mmochi » 2010/10/13 09:34

mmochiです。

一例だけ。

tpl_modules_featured_products.php
の場合。

まず上記ファイルのコードを見ます。

コード: 全て選択

require($template->get_template_dir('tpl_columnar_display.php',DIR_WS_TEMPLATE, $current_page_base,'common'). '/tpl_columnar_display.php');
という記述があります。ここから
includes/templates/template_default/common/tpl_columnar_display.php
のファイルを読み込んでいることが分かります。

次に上記で読み込んでいるファイルのコードを見ます。

コード: 全て選択

<?php
    for($col=0;$col<sizeof($list_box_contents[$row]);$col++) {
      $r_params = "";
      if (isset($list_box_contents[$row][$col]['params'])) $r_params .= ' ' . (string)$list_box_contents[$row][$col]['params'];
     if (isset($list_box_contents[$row][$col]['text'])) {
?>
    <?php echo '<div' . $r_params . '>' . $list_box_contents[$row][$col]['text'] .  '</div>' . "\n"; ?>
<?php
      }
    }
?>
ここから、$list_box_contentsという配列の中身をループして取り出していることが分かります。

次に$list_box_contentsという配列を生成しているところを探します。
(探し方はgrepぽい検索が出来るエディタ等で。割愛します。)
includes/modules/featured_products.php
で生成していることが分かります。

つまり、
includes/modules/featured_products.php
で表示したい値を取得すれば良いのですが、その取得した値を配列に格納しなければ表示されないということです。
配列に格納している部分は53行目付近で、この中の

コード: 全て選択

'text' =>
の中身が表示されるデータになります。

#追記
templateはご自分の環境に置き換えてください。
(実際に触るファイルもtemplate名でオーバーライドさせた方が良いです)
他の箇所で表示させたい場合もほぼ同じ要領で出来ますので試してみてください。
mmochi
ブログ http://blog.andplus.net/
株式会社あんどぷらす http://www.andplus.net/
アバター
wakaba99
記事: 22
登録日時: 2010/8/09 13:59

Re: 一覧ページに拡張テーブルの項目を追加する

投稿記事by wakaba99 » 2010/10/15 12:11

おはようございます。
kimono様、mmochi様、返信ありがとうございます。
しばらくzencartにさわれずにいたので返信が遅くなり申し訳ありません。

kimono様
$products_new_query_raw
にて、TABLE_MANUFACTURERSとかTABLE_PRODUCTS_DESCRIPTIONみたいにリレーションで追加したらいいのではないでしょうか?
は、以下の部分でしょうか?

コード: 全て選択

  $products_new_query_raw = "SELECT p.products_id, p.products_type, pd.products_name, p.products_image, p.products_price,
                                    p.products_tax_class_id, p.products_date_added, m.manufacturers_name, p.products_model,
                                    p.products_quantity, p.products_weight, p.product_is_call
                             FROM " . TABLE_PRODUCTS . " p
                             LEFT JOIN " . TABLE_MANUFACTURERS . " m
                             ON (p.manufacturers_id = m.manufacturers_id), " . TABLE_PRODUCTS_DESCRIPTION . " pd
                             WHERE p.products_status = 1
                             AND p.products_id = pd.products_id
                             AND pd.language_id = :languageID " . $display_limit . $order_by;

  $products_new_query_raw = $db->bindVars($products_new_query_raw, ':languageID', $_SESSION['languages_id'], 'integer');

ものすごく初歩的な質問をして申し訳ありませんが、ここのp.やpd.はどのような役割を果たしているものなのでしょうか。
続く文のテーブルを呼んでいる部分のpやpdと関係あるのだろうなと推測はできるのですが、SQL文のパラメータ(?)のようなものでしょうか?

includes/index_filters/default_filter.php
でデーターベースを作り、
includes/modules/product_listing.php
にて生成しているかな。
default_filter.phpでリストに読み込む内容をDBから取得してproduct_listing.phpで吐き出しているという理解であってますか?
ソースが長くて気圧されますが上から順に流れを追ってみます。ありがとうございます。

mmochi様
手順まで示して下さりありがとうございます。

'text' => の最後に $book_test = $book_extras->fields['test'] を
追加するために、拡張テーブルから項目を読み込むためにSELECTする部分について、以下のソースに新しくelseを追加(?)すればいいのでしょうか?

コード: 全て選択

if ( (!isset($new_products_category_id)) || ($new_products_category_id == '0') ) {
  $new_products_query = "select p.products_id, p.products_image, p.products_tax_class_id, p.products_price, p.products_date_added
                           from " . TABLE_PRODUCTS . " p
                           where p.products_status = 1 " . $display_limit;
} else {
  $new_products_query = "select distinct p.products_id, p.products_image, p.products_tax_class_id, p.products_date_added,
                                           p.products_price
                           from " . TABLE_PRODUCTS . " p
                           left join " . TABLE_SPECIALS . " s
                           on p.products_id = s.products_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " .
  TABLE_CATEGORIES . " c
                           where p.products_id = p2c.products_id
                           and p2c.categories_id = c.categories_id
                           and c.parent_id = '" . (int)$new_products_category_id . "'
                           and p.products_status = 1 " . $display_limit;
}

何となくですが、一覧(リスト)よりはトップページに項目を追加するほうがまだ理解の範疇にある気がします。
リストのほうはかなり難航しそうです…。
アバター
wakaba99
記事: 22
登録日時: 2010/8/09 13:59

Re: 一覧ページに拡張テーブルの項目を追加する

投稿記事by wakaba99 » 2010/10/15 14:31

自己レスです。トップページの新着商品について、追加項目表示に成功しました。
一覧のほうはまだですが…。

viewtopic.php?f=2&t=4748
こちらを参考に、ソースを

コード: 全て選択

if ( (!isset($new_products_category_id)) || ($new_products_category_id == '0') ) {
  $new_products_query = "select p.products_id, p.products_image, p.products_tax_class_id, p.products_price, p.products_date_added
                           from " . TABLE_PRODUCTS . " p
                           where p.products_status = 1 " . $display_limit;
} else {
  $new_products_query = "select distinct p.products_id, p.products_image, p.products_tax_class_id, p.products_date_added,
                                           p.products_price
                           from " . TABLE_PRODUCTS . " p
                           left join " . TABLE_SPECIALS . " s
                           on p.products_id = s.products_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " .
  TABLE_CATEGORIES . " c
                           where p.products_id = p2c.products_id
                           and p2c.categories_id = c.categories_id
                           and c.parent_id = '" . (int)$new_products_category_id . "'
                           and p.products_status = 1 " . $display_limit;
}

から

コード: 全て選択

if ( (!isset($new_products_category_id)) || ($new_products_category_id == '0') ) {
  $new_products_query = "select p.products_id, p.products_image, p.products_tax_class_id, p.products_price, p.products_date_added, e.test
                           from " . TABLE_PRODUCTS . " p
                           left join ". TABLE_PRODUCT_BOOK_EXTRA ." e
                           on (p.products_id = e.products_id)
                           where p.products_status = 1 " . $display_limit;
} else {
  $new_products_query = "select distinct p.products_id, p.products_image, p.products_tax_class_id, p.products_date_added,, e.test,
                                           p.products_price
                           from " . TABLE_PRODUCTS . " p
                           left join " . TABLE_SPECIALS . " s
                           on p.products_id = s.products_id
                           left join ". TABLE_PRODUCT_BOOK_EXTRA ." e
                           on (p.products_id = e.products_id), " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " .
  TABLE_CATEGORIES . " c
                           where p.products_id = p2c.products_id
                           and p2c.categories_id = c.categories_id
                           and c.parent_id = '" . (int)$new_products_category_id . "'
                           and p.products_status = 1 " . $display_limit;
}

コード: 全て選択

$book_test = $new_products->fields['test']

としました。

p.とかpd.のことをスキーマというのですね。
TABLEのあとの一文字を使用するのが慣例みたいなので今回はe.としました。

よく見たら参考にした過去ログの書き込みもmmochiさんでしたね :P
過去ログでもお世話になっています(笑)

引き続き一覧ページの解析に入ります。
アバター
wakaba99
記事: 22
登録日時: 2010/8/09 13:59

Re: 一覧ページに拡張テーブルの項目を追加する

投稿記事by wakaba99 » 2010/10/21 14:26

自己レスです。

(新着一覧の例)
includes/modules/pages/products_new/header_php.php

コード: 全て選択

  $products_new_query_raw = "SELECT p.products_id, p.products_type, pd.products_name, p.products_image, p.products_price,
                                    p.products_tax_class_id, p.products_date_added, m.manufacturers_name, p.products_model,
                                    p.products_quantity, p.products_weight, p.product_is_call
                             FROM " . TABLE_PRODUCTS . " p
                             LEFT JOIN " . TABLE_MANUFACTURERS . " m
                             ON (p.manufacturers_id = m.manufacturers_id), " . TABLE_PRODUCTS_DESCRIPTION . " pd
から

コード: 全て選択

  $products_new_query_raw = "SELECT p.products_id, p.products_type, pd.products_name, p.products_image, p.products_price,
                                    p.products_tax_class_id, p.products_date_added, m.manufacturers_name, p.products_model,
                                    p.products_quantity, p.products_weight, p.product_is_call, e.test
                             FROM " . TABLE_PRODUCTS . " p
                             LEFT JOIN " . TABLE_MANUFACTURERS . " m
                             ON (p.manufacturers_id = m.manufacturers_id)

                             LEFT JOIN " . TABLE_PRODUCT_BOOK_EXTRA . " e
                             ON (p.products_id = e.products_id)

, " . TABLE_PRODUCTS_DESCRIPTION . " pd
と書き換え、
tpl_modules_products_new_listing.php

コード: 全て選択

$products_new->fields['test']
とすることで追加テーブルの項目を読み出すことができました!

もう少しスマートな書き方もある気はしますが、ひとまずこれで解決としたいと思います。
ありがとうございました。

“Zen Cart 質問コーナー” へ戻る