NHIDとは?
「日本の古本屋」は、2015年リニューアルから書誌テーブルと商品テーブル類が分離されて、書誌テーブルのNHIDという日本の古本屋IDで書誌と商品が紐付けできるようになった。もっとも各書店が商品を掲載するときにこの紐付けは必須ではない。また書誌データがない書籍に関しては各書店が書誌データを申請することが可能になった。
このNHIDであるが、他のデータベースの書誌IDと何か変換の法則があるのだろうか。
書誌データの例
- NHID 2580360 (275F88)
- 版表示
- 書名 一古書肆の思い出
- ページ数 429p
- 書名よみ イチ コショシ ノ オモイデ
- サイズ(判型) 16cm
- 著者 反町茂雄 著
- 物理的属性
- 巻号 1 (修行時代)
- ISBN 4582762441
- シリーズ名 平凡社ライブラリー
- 資料種別 文字資料 : 普通活字
- シリーズ巻号
- 全国書誌番号 99019737
- 書名別名
- NACSIS-CATID BA36152682
- 書名別名よみ シュギョウ ジダイ
- 出版元 平凡社
- 初版年 1998.5
- 出版国 日本
この書誌に紐付けされた書籍は
http://www.kosho.or.jp/products/catalog_detail.php?nh_id=2580360
でアクセスできる。
http://www.kosho.or.jp/products/catalog_detail.php?isbn=4582762441
はだめだった。
「日本の古本屋」の商品データ
入力用フォームにはこれだけの項目がある。(表にするのが面倒なのでリストにしてある。一番上は見出し)
- ラベル 名前 最大文字数 備考
- 在庫カテゴリ book_flg
- ISBN isbn 17
- 成人指定 adult_flg
- 書名 name 1000 必須
- 巻号 volume 1000
- 版表示 edition 1000
- 書名よみ name_kana 1000
- 著者 author 1000
- 著者よみ author_kana 1000
- 出版元 publisher 1000
- 初版年 first_published_year_txt 50
- ページ数 quantity 1000
- サイズ(判型) size 1000
- 書名別名 alternate_titles 1000
- 書名別名よみ alternate_titles_kana 1000
- シリーズ名 series_titles 1000
- シリーズ巻号 series_titles_volume 1000
- レーベル名 label 100
- 物理的属性 attribute 1000
- ISSN issn 9
- ASIN asin 100
- 在庫ステータス status
- 自店用在庫管理コード product_code 100
- 保管場所 stock_place 100
- 刊行年 published_year_txt 50
- 冊数 sets_num 50
- セット販売商品 sets
- 共通コンディション classcategory_id1
- 解説 comment4 1000
- 税込価格 price02 8 必須
- 即決注文対象品 payment_oneclick
- 海外発送可不可 delivery_icon_id
- ゆうパック・宅配便 deliv_id
- ゆうメール・メール便 deliv_id02
- 本体価格 price01 8
- 担当者ID management_id
- 販売条件等 comment1 1000
- 支払方法 payment_icon_id
- 検索用キーワード comment3 1000
- 在庫ID product_id 自動付与
- オススメ product_status
- 自店コンディションコード shop_condition 100
- SKU sku 100
- 表示用タグ comment5 1000
- (分類コード) note1 1000
- 自店用コード1 code1 1000
- (自店分類) note2 1000
- 自店用コード2 code2 1000
- 自店用テキスト3 note3 1000
- 自店用コード3 code3 1000
- 自店用テキスト4 note4 1000
- 自店用コード4 code4 1000
- 自店用テキスト5 note5 1000
- 自店用コード5 code5 1000
- 抹消理由 destroyed_reason 1000
- 画像URL url_image 1024
- 在庫画像 main_large_image 1024
- サブ画像(1) sub_large_image1 1024
- サブ画像(1) sub_large_image2 1024
- サブ画像(1) sub_large_image3 1024
- サブ画像(1) sub_large_image4 1024
- サブ画像(1) sub_large_image5 1024
- リサイズなし画像 sub_large_image6 1024
まだ抜けているものがあるかもしれない。
EC-CUBE3に新規にページを追加する
前掲書 p169参照
- [コンテンツ管理]-[ページ管理]をクリック
- 一番下の「新規入力」をクリック
以下の内容を入力する
名称 FAQ URL http://ec-cube3-charlieting.c9users.io/html/user_data/faq ファイル名 /home/ubuntu/workspace/html/user_data/faq.twig 内容 {% extends 'default_frame.twig' %} {% block main %} <h1>FAQ</h1> <p>よくある質問</p> {% endblock %}
ファイルが作られた場所
/html/user_data/faq.twig
ブロックの作成と登録
ブロックの作成
『EC-CUBE 3 店舗運営&デザインカスタマイズガイド』 http://www.amazon.co.jp/dp/4899774389/ p. 163以降を参照して、ブロックを作成する
動作環境
- Cloud9
- PHP Version 5.5.9-1ubuntu4.20
- Apache/2.4.7
- EC-CUBE3.0.13
- PostgreSQL 9.3
手順
- [管理画面]-[コンテンツ管理]-[ブロック管理]の「新規入力」をクリック
ブロック名: コメント ファイル名: comment ブロックデータ: <p>ようこそ、EC-CUBE商店へ</p>
- 「登録」をクリック
ページに登録
- [コンテンツ管理]-[ページ管理]をクリック
- 「商品一覧ページ」の右側の「…」をクリックして「レイアウト編集」をクリック
- 「未使用ブロック」から「コメント」を#side_rightなどにドラッグアンドドロップする。
- 「登録」をクリックする。
ブロックが作成される場所
/app/template/default/Block/comment.twig
ブロックのテーブル
ブロックの情報は、dtb_block
にある。
eccube3=# select * from dtb_block; block_id | device_type_id | block_name | file_name | create_date | update_date | logic_flg | deletable_flg ----------+----------------+--------------+----------------+---------------------+---------------------+-----------+--------------- 1 | 10 | カテゴリ | category | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 1 | 0 2 | 10 | カゴの中 | cart | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 1 | 0 3 | 10 | 商品検索 | search_product | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 1 | 0 4 | 10 | 新着情報 | news | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 1 | 0 5 | 10 | ログイン | login | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 1 | 0 6 | 10 | ロゴ | logo | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 | 0 7 | 10 | フッター | footer | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 | 0 8 | 10 | 新着商品 | new_product | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 | 0 9 | 10 | フリーエリア | free | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 | 0 10 | 10 | ギャラリー | garally | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 | 0 12 | 10 | コメント | comment | 2017-01-24 22:39:56 | 2017-01-24 22:39:56 | 0 | 1 (11 rows)
block_idが12の行が新規登録した情報である。
ブロックデータでTwigの機能を使ってみる
先ほどのブロックcommentを用いてTwigの練習をしてみる。よくわからないのだが、このような感じらしい。変数名の前に$は不要らしい。
<p>ようこそ、EC-CUBE商店へ</p> {% set int = 1234 %} {{int}}
実行結果
ようこそ、EC-CUBE商店へ 1234
EC-CUBE3のテーブル構造(商品情報テーブルなど)
データベースに関する資料
EC-CUBE3のデータベースは複数のテーブルで構成されている。 データベースの構造については
- https://github.com/EC-CUBE/eccube3-doc/blob/master/ER-D_Physical.pdf
- https://github.com/EC-CUBE/eccube3-doc/blob/master/ER-D_Logical.pdf
- https://github.com/EC-CUBE/eccube3-doc/blob/master/%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E5%AE%9A%E7%BE%A9%E6%9B%B8(EC-CUBE2.13dev).xlsx
にある。(ただし、バージョン2.13用である) (なお、「EC-CUBE 3 開発ドキュメント」は https://github.com/EC-CUBE/ec-cube.github.io にある。)
例えば、店舗情報はdtb_base_infoテーブルに格納されている。
商品情報は、dtb_productテーブルなどにある。
テーブル情報の確認
eccube3=# \dt (結果は省略) eccube3=# \d dtb_base_info Table "public.dtb_base_info" Column | Type | Modifiers ------------------------------------+--------------------------------+----------------------- id | integer | not null country_id | smallint | pref | smallint | company_name | text | company_kana | text | zip01 | text | zip02 | text | zipcode | text | (以下省略) eccube3=# select * from dtb_base_info; id | country_id | pref | company_name | company_kana | zip01 | zip02 | zipcode | addr01 | addr02 | tel01 | tel02 | tel03 | fax01 | fax02 | fax03 | business_hour | email01 | email02 | email03 | email04 | shop_name | shop_kana | shop_name_eng | update_date | good_traded | message | latitude | longitude | delivery_free_amount | delivery_free_quantity | option_multiple_shipping | option_mypage_order_status_display | nostock_hidden | option_favorite_product | option_product_delivery_fee | option_product_tax_rule | option_customer_activate | option_remember_me | authentication_key ----+------------+------+--------------------+----------------------------------+-------+-------+---------+--------------------------------+------------------+-------+-------+-------+-------+-------+-------+---------------+-------------------+-------------------+-------------------+-------------------+--------------+------------------+---------------+---------------------+-------------+--------------------------------+----------+------------+----------------------+------------------------+--------------------------+------------------------------------+----------------+-------------------------+-----------------------------+-------------------------+--------------------------+--------------------+-------------------- 1 | | 13 | 株式会社sample書店 | カブシキガイシャサンプルショテン | 101 | 0051 | | 千代田区神田神保町99-999 | 神保町999ビル | 03 | 9999 | 9876 | 03 | 999 | 9999 | 10時~20時 | admin@example.com | admin@example.com | admin@example.com | admin@example.com | EC-CUBE SHOP | サンプルショテン | | 2017-01-24 17:11:43 | 古書籍 | テストです。中身はありませ ん。 | 35.70204 | 139.768027 | | | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | (1 row)
商品データは複数テーブルに分割
商品データは、EC-CUBE3では複数のテーブルに分割されている。product_id が外部キーになっている。
例
- dtb_product
- dtb_product_category
- dtb_product_tag
- dtb_product_class
- dtb_product_image
- dtb_product_stock
dtb_product
eccube3=# \d dtb_product Table "public.dtb_product" Column | Type | Modifiers --------------------+--------------------------------+-------------------- product_id | integer | not null creator_id | integer | not null status | smallint | name | text | not null note | text | description_list | text | description_detail | text | search_word | text | free_area | text | del_flg | smallint | not null default 0 create_date | timestamp(0) without time zone | not null update_date | timestamp(0) without time zone | not null Indexes: "dtb_product_pkey" PRIMARY KEY, btree (product_id) "idx_c49de22f61220ea6" btree (creator_id) "idx_c49de22f7b00651c" btree (status) Foreign-key constraints: "fk_c49de22f61220ea6" FOREIGN KEY (creator_id) REFERENCES dtb_member(member_id) "fk_c49de22f7b00651c" FOREIGN KEY (status) REFERENCES mtb_disp(id) Referenced by: TABLE "dtb_product_class" CONSTRAINT "fk_1a11d1ba4584665a" FOREIGN KEY (product_id) REFERENCES dtb_product(product_id) TABLE "dtb_product_image" CONSTRAINT "fk_3267cc7a4584665a" FOREIGN KEY (product_id) REFERENCES dtb_product(product_id) TABLE "dtb_product_tag" CONSTRAINT "fk_4433e7214584665a" FOREIGN KEY (product_id) REFERENCES dtb_product(product_id) TABLE "dtb_shipment_item" CONSTRAINT "fk_57c3c0394584665a" FOREIGN KEY (product_id) REFERENCES dtb_product(product_id) TABLE "dtb_order_detail" CONSTRAINT "fk_58fe35734584665a" FOREIGN KEY (product_id) REFERENCES dtb_product(product_id) : eccube3=# select * from dtb_product; product_id | creator_id | status | name | note | description_list | description_detail | search_word | free_area | del_flg | create_date | update_date ------------+------------+--------+------------------+------+------------------+------------------------------------------------------------------------------------------------------------------------------------+-------------+-----------+---------+---------------------+--------------------- 1 | 1 | 1 | ディナーフォーク | | | セットで揃えたいディナー用のカトラリー。 +| | | 0 | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | | | | | | 定番の銀製は、シルバー特有の美しい輝きと柔らかな曲線が特徴です。適度な重みと日本人の手に合いやすいサイズ感で長く愛用いただけます。+| | | | | | | | | | | 最高級プラチナフォークは、贈り物としても人気です。 | | | | | 2 | 1 | 1 | パーコレーター | | | +| | | 0 | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | | | | | | パーコレーターはコーヒーの粉をセットして直火にかけて抽出する器具です。 +| | | | | | | | | | | アウトドアでも淹れたてのコーヒーをお楽しみいただけます。 +| | | | | | | | | | | いまだけ、おいしい淹れ方の冊子つきです。 | | | | | (2 rows)
dtb_product_class
Table "public.dtb_product_class" Column | Type | Modifiers --------------------+--------------------------------+----------------------- product_class_id | integer | not null product_id | integer | not null product_type_id | smallint | not null class_category_id1 | integer | class_category_id2 | integer | delivery_date_id | integer | creator_id | integer | not null product_code | text | stock | numeric(10,0) | default NULL::numeric stock_unlimited | smallint | not null sale_limit | numeric(10,0) | default NULL::numeric price01 | numeric(10,0) | default NULL::numeric price02 | numeric(10,0) | not null delivery_fee | numeric(10,0) | default NULL::numeric create_date | timestamp(0) without time zone | not null update_date | timestamp(0) without time zone | not null del_flg | smallint | not null default 0 (以下省略) eccube3=# select * from dtb_product_class; product_class_id | product_id | product_type_id | class_category_id1 | class_category_id2 | delivery_date_id | creator_id | product_code | stock | stock_unlimited | sale_limit | price01 | price02 | delivery_fee | create_date | update_date | del_flg ------------------+------------+-----------------+--------------------+--------------------+------------------+------------+--------------+-------+-----------------+------------+---------+---------+--------------+---------------------+---------------------+--------- 0 | 1 | 1 | | | | 1 | fork-01 | | 1 | | 115000 | 110000 | | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 1 1 | 1 | 1 | 3 | 6 | | 1 | fork-01 | | 1 | | 115000 | 110000 | | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 2 | 1 | 1 | 3 | 5 | | 1 | fork-02 | | 1 | | 95000 | 93000 | | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 3 | 1 | 1 | 3 | 4 | | 1 | fork-03 | | 1 | | 75000 | 74000 | | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 4 | 1 | 1 | 2 | 6 | | 1 | fork-04 | | 1 | | 95000 | 93000 | | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 5 | 1 | 1 | 2 | 5 | | 1 | fork-05 | | 1 | | 50000 | 49000 | | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 6 | 1 | 1 | 2 | 4 | | 1 | fork-06 | | 1 | | 35000 | 34500 | | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 7 | 1 | 1 | 1 | 6 | | 1 | fork-07 | | 1 | | | 18000 | | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 8 | 1 | 1 | 1 | 5 | | 1 | fork-08 | | 1 | | | 13000 | | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 9 | 1 | 1 | 1 | 4 | | 1 | fork-09 | | 1 | | | 5000 | | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 10 | 2 | 1 | | | | 1 | cafe-01 | 100 | 0 | 5 | 3000 | 2800 | | 2017-01-19 14:27:02 | 2017-01-19 14:27:02 | 0 (11 rows)
dtb_product_image
eccube3=# \d dtb_product_image Table "public.dtb_product_image" Column | Type | Modifiers ------------------+--------------------------------+----------- product_image_id | integer | not null product_id | integer | not null creator_id | integer | not null file_name | text | not null rank | integer | not null create_date | timestamp(0) without time zone | not null Indexes: "dtb_product_image_pkey" PRIMARY KEY, btree (product_image_id) "idx_3267cc7a4584665a" btree (product_id) "idx_3267cc7a61220ea6" btree (creator_id) Foreign-key constraints: "fk_3267cc7a4584665a" FOREIGN KEY (product_id) REFERENCES dtb_product(product_id) "fk_3267cc7a61220ea6" FOREIGN KEY (creator_id) REFERENCES dtb_member(member_id) eccube3=# select * from dtb_product_image; product_image_id | product_id | creator_id | file_name | rank | create_date ------------------+------------+------------+------------+------+--------------------- 1 | 1 | 1 | fork-1.jpg | 1 | 2017-01-19 14:27:02 2 | 1 | 1 | fork-2.jpg | 2 | 2017-01-19 14:27:02 3 | 1 | 1 | fork-3.jpg | 3 | 2017-01-19 14:27:02 4 | 2 | 1 | cafe-1.jpg | 3 | 2017-01-19 14:27:02 5 | 2 | 1 | cafe-2.jpg | 3 | 2017-01-19 14:27:02 6 | 2 | 1 | cafe-3.jpg | 3 | 2017-01-19 14:27:02 (6 rows)
カスタマイズに向けて
既存のEC-CUBE3を古書店用にカスタマイズするためには、どうしたらいいのだろうか。
- 商品データのテーブルの列を拡張するには別途テーブルを作成してproduct_idで結合する、ということでよいのだろうか。
- 「日本の古本屋」の商品データは、どの列がEC-CUBEのどの列に対応しているのだろうか。(そもそも「日本の古本屋」はEC-CUBE2であると思われるが。)
- 「日本の古本屋」は商品テーブルのほかに書誌テーブルがあるが、後者をどのように実装するか。
Cloud9にEC-CUBE3.0.13をインストールする
HerokuでEC-CUBE3を数日間試してみたが、今後はCloud9を利用してカスタマイズしてみたいと思う。
なおPostgreSQLをCloud9にインストールするために参考にしたサイトは以下の通り。
- Setting up PostgreSQL - How To - Cloud9 Community
- Cloud9でPostgreSQLを利用しHerokuにRails5.xをデプロイした時の手順 - Qiita
- cloud9にEC-CUBE3をインストールしてみた - Qiita
Cloud9のWorkspaceを作成する
「Clone from Git or Mercurial URL (optional)」
には
https://github.com/EC-CUBE/ec-cube.git
を指定する。
「Choose a template」
には「PHP, Apache」を指定する。
Cloud9でPostgreSQLを設定する
Cloud9にEC-CUBE3をインストールするにあたって、データベースとしてPostgreSQLを利用することにする。 そこで、データベースをあらかじめ設定しておく。これはCloud9ではWorkspaceごとに設定する必要があるので注意。
~/workspace $ sudo service postgresql start * Starting PostgreSQL 9.3 database server ...done. ~/workspace $ createdb eccube3 --locale=C --encoding=UTF8 --template=template0 ~/workspace $ psql -l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+-----------+---------+-------+----------------------- eccube3 | ubuntu | UTF8 | C | C | ~/workspace $ psql psql (9.3.14) Type "help" for help. ubuntu=# \password ubuntu Enter new password: Enter it again: ubuntu=# \q ~/workspace $
EC-CUBE3をインストールする
eccube_install.sh
を開き、
61行目以降を編集
export ROOT_URLPATH=${ROOT_URLPATH:-"/html"}
71行目以降を編集
export DBSERVER=${DBSERVER-"0.0.0.0"} export DBNAME=${DBNAME:-"eccube3"} export DBUSER=${DBUSER:-"ubuntu"} export DBPASS=${DBPASS:-"password"}
eccube_install.sh
を上書き保存する。その後以下の通り実行。
~/workspace $ sh eccube_install.sh pgsql (中略) execute optional SQL... cache:clear success Finished Successful! ~/workspace (master) $
最後のほうで
dropdb... psql: FATAL: Peer authentication failed for user "postgres" createdb... psql: FATAL: Peer authentication failed for user "postgres"
と出るのだがいいのだろうか。
なお、インストールをやり直す場合はdropdb データベース名
のあと再度データベースを作成してeccube_install.sh
を実行すればよい。たぶん。
Apacheの起動
メニューの「Run Project」をクリックすると、Apacheが起動する。
URLの後ろに/html/
を追加するとEC-CUBEにアクセスできる。
install.phpを使えなくする
~/workspace (master) $ cd html/ ~/workspace/html (master) $ chmod 000 install.php
商品用テーブルの構成
EC-CUBE3に実際の書籍
を登録してみた。
登録した商品のcsvファイルをダウンロードしたところ、EC-CUBE3のデフォルトで出力されるのは以下の項目である。
- 商品ID : 3
- 公開ステータス(ID) : 1
- 公開ステータス(名称) : 公開
- 商品名 : 一古書肆の思い出 1巻
- ショップ用メモ欄 :
- 商品説明(一覧) :
- 商品説明(詳細) : "テストです 反町茂雄 著、出版年月 1986/01、ISBN 9784582486315、判型・ページ数 4-6 428ページ"
- 検索ワード :
- フリーエリア :
- 商品規格ID : 11
- 商品種別(ID) : 1
- 商品種別(名称) : 商品種別A
- 規格分類1(ID) :
- 規格分類1(名称) :
- 規格分類2(ID) :
- 規格分類2(名称) :
- 発送日目安(ID) :
- 発送日目安(名称) :
- 商品コード : 9784582486315
- 在庫数 : 1
- 在庫数無制限フラグ : 0
- 販売制限数 :
- 通常価格 :
- 販売価格 : 1000
- 商品画像 : 0119162042_588068ca89aed.jpg
- 商品カテゴリ(ID) :
- 商品カテゴリ(名称) :
- タグ(ID) :
- タグ(名称) :
「日本の古本屋」の商品データはEC-CUBE3のデフォルトと比べると約2倍の項目がある。以下、日本の古本屋の場合。
- 書名
- 税込価格
- 販売先
- 即決注文対象品
- 配送方法
- 在庫カテゴリ
- 共通コンディション
- 解説
- 販売条件等
- 検索用キーワード
- 表示用タグ
- セット販売商品
- 成人指定
- 冊数
- 在庫ステータス
- 画像URL
- 自店用在庫管理コード
- 保管場所
- 抹消理由
- NHID
- ISBN
- ISSN
- 書名よみ
- 著者
- 著者よみ
- 出版元
- 巻号
- 書名別名
- 書名別名よみ
- シリーズ名
- シリーズ巻号
- レーベル名
- 版表示
- 初版年
- 刊行年
- 物理的属性
- ページ数
- サイズ(判型)
- 大分類名称1
- 大分類名称2
- 大分類名称3
- 小分類名称1
- 小分類名称2
- 小分類名称3
- 自店コンディションコード
- オススメ
- 特にオススメ
- 本体価格
- 自店用テキスト1
- 自店用テキスト2
- 自店用テキスト3
- 自店用テキスト4
- 自店用テキスト5
- 自店用コード1
- 自店用コード2
- 自店用コード3
- 自店用コード4
- 自店用コード5
- SKU
- ASIN
- Amazonコンディションコード
- セットものマスタ作成
- NHマスタ候補
- 在庫ID
- 削除フラグ
- 登録担当者
- 登録日
「日本の古本屋」の「在庫ID」は、EC-CUBE3の「商品ID」に相当する。両IDとも自動的に付与されるAUTOINCREMENT(オートナンバー型)である。
今後は、EC-CUBE3をcloud9にインストールしたうえでカスタマイズをしてみたいと思う。