<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/cafemilk/">
    <title>cafemilk @ ウィキ</title>
    <link>http://w.atwiki.jp/cafemilk/</link>
    <atom:link href="https://w.atwiki.jp/cafemilk/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>cafemilk @ ウィキ</description>

    <dc:language>ja</dc:language>
    <dc:date>2010-10-23T20:16:17+09:00</dc:date>
    <utime>1287832577</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/cafemilk/pages/23.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/cafemilk/pages/21.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/cafemilk/pages/32.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/cafemilk/pages/2.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/cafemilk/pages/1.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/cafemilk/pages/31.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/cafemilk/pages/30.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/cafemilk/pages/29.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/cafemilk/pages/28.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/cafemilk/pages/27.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/cafemilk/pages/23.html">
    <title>インストール その他</title>
    <link>https://w.atwiki.jp/cafemilk/pages/23.html</link>
    <description>
      *その他
-手っ取り早く本運用に進めるための情報です。
**ドメイントップを main.cgi にしたい
-通常ドメインのトップは index.html と相場が決まっていますが、サーバによってはアクセスコントロールファイル (.haccess) を用いるとドメイントップのファイル名を変更することができます。
-.haccess に記述する内容は以下の通りです。
&gt;DirectoryIndex main.cgi

**CGI であることを隠蔽したい 1
-サーバによってはアクセスコントロールファイル (.haccess) を用いると、完全に隠蔽とはいきませんが、拡張子.cgiをなくした状態での運用が可能です。
-.haccess に記述する内容は以下の通りです。
&gt;&lt;Files &quot;main&quot;&gt;
&gt;ForceType cgi-script
&gt;&lt;/Files&gt;
-これにあわせて設定を変更します。
-設定ファイルの位置は以下のようになります。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[config]}
&gt;&amp;tt(){　 　　 　　└　[common]}
&gt;&amp;tt(){　 　　 　　 　　└　config_common.pl}
-以下のように設定します。
&gt;　　# CGI名
&gt;　　　# [通常]
&gt;　　　# $config-&gt;{path}{cgi} = &#039;main.cgi&#039;;
&gt;　　　# [拡張子を省略できる場合]
&gt;　　　# $config-&gt;{path}{cgi} = &#039;main&#039;;
&gt;　　　$config-&gt;{path}{cgi} = &#039;main&#039;;
-さらに main.cgi のファイル名を変更して拡張子を削除します。
--拡張子のつかないファイルの FTP 転送にはご注意ください。
--たいていの場合、手動にてテキスト転送を行う必要があります。
&gt;&amp;tt(){main}

**CGI であることを隠蔽したい 2
-さらに、PATH_INFO という仕組みを用いると、商品ページなど一部の URL から ? 表記をなくすことができます。
--PATH_INFO を用いた URL は例えば以下のように変化します。
&gt;&amp;tt(){Before : http://www.example.com/main.cgi?execute=item&amp;item=cup_01}
&gt;&amp;tt(){After. : http://www.example.com/main/item/cup_01/}
-設定を変更します。
-設定ファイルの位置は以下のようになります。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[config]}
&gt;&amp;tt(){　 　　 　　└　[common]}
&gt;&amp;tt(){　 　　 　　 　　└　config_common.pl}
-以下のように設定します。
&gt;　　# PATH_INFOモード
&gt;　　　# 通常は無効です。
&gt;　　　# [無効]
&gt;　　　# $config-&gt;{path_info} = &#039;0&#039;;
&gt;　　　# [有効]
&gt;　　　# $config-&gt;{path_info} = &#039;1&#039;;;
&gt;　　　$config-&gt;{path_info} = &#039;1&#039;;

**スキンを製作したい
-手っ取り早くスキンを作成したい場合、標準スキンの HTML ソースを見ながら新しいスキンを作成し、差し替えるというやり方がよいでしょう。
--オリジナルの HTML ソースに、標準スキンから独自タグの移植を行うという作業となります。
-オリジナルのタグは &lt;# .. #&gt; で囲まれたタグです。
-オリジナルタグの一例は以下の通りです。
&gt;&lt;form action=&#039;&lt;##url_root##&gt;&lt;#path_cgi#&gt;&#039; method=&#039;post&#039; style=&#039;&#039;&gt;
-PC 用スキンは以下の 3 つのディレクトリにあります。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[user]}
&gt;&amp;tt(){　 　　 　　 　　└　[cgi]}
&gt;&amp;tt(){　 　　 　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　└　[web]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　├　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　├　[guest]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　└　[member]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　 　　└　[default]}
-PC 用スキン用の画像等ファイルは以下の 3 つのディレクトリに置きます。
--スタイルシートはここにあります。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[public_html]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[user]}
&gt;&amp;tt(){　 　　 　　 　　└　[cgi]}
&gt;&amp;tt(){　 　　 　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　└　[web]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　├　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　├　[guest]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　└　[member]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　 　　└　[default]}
-携帯用スキンは以下の 3 つのディレクトリにあります。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[user]}
&gt;&amp;tt(){　 　　 　　 　　└　[cgi]}
&gt;&amp;tt(){　 　　 　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　└　[mobile]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　├　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　├　[guest]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　└　[member]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　 　　└　[default]}
-携帯用スキン用の画像等ファイルは以下の 3 つのディレクトリに置きます。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[public_html]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[user]}
&gt;&amp;tt(){　 　　 　　 　　└　[cgi]}
&gt;&amp;tt(){　 　　 　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　└　[mobile]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　├　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　├　[guest]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　│　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　└　[member]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　 　　└　[default]}
-スキン内部にて画像ファイルを呼び出すタグは以下のようになります。
--画像ファイルのディレクトリ構造はスキンのディレクトリ構造に連動していますので、一致したディレクトリに画像を置く必要があります。
&gt;&lt;img src=&#039;&lt;##path_material##&gt;hoge.jpg&#039; border=&#039;0&#039; width=&#039;100&#039; height=&#039;100&#039;&gt;
-PC 用スキンのカート画面に表示される iframe による説明と規約の部分については新規に作成する必要があります。
-作成したものの適用が求められるスキンは以下の通りです。
&gt;&amp;tt(){[pin_user_cart_main_submit.html]}
-適用箇所は以下の部分です。
--dummy.html の部分を差し替えてください。
&gt;&lt;div class=&#039;box_cart_main_menu_5&#039;&gt;
&gt;&lt;br&gt;
&gt;購入手続にあたっての同意事項 :&lt;br&gt;
&gt;たいへんお手数とはなりますが、ご購入の手続にあたっては、以下の規約と説明を閲覧し、その内容に同意ください。&lt;br&gt;
&gt;&lt;iframe src=&#039;dummy.html&#039; style=&#039;width:682px;height:400px;border:1px #DDDDDD solid;&#039;&gt;&lt;/iframe&gt;
&gt;&lt;/div&gt;
&gt;&lt;div style=&#039;clear:both;&#039;&gt;
&gt;&lt;/div&gt;


//├└─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋    </description>
    <dc:date>2010-10-23T20:16:17+09:00</dc:date>
    <utime>1287832577</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/cafemilk/pages/21.html">
    <title>インストール ケース 2</title>
    <link>https://w.atwiki.jp/cafemilk/pages/21.html</link>
    <description>
      *ケース 2
-サーバ内構造が public_html と cgi-bin とに分かれておらず、CGI の設置ディレクトリと商品画像などの素材ディレクトリを別にする必要がない場合のインストール
1) 統合作業
-注意点
--バージョンアップの際に統合作業を行うと設定やデータベースといったものが消失することになります。
--設定ファイルのバージョンアップ更新が必要となった場合は差分を適用するようにしましょう。
-ダウンロードしたファイルの構造は(一部)こうなっています。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　├　[cgi-bin]}
&gt;&amp;tt(){　│　　├　[affiliate]}
&gt;&amp;tt(){　│　　├　[backup]}
&gt;&amp;tt(){　│　　├　[execute]}
&gt;&amp;tt(){　│　　├　[MIME]}
&gt;&amp;tt(){　│　　├　[other]}
&gt;&amp;tt(){　│　　├　[payment]}
&gt;&amp;tt(){　│　　├　[pl]}
&gt;&amp;tt(){　│　　├　[plugin]}
&gt;&amp;tt(){　│　　├　[record]}
&gt;&amp;tt(){　│　　├　[skin]}
&gt;&amp;tt(){　│　　├　main.cgi}
&gt;&amp;tt(){　│　　└　rf.cgi}
&gt;&amp;tt(){　└　[public_html]}
&gt;&amp;tt(){[統合ファイル]}
&gt;&amp;tt(){　├　[config]}
&gt;&amp;tt(){　├　[database]}
&gt;&amp;tt(){　├　[log]}
&gt;&amp;tt(){　├　[mail]}
&gt;&amp;tt(){　└　[session]}
-ディレクトリ 統合ファイル の中身を cgi-bin にコピーします。
-その結果は(一部)このようになるはずです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　├　[cgi-bin]}
&gt;&amp;tt(){　│　　├　[affiliate]}
&gt;&amp;tt(){　│　　├　[backup]}
&gt;&amp;tt(){　│　　├　[config]}
&gt;&amp;tt(){　│　　├　[database]}
&gt;&amp;tt(){　│　　├　[execute]}
&gt;&amp;tt(){　│　　├　[log]}
&gt;&amp;tt(){　│　　├　[MIME]}
&gt;&amp;tt(){　│　　├　[mail]}
&gt;&amp;tt(){　│　　├　[other]}
&gt;&amp;tt(){　│　　├　[payment]}
&gt;&amp;tt(){　│　　├　[pl]}
&gt;&amp;tt(){　│　　├　[plugin]}
&gt;&amp;tt(){　│　　├　[record]}
&gt;&amp;tt(){　│　　├　[session]}
&gt;&amp;tt(){　│　　├　[skin]}
&gt;&amp;tt(){　│　　├　main.cgi}
&gt;&amp;tt(){　│　　└　rf.cgi}
&gt;&amp;tt(){　└　[public_html]}
-続いて AjaxZip 2.0 を統合します。
-統合先ディレクトリこちらです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[public_html]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[js]}
&gt;&amp;tt(){　 　　 　　 　　└　[ajaxzip2]}
-統合すると(一部)このようになるはずです。
&gt;&amp;tt(){[ajaxzip2]}
&gt;&amp;tt(){　├　[data]}
&gt;&amp;tt(){　├　ajaxzip2.js}
&gt;&amp;tt(){　├　jquery.js}
&gt;&amp;tt(){　└　prototype.js}
-続いて openWYSIWYG を統合します。
-統合先ディレクトリこちらです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[public_html]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[js]}
&gt;&amp;tt(){　 　　 　　 　　└　[openwysiwyg]}
-統合すると(一部)このようになるはずです。
&gt;&amp;tt(){[openwysiwyg]}
&gt;&amp;tt(){　├　[icons]}
&gt;&amp;tt(){　├　[popups]}
&gt;&amp;tt(){　├　[styles]}
&gt;&amp;tt(){　└　wysiwyg.js}
-phone.pl は本体に含まれているので統合の必要はありません。
-最新版が出た場合は差し替える必要があります。
-ディレクトリはこちらです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[pl]}
&gt;&amp;tt(){　 　　 　　└　[kawasaki]}
&gt;&amp;tt(){　 　　 　　 　　└　phone.pl}

2) 設定
-cgi-bin 内にあるファイル群の設置は example.com の トップディレクトリに行うとします。
-これの URL はこのようになるでしょう。
&gt;&amp;tt(){http://www.example.com/}
-これを FTP 側から見ると public_html となるでしょう。
&gt;&amp;tt(){[public_html]}
-public_html 内にあるファイル群の設置は同様に example.com の shop ディレクトリに行うとします。
-これの URL はこのようになるでしょう。
&gt;&amp;tt(){http://www.example.com/shop/}
-これを FTP 側から見ると以下のようになるでしょう。
&gt;&amp;tt(){[public_html]}
&gt;&amp;tt(){　└　[shop]}
-以上の前提についてはサーバによって差異がありますので、趣旨をよく理解したうえで調整をはかってください。
-では設定ファイルを開きます。
--設定ファイルを開き編集するには UTF-8N 対応のエディタが必要です。
-設定ファイルの位置は以下のようになります。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[config]}
&gt;&amp;tt(){　 　　 　　└　[common]}
&gt;&amp;tt(){　 　　 　　 　　└　config_common.pl}
-設定ファイルの内容は以下のようになります。
&gt;################################################################################
&gt;#                                                                              #
&gt;#                          CAFEMILK SHOPPING CART  V5                          #
&gt;#                       SOHO WORKSHOP CAFEMILK  全権留保                       #
&gt;#                                                                              #
&gt;################################################################################
&gt;# こちらはショップ管理者共通設定ファイルです。
&gt;# ショップはこちらに設定を書き込んでください。
&gt;# 設定の記述は Perl の規則に従って行ってください。そうしないと全く動作しなくなり
&gt;# ます。
&gt;
&gt;use utf8;
&gt;# use encoding &quot;utf8&quot;;
&gt;
&gt;package Cartconfig;
&gt;sub config_common
&gt;　{
&gt;　my $config = shift;
&gt;# ここからが設定部分です。これより上部は書き換えないでください。
&gt;################################################################################
&gt;## CONFIG BIGIN                                                               ##
&gt;################################################################################
&gt;
&gt;　# ● パス等の設定
&gt;
&gt;　　# CGI-BINからPUBLIC_HTMLへのURLのパス
&gt;　　　# これは、CGIのWEB出力によって呼び出されるファイル、
&gt;　　　# たとえばスタイルシートやJSファイルの所在を示すパスです。
&gt;　　　# WEB出力においてスタイルシートが呼び出されていない場合は調整が必要
&gt;　　　# です。
&gt;　　　# 通常はパスではなくURLを設定してください。
&gt;　　　# [例]
&gt;　　　# $config-&gt;{path}{cgi_to_html} = &#039;http://example.jp/shop/&#039;;
&gt;　　　$config-&gt;{path}{cgi_to_html} = &#039;http://localhost:7859/shop/&#039;;
&gt;
&gt;　　# CGI-BINからPUBLIC_HTMLへのLOCALのパス
&gt;　　　# これは、CGIが操作するファイル、
&gt;　　　# たとえば商品の画像をアップロードしたり参照したりする際に用いるパス
&gt;　　　# です。
&gt;　　　# これは$config-&gt;{path}{cgi_to_html}と整合している必要があります。
&gt;　　　# [LOCALにおいてcgi-bin/shop/main.cgiからpublic_html/shop/を参照し、
&gt;　　　#  一方でURLにおいてhttp://example.jp/cgi-bin/shop/main.cgiから
&gt;　　　#  http://example.jp/shop/が参照されるシステムの場合]
&gt;　　　# $config-&gt;{path}{cgi_to_file} = &#039;../../public_html/shop/&#039;;
&gt;　　　# [単にmain.cgiから./web/を参照する場合]
&gt;　　　# $config-&gt;{path}{cgi_to_file} = &#039;web/&#039;;
&gt;　　　$config-&gt;{path}{cgi_to_file} = &#039;../../public_html/shop/&#039;;
&gt;
&gt;　　# main.cgiのあるURL
&gt;　　　# [例]
&gt;　　　# $config-&gt;{url}{root} = &#039;http://example.jp/cgi-bin/shop/&#039;;
&gt;　　　$config-&gt;{url}{root} = &#039;http://localhost:7859/cgi-bin/shop/&#039;;
&gt;
&gt;　　# main.cgiのあるSSLのURL
&gt;　　　# [例]
&gt;　　　# $config-&gt;{url}{sslroot} = &#039;https://example.jp/cgi-bin/shop/&#039;;
&gt;　　　# SSL専用のサーバがある場合などにおいて本製品はSSLで動作しないことが
&gt;　　　# あります。
&gt;　　　# [SSLを使用しない場合]
&gt;　　　# その場合は$config-&gt;{url}{root}と同じ値を設定します。
&gt;　　　# $config-&gt;{url}{sslroot} = &#039;http://example.jp/cgi-bin/shop/&#039;;
&gt;　　　$config-&gt;{url}{sslroot} = &#039;http://localhost:7859/cgi-bin/shop/&#039;;
&gt;
&gt;　　# 画像のあるURL
&gt;　　　# [例]
&gt;　　　# $config-&gt;{url}{imageroot} = &#039;https://example.jp/shop/&#039;;
&gt;　　　# 商品の画像をアップロードしても表示されない場合に調整が必要です。
&gt;　　　$config-&gt;{url}{imageroot} = &#039;http://localhost:7859/shop/&#039;;
&gt;
&gt;　　# CGI名
&gt;　　　# [通常]
&gt;　　　# $config-&gt;{path}{cgi} = &#039;main.cgi&#039;;
&gt;　　　# [拡張子を省略できる場合]
&gt;　　　# $config-&gt;{path}{cgi} = &#039;main&#039;;
&gt;　　　$config-&gt;{path}{cgi} = &#039;main.cgi&#039;;
&gt;
&gt;　　# PATH_INFOモード
&gt;　　　# 通常は無効です。
&gt;　　　# [無効]
&gt;　　　# $config-&gt;{path_info} = &#039;0&#039;;
&gt;　　　# [有効]
&gt;　　　# $config-&gt;{path_info} = &#039;1&#039;;;
&gt;　　　$config-&gt;{path_info} = &#039;0&#039;;
&gt;
&gt;　# ● カートの設定
&gt;
&gt;　　# 送料の方式
&gt;　　　# [無料]
&gt;　　　# $config-&gt;{mailing}{mode} = &#039;0&#039;;
&gt;　　　# [固定]
&gt;　　　# $config-&gt;{mailing}{mode} = &#039;1&#039;;
&gt;　　　# [都道府県]
&gt;　　　# $config-&gt;{mailing}{mode} = &#039;2&#039;;
&gt;　　　# その他の方式にする場合はカスタマイズが必要です。
&gt;　　　$config-&gt;{mailing}{mode} = &#039;2&#039;;
&gt;
&gt;　　# 固定送料
&gt;　　　# $config-&gt;{mailing}{mode} = &#039;1&#039;の場合の固定送料です。
&gt;　　　# [780円の場合]
&gt;　　　# $config-&gt;{mailing}{basic_cost} = &#039;780&#039;;
&gt;　　　$config-&gt;{mailing}{basic_cost} = &#039;780&#039;;
&gt;
&gt;　　# 都道府県送料
&gt;　　　# $config-&gt;{mailing}{mode} = &#039;2&#039;の場合の都道府県送料です。
&gt;　　　# [北海道が1050円の場合]
&gt;　　　# $config-&gt;{mailing}{prefecture_cost}[1] = &#039;1050&#039;;
&gt;　　　# 数値と都道府県の対応は以下の通りです。
&gt;　　　#  0: [使用しません]
&gt;　　　#  1: 北海道
&gt;　　　#  2: 青森県
&gt;　　　#  3: 岩手県
&gt;　　　#  4: 宮城県
&gt;　　　#  5: 秋田県
&gt;　　　#  6: 山形県
&gt;　　　#  7: 福島県
&gt;　　　#  8: 茨城県
&gt;　　　#  9: 栃木県
&gt;　　　# 10: 群馬県
&gt;　　　# 11: 埼玉県
&gt;　　　# 12: 千葉県
&gt;　　　# 13: 東京都
&gt;　　　# 14: 神奈川県
&gt;　　　# 15: 新潟県
&gt;　　　# 16: 富山県
&gt;　　　# 17: 石川県
&gt;　　　# 18: 福井県
&gt;　　　# 19: 山梨県
&gt;　　　# 20: 長野県
&gt;　　　# 21: 岐阜県
&gt;　　　# 22: 静岡県
&gt;　　　# 23: 愛知県
&gt;　　　# 24: 三重県
&gt;　　　# 25: 滋賀県
&gt;　　　# 26: 京都府
&gt;　　　# 27: 大阪府
&gt;　　　# 28: 兵庫県
&gt;　　　# 29: 奈良県
&gt;　　　# 30: 和歌山県
&gt;　　　# 31: 鳥取県
&gt;　　　# 32: 島根県
&gt;　　　# 33: 岡山県
&gt;　　　# 34: 広島県
&gt;　　　# 35: 山口県
&gt;　　　# 36: 徳島県
&gt;　　　# 37: 香川県
&gt;　　　# 38: 愛媛県
&gt;　　　# 39: 高知県
&gt;　　　# 40: 福岡県
&gt;　　　# 41: 佐賀県
&gt;　　　# 52: 長崎県
&gt;　　　# 43: 熊本県
&gt;　　　# 44: 大分県
&gt;　　　# 45: 宮崎県
&gt;　　　# 46: 鹿児島県
&gt;　　　# 47: 沖縄県
&gt;　　　# 離島などに対応するにはカスタマイズが必要です。
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[1]  = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[2]  = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[3]  = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[4]  = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[5]  = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[6]  = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[7]  = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[8]  = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[9]  = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[10] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[11] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[12] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[13] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[14] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[15] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[16] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[17] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[18] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[19] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[20] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[21] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[22] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[23] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[24] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[25] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[26] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[27] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[28] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[29] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[30] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[31] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[32] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[33] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[34] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[35] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[36] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[37] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[38] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[39] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[40] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[41] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[42] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[43] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[44] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[45] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[46] = &#039;1050&#039;;
&gt;　　　$config-&gt;{mailing}{prefecture_cost}[47] = &#039;1050&#039;;
&gt;
&gt;　　# 送料無料購入額
&gt;　　　# $config-&gt;{mailing}{mode} = &#039;1&#039;もしくは&#039;2&#039;の場合、一定額購入時に送
&gt;　　　# 料無料とすることができます。その場合の購入額を入力してください。
&gt;　　　# [無効にする場合]
&gt;　　　# $config-&gt;{mailing}{free_cost} = &#039;0&#039;;
&gt;　　　# [10,000円にする場合]
&gt;　　　# $config-&gt;{mailing}{free_cost} = &#039;10000&#039;;
&gt;　　　$config-&gt;{mailing}{free_cost} = &#039;10000&#039;;
&gt;
&gt;　　# 有効にする決済のID
&gt;　　　# 決済処理はモジュールによって実施されます。そのIDを指定してください。
&gt;　　　# 新規に決済を追加するにはモジュールの作成が必要です。
&gt;　　　# [代引決済を有効にする場合]
&gt;　　　# $config-&gt;{payment}{id_list} = [&#039;delivery_collect&#039;];
&gt;　　　# [ZEUS決済を追加する場合]
&gt;　　　# $config-&gt;{payment}{id_list} = [&#039;delivery_collect&#039;,&#039;zeus&#039;];
&gt;　　　# 利用できるIDは以下の通りです。
&gt;　　　# delivery_collect : 代金引換
&gt;　　　# bank_transfer    : 銀行振込
&gt;　　　# postal_transfer  : 郵便払込
&gt;　　　# zeus             : ZEUS決済 Link Point 方式
&gt;　　　# ※ ZEUS決済の他の方式について導入されるショップは開発元までご相談
&gt;　　　# ください。
&gt;　　　$config-&gt;{payment}{id_list} = [&#039;delivery_collect&#039;,&#039;bank_transfer&#039;,&#039;postal_transfer&#039;,&#039;zeus&#039;];
&gt;
&gt;　　# お知らせ
&gt;　　　# 弊社製品を利用されるショップはぜひZEUSクレジットカード決済をご導入
&gt;　　　# ください。また、導入にあたっては、有利なプランを用意しておりますの
&gt;　　　# で、ぜひ弊社サイト内にある資料請求専用ページから資料請求を行ってく
&gt;　　　# ださい。
&gt;
&gt;　　# ZEUS加盟店IPコード
&gt;　　　# [例]
&gt;　　　# $config-&gt;{payment}{zeus}{ip} = &#039;91197&#039;;
&gt;　　　$config-&gt;{payment}{zeus}{ip} = &#039;&#039;;
&gt;
&gt;　　# 代引手数料テーブル
&gt;　　　# 代引手数料を動的に計算するためのテーブルです。
&gt;　　　# 代引手数料は支払金額(小計ではなく合計)から算出されます。
&gt;　　　# table_1が支払金額、table_2が手数料額です。
&gt;　　　# 各設定値は税込みの値となります。
&gt;　　　# カードの手数料は計上しません。計上するにはカスタマイズが必要です。
&gt;　　　# [ヤマトグループの手数料を計上する場合]
&gt;　　　# $config-&gt;{payment}{delivery_collect}{table_1} = [&#039;9999&#039;,&#039;29999&#039;,&#039;99999&#039;,&#039;300000&#039;];
&gt;　　　# $config-&gt;{payment}{delivery_collect}{table_2} = [ &#039;315&#039;,  &#039;420&#039;,  &#039;630&#039;,  &#039;1050&#039;];
&gt;　　　# [佐川急便の手数料を計上する場合]
&gt;　　　# $config-&gt;{payment}{delivery_collect}{table_1} = [&#039;10000&#039;,&#039;30000&#039;,&#039;100000&#039;,&#039;300000&#039;,&#039;500000&#039;,&#039;1000000&#039;,&#039;1000000000&#039;];
&gt;　　　# $config-&gt;{payment}{delivery_collect}{table_2} = [ &#039;315&#039;,  &#039;420&#039;,  &#039;630&#039;,  &#039;1050&#039;  ,  &#039;2100&#039;,   &#039;3150&#039;,      &#039;4200&#039;];
&gt;　　　# [手数料を無料とする場合]
&gt;　　　# $config-&gt;{payment}{delivery_collect}{table_1} = [&#039;1000000000&#039;];
&gt;　　　# $config-&gt;{payment}{delivery_collect}{table_2} = [         &#039;0&#039;];
&gt;　　　$config-&gt;{payment}{delivery_collect}{table_1} = [&#039;9999&#039;,&#039;29999&#039;,&#039;99999&#039;,&#039;300000&#039;];
&gt;　　　$config-&gt;{payment}{delivery_collect}{table_2} = [ &#039;315&#039;,  &#039;420&#039;,  &#039;630&#039;,  &#039;1050&#039;];
&gt;
&gt;　　# 内税率
&gt;　　　# 内税額を計算するための税率です。
&gt;　　　# [5%である場合]
&gt;　　　# $config-&gt;{tax}{inclusive}{rate} = &#039;5&#039;;
&gt;　　　$config-&gt;{tax}{inclusive}{rate} = &#039;5&#039;;
&gt;
&gt;　　# お知らせ
&gt;　　　# 弊社製品を利用されるショップはぜひa8.netアフィリエイトをご導入くだ
&gt;　　　# さい。問い合わせと申し込み手続きは弊社サイトから行うことができます。
&gt;
&gt;　　# A8.netのプログラムID
&gt;　　　# [A8.netと契約していない場合]
&gt;　　　# $config-&gt;{affiliate}{a8}{pid} = &#039;&#039;;
&gt;　　　$config-&gt;{affiliate}{a8}{pid} = &#039;&#039;;
&gt;
&gt;　# ● メールの設定
&gt;
&gt;　　# SENDMAILのパス
&gt;　　　# プロバイダの指示にしたがう値を入力してください。
&gt;　　　# [例]
&gt;　　　# $config-&gt;{sendmail}{path} = &#039;/usr/sbin/sendmail&#039;;
&gt;　　　$config-&gt;{sendmail}{path} = &#039;/usr/sbin/sendmail&#039;;
&gt;
&gt;　　# FORMアドレス
&gt;　　　# 自動送信メールの送信元アドレスです。
&gt;　　　# [例]
&gt;　　　# $config-&gt;{sendmail}{address}{shop}{from}[0] = &#039;shop@example.jp&#039;;
&gt;　　　$config-&gt;{sendmail}{address}{shop}{from}[0] = &#039;a-c@zpost.plala.or.jp&#039;;
&gt;
&gt;　　# TO アドレス
&gt;　　　# ショップ向け自動送信メールの送信先アドレスです。
&gt;　　　# 連番による複数設定ができます。
&gt;　　　# [例]
&gt;　　　# $config-&gt;{sendmail}{address}{shop}{to}[0] = &#039;shop@example.jp&#039;;
&gt;　　　$config-&gt;{sendmail}{address}{shop}{to}[0] = &#039;a-c@zpost.plala.or.jp&#039;;
&gt;　　　$config-&gt;{sendmail}{address}{shop}{to}[1] = &#039;cafemilk@xkf.milkcafe.to&#039;;
&gt;
&gt;　　# RETURN アドレス
&gt;　　　# 不達メールの転送先アドレスです。
&gt;　　　# [例]
&gt;　　　# $config-&gt;{sendmail}{address}{shop}{return}[0] = &#039;return@example.jp&#039;;
&gt;　　　$config-&gt;{sendmail}{address}{shop}{return}[0] = &#039;a-c@zpost.plala.or.jp&#039;;
&gt;
&gt;　　# ALERT アドレス
&gt;　　　# ショップの動作に問題があった場合の自動送信メールの送信先アドレスで
&gt;　　　# す。
&gt;　　　# 通常は動作しませんが、設定は行ってください。
&gt;　　　# [例]
&gt;　　　# $config-&gt;{sendmail}{address}{shop}{alert}[0] = &#039;alert@example.jp&#039;;
&gt;　　　$config-&gt;{sendmail}{address}{shop}{alert}[0] = &#039;a-c@zpost.plala.or.jp&#039;;
&gt;
&gt;　　# 配信 アドレス
&gt;　　　# 会員にメール配信をする際のFROMアドレスです。
&gt;　　　# [例]
&gt;　　　# $config-&gt;{sendmail}{address}{shop}{mail_delivery} = &#039;magazine@example.jp&#039;;
&gt;　　　$config-&gt;{sendmail}{address}{shop}{mail_delivery} = &#039;a-c@zpost.plala.or.jp&#039;;
&gt;
&gt;　# ● ポイントの設定
&gt;
&gt;　　# ポイント機能
&gt;　　　# [有効]
&gt;　　　# $config-&gt;{point}{mode} = &#039;1&#039;;
&gt;　　　# [無効]
&gt;　　　# $config-&gt;{point}{mode} = &#039;0&#039;;
&gt;　　　$config-&gt;{point}{mode} = &#039;1&#039;;
&gt;
&gt;　　# ポイントの有効日数
&gt;　　　# [例]
&gt;　　　# $config-&gt;{point}{expire_days} = &#039;100&#039;;
&gt;　　　$config-&gt;{point}{expire_days} = &#039;100&#039;;
&gt;
&gt;　　# ポイントの加算率
&gt;　　　# [5%である場合]
&gt;　　　# $config-&gt;{point}{rate} = &#039;5&#039;;
&gt;　　　$config-&gt;{point}{rate} = &#039;5&#039;;
&gt;
&gt;　# ● その他の設定
&gt;
&gt;　　# 商品の監視モード
&gt;　　# 商品の監視は、商品の売れすぎを監視して売れすぎる商品の販売を自動的に停
&gt;　　# 止する機能です。一度にあまりに注文が殺到すると困るショップや、価格入力
&gt;　　# ミスによる混乱を予防したいショップは有効にしてください。
&gt;　　# [有効]
&gt;　　# $config-&gt;{item}{guard} = &#039;1&#039;;
&gt;　　# [無効]
&gt;　　# $config-&gt;{item}{guard} = &#039;0&#039;;
&gt;　　$config-&gt;{item}{guard} = &#039;1&#039;;
&gt;
&gt;################################################################################
&gt;## CONFIG END                                                                 ##
&gt;################################################################################
&gt;# ここまでが設定部分です。これより下部は書き換えないでください。
&gt;　}
&gt;1;
-「CGI-BINからPUBLIC_HTMLへのURLのパス」を設定します。
&gt;　　# CGI-BINからPUBLIC_HTMLへのURLのパス
&gt;　　　# これは、CGIのWEB出力によって呼び出されるファイル、
&gt;　　　# たとえばスタイルシートやJSファイルの所在を示すパスです。
&gt;　　　# WEB出力においてスタイルシートが呼び出されていない場合は調整が必要
&gt;　　　# です。
&gt;　　　# 通常はパスではなくURLを設定してください。
&gt;　　　# [例]
&gt;　　　# $config-&gt;{path}{cgi_to_html} = &#039;http://example.jp/shop/&#039;;
&gt;　　　$config-&gt;{path}{cgi_to_html} = &#039;http://www.example.com/shop/&#039;;
-「CGI-BINからPUBLIC_HTMLへのLOCALのパス」を設定します。
&gt;　　# CGI-BINからPUBLIC_HTMLへのLOCALのパス
&gt;　　　# これは、CGIが操作するファイル、
&gt;　　　# たとえば商品の画像をアップロードしたり参照したりする際に用いるパス
&gt;　　　# です。
&gt;　　　# これは$config-&gt;{path}{cgi_to_html}と整合している必要があります。
&gt;　　　# [LOCALにおいてcgi-bin/shop/main.cgiからpublic_html/shop/を参照し、
&gt;　　　#  一方でURLにおいてhttp://example.jp/cgi-bin/shop/main.cgiから
&gt;　　　#  http://example.jp/shop/が参照されるシステムの場合]
&gt;　　　# $config-&gt;{path}{cgi_to_file} = &#039;../../public_html/shop/&#039;;
&gt;　　　# [単にmain.cgiから./web/を参照する場合]
&gt;　　　# $config-&gt;{path}{cgi_to_file} = &#039;web/&#039;;
&gt;　　　$config-&gt;{path}{cgi_to_file} = &#039;./shop/&#039;;
-「main.cgiのあるURL」を設定します。
--SSLを使用しない場合
&gt;　　# main.cgiのあるURL
&gt;　　　# [例]
&gt;　　　# $config-&gt;{url}{root} = &#039;http://example.jp/cgi-bin/shop/&#039;;
&gt;　　　$config-&gt;{url}{root} = &#039;http://www.example.com/&#039;;
&gt;
&gt;　　# main.cgiのあるSSLのURL
&gt;　　　# [例]
&gt;　　　# $config-&gt;{url}{sslroot} = &#039;https://example.jp/cgi-bin/shop/&#039;;
&gt;　　　# SSL専用のサーバがある場合などにおいて本製品はSSLで動作しないことが
&gt;　　　# あります。
&gt;　　　# [SSLを使用しない場合]
&gt;　　　# その場合は$config-&gt;{url}{root}と同じ値を設定します。
&gt;　　　# $config-&gt;{url}{sslroot} = &#039;http://example.jp/cgi-bin/shop/&#039;;
&gt;　　　$config-&gt;{url}{sslroot} = &#039;http://www.example.com/&#039;;
-「画像のあるURL」を設定します。
&gt;　　# 画像のあるURL
&gt;　　　# [例]
&gt;　　　# $config-&gt;{url}{imageroot} = &#039;https://example.jp/shop/&#039;;
&gt;　　　# 商品の画像をアップロードしても表示されない場合に調整が必要です。
&gt;　　　$config-&gt;{url}{imageroot} = &#039;http://www.example.com/shop/&#039;;
-「SENDMAILのパス」を設定します。
--パスはサーバによって異なります。プロバイダのサポート文書等を参照してください。
&gt;　　# SENDMAILのパス
&gt;　　　# プロバイダの指示にしたがう値を入力してください。
&gt;　　　# [例]
&gt;　　　# $config-&gt;{sendmail}{path} = &#039;/usr/sbin/sendmail&#039;;
&gt;　　　$config-&gt;{sendmail}{path} = &#039;/usr/sbin/sendmail&#039;;
-ほかにも設定はありますがインストールに必要な作業は以上になります。
--可能ならメールアドレスの設定もこの時に済ませておくことができるでしょう。
3) PERL のパスの書き換え
-CGI の PERL のパスを書き換えます。
--CGI ファイルを開き編集するには UTF-8N 対応のエディタが必要です。
--パスはサーバによって異なります。プロバイダのサポート文書等を参照してください。
-書き換えるファイルは以下の通りとなります。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　├　main.cgi}
&gt;&amp;tt(){　 　　└　rf.cgi}
-書き換えるのは冒頭の一行です。
&gt;#!/user/bin/perl

4) FTP でのアップロード
-以上の内容を FTP にてアップロードします。
--アップロードには UTF-8 転送に対応した FTP クライアントが必要です。
--アップロード先は設定したパスの値と一致していなければなりません。
-転送先ディレクトリ public_html には 転送元ディレクトリ public_html の中身をアップロードします。
--転送先ディレクトリ public_html に 転送元ディレクトリ public_html をそのディレクトリごとアップロードしてはなりません。
-転送先ディレクトリ shop には 転送元ディレクトリ cgi-bin の中身をアップロードします。
--転送先ディレクトリ shop に 転送元ディレクトリ cgi-bin をそのディレクトリごとアップロードしてはなりません。
-以下の CGI のパーミッションを 755 にします。
&gt;&amp;tt(){[public_html]}
&gt;&amp;tt(){　├　main.cgi}
&gt;&amp;tt(){　└　rf.cgi}
-以下のディレクトリのパーミッションを 666 にします。
&gt;&amp;tt(){[public_html]}
&gt;&amp;tt(){　├　[backup]}
&gt;&amp;tt(){　├　[database]}
&gt;&amp;tt(){　├　[log]}
&gt;&amp;tt(){　├　[mail]}
&gt;&amp;tt(){　└　[session]}

5) 動作確認
-ブラウザにてアクセスを行い、動作することを確認します。
-アクセスする URL はこのようになるはずです。
&gt;&amp;tt(){http://www.example.com/main.cgi}

6) openWYSIWYG の設定
-openWYSIWYG の設定のために以下のファイルを開いてください。
&gt;&amp;tt(){wysiwyg.js}
-wysiwyg.js のあるディレクトは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[public_html]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[js]}
&gt;&amp;tt(){　 　　 　　 　　└　[openwysiwyg]}
-以下の設定を参考にして設定してください。
&gt;imagesDir = &quot;http://www.example.com/shop/skin/js/openwysiwyg/icons/&quot;;
&gt;cssDir = &quot;http://www.example.com/shop/skin/js/openwysiwyg/styles/&quot;;
&gt;popupsDir = &quot;http://www.example.com/shop/skin/js/openwysiwyg/popups/&quot;;
&gt;wysiwygWidth = 466;
&gt;wysiwygHeight = 300;

//├└─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋    </description>
    <dc:date>2010-05-28T11:14:54+09:00</dc:date>
    <utime>1275012894</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/cafemilk/pages/32.html">
    <title>データベース ログデータベース</title>
    <link>https://w.atwiki.jp/cafemilk/pages/32.html</link>
    <description>
      *ログデータベース
-CAFEMILK SHOPIING CART V5 ではカンマ区切りCSV形式のデータベースを用います。
--文字コードは UTF-8N となります。
--エクセルの書式に対応しています。
-データベース運用の方法は用途に合わせて基本データベースとログデータベースの二種類があります。
-データベース関連の処理はフレームワークとなっていますので、カスタマイズ時の実装作業が楽です。
--レコードの各項目は SQL のようにカラム名をつけて操作することができ、効率的です。
-独自仕様であるため、SQL に常態化しているようなデータベースインジェクション脆弱性の危険がありません。

**ログデータベースの概要
-ログデータベースは、レコードを収めた10のファイルとそのカラム名を収めたファイルの11ファイルからなるデータベースを運用する形態となります。
--レコードは古くなると消えます。(ログローテンションします。)
--Flock を用いてロックすることはしません。
--ログデータベースでは書き込みは追記しかできません。
-ログデータベースを扱うモジュールのファイル名は以下の通りです。
&gt;&amp;tt(){cafemilk_database_log.pl}
-cafemilk_database_log.pl のあるディレクトリは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[pl]}
-ログデータベースの扱うデータベースのファイルは例えば以下の通りです。
&gt;&amp;tt(){item_news.0.log.csv.cgi : 新着商品のレコード0}
&gt;&amp;tt(){item_news.1.log.csv.cgi : 新着商品のレコード1}
&gt;&amp;tt(){item_news.2.log.csv.cgi : 新着商品のレコード2}
&gt;&amp;tt(){item_news.3.log.csv.cgi : 新着商品のレコード3}
&gt;&amp;tt(){item_news.4.log.csv.cgi : 新着商品のレコード4}
&gt;&amp;tt(){item_news.5.log.csv.cgi : 新着商品のレコード5}
&gt;&amp;tt(){item_news.6.log.csv.cgi : 新着商品のレコード6}
&gt;&amp;tt(){item_news.7.log.csv.cgi : 新着商品のレコード7}
&gt;&amp;tt(){item_news.8.log.csv.cgi : 新着商品のレコード8}
&gt;&amp;tt(){item_news.9.log.csv.cgi : 新着商品のレコード9}
&gt;&amp;tt(){item_column_list.csv... : 新着商品のカラム名}
-データベースは標準にてセーフモードで運用されます。
--パーミッションファイルのないディレクトにあるデータベースの読み書きはできません。
-標準のセーフモードは以下のように指定されています。
&gt;$config-&gt;{database}{safety} = &#039;1&#039;;
-$config-&gt;{database}{safety} を設定しているファイルは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[config]}
&gt;&amp;tt(){　 　　 　　└　[admin]}
&gt;&amp;tt(){　 　　 　　 　　└　config_basic.pl}
-セーフモードにて要求されるパーミッションファイルは以下の通りです。
--ファイルの内容は何でもかまいせん。
&gt;&amp;tt(){[permit_database_connect.txt]}

**ログデータベースの操作のサンプル
-以下は、ログを追記する場合のサンプルとなります。
&gt;&gt;まずはデータベース接続
&gt;my $log_database = Cafemilk_database_log-&gt;connect
&gt;　({
&gt;　config             =&gt; $config,
&gt;　userdata           =&gt; $userdata,
&gt;　log_error          =&gt; $log_error,
&gt;　log_alert          =&gt; $log_alert,
&gt;　status             =&gt; $status,
&gt;　column_filename    =&gt; &#039;log/access_log_column_list.csv&#039;,
&gt;　column_separator   =&gt; &#039;,&#039;,
&gt;　database_filename  =&gt; &#039;log/access_log&#039;,
&gt;　database_separator =&gt; &#039;,&#039;,
&gt;　record_stack       =&gt; $config-&gt;{database}{log_stack}{common},
&gt;　});
&gt;&gt;ログとして書き込む内容の作成
&gt;my $error = &quot;@{$log_error}&quot;;
&gt;my $alert = &quot;@{$log_alert}&quot;;
&gt;$error =~ s/\x0D\x0A|\x0D|\x0A//g;
&gt;$alert =~ s/\x0D\x0A|\x0D|\x0A//g;
&gt;my %records = 
&gt;　(
&gt;　id         =&gt; $userdata-&gt;{&#039;time&#039;},
&gt;　time       =&gt; $userdata-&gt;{&#039;time&#039;},
&gt;　admin_name =&gt; $userdata-&gt;{admin_registry_values}{admin_name},
&gt;　user_name  =&gt; $userdata-&gt;{user_registry_values}{user_name},
&gt;　execute    =&gt; $userdata-&gt;{request_values}{execute}[0],
&gt;　ip_address =&gt; $ENV{&#039;REMOTE_ADDR&#039;},
&gt;　referer    =&gt; $ENV{&#039;HTTP_REFERER&#039;},
&gt;　# post       =&gt; $ENV{&#039;CONTENT_LENGTH&#039;},
&gt;　# get        =&gt; $ENV{&#039;QUERY_STRING&#039;},
&gt;　# cookie     =&gt; $ENV{&#039;HTTP_COOKIE&#039;},
&gt;　# error      =&gt; $error,
&gt;　# alert      =&gt; $alert,
&gt;　);
&gt;&gt;追記
&gt;$log_database-&gt;postscript(\%records);
&gt;&gt;終了処理
&gt;undef $log_database;
-以下は、最後のレコードを取得する場合のサンプルとなります。
&gt;my $database = Cafemilk_database_log-&gt;connect
&gt;　({
&gt;　config             =&gt; $config,
&gt;　userdata           =&gt; $userdata,
&gt;　log_error          =&gt; $log_error,
&gt;　log_alert          =&gt; $log_alert,
&gt;　status             =&gt; $status,
&gt;　column_filename    =&gt; &#039;database/forum_thread_column_list.csv&#039;,
&gt;　column_separator   =&gt; &#039;,&#039;,
&gt;　database_filename  =&gt; &#039;database/admin_forum_thread&#039;,
&gt;　database_separator =&gt; &#039;,&#039;,
&gt;　record_stack       =&gt; $config-&gt;{database}{session_stack}{admin_forum}{thread},
&gt;　});
&gt;&gt;条件に合う最後のレコードを取得
&gt;my $extract_database = $database-&gt;extract_last_record
&gt;　({
&gt;　extract_column_name  =&gt; &#039;thread_id&#039;,
&gt;　extract_column_value =&gt; $message_values{thread_id},
&gt;　});
&gt;&gt;%thread_values にレコードのカラム名と値を格納
&gt;%thread_values = $database-&gt;get_values_argument
&gt;　({
&gt;　database_values =&gt; $extract_database,
&gt;　});
&gt;undef $database;
-以下は、最後のレコードを取得して内容を修正し、追記する場合のサンプルとなります。
&gt;my $database = Cafemilk_database_log-&gt;connect
&gt;　({
&gt;　config             =&gt; $config,
&gt;　userdata           =&gt; $userdata,
&gt;　log_error          =&gt; $log_error,
&gt;　log_alert          =&gt; $log_alert,
&gt;　status             =&gt; $status,
&gt;　column_filename    =&gt; &#039;log/sale_count_column_list.csv&#039;,
&gt;　column_separator   =&gt; &#039;,&#039;,
&gt;　database_filename  =&gt; &#039;log/sale_count&#039;,
&gt;　database_separator =&gt; &#039;,&#039;,
&gt;　record_stack       =&gt; 10,
&gt;　});
&gt;my $extract_database = $database-&gt;extract_last_record
&gt;　({
&gt;　extract_column_name  =&gt; &#039;dummy&#039;,
&gt;　extract_column_value =&gt; &#039;count&#039;,
&gt;　});
&gt;&gt;%count_values にレコードのカラム名と値を格納
&gt;my %count_values = $database-&gt;get_values_argument
&gt;　({
&gt;　database_values =&gt; $extract_database,
&gt;　});
&gt;&gt;%count_values の変更
&gt;$count_values{count} ++;
&gt;$status-&gt;{sale_count} = $count_values{count};
&gt;$count_values{id}    = $userdata-&gt;{&#039;time&#039;};
&gt;$count_values{time}  = $userdata-&gt;{&#039;time&#039;};
&gt;$count_values{dummy} = &#039;count&#039;;
&gt;&gt;追記
&gt;$database-&gt;postscript(\%count_values);
&gt;undef $database;
-以下は、データベスーから特定の条件に合うレコード(複数)を抽出して、抽出された各レコードを順次処理していく場合のサンプルとなります。
&gt;&gt;まずはデータベース接続
&gt;my $database = Cafemilk_database_log-&gt;connect
&gt;　({
&gt;　config             =&gt; $config,
&gt;　userdata           =&gt; $userdata,
&gt;　log_error          =&gt; $log_error,
&gt;　log_alert          =&gt; $log_alert,
&gt;　status             =&gt; $status,
&gt;　column_filename    =&gt; &#039;database/item_column_list.csv&#039;,
&gt;　column_separator   =&gt; &#039;,&#039;,
&gt;　database_filename  =&gt; &#039;database/item_news&#039;,
&gt;　database_separator =&gt; &#039;,&#039;,
&gt;　record_stack       =&gt; $config-&gt;{database}{session_stack}{item}{news},
&gt;　});
&gt;&gt;全レコードの読み込み
&gt;$database-&gt;get_record_all();
&gt;&gt;追記により重複しているレコードを最新のものを除いて削除
&gt;$database-&gt;merge_database
&gt;　({
&gt;　column_name =&gt; &#039;item_id&#039;,
&gt;　});
&gt;&gt;完全一致カラム抽出処理
&gt;my $target = &#039;multiprice&#039;;
&gt;$database-&gt;match_database
&gt;　({
&gt;　column_name =&gt; &#039;item_type&#039;,
&gt;　match_word  =&gt; $target,
&gt;　});
&gt;&gt;検索文字列の用意
&gt;&gt;文字列はスペース区切りで AND 検索となる
&gt;my $words = $input_values{&#039;search&#039;};
&gt;$words = Cafemilk_basic::decode_escape
&gt;　({
&gt;　config    =&gt; $config,
&gt;　userdata  =&gt; $userdata,
&gt;　log_error =&gt; $log_error,
&gt;　log_alert =&gt; $log_alert,
&gt;　status    =&gt; $status,
&gt;　text      =&gt; $words,
&gt;　});
&gt;&gt;検索の対象となるカラムの指定
&gt;my @columns = 
&gt;　(
&gt;　&quot;item_id&quot;,
&gt;　&quot;name_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;text_1_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;text_2_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;manufacturer_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;table_value_1_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;table_value_2_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;table_value_3_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;table_value_4_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;option_name_1_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;option_name_2_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;option_name_3_$userdata-&gt;{language_type}&quot;,
&gt;　);
&gt;&gt;検索実行
&gt;$database-&gt;search_database
&gt;　({
&gt;　search_column  =&gt; \@columns,
&gt;　search_words   =&gt; $words,
&gt;&gt;英字の大文字と小文字の区別
&gt;&gt;1 でしない
&gt;　character_mode =&gt; &#039;1&#039;,
&gt;　});
&gt;&gt;並び替え処理
&gt;$database-&gt;sort_database
&gt;　({
&gt;　column_name  =&gt; &quot;price_main_$userdata-&gt;{currency_type}&quot;,
&gt;&gt;逆順処理
&gt;&gt;1 で逆順
&gt;　reverse_mode =&gt; &#039;0&#039;,
&gt;&gt;並び替えモード
&gt;&gt;number_quick で数値モード
&gt;&gt;character_quick で文字モード
&gt;　sort_mode    =&gt; &#039;number_quick&#039;,
&gt;　});
&gt;&gt;抽出・検索・並び替えされたレコードを取得
&gt;my @lines = $database-&gt;get_extract_database();
&gt;&gt;レコード処理
&gt;foreach (@lines)
&gt;　{
&gt;　my $line = $_;
&gt;&gt;レコードの分割とカラム名との関連づけ
&gt;　my %target_values = $database-&gt;get_values_argument
&gt;　　({
&gt;　　database_values =&gt; $line,
&gt;　　});
&gt;&gt;ここで例えばレコードの内容の表示処理を行う
&gt;　print $target_values{item_id};
&gt;　}
&gt;&gt;終了処理
&gt;undef $database;    </description>
    <dc:date>2009-11-02T18:10:02+09:00</dc:date>
    <utime>1257153002</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/cafemilk/pages/2.html">
    <title>メニュー</title>
    <link>https://w.atwiki.jp/cafemilk/pages/2.html</link>
    <description>
      **メニュー
-[[トップページ]]
----
-[[製品の位置づけ]]
-[[製品の概要]]
-[[動作環境]]
-[[ダウンロード]]
-[[インストール 1&gt;インストール ケース 1]]
-[[インストール 2&gt;インストール ケース 2]]
-[[インストール 3&gt;インストール 初期作業]]
-[[インストール 4&gt;インストール その他]]
-[[バージョンアップ&gt;インストール バージョンアップ]]
----
-[[基本エンジン&gt;仕様 基本エンジン]]
-[[exeute 型プラグイン&gt;プラグイン exeute 型]]
-[[plugin 型プラグイン&gt;プラグイン plugin 型]]
-[[その他のプラグイン&gt;プラグイン その他]]
-[[スキンの概要&gt;スキン 概要]]
-[[テンプレートエンジン&gt;スキン テンプレートエンジン]]
-[[基本データベース&gt;データベース 基本データベース]]
-[[ログデータベース&gt;データベース ログデータベース]]

// **管理作業用
// -[[@wikiご利用ガイド&gt;&gt;http://atwiki.jp/guide/]]
// -[[プラグイン紹介&gt;プラグイン]]
// -[[まとめサイト作成支援ツール]]

&amp;link_editmenu(text=ここを編集)    </description>
    <dc:date>2009-10-26T17:17:53+09:00</dc:date>
    <utime>1256545073</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/cafemilk/pages/1.html">
    <title>トップページ</title>
    <link>https://w.atwiki.jp/cafemilk/pages/1.html</link>
    <description>
      *CAFEMILK SHOPPING CART V5
-スキン＆プラグイン方式でカスタマイズが簡単＆自由な CAFEMILK SHOPPING CART V5 製品
-ここでは、製品についての種々の情報をまとめたり蓄積したりしています。
--公式の情報より圧倒的に詳しい内容です。
--内容については無責任・無保証です。あらかじめご承知おきください。
**バージョン
- 現在のバージョン - V5.1.6.R2
**基本
-[[製品の位置づけ]]
-[[製品の概要]]
-[[動作環境]]
-[[ダウンロード]]
-インストール
--[[ケース 1&gt;インストール ケース 1]]
--[[ケース 2&gt;インストール ケース 2]]
--[[初期作業&gt;インストール 初期作業]]
--[[その他&gt;インストール その他]]
--[[バージョンアップ&gt;インストール バージョンアップ]]
**仕様
-[[基本エンジン&gt;仕様 基本エンジン]]
-プラグイン
--[[exeute 型&gt;プラグイン exeute 型]]
--[[plugin 型&gt;プラグイン plugin 型]]
--[[その他&gt;プラグイン その他]]
-スキン
--[[概要&gt;スキン 概要]]
--[[テンプレートエンジン&gt;スキン テンプレートエンジン]]
-データベース
--[[基本データベース&gt;データベース 基本データベース]]
--[[ログデータベース&gt;データベース ログデータベース]]
//-ツール
//-セキュリティ
**リンク
-公式
--[[公式ホーム&gt;http://cafemilk.milkcafe.to/]]
//--[[更新情報など&gt;http://cafemilk.milkcafe.to/v5forum/wforum.cgi?mode=newsort&amp;page=0]]
//-そのほか
//--[[ショッピングカート比較&gt;http://procart.web.fc2.com/]]
//**２ちゃんねる
//-[[現行スレ&gt;http://pc11.2ch.net/test/read.cgi/php/1246680239/]]
//-[[テンプレ]]
//-発言集
//--[[有用な発言]]
//--[[ネタ]]    </description>
    <dc:date>2009-10-26T17:10:09+09:00</dc:date>
    <utime>1256544609</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/cafemilk/pages/31.html">
    <title>データベース 基本データベース</title>
    <link>https://w.atwiki.jp/cafemilk/pages/31.html</link>
    <description>
      *基本データベース
-CAFEMILK SHOPIING CART V5 ではカンマ区切りCSV形式のデータベースを用います。
--文字コードは UTF-8N となります。
--エクセルの書式に対応しています。
-データベース運用の方法は用途に合わせて基本データベースとログデータベースの二種類があります。
-データベース関連の処理はフレームワークとなっていますので、カスタマイズ時の実装作業が楽です。
--レコードの各項目は SQL のようにカラム名をつけて操作することができ、効率的です。
-独自仕様であるため、SQL に常態化しているようなデータベースインジェクション脆弱性の危険がありません。

**基本データベースの概要
-基本データベースは、レコードを収めた1つのファイルとそのカラム名を収めたファイルの2ファイルからなるデータベースを運用する形態となります。
--レコードは古くなっても消えません。(ログローテンションしません。)
--Flock を用いてロックすることができます。
-基本データベースを扱うモジュールのファイル名は以下の通りです。
&gt;&amp;tt(){cafemilk_database_basic.pl}
-cafemilk_database_basic.pl のあるディレクトリは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[pl]}
-基本データベースの扱うデータベースのファイルは例えば以下の通りです。
&gt;&amp;tt(){item.csv.cgi........ : 商品データベースのレコード}
&gt;&amp;tt(){item_column_list.csv : 商品データベースのカラム名}
-データベースは標準にてセーフモードで運用されます。
--パーミッションファイルのないディレクトにあるデータベースの読み書きはできません。
-標準のセーフモードは以下のように指定されています。
&gt;$config-&gt;{database}{safety} = &#039;1&#039;;
-$config-&gt;{database}{safety} を設定しているファイルは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[config]}
&gt;&amp;tt(){　 　　 　　└　[admin]}
&gt;&amp;tt(){　 　　 　　 　　└　config_basic.pl}
-セーフモードにて要求されるパーミッションファイルは以下の通りです。
--ファイルの内容は何でもかまいせん。
&gt;&amp;tt(){[permit_database_connect.txt]}

**基本データベースの操作のサンプル
-以下は、データベスーから特定の条件に合うレコード(複数)を抽出して、抽出された各レコードを順次処理していく場合のサンプルとなります。
&gt;&gt;まずはデータベース接続
&gt;my $database = Cafemilk_database_basic-&gt;connect
&gt;　({
&gt;　config             =&gt; $config,
&gt;　userdata           =&gt; $userdata,
&gt;　log_error          =&gt; $log_error,
&gt;　log_alert          =&gt; $log_alert,
&gt;　status             =&gt; $status,
&gt;&gt;カラム名の所在の指定
&gt;　column_filename    =&gt; &#039;database/item_column_list.csv&#039;,
&gt;&gt;カラム名の区切りコードを指定
&gt;&gt;値はカンマ固定
&gt;　column_separator   =&gt; &#039;,&#039;,
&gt;&gt;レコードの所在の指定
&gt;　database_filename  =&gt; &#039;database/item.csv.cgi&#039;,
&gt;&gt;レコードの区切りコードを指定
&gt;&gt;値はカンマ固定
&gt;　database_separator =&gt; &#039;,&#039;,
&gt;&gt;接続モード
&gt;　database_mode      =&gt; &#039;+&lt;&#039;,
&gt;&gt;Flockの設定
&gt;&gt;ロックするときは &#039;2&#039; とする
&gt;　database_flock     =&gt; &#039;2&#039;,
&gt;　});
&gt;&gt;全レコードの読み込み
&gt;$database-&gt;get_record_all();
&gt;&gt;完全一致カラム抽出処理
&gt;my $target = &#039;multiprice&#039;;
&gt;$database-&gt;match_database
&gt;　({
&gt;　column_name =&gt; &#039;item_type&#039;,
&gt;　match_word  =&gt; $target,
&gt;　});
&gt;&gt;検索文字列の用意
&gt;&gt;文字列はスペース区切りで AND 検索となる
&gt;my $words = $input_values{&#039;search&#039;};
&gt;$words = Cafemilk_basic::decode_escape
&gt;　({
&gt;　config    =&gt; $config,
&gt;　userdata  =&gt; $userdata,
&gt;　log_error =&gt; $log_error,
&gt;　log_alert =&gt; $log_alert,
&gt;　status    =&gt; $status,
&gt;　text      =&gt; $words,
&gt;　});
&gt;&gt;検索の対象となるカラムの指定
&gt;my @columns = 
&gt;　(
&gt;　&quot;item_id&quot;,
&gt;　&quot;name_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;text_1_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;text_2_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;manufacturer_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;table_value_1_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;table_value_2_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;table_value_3_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;table_value_4_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;option_name_1_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;option_name_2_$userdata-&gt;{language_type}&quot;,
&gt;　&quot;option_name_3_$userdata-&gt;{language_type}&quot;,
&gt;　);
&gt;&gt;検索実行
&gt;$database-&gt;search_database
&gt;　({
&gt;　search_column  =&gt; \@columns,
&gt;　search_words   =&gt; $words,
&gt;&gt;英字の大文字と小文字の区別
&gt;&gt;1 でしない
&gt;　character_mode =&gt; &#039;1&#039;,
&gt;　});
&gt;&gt;並び替え処理
&gt;$database-&gt;sort_database
&gt;　({
&gt;　column_name  =&gt; &quot;price_main_$userdata-&gt;{currency_type}&quot;,
&gt;&gt;逆順処理
&gt;&gt;1 で逆順
&gt;　reverse_mode =&gt; &#039;0&#039;,
&gt;&gt;並び替えモード
&gt;&gt;number_quick で数値モード
&gt;&gt;character_quick で文字モード
&gt;　sort_mode    =&gt; &#039;number_quick&#039;,
&gt;　});
&gt;&gt;抽出・検索・並び替えされたレコードを取得
&gt;my @lines = $database-&gt;get_extract_database();
&gt;&gt;レコード処理
&gt;foreach (@lines)
&gt;　{
&gt;　my $line = $_;
&gt;&gt;レコードの分割とカラム名との関連づけ
&gt;　my %target_values = $database-&gt;get_values_argument
&gt;　　({
&gt;　　database_values =&gt; $line,
&gt;　　});
&gt;&gt;ここで例えばレコードの内容の表示処理を行う
&gt;　print $target_values{item_id};
&gt;　}
&gt;&gt;終了処理
&gt;undef $database;
-以下は、データベスーから特定の条件に合うレコード(単数)を抽出して、レコードを書き換える場合のサンプルとなります。
&gt;my $database = Cafemilk_database_basic-&gt;connect
&gt;　({
&gt;　config             =&gt; $config,
&gt;　userdata           =&gt; $userdata,
&gt;　log_error          =&gt; $log_error,
&gt;　log_alert          =&gt; $log_alert,
&gt;　status             =&gt; $status,
&gt;　column_filename    =&gt; &#039;database/item_column_list.csv&#039;,
&gt;　column_separator   =&gt; &#039;,&#039;,
&gt;　database_filename  =&gt; &#039;database/item.csv.cgi&#039;,
&gt;　database_separator =&gt; &#039;,&#039;,
&gt;　database_mode      =&gt; &#039;+&lt;&#039;,
&gt;　database_flock     =&gt; &#039;2&#039;,
&gt;　});
&gt;$database-&gt;get_record_all();
&gt;&gt;商品コード &#039;hoge&#039; のレコード(単独)を抽出
&gt;my $extract_database = $database-&gt;extract_last_record
&gt;　({
&gt;　extract_column_name  =&gt; &#039;item_id&#039;,
&gt;　extract_column_value =&gt; &#039;hoge&#039;,
&gt;　});
&gt;&gt;レコードの分割とカラム名との関連づけ
&gt;my %record = $database-&gt;get_values_argument
&gt;　({
&gt;　database_values =&gt; $extract_database,
&gt;　});
&gt;&gt;ここで例えば商品の販売数を更新
&gt;$record{sales_quantity} ++;
&gt;&gt;レコードの差し替え
&gt;$database-&gt;replace_record
&gt;　({
&gt;　extract_column_name  =&gt; &#039;item_id&#039;,
&gt;　extract_column_value =&gt; &#039;hoge&#039;,
&gt;　records =&gt; \%record,
&gt;　});
&gt;&gt;上書き
&gt;$database-&gt;overwrite();
&gt;undef $database;
-以下は、特定の条件に合うレコードを削除する場合のサンプルとなります。
&gt;my $database = Cafemilk_database_basic-&gt;connect
&gt;　({
&gt;　config             =&gt; $config,
&gt;　userdata           =&gt; $userdata,
&gt;　log_error          =&gt; $log_error,
&gt;　log_alert          =&gt; $log_alert,
&gt;　status             =&gt; $status,
&gt;　column_filename    =&gt; &#039;database/item_column_list.csv&#039;,
&gt;　column_separator   =&gt; &#039;,&#039;,
&gt;　database_filename  =&gt; &#039;database/item.csv.cgi&#039;,
&gt;　database_separator =&gt; &#039;,&#039;,
&gt;　database_mode      =&gt; &#039;+&lt;&#039;,
&gt;　database_flock     =&gt; &#039;2&#039;,
&gt;　});
&gt;$database-&gt;get_record_all();
&gt;&gt;商品コード &#039;hoge&#039; のレコード(単独)を削除
&gt;$database-&gt;delete_record
&gt;　({
&gt;　extract_column_name  =&gt; &#039;item_id&#039;,
&gt;　extract_column_value =&gt; &#039;hoge&#039;,
&gt;　});
&gt;&gt;上書き
&gt;$database-&gt;overwrite();
&gt;undef $database;
-以下は、レコードを追記する場合のサンプルとなります。
--追記を行う場合、get_record_all() や overwrite() は必要ありません。
&gt;my $database = Cafemilk_database_basic-&gt;connect
&gt;　({
&gt;　config             =&gt; $config,
&gt;　userdata           =&gt; $userdata,
&gt;　log_error          =&gt; $log_error,
&gt;　log_alert          =&gt; $log_alert,
&gt;　status             =&gt; $status,
&gt;　column_filename    =&gt; &#039;database/item_column_list.csv&#039;,
&gt;　column_separator   =&gt; &#039;,&#039;,
&gt;　database_filename  =&gt; &#039;database/item.csv.cgi&#039;,
&gt;　database_separator =&gt; &#039;,&#039;,
&gt;　database_mode      =&gt; &#039;+&lt;&#039;,
&gt;　database_flock     =&gt; &#039;2&#039;,
&gt;　});
&gt;&gt;レコードの作成
&gt;my %record;
&gt;&gt;%recordにレコードのカラム名と値を格納 (省略)
&gt;
&gt;&gt;追記
&gt;$database-&gt;postscript(\%record);
&gt;undef $database;
-以下はレコード数を確認する場合のサンプルとなります。
&gt;my $database = Cafemilk_database_basic-&gt;connect
&gt;　({
&gt;　config             =&gt; $config,
&gt;　userdata           =&gt; $userdata,
&gt;　log_error          =&gt; $log_error,
&gt;　log_alert          =&gt; $log_alert,
&gt;　status             =&gt; $status,
&gt;　column_filename    =&gt; &#039;database/item_column_list.csv&#039;,
&gt;　column_separator   =&gt; &#039;,&#039;,
&gt;　database_filename  =&gt; &#039;database/item.csv.cgi&#039;,
&gt;　database_separator =&gt; &#039;,&#039;,
&gt;　database_mode      =&gt; &#039;+&lt;&#039;,
&gt;　database_flock     =&gt; &#039;2&#039;,
&gt;　});
&gt;$database-&gt;get_record_all();
&gt;my $target = &#039;multiprice&#039;;
&gt;$database-&gt;match_database
&gt;　({
&gt;　column_name =&gt; &#039;item_type&#039;,
&gt;　match_word  =&gt; $target,
&gt;　});
&gt;&gt;レコード数の取得
&gt;my $stack = $database-&gt;get_stack();
&gt;undef $database;
-以下はダブルソートのサンプルとなります。
&gt;my $database = Cafemilk_database_basic-&gt;connect
&gt;　({
&gt;　config             =&gt; $config,
&gt;　userdata           =&gt; $userdata,
&gt;　log_error          =&gt; $log_error,
&gt;　log_alert          =&gt; $log_alert,
&gt;　status             =&gt; $status,
&gt;　column_filename    =&gt; &#039;database/item_column_list.csv&#039;,
&gt;　column_separator   =&gt; &#039;,&#039;,
&gt;　database_filename  =&gt; &#039;database/item.csv.cgi&#039;,
&gt;　database_separator =&gt; &#039;,&#039;,
&gt;　database_mode      =&gt; &#039;+&lt;&#039;,
&gt;　database_flock     =&gt; &#039;2&#039;,
&gt;　});
&gt;$database-&gt;get_record_all();
&gt;&gt;ダブルソート
&gt;$database-&gt;double_sort_database
&gt;　({
&gt;　column_name_1  =&gt; &#039;item_type&#039;,
&gt;　reverse_mode_1 =&gt; &#039;0&#039;,
&gt;　sort_mode_1    =&gt; &#039;character_quick&#039;,
&gt;　column_name_2  =&gt; &#039;item_id&#039;,
&gt;　reverse_mode_2 =&gt; &#039;0&#039;,
&gt;　sort_mode_2    =&gt; &#039;character_quick&#039;,
&gt;　});
&gt;&gt;ここに各処理(省略)
&gt;undef $database;

**DUMMY 接続
-データベースのロックの衝突を防いだり、処理の速度を上げるために DUMMY 接続を用いることができます。
-また、DUMMY 接続をうまく使うことにより、あるプラグインで抽出検索並び替え等を行ったレコードを別のプラグインで再利用できます。
--DUMMY 接続では書き込みはできません。
-以下はDUMMY 接続のサンプルとなります。
&gt;my $database = Cafemilk_database_basic-&gt;connect
&gt;　({
&gt;　config             =&gt; $config,
&gt;　userdata           =&gt; $userdata,
&gt;　log_error          =&gt; $log_error,
&gt;　log_alert          =&gt; $log_alert,
&gt;　status             =&gt; $status,
&gt;　column_filename    =&gt; &#039;database/item_column_list.csv&#039;,
&gt;　column_separator   =&gt; &#039;,&#039;,
&gt;　database_filename  =&gt; &#039;database/item.csv.cgi&#039;,
&gt;　database_separator =&gt; &#039;,&#039;,
&gt;　database_mode      =&gt; &#039;+&lt;&#039;,
&gt;　database_flock     =&gt; &#039;2&#039;,
&gt;　});
&gt;$database-&gt;get_record_all();
&gt;my @lines = $database-&gt;get_extract_database();
&gt;$userdata-&gt;{database}{lines}{item} = \@lines;
&gt;undef $database;
&gt;
&gt;my $database = Cafemilk_database_basic-&gt;dummy
&gt;　({
&gt;　config             =&gt; $config,
&gt;　userdata           =&gt; $userdata,
&gt;　log_error          =&gt; $log_error,
&gt;　log_alert          =&gt; $log_alert,
&gt;　status             =&gt; $status,
&gt;　column_filename    =&gt; &#039;database/item_column_list.csv&#039;,
&gt;　column_separator   =&gt; &#039;,&#039;,
&gt;　database_separator =&gt; &#039;,&#039;,
&gt;　});
&gt;my @lines = @{$userdata-&gt;{database}{lines}{item}};
&gt;&gt;レコード処理
&gt;foreach (@lines)
&gt;　{
&gt;　my $line = $_;
&gt;&gt;省略
&gt;　} 
&gt;undef $database;

**詳細
-データベース接続時の接続モードは以下のものの使用が禁止されています。
--OS の仕様により上書き時にデータが消えることがあるためです。
&gt;&amp;tt(){&gt;}
&gt;&amp;tt(){&gt;+}
-データベースに上書きがある場合、接続モードは以下を用いてください。
&gt;&amp;tt(){+&lt;}
-データベース読み込むだけの場合、接続モードは以下を用いてください。
&gt;&amp;tt(){&lt;}
-Flock は基本的に常に &#039;2&#039; です。
-postscript はただちに実行されるため、overwrite の必要はありません。

**並び替えモード
-並び替えモードは以下の通りとなります。
&gt;&amp;tt(){number_quick... : 数値のソート}
&gt;&amp;tt(){character_quick : 文字列のソート}
-以下のモードは使用を禁止されていますが、検索結果が確実でなくてもよい場合に、高速化を得ることができます。
&gt;&amp;tt(){number_basic... : 数値のソート}
&gt;&amp;tt(){character_basic : 文字列のソート}
-通常は使いませんが、ベンチマークを取りたい場合など、ほかに以下のソートが利用できます。
&gt;&amp;tt(){number_normal......... : 標準的なコードで書かれた早くないソート 数値}
&gt;&amp;tt(){character_normal...... : 標準的なコードで書かれた早くないソート 文字列}
&gt;&amp;tt(){number_schwartz....... : シュワルツ変換 数値}
&gt;&amp;tt(){character_schwartz ....: シュワルツ変換 文字列}
&gt;&amp;tt(){number_eimerbrigade... : バケットソート 数値}
&gt;&amp;tt(){character_eimerbrigade : バケットソート 文字列}
-通常は使いませんが、以下は検索結果が雑になるソートです。
&gt;&amp;tt(){number_greathattery... : いい加減ソート 数値}
&gt;&amp;tt(){character_greathattery : いい加減ソート 文字列}    </description>
    <dc:date>2009-10-20T23:10:14+09:00</dc:date>
    <utime>1256047814</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/cafemilk/pages/30.html">
    <title>スキン テンプレートエンジン</title>
    <link>https://w.atwiki.jp/cafemilk/pages/30.html</link>
    <description>
      *テンプレートエンジン
-CAFEMILK SHOPPING CART V5 製品には独自のテンプレートエンジンが搭載されており、通常の HTML ソースに独自タグによる表記を加え、それをテンプレートエンジンに通すことによってウエブ表示等のテキスト出力が完成するという仕組みになっています。

**タグ
-タグには以下の表記と種類があります。
&gt;&amp;tt(){&lt;#key#&gt;.......... : 低層テンプレートタグ}
&gt;&amp;tt(){&lt;##key##&gt;........ : 中層テンプレートタグ}
&gt;&amp;tt(){&lt;###key###&gt;...... : 高層テンプレートタグ}
&gt;&amp;tt(){&lt;####key####&gt;.... : 低層プラグインタグ}
&gt;&amp;tt(){&lt;#####key#####&gt;.. : 中層プラグインタグ}
&gt;&amp;tt(){&lt;######key######&gt; : 高層プラグインタグ}
-テンプレートタグは主に文字列の出力に用います。
-プラグインタグは plugin 型プラグイン (用語に注意) を呼び出すタグで、プログラムの実行とスキン部品の出力を行います。
--テンプレートタグが簡易、プラグインタグが高度、という位置づけになります。
-# 記号の多さは実行の優先度を表します。つまり、# 記号が多いタグほど優先して実行されます。
-どのタグにも必要に応じてオプションをつけることができます。
--オプションは : (コロン) 区切りで複数を指定できます。
-以下はオプションの付いたタグの一例です。
&gt;&lt;#####mail_cart_record:package#####&gt;

**構成
-テンプレートエンジンは、ウェブ処理用とメール処理用の 2 種類あります。
-基本的な振る舞いはどちらも同じとなります。
-ウェブ用テンプレートエンジンのファイル名は以下の通りとなります。
&gt;&amp;tt(){cafemilk_skin_html.pl}
-cafemilk_skin_html.pl は以下のファイルを参照します。
&gt;&amp;tt(){cafemilk_tag_html.pl}
-これらのファイルのあるディレクトリは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[pl]}
-メール用テンプレートエンジンのファイル名は以下の通りとなります。
&gt;&amp;tt(){cafemilk_skin_mail.pl}
-cafemilk_skin_mail.pl は以下のファイルを参照します。
&gt;&amp;tt(){cafemilk_tag_mail.pl}
-これらのファイルのあるディレクトリは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[pl]}
-基本エンジン (コントローラ) は、 execute の HTML テンプレート処理を肩代わりする仕様となっており、専用のテンプレートコントローラが用意されています。(用語注意)
--MAIL テンプレート処理のテンプレートコントローラはありません。execute 側がコントローラを内包することになります。
--plugin は常にテンプレートコントローラを内包します。
---内包することを望まない場合、execute 用のテンプレートコントローラを呼び出して使用することが可能です。
-テンプレートコントローラのファイル名は以下の通りとなります。
&gt;&amp;tt(){cafemilk_template_html.pl}
-cafemilk_template_html.pl のあるディレクトリは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[pl]}

*設定
-テンプレートタグおよびプラグインタグは、実行を許可されなければなりません。
--許可されていないタグは無視されます。
-あらかじめ規定値(許可のリスト)が設定されています。
-WEB テンプレートタグの規定値は以下に設定されています。
&gt;$config-&gt;{list}{tag}{html}
-$config-&gt;{list}{plugin} を設定しているファイルは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[config]}
&gt;&amp;tt(){　 　　 　　└　[admin]}
&gt;&amp;tt(){　 　　 　　 　　└　config_basic.pl}
-MAIL テンプレートタグの規定値は以下に設定されています。
&gt;$config-&gt;{list}{tag}{mail}
-$config-&gt;{list}{plugin} を設定しているファイルは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[config]}
&gt;&amp;tt(){　 　　 　　└　[admin]}
&gt;&amp;tt(){　 　　 　　 　　└　config_basic.pl}
-プラグインタグの規定値は以下に設定されています。
&gt;$config-&gt;{list}{plugin}
-$config-&gt;{list}{plugin} を設定しているファイルは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[config]}
&gt;&amp;tt(){　 　　 　　└　[admin]}
&gt;&amp;tt(){　 　　 　　 　　└　config_basic.pl}

*コントローラ
-テンプレートコントローラは、モジュールとして外部に持つことも、内部に持つこともできます。
--テンプレートエンジンはフレームワークですので操作 (コントロール) の方法がわかれば十分です。
-以下は、外部モジュールとなる cafemilk_template_html.pl のソースとなります。
--cafemilk_template_html.pl はコントローラとしての機能をすべて備えていますので、コントローラを plugin に内包させる場合などに参考にしてください。
&gt;################################################################################
&gt;#                                                                              #
&gt;#                          CAFEMILK SHOPPING CART  V5                          #
&gt;#                       SOHO WORKSHOP CAFEMILK  全権留保                       #
&gt;#                                                                              #
&gt;################################################################################
&gt;
&gt;use strict;
&gt;# use warnings;
&gt;use utf8;
&gt;# use encoding &quot;utf8&quot;;
&gt;use open &quot;:utf8&quot;;
&gt;
&gt;require &#039;./pl/cafemilk_skin_html.pl&#039;;
&gt;
&gt;package Cafemilk_template_html;
&gt;sub template
&gt;　{
&gt;　my $argument = shift;
&gt;　my $config    = $argument-&gt;{config};
&gt;　my $userdata  = $argument-&gt;{userdata};
&gt;　my $log_error = $argument-&gt;{log_error};
&gt;　my $log_alert = $argument-&gt;{log_alert};
&gt;　my $status    = $argument-&gt;{status};
&gt;&gt;スキンのパスの受け取り。
&gt;　my $path      = $argument-&gt;{skinpath};
&gt;&gt;テンプレートエンジンを操作するソースはここから
&gt;　# HTML スキンファイルを読み込みます。
&gt;&gt;まずはオブジェクト作成。
&gt;　my $skin_html_main = Cafemilk_skin_html-&gt;new
&gt;　　({
&gt;　　config    =&gt; $config,
&gt;　　userdata  =&gt; $userdata,
&gt;　　log_error =&gt; $log_error,
&gt;　　log_alert =&gt; $log_alert,
&gt;　　status    =&gt; $status,
&gt;&gt;name は任意の文字列を充てる。
&gt;&gt;ここでは execute 名が使われている。
&gt;　　name      =&gt; &quot;$userdata-&gt;{request_values}{execute}[0]&quot;,
&gt;　　});
&gt;&gt;スキンの読み込み。
&gt;&gt;$path は相対パスで指定する。
&gt;　$skin_html_main-&gt;set_path($path);
&gt;&gt;プラグインタグ (plugin 型プラグイン) の処理。
&gt;　# 高層プラグインを抽出。
&gt;　$skin_html_main-&gt;load_plugin_high();
&gt;　# 高層プラグインを置換。
&gt;　$skin_html_main-&gt;replace_plugin_high
&gt;　　({
&gt;　　allow       =&gt; $config-&gt;{list}{plugin},
&gt;　　plugin_path =&gt; &quot;./$config-&gt;{path}{plugin}/&quot;,
&gt;　　package     =&gt; &#039;Cart_plugin&#039;,
&gt;　　});
&gt;　# 中層プラグインを抽出。
&gt;　$skin_html_main-&gt;load_plugin_middle();
&gt;　# 中層プラグインを置換。
&gt;　$skin_html_main-&gt;replace_plugin_middle
&gt;　　({
&gt;　　allow       =&gt; $config-&gt;{list}{plugin},
&gt;　　plugin_path =&gt; &quot;./$config-&gt;{path}{plugin}/&quot;,
&gt;　　package     =&gt; &#039;Cart_plugin&#039;,
&gt;　　});
&gt;　# 下層プラグインを抽出。
&gt;　$skin_html_main-&gt;load_plugin_low();
&gt;　# 下層プラグインを置換。
&gt;　$skin_html_main-&gt;replace_plugin_low
&gt;　　({
&gt;　　allow       =&gt; $config-&gt;{list}{plugin},
&gt;　　plugin_path =&gt; &quot;./$config-&gt;{path}{plugin}/&quot;,
&gt;　　package     =&gt; &#039;Cart_plugin&#039;,
&gt;　　});
&gt;&gt;テンプレートタグの処理。
&gt;　# 高層タグを抽出。
&gt;　$skin_html_main-&gt;load_tag_high();
&gt;　# 高層タグを置換。
&gt;　$skin_html_main-&gt;replace_tag_high
&gt;　　({
&gt;　　allow   =&gt; $config-&gt;{list}{tag}{html},
&gt;　　package =&gt; &quot;Cafemilk_tag_html&quot;,
&gt;　　});
&gt;　# 中層タグを抽出。
&gt;　$skin_html_main-&gt;load_tag_middle();
&gt;　# 中層タグを置換。
&gt;　$skin_html_main-&gt;replace_tag_middle
&gt;　　({
&gt;　　allow   =&gt; $config-&gt;{list}{tag}{html},
&gt;　　package =&gt; &quot;Cafemilk_tag_html&quot;,
&gt;　　});
&gt;　# 下層タグを抽出。
&gt;　$skin_html_main-&gt;load_tag_low();
&gt;　# 下層タグを置換。
&gt;　$skin_html_main-&gt;replace_tag_low
&gt;　　({
&gt;　　allow   =&gt; $config-&gt;{list}{tag}{html},
&gt;　　package =&gt; &quot;Cafemilk_tag_html&quot;,
&gt;　　});
&gt;　# HTML スキンの処理済みソースを取得します。
&gt;　my $source = $skin_html_main-&gt;get_source();
&gt;&gt;ここまで。
&gt;　}
&gt;1;
-次の例は plugin におけるコントローラの実装例です。
&gt;################################################################################
&gt;#                                                                              #
&gt;#                          CAFEMILK SHOPPING CART  V5                          #
&gt;#                       SOHO WORKSHOP CAFEMILK  全権留保                       #
&gt;#                                                                              #
&gt;################################################################################
&gt;
&gt;use strict;
&gt;# use warnings;
&gt;use utf8;
&gt;# use encoding &quot;utf8&quot;;
&gt;
&gt;package Cart_plugin;
&gt;sub user_inquiry_step1_html
&gt;　{
&gt;　my $package  = shift;
&gt;　my $argument = shift;
&gt;　my $config    = $argument-&gt;{config};
&gt;　my $userdata  = $argument-&gt;{userdata};
&gt;　my $log_error = $argument-&gt;{log_error};
&gt;　my $log_alert = $argument-&gt;{log_alert};
&gt;　my $status    = $argument-&gt;{status};
&gt;　my $pin_name = &#039;user_inquiry_step1_html&#039;;
&gt;　my $path = &quot;./$config-&gt;{path}{skin}/user/cgi/$config-&gt;{default}{user_type}/$userdata-&gt;{device_type}/$userdata-&gt;{language_type}/$userdata-&gt;{currency_type}/$userdata-&gt;{template_type}/pin_user_inquiry_step1.html&quot;;
&gt;　my %input_values;
&gt;　my @list = 
&gt;　　qw(
&gt;　　input_1_email_1 input_1_email_2 input_inquiry
&gt;　　);
&gt;　foreach (@list)
&gt;　　{
&gt;　　$input_values{$_} = $userdata-&gt;{request_values}{$_}[0];
&gt;　　}
&gt;&gt;テンプレートタグ temporal に各情報を格納
&gt;&gt;格納は $userdata-&gt;{tag_data}{temporal}{$key} に行う
&gt;　foreach (keys %input_values)
&gt;　　{
&gt;　　$userdata-&gt;{tag_data}{temporal}{$_} = $input_values{$_};
&gt;　　}
&gt;　if (($input_values{input_1_email_1} eq &#039;&#039;)
&gt;　and ($input_values{input_1_email_2} eq &#039;&#039;))
&gt;　　{
&gt;　　$userdata-&gt;{tag_data}{temporal}{input_1_email_1} = $userdata-&gt;{user_registry_values}{&#039;1_email_1&#039;};
&gt;　　$userdata-&gt;{tag_data}{temporal}{input_1_email_2} = $userdata-&gt;{user_registry_values}{&#039;1_email_1&#039;};
&gt;　　}
&gt;&gt;ここからテンプレート処理 (コントローラ)
&gt;
&gt;&gt;オブジェクト作成
&gt;　my $skin = Cafemilk_skin_html-&gt;new
&gt;　　({
&gt;　　config    =&gt; $config,
&gt;　　userdata  =&gt; $userdata,
&gt;　　log_error =&gt; $log_error,
&gt;　　log_alert =&gt; $log_alert,
&gt;　　status    =&gt; $status,
&gt;　　name      =&gt; $pin_name,
&gt;　　});
&gt;&gt;スキン読み込み
&gt;　$skin-&gt;set_path($path);
&gt;&gt;中層テンプレートタグの取得
&gt;　$skin-&gt;load_tag_middle();
&gt;&gt;許可リストの作成
&gt;&gt;ここでは temporal のみ許可
&gt;　my @list = qw(temporal);
&gt;&gt;中層テンプレートタグの処理
&gt;　$skin-&gt;replace_tag_middle
&gt;　　({
&gt;　　allow   =&gt; \@list,
&gt;　　package =&gt; &quot;Cafemilk_tag_html&quot;,
&gt;　　});
&gt;&gt;コーディングルールにしたがいテンプレートタグ temporal の内容を消去
&gt;　undef $userdata-&gt;{tag_data}{temporal};
&gt;&gt;処理されたスキンの出力
&gt;　my $source = $skin-&gt;get_source();
&gt;　}
&gt;sub user_inquiry_step1_mail
&gt;　{
&gt;　# none
&gt;　}
&gt;1;
-この plugin では、plugin に固有の情報をすべて中層テンプレートタグ temporal にて出力しています。
-そのため、コントローラ部分から必要のない処理は一切省かれています。
--そのため、中層テンプレートタグしか処理されていません。
--また、規定の設定値 $config-&gt;{list}{tag}{html} は使用されていません。
-plugin での処理が省かれることにより、plugin で処理されなかった各種タグの処理は execute に回されます。
--たとば、テンプレートタグ path_material はスキン内に大量に出てきますが、これを繰り返し処理するとリソースを食うから、というのが理由です。最終的に execute のコントローラがすべてのタグを処理するので、上記のような処理でタグ処理に漏れがあったとしても問題はなく、plugin は plugin に固有のタグの処理に専念できるというわけです。
-plugin に固有の情報はテンプレートタグは temporal に格納することになります。コーディングルールにより temporal は逐次内容を undef することになっており、その情報が外部に干渉することはありません。
--たとえば、異なる plugin が &lt;##temporal:hoge##&gt; といった同じタグを用いても、あるいは、同じ plugin が複数実行されてその都度同じタグが異なる内容を出力する場合でも、干渉はないということです。
--他のプラグインで情報を利用する必要がある場合は message を使います。message は undef しないので値を使いまわせます。
-次の例はメール送信処理の例です。
--メール送信処理はフレームワーク化されているので手間がかかりません。
&gt;&gt;任意の処理名を設定
&gt;　　my $mail_name = &#039;user_inquiry_step3_shop&#039;;
&gt;&gt;スキンのパスの指定
&gt;　　my $path = &quot;./$config-&gt;{path}{skin}/user/cgi/$config-&gt;{default}{user_type}/$userdata-&gt;{device_type}/$userdata-&gt;{language_type}/$userdata-&gt;{currency_type}/$userdata-&gt;{template_type}/mail_user_inquiry_step3_shop.txt&quot;;
&gt;&gt;オブジェクト作成
&gt;　　my $skin = Cafemilk_skin_mail-&gt;new
&gt;　　　({
&gt;　　　config    =&gt; $config,
&gt;　　　userdata  =&gt; $userdata,
&gt;　　　log_error =&gt; $log_error,
&gt;　　　log_alert =&gt; $log_alert,
&gt;　　　status    =&gt; $status,
&gt;　　　name      =&gt; $mail_name,
&gt;　　　});
&gt;
&gt;&gt;中略
&gt;
&gt;&gt;スキンの読み込み
&gt;　　$skin-&gt;set_path($path);
&gt;&gt;中層テンプレートタグの取得
&gt;　　$skin-&gt;load_tag_middle();
&gt;&gt;規定値の取得
&gt;　　my @list = @{$config-&gt;{list}{tag}{mail}};
&gt;&gt;中層テンプレートタグの処理
&gt;　　$skin-&gt;replace_tag_middle
&gt;　　　({
&gt;　　　allow   =&gt; \@list,
&gt;　　　package =&gt; &quot;Cafemilk_tag_mail&quot;,
&gt;　　　});
&gt;&gt;temporal は uendf する
&gt;　　undef $userdata-&gt;{tag_data}{temporal};
&gt;&gt;処理されたスキンの取得
&gt;　　my $source = $skin-&gt;get_source();
&gt;&gt;メール送信処理
&gt;　　my $from = $config-&gt;{sendmail}{address}{shop}{from}[0];
&gt;　　my $to   = $input_values{input_1_email_1};
&gt;　　my $cc   = &#039;&#039;;
&gt;　　my $bcc  = &#039;&#039;;
&gt;　　my $return = $config-&gt;{sendmail}{address}{shop}{return}[0];
&gt;　　Cafemilk_mail::skin_sendmail
&gt;　　　({
&gt;　　　config    =&gt; $config,
&gt;　　　userdata  =&gt; $userdata,
&gt;　　　log_error =&gt; $log_error,
&gt;　　　log_alert =&gt; $log_alert,
&gt;　　　status    =&gt; $status,
&gt;　　　from      =&gt; $from,
&gt;　　　to        =&gt; $to,
&gt;　　　cc        =&gt; $cc,
&gt;　　　bcc       =&gt; $bcc,
&gt;　　　source    =&gt; $source,
&gt;　　　return    =&gt; $return,
&gt;　　　});    </description>
    <dc:date>2009-10-12T15:02:28+09:00</dc:date>
    <utime>1255327348</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/cafemilk/pages/29.html">
    <title>スキン 概要</title>
    <link>https://w.atwiki.jp/cafemilk/pages/29.html</link>
    <description>
      *概要
**スキンの型
-スキンには種類とか型とか呼ばれる種別があります。
-その内容は以下の通りです。
-HTML スキン
--もしくはウェブ用スキン。
--ウェブ出力用のスキンで、execute 用と plugin 用とがあります。
-MAIL スキン
--もしくはメール用スキン。
--メール出力用のスキンです。
-WORDLIST 型スキン
--これは補助的なスキンです。
--条件に合わせて選択したうえで他のスキンに挿入する必要のある様々な文字列を扱います。
--たとえば曜日のリストといったものになります。
-スタイルシート
--HTML スキンが必要とする外部スタイルシートです。
**アドバイス
-製品を導入するショップのほとんどが、スキンを自作することを考えておられると思います。
-その際は以下の点にぜひご留意ください。
--標準スキンを改造するより、HP作成ソフトなどを使って新規にデザインを起こしてそれを移植する方がはるかに楽です。
--標準は全ページ3ペインとなっていますが、ページによっては2ペインとなるようにするとよさそうです。
---各ページにあるヘルプはくどいので省いたほうがいいかもしれません。
--2ペインにする場合でも3ペインにする場合でもメインの部分はブラウザの幅に合わせて表示幅が可変になるようにするのがスマートです。
-公式に[[スキン製作例&gt;http://cafemilk.milkcafe.to/v5skin.html]]がありますのでよく読みましょう。
**独自タグについての予備知識
-CAFEMILK SHOPPING CART V5 製品には独自のテンプレートエンジンが搭載されており、通常の HTML ソースに独自タグによる表記を加え、それをテンプレートエンジンに通すことによってウエブ表示等のテキスト出力が完成するという仕組みになっています。
-タグには以下の表記と種類があります。
&gt;&amp;tt(){&lt;#key#&gt;.......... : 低層テンプレートタグ}
&gt;&amp;tt(){&lt;##key##&gt;........ : 中層テンプレートタグ}
&gt;&amp;tt(){&lt;###key###&gt;...... : 高層テンプレートタグ}
&gt;&amp;tt(){&lt;####key####&gt;.... : 低層プラグインタグ}
&gt;&amp;tt(){&lt;#####key#####&gt;.. : 中層プラグインタグ}
&gt;&amp;tt(){&lt;######key######&gt; : 高層プラグインタグ}
-テンプレートタグは主に文字列の出力に用います。
-プラグインタグは plugin 型プラグイン (用語に注意) を呼び出すタグで、プログラムの実行とスキン部品の出力を行います。
--テンプレートタグが簡易、プラグインタグが高度、という位置づけになります。
--が、スキン側から見ればどちらもただのタグです。
--これらは、スキン側から見る限り、違いを気にする必要はあまりありません。
-# 記号の多さは実行の優先度を表します。つまり、# 記号が多いタグほど優先して実行されます。
-どのタグにも必要に応じてオプションをつけることができます。
--オプションは : (コロン) 区切りで複数を指定できます。
-以下はオプションの付いたタグの一例です。
&gt;&lt;#####mail_cart_record:package#####&gt;
-以下は覚えておきたいテンプレートタグです。
&gt;&amp;tt(){path_cgi......... : CGIのファイル名}
&gt;&amp;tt(){url_root......... : CGIのURL}
&gt;&amp;tt(){url_sslroot...... : SSLでのCGIのURL}
&gt;&amp;tt(){path_material.... : スキン内で使用する素材画像ファイルのディレクトリ}
&gt;&amp;tt(){user_name........ : 会員のニックネーム}
&gt;&amp;tt(){user_point....... : 会員の所有ポイント}
&gt;&amp;tt(){mailing_free_cost : 送料無料購入額}
&gt;&amp;tt(){make_select...... : フォーム内の SELECT 入力欄}
&gt;&amp;tt(){message.......... : 汎用 オプションをつけて様々な語句を出力する}
&gt;&amp;tt(){temporal......... : 汎用 オプションをつけて様々な語句を出力する}
&gt;&amp;tt(){preview_user_type : ログイン属性}
&gt;&amp;tt(){category_bread... : パンくずナビ}
&gt;&amp;tt(){cart_stack....... : カートへの投入数}
&gt;&amp;tt(){cart_subtotal.... : カートの小計}
&gt;&amp;tt(){material_html.... : 汎用 HTML 部品の単純呼び出し}

**HTML execute スキン
-あるいは単に execute スキン。
-これは、ウェブに表示される各ページの全体をレイアウトするスキンです。
--そこに、プラグインタグやテンプレートタグという形で、スキン部品や各種要素が挿入されていきます。
-スキンのファイル名は以下のようになります。
&gt;&amp;tt(){exe_ + execute 名 + .html}
-通常、スキンは、PC 表示用と MOBILE (携帯) 表示用の 2 種類あって、それぞれ別のディレクトリにあります。
-execute スキンは以下のディレクトリに存在します。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[user]}
&gt;&amp;tt(){　 　　 　　 　　└　[cgi]}
&gt;&amp;tt(){　 　　 　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　[web]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　└　[mobile]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　└　[default]}
-HTML execute スキンはウェブページとなるものですので、head を出力しなければなりません。
-head においては以下の情報の出力が行われます。
&gt;&amp;tt(){title....... : ページのタイトル}
&gt;&amp;tt(){Content-Type : 文字コードは UTF-8 です}
&gt;&amp;tt(){robots...... : ロボット型クローラへの指示}
&gt;&amp;tt(){product..... : 製品の情報}
&gt;&amp;tt(){author...... : 制作者}
&gt;&amp;tt(){stylesheet.. : スタイルシートのパス}
&gt;&amp;tt(){script...... : JS スクリプトのパス 必要な場合のみ}
-以下はその一例です
&gt;&lt;head&gt;
&gt;&lt;title&gt;会員登録手続 &gt; &gt; 情報の入力&lt;/title&gt;
&gt;&lt;META HTTP-EQUIV=&#039;Content-Type&#039; CONTENT=&#039;text/html; charset=UTF-8&#039;&gt;
&gt;&lt;meta name=&#039;robots&#039; content=&#039;&amp;color(,#f2e59e){&lt;#robots#&gt;}&#039;&gt;
&gt;&lt;meta name=&#039;product&#039; content=&#039;&amp;color(,#f2e59e){&lt;##product##&gt;}&#039;&gt;
&gt;&lt;meta name=&#039;author&#039; content=&#039;&amp;color(,#f2e59e){&lt;##author##&gt;}&#039;&gt;
&gt;&lt;link href=&#039;&amp;color(,#f2e59e){&lt;##path_css##&gt;}&#039; type=&#039;text/css&#039; rel=&#039;stylesheet&#039;&gt;
&gt;&lt;script src=&#039;&amp;color(,#f2e59e){&lt;##path_js##&gt;}ajaxzip2/prototype.js&#039;&gt;&lt;/script&gt;
&gt;&lt;script src=&#039;&amp;color(,#f2e59e){&lt;##path_js##&gt;}ajaxzip2/ajaxzip2.js&#039; charset=&#039;UTF-8&#039;&gt;&lt;/script&gt;
&gt;&lt;script&gt;AjaxZip2.JSONDATA = &#039;&amp;color(,#f2e59e){&lt;##path_js##&gt;}ajaxzip2/data&#039;;&lt;/script&gt;
&gt;&lt;/head&gt;
-実際の出力では独自タグ (この場合はテンプレートタグ) が置換されますので、例えば以下のようになります。
&gt;&lt;head&gt;
&gt;&lt;title&gt;会員登録手続 &gt; &gt; 情報の入力&lt;/title&gt;
&gt;&lt;META HTTP-EQUIV=&#039;Content-Type&#039; CONTENT=&#039;text/html; charset=UTF-8&#039;&gt;
&gt;&lt;meta name=&#039;robots&#039; content=&#039;&amp;color(,#f2e59e){noindex,follow}&#039;&gt;
&gt;&lt;meta name=&#039;product&#039; content=&#039;&amp;color(,#f2e59e){CAFEMILK SHOPPING CART V5 TYPE A}&#039;&gt;
&gt;&lt;meta name=&#039;author&#039; content=&#039;&amp;color(,#f2e59e){SOHO WORKSHOP CAFEMILK, TAKASHI MIYAHARA, 宮原 崇}&#039;&gt;
&gt;&lt;link href=&#039;&amp;color(,#f2e59e){http://www.example.com/shop/skin/user/cgi/default/web/japanese/yen/default/style_cafemilk.css}&#039; type=&#039;text/css&#039; rel=&#039;stylesheet&#039;&gt;
&gt;&lt;script src=&#039;&amp;color(,#f2e59e){http://www.example.com/shop/skin/js/}ajaxzip2/prototype.js&#039;&gt;&lt;/script&gt;
&gt;&lt;script src=&#039;&amp;color(,#f2e59e){http://www.example.com/shop/skin/js/}ajaxzip2/ajaxzip2.js&#039; charset=&#039;UTF-8&#039;&gt;&lt;/script&gt;
&gt;&lt;script&gt;AjaxZip2.JSONDATA = &#039;&amp;color(,#f2e59e){http://www.example.com/shop/skin/js/}ajaxzip2/data&#039;;&lt;/script&gt;
&gt;&lt;/head&gt;

**HTML plugin スキン
-あるいは単に plugin スキン。
-これは、プラグインタグによって呼び出されるスキン部品となります。
-plugin 型プラグインが呼び出すスキンが 1 つのみの場合、たいてい、スキンのファイル名は以下のようになります。
&gt;&amp;tt(){pin_ + plugin 名 + .html}
-しかし、plugin 型プラグインは複数のスキンを読み込むことがあります。
-例えば、plugin 型プラグイン user_item_main が呼び出すスキンは以下のようになります。
--ファイル名が揃っているので判別は容易です。
&gt;&amp;tt(){pin_user_item_main_image.html}
&gt;&amp;tt(){pin_user_item_main_flash.html}
&gt;&amp;tt(){pin_user_item_main_text.html}
&gt;&amp;tt(){pin_user_item_main_table.html}
&gt;&amp;tt(){pin_user_item_main_submit_singletype.html}
&gt;&amp;tt(){pin_user_item_main_submit_multitype_1.html}
&gt;&amp;tt(){pin_user_item_main_submit_multitype_2.html}
&gt;&amp;tt(){pin_user_item_main_submit_multiprice_1.html}
&gt;&amp;tt(){pin_user_item_main_submit_multiprice_2.html}
-通常、スキンは、PC 表示用と MOBILE (携帯) 表示用の 2 種類あって、それぞれ別のディレクトリにあります。
-plugin スキンは以下のディレクトリ (execute スキンと同じディレクトリ) に存在します。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[user]}
&gt;&amp;tt(){　 　　 　　 　　└　[cgi]}
&gt;&amp;tt(){　 　　 　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　[web]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　└　[mobile]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　└　[default]}
-plugin 型プラグイン user_status のスキンは他の plugin スキンと異なり、ログイン状態によってスキンを切り替えるようになっています。そのため、同じファイル名 pin_user_status.html のスキンが 6 つあります。
-これらのスキンは以下のディレクトリに存在します。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[public_html]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[user]}
&gt;&amp;tt(){　 　　 　　 　　└　[cgi]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　├　[web]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　├　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　├　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　├　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　└　[mobile]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　 　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　 　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　 　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　[guest]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　├　[web]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　├　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　├　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　├　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　└　[mobile]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　 　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　 　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　├　　 　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　└　[member]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　[web]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　└　[mobile]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　└　[default]}

**MAIL スキン
-メールの本文を作成するスキン、という以外は HTML スキンとほぼ同じ振る舞いをします。
-スキンのファイル名は以下のようになります。
&gt;&amp;tt(){mail_ + メール名 + .txt}
-MAIL スキンは以下のディレクトリ (HTML スキンと同じディレクトリ) に存在します。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[user]}
&gt;&amp;tt(){　 　　 　　 　　└　[cgi]}
&gt;&amp;tt(){　 　　 　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　[web]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　└　[mobile]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　└　[default]}
-スキンの 1 行目は件名であることがあります。
-以下はスキンの例です。
&gt;&gt;1 行目は件名
&gt;[SHOP] 問い合わせ&lt;##user_time##&gt;
&gt;&gt;メール本文
&gt;※ このメールはショップ向けの自動発行メールです
&gt;● 基本情報
&gt;○ 手続名
&gt;　問い合わせ
&gt;○ 手続コード
&gt;　&lt;##user_time##&gt;
&gt;○ 日時
&gt;　&lt;##user_time_year##&gt;年&lt;##user_time_month##&gt;月&lt;##user_time_day##&gt;日&lt;##user_time_week##&gt; &lt;##user_time_hour##&gt;時&lt;##user_time_min##&gt;分
&gt;● 問い合わせ情報
&gt;○ メールアドレス
&gt;　&lt;##temporal:input_1_email_1##&gt;
&gt;○ 問い合わせ内容
&gt;&lt;##temporal:input_inquiry##&gt;

**WORDLIST 型スキン
-出力用の文字列を格納するスキンです。
-各項目は予約されており、並び替えることはしません。
-スキンのファイル名は以下のようになります。
&gt;&amp;tt(){list_ + WORDLIST 名 + .txt}
-WORDLIST 型スキンは以下のディレクトリ (HTML スキンと同じディレクトリ) に存在します。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[user]}
&gt;&amp;tt(){　 　　 　　 　　└　[cgi]}
&gt;&amp;tt(){　 　　 　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　[web]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　├　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　└　[mobile]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　└　[default]}
-例えば、list_input_status.txt の内容は以下のようになります。
&gt;入力内容が不正です
&gt;入力がありません
&gt;文字数が不正です
&gt;入力文字数が多すぎます
&gt;入力文字数が少なすぎます
&gt;入力内容が一致しません
&gt;同じ文字列がすでに使用されています
&gt;アカウント名とパスワードが同じです
&gt;他との重複により使用が認められないパスワードです
&gt;文字以上
&gt;文字以内
&gt;全角
&gt;半角
&gt;英数
&gt;数字
&gt;かな
&gt;カナ
&gt;数値が大きすぎます
&gt;数値が小さすぎます
&gt;桁数が不正です
-WORDLIST 型スキンの文字列は様々なところから呼び出されるので、変更する際には各所において表記に乱れが生じないか注意する必要があります。
**スタイルシート
-スタイルシートに特殊なところは何もありません。
-PC 表示のスタイルシートは外部にあります。
-PC 表示のスタイルシートは以下のディレクトリにあります。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[public_html]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[user]}
&gt;&amp;tt(){　 　　 　　 　　└　[cgi]}
&gt;&amp;tt(){　 　　 　　 　　 　　└　[default]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　└　[web]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　└　[japanese]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　└　[yen]}
&gt;&amp;tt(){　 　　 　　 　　 　　 　　 　　 　　 　　└　[default]}

**material_html スキン部品
-内部において独自タグを用いないスキン部品は plugin 型プラグインを介すことなく、テンプレートタグ material_html を用いて単純な呼び出しを行うことができます。
--トップページにバナー型の広告を並べる場合など、頻繁に部品の差し替えがある場合に重宝します。
-material_html の使用例は以下の通りです。
&gt;&lt;##material_html:sample##&gt;
-上記の場合に呼び出されるスキン部品のファイル名は以下の通りです。
&gt;&amp;tt(){sample.html}
-material_html が呼び出すスキンは以下のディレクトリに置きます。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[skin]}
&gt;&amp;tt(){　 　　 　　└　[user]}
&gt;&amp;tt(){　 　　 　　 　　└　[material]}

//├└─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋    </description>
    <dc:date>2009-10-02T17:43:11+09:00</dc:date>
    <utime>1254472991</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/cafemilk/pages/28.html">
    <title>プラグイン その他</title>
    <link>https://w.atwiki.jp/cafemilk/pages/28.html</link>
    <description>
      *その他
-カスタマイズの利便が要求される幾つかの機能は、execute 型や plugin 型とは別にプラグイン化されています。
**決済プラグイン
-決済処理用のプラグインです。
--決済処理がプラグイン化されていることにより、決済の追加が容易になります。
-使用する決済の ID は以下の設定に記載されなければなりません。
&gt;$config-&gt;{payment}{id_list}
-$config-&gt;{payment}{id_list} を設定しているファイルは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[config]}
&gt;&amp;tt(){　 　　 　　└　[common]}
&gt;&amp;tt(){　 　　 　　 　　└　config_common.pl}
-以下は設定の例です。
&gt;# 有効にする決済のID
&gt;　　　# 決済処理はモジュールによって実施されます。そのIDを指定してください。
&gt;　　　# 新規に決済を追加するにはモジュールの作成が必要です。
&gt;　　　# [代引決済を有効にする場合]
&gt;　　　# $config-&gt;{payment}{id_list} = [&#039;delivery_collect&#039;];
&gt;　　　# [ZEUS決済を追加する場合]
&gt;　　　# $config-&gt;{payment}{id_list} = [&#039;delivery_collect&#039;,&#039;zeus&#039;];
&gt;　　　# 利用できるIDは以下の通りです。
&gt;　　　# delivery_collect : 代金引換
&gt;　　　# bank_transfer    : 銀行振込
&gt;　　　# postal_transfer  : ゆうちょ銀行払込
&gt;　　　# zeus             : ZEUS決済 Link Point 方式
&gt;　　　# ※ ZEUS決済の他の方式について導入されるショップは開発元までご相談
&gt;　　　# ください。
&gt;　　　$config-&gt;{payment}{id_list} = [&#039;delivery_collect&#039;,&#039;bank_transfer&#039;,&#039;postal_transfer&#039;,&#039;zeus&#039;];
-上の設定の場合、以下の決済プラグインが読み込まれます。
&gt;&amp;tt(){delivery_collect.pl}
&gt;&amp;tt(){bank_transfer.pl}
&gt;&amp;tt(){postal_transfer.pl}
&gt;&amp;tt(){zeus.pl}
-以上のプラグインのあるディレクトリは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[payment]}
-以下の plugin は $config-&gt;{payment}{id_list} に基づいて決済関連のスキンを読み込みます。
&gt;&amp;tt(){pin_user_cart_step2_payment_lines.pl}
-pin_user_cart_step2_payment_lines.pl が読み込むスキンは例えば以下の通りです。
&gt;&amp;tt(){pin_user_cart_step2_payment_lines_delivery_collect.html}
&gt;&amp;tt(){pin_user_cart_step2_payment_lines_delivery_collect_close.html}
&gt;&amp;tt(){pin_user_cart_step2_payment_lines_bank_transfer.html}
&gt;&amp;tt(){pin_user_cart_step2_payment_lines_postal_transfer.html}
&gt;&amp;tt(){pin_user_cart_step2_payment_lines_zeus.html}
-以下の plugin は、場合によって決済関連のスキンを読み込みます。
&gt;&amp;tt(){pin_user_cart_step5_payment.pl}
-pin_user_cart_step5_payment.pl が読み込むスキンは例えば以下の通りです。
&gt;&amp;tt(){pin_user_cart_step5_zeus.html}
-決済プラグインを読み込むモジュールは以下の通りです。
--決済関連の基本的な処理はフレームワーク化されていますのであまり気にする必要はありません。
&gt;&amp;tt(){cafemilk_basic_pl}
-決済プラグインはオブジェクト方式で実装されなければなりません。
-決済プラグインは package を宣言しなければなりません。
-宣言する package 名は以下の通りとなります。
&gt;Cafemilk_payment
-決済プラグインは以下のサブルーチンを持ちます。
&gt;&amp;tt(){new......................... : オブジェクト作成}
&gt;&amp;tt(){payment_ + 決済名 + _account : 費用計算等}
&gt;&amp;tt(){payment_ + 決済名 + _tag.... : 決済ページ投入情報作成}
-以下は決済プラグインの一例です。
&gt;################################################################################
&gt;#                                                                              #
&gt;#                          CAFEMILK SHOPPING CART  V5                          #
&gt;#                       SOHO WORKSHOP CAFEMILK  全権留保                       #
&gt;#                                                                              #
&gt;################################################################################
&gt;
&gt;use strict;
&gt;# use warnings;
&gt;use utf8;
&gt;# use encoding &quot;utf8&quot;;
&gt;
&gt;&gt;コーディングルールにより package 名を宣言
&gt;package Cafemilk_payment;
&gt;&gt;オブジェクト作成
&gt;&gt;変更不可
&gt;sub new
&gt;　{
&gt;　my $class    = shift;
&gt;　my $argument = shift;
&gt;　my $config    = $argument-&gt;{config};
&gt;　my $userdata  = $argument-&gt;{userdata};
&gt;　my $log_error = $argument-&gt;{log_error};
&gt;　my $log_alert = $argument-&gt;{log_alert};
&gt;　my $status    = $argument-&gt;{status};
&gt;　my $stock     = $argument-&gt;{stock};
&gt;　if ($stock eq &#039;&#039;)
&gt;　　{
&gt;　　$stock = &#039;cart&#039;;
&gt;　　}
&gt;　my $self =
&gt;　　{
&gt;　　config    =&gt; $config,
&gt;　　userdata  =&gt; $userdata,
&gt;　　log_error =&gt; $log_error,
&gt;　　log_alert =&gt; $log_alert,
&gt;　　status    =&gt; $status,
&gt;　　stock     =&gt; $stock,
&gt;　　};
&gt;　bless $self, $class;
&gt;　}
&gt;&gt;以下は費用計算等
&gt;sub payment_zeus_account
&gt;　{
&gt;&gt;コーディングルールによって義務づけられた各種情報の格納処理
&gt;　my $class    = shift;
&gt;　my $argument = shift;
&gt;　my $config    = $class-&gt;{config};
&gt;　my $userdata  = $class-&gt;{userdata};
&gt;　my $log_error = $class-&gt;{log_error};
&gt;　my $log_alert = $class-&gt;{log_alert};
&gt;　my $status    = $class-&gt;{status};
&gt;　my $stock     = $class-&gt;{stock};
&gt;&gt;決済費用等の取得が行われたことを告知
&gt;　$status-&gt;{$stock}{payment_cost} = &#039;1&#039;;
&gt;&gt;決済名
&gt;　$userdata-&gt;{&quot;$stock\_check&quot;}{payment_name} = &quot;ZEUS決済&quot;;
&gt;&gt;決済手数料
&gt;　$userdata-&gt;{&quot;$stock\_check&quot;}{valid_payment_cost} = 0;
&gt;&gt;決済手数料 ウェブ等表示用
&gt;　$userdata-&gt;{&quot;$stock\_check&quot;}{preview_payment_cost} = &#039;0&#039;;
&gt;&gt;決済手数料の表示に続いて注意書き等が必要な場合
&gt;　$userdata-&gt;{&quot;$stock\_check&quot;}{payment_message_1} = &#039;&#039;;
&gt;　}
&gt;&gt;以下は決済ページURLと値の作成
&gt;sub payment_zeus_tag
&gt;　{
&gt;　my $class    = shift;
&gt;　my $argument = shift;
&gt;　my $config    = $class-&gt;{config};
&gt;　my $userdata  = $class-&gt;{userdata};
&gt;　my $log_error = $class-&gt;{log_error};
&gt;　my $log_alert = $class-&gt;{log_alert};
&gt;　my $status    = $class-&gt;{status};
&gt;　my $stock     = $class-&gt;{stock};
&gt;　my %parameter;
&gt;　# 1
&gt;　$parameter{form_action} = &quot;https://linkpt.cardservice.co.jp/cgi-bin/order.cgi?orders&quot;;
&gt;　# 2
&gt;　$parameter{send} = &#039;mall&#039;;
&gt;　# 3
&gt;　$parameter{clientip} = $config-&gt;{payment}{zeus}{ip};
&gt;　# 4
&gt;　$parameter{money} = $userdata-&gt;{&quot;$stock\_check&quot;}{grandtotal};
&gt;　# 5
&gt;　$parameter{custom} = &#039;yes&#039;;
&gt;　# 9
&gt;　$parameter{sendid} = &quot;$userdata-&gt;{ordercode}&quot;;
&gt;　%parameter;
&gt;　}
&gt;&gt;最後に何か retern するのが Perl のお約束
&gt;1;

**アフィリエイトプラグイン
-アフィリエイトプログラムが要求するコンバージョンコードを用意するプラグインです。
--用語は業者によって違っていることがあります。
-以下はファンコミュニケーションズの提供するA8.netの場合となります。
-プログラムIDは以下に記載します。
&gt;$config-&gt;{affiliate}{a8}{pid}
-$config-&gt;{affiliate}{a8}{pid} を設定しているファイルは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[config]}
&gt;&amp;tt(){　 　　 　　└　[common]}
&gt;&amp;tt(){　 　　 　　 　　└　config_common.pl}
-以下は設定の例です。
&gt;　　# A8.netのプログラムID
&gt;　　　# [A8.netと契約していない場合]
&gt;　　　# $config-&gt;{affiliate}{a8}{pid} = &#039;&#039;;
&gt;　　　$config-&gt;{affiliate}{a8}{pid} = &#039;s0000000000000&#039;;
-以下のプラグインが読み込まれます。
&gt;&amp;tt(){a8.pl}
-a8.pl のあるディレクトリは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[affiliate]}
-a8.pl を使用するプラグインは以下の通りです。
&gt;&amp;tt(){pin_user_cart_step5_affiliate.pl}
-アフィリエイトプラグインはオブジェクト方式で実装されなければなりません。
-アフィリエイトプラグインは package を宣言しなければなりません。
-宣言する package 名は以下の通りとなります。
&gt;Cafemilk_affiliate
-アフィリエイトプラグインは以下のサブルーチンを持ちます。
&gt;&amp;tt(){new................................. : オブジェクト作成}
&gt;&amp;tt(){affiliate_ + アフィリエイト名 + _tag : コンバージョンコード作成}
-a8.pl の内容は以下の通りです。
&gt;################################################################################
&gt;#                                                                              #
&gt;#                          CAFEMILK SHOPPING CART  V5                          #
&gt;#                       SOHO WORKSHOP CAFEMILK  全権留保                       #
&gt;#                                                                              #
&gt;################################################################################
&gt;
&gt;use strict;
&gt;# use warnings;
&gt;use utf8;
&gt;# use encoding &quot;utf8&quot;;
&gt;
&gt;&gt;コーディングルールにより package 名を宣言
&gt;package Cafemilk_affiliate;
&gt;&gt;オブジェクト作成
&gt;&gt;変更不可
&gt;sub new
&gt;　{
&gt;　my $class    = shift;
&gt;　my $argument = shift;
&gt;　my $config    = $argument-&gt;{config};
&gt;　my $userdata  = $argument-&gt;{userdata};
&gt;　my $log_error = $argument-&gt;{log_error};
&gt;　my $log_alert = $argument-&gt;{log_alert};
&gt;　my $status    = $argument-&gt;{status};
&gt;　my $stock     = $argument-&gt;{stock};
&gt;　if ($stock eq &#039;&#039;)
&gt;　　{
&gt;　　$stock = &#039;cart&#039;;
&gt;　　}
&gt;　my $self =
&gt;　　{
&gt;　　config    =&gt; $config,
&gt;　　userdata  =&gt; $userdata,
&gt;　　log_error =&gt; $log_error,
&gt;　　log_alert =&gt; $log_alert,
&gt;　　status    =&gt; $status,
&gt;　　stock     =&gt; $stock,
&gt;　　};
&gt;　bless $self, $class;
&gt;　}
&gt;&gt;コンバージョンコードの発行
&gt;sub affiliate_a8_tag
&gt;　{
&gt;　my $class    = shift;
&gt;　my $argument = shift;
&gt;　my $config    = $class-&gt;{config};
&gt;　my $userdata  = $class-&gt;{userdata};
&gt;　my $log_error = $class-&gt;{log_error};
&gt;　my $log_alert = $class-&gt;{log_alert};
&gt;　my $status    = $class-&gt;{status};
&gt;　my $stock     = $class-&gt;{stock};
&gt;　my %parameter;
&gt;　$parameter{form_action} = &quot;https://px.a8.net/cgi-bin/a8fly/sales&quot;;
&gt;　$parameter{pid} = &quot;$config-&gt;{affiliate}{a8}{pid}&quot;;
&gt;　$parameter{so} = &quot;$userdata-&gt;{ordercode}&quot;;
&gt;　foreach (0 .. ($userdata-&gt;{$stock}{stack} - 1))
&gt;　　{
&gt;　　my $number = $_;
&gt;　　my $price    = $userdata-&gt;{&quot;$stock\_check&quot;}{price}[$number];
&gt;　　my $quantity = $userdata-&gt;{$stock}{&quot;quantity_$number&quot;};
&gt;　　my $total    = $userdata-&gt;{&quot;$stock\_check&quot;}{get_price}[$number];
&gt;　　my $id       = $userdata-&gt;{$stock}{&quot;id_$number&quot;};
&gt;　　if ($userdata-&gt;{&quot;$stock\_check&quot;}{option_number}[$number] ne &#039;&#039;)
&gt;　　　{
&gt;　　　$id .= &quot;-&quot;.$userdata-&gt;{&quot;$stock\_check&quot;}{option_number}[$number];
&gt;　　　}
&gt;　　$parameter{sis} .= &quot;\&amp;si=$price\.$quantity\.$total\.$id&quot;;
&gt;　　}
&gt;　$parameter{ts}
&gt;　　= &quot;$status-&gt;{datetime}{year}$status-&gt;{datetime}{month}&quot;
&gt;　　. &quot;$status-&gt;{datetime}{day}$status-&gt;{datetime}{hour}&quot;
&gt;　　. &quot;$status-&gt;{datetime}{min}$status-&gt;{datetime}{sec}&quot;;
&gt;　my $parameter
&gt;　　= &quot;&lt;img src=&#039;$parameter{form_action}\?pid=$parameter{pid}\&amp;so=$parameter{so}$parameter{sis}\&amp;ts=$parameter{ts}&#039; width=&#039;1&#039; height=&#039;1&#039; border=&#039;0&#039;&gt;&quot;;
&gt;　$parameter;
&gt;　}
&gt;&gt;最後に何か retern するのが Perl のお約束 
&gt;1;

**レコードプラグイン
-レコードプラグインは受注の情報などを CSV などのレコードの形にして出力するプラグインです。
-以下は標準伝票レコードの場合となります。
-標準伝票レコードのレコード名は以下のようになります。
&gt;package
-ファイル名は以下のようになります。
&gt;&amp;tt(){package.pl}
-package.pl のあるディレクトリは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[record]}
-package.pl を使用するプラグインは以下の通りです。
&gt;&amp;tt(){pin_mail_cart_record.pl}
-plugin 型プラグイン mail_cart_record (pin_mail_cart_record.pl) を呼び出すプラグインタグにはオプションにレコード名がついていなければなりません。
-標準伝票レコードを呼び出すプラグインタグは以下の通りです。
&gt;&amp;tt(){&lt;#####mail_cart_record:package#####&gt;}
-pin_mail_cart_record.pl の内容は以下の通りとなります。
&gt;################################################################################
&gt;#                                                                              #
&gt;#                          CAFEMILK SHOPPING CART  V5                          #
&gt;#                       SOHO WORKSHOP CAFEMILK  全権留保                       #
&gt;#                                                                              #
&gt;################################################################################
&gt;
&gt;use strict;
&gt;# use warnings;
&gt;use utf8;
&gt;# use encoding &quot;utf8&quot;;
&gt;
&gt;&gt;コーディングルールにより package 名を宣言
&gt;package Cart_plugin;
&gt;&gt;以下はウェブ処理用 
&gt;sub mail_cart_record_html
&gt;　{
&gt;　# none
&gt;　}
&gt;&gt;以下はメール処理用 
&gt;sub mail_cart_record_mail
&gt;　{
&gt;&gt;コーディングルールによって義務づけられた各種情報の格納処理
&gt;　my $package  = shift;
&gt;　my $argument = shift;
&gt;　my $config    = $argument-&gt;{config};
&gt;　my $userdata  = $argument-&gt;{userdata};
&gt;　my $log_error = $argument-&gt;{log_error};
&gt;　my $log_alert = $argument-&gt;{log_alert};
&gt;　my $status    = $argument-&gt;{status};
&gt;&gt;オプションにて指定されたレコード名の取得
&gt;　my $target    = $argument-&gt;{values}[0];
&gt;&gt;準備
&gt;　my $source;
&gt;&gt;内容のチェック
&gt;　if (($target ne &#039;&#039;           )
&gt;　and (-e &quot;./record/$target.pl&quot;))
&gt;　　{
&gt;&gt;該当のレコードプラグインを呼び出し
&gt;　　require &quot;./record/$target.pl&quot;;
&gt;&gt;オブジェクトの作成
&gt;　　my $record = Cafemilk_record-&gt;new
&gt;　　　({
&gt;　　　config    =&gt; $config,
&gt;　　　userdata  =&gt; $userdata,
&gt;　　　log_error =&gt; $log_error,
&gt;　　　log_alert =&gt; $log_alert,
&gt;　　　status    =&gt; $status,
&gt;　　　});
&gt;&gt;レコードの取得
&gt;　　my $name = &quot;record_$target&quot;;
&gt;　　$source = $record-&gt;$name();
&gt;　　}
&gt;&gt;レコードを return
&gt;　$source;
&gt;　}
&gt;&gt;最後に何か retern するのが Perl のお約束
&gt;1;
-レコードプラグインはオブジェクト方式で実装されなければなりません。
-レコードプラグインは package を宣言しなければなりません。
-宣言する package 名は以下の通りとなります。
&gt;Cafemilk_record
-レコードプラグインは以下のサブルーチンを持ちます。
&gt;&amp;tt(){new................. : オブジェクト作成}
&gt;&amp;tt(){record_ + レコード名 : レコード作成}
-package.pl の内容は一部以下の通りです。
&gt;################################################################################
&gt;#                                                                              #
&gt;#                          CAFEMILK SHOPPING CART  V5                          #
&gt;#                       SOHO WORKSHOP CAFEMILK  全権留保                       #
&gt;#                                                                              #
&gt;################################################################################
&gt;
&gt;use strict;
&gt;# use warnings;
&gt;use utf8;
&gt;# use encoding &quot;utf8&quot;;
&gt;
&gt;&gt;コーディングルールにより package 名を宣言
&gt;package Cafemilk_record;
&gt;&gt;オブジェクト作成
&gt;sub new
&gt;　{
&gt;　my $class    = shift;
&gt;　my $argument = shift;
&gt;　my $config    = $argument-&gt;{config};
&gt;　my $userdata  = $argument-&gt;{userdata};
&gt;　my $log_error = $argument-&gt;{log_error};
&gt;　my $log_alert = $argument-&gt;{log_alert};
&gt;　my $status    = $argument-&gt;{status};
&gt;　my $self =
&gt;　　{
&gt;　　config    =&gt; $config,
&gt;　　userdata  =&gt; $userdata,
&gt;　　log_error =&gt; $log_error,
&gt;　　log_alert =&gt; $log_alert,
&gt;　　status    =&gt; $status,
&gt;　　};
&gt;　bless $self, $class;
&gt;　}
&gt;&gt;以下はレコードの作成
&gt;sub record_package
&gt;　{
&gt;&gt;コーディングルールによって義務づけられた各種情報の格納処理
&gt;　my $class    = shift;
&gt;　my $argument = shift;
&gt;　my $config    = $class-&gt;{config};
&gt;　my $userdata  = $class-&gt;{userdata};
&gt;　my $log_error = $class-&gt;{log_error};
&gt;　my $log_alert = $class-&gt;{log_alert};
&gt;　my $status    = $class-&gt;{status};
&gt;&gt;コーディングルールにより %input_values にリクエストされた各情報を格納
&gt;　my %input_values;
&gt;　my @list = 
&gt;　　qw(
&gt;　　input_1_name_sei input_1_name_mei
&gt;　　input_1_name_kana_sei input_1_name_kana_mei input_1_company_name
&gt;　　input_1_company_name_kana input_1_zipcode_1 input_1_zipcode_2
&gt;　　input_1_address_1 input_1_address_2 input_1_address_3 input_1_address_4
&gt;　　input_1_address_5 input_1_phone_1 input_1_phone_2 input_1_email_1
&gt;　　input_1_email_2 input_1_email_3 input_1_email_4 input_2_name_sei
&gt;　　input_2_name_mei input_2_name_kana_sei input_2_name_kana_mei
&gt;　　input_2_company_name input_2_company_name_kana input_2_zipcode_1
&gt;　　input_2_zipcode_2 input_2_address_1 input_2_address_2 input_2_address_3
&gt;　　input_2_address_4 input_2_address_5 input_2_phone_1
&gt;　　);
&gt;　foreach (@list)
&gt;　　{
&gt;　　$input_values{$_} = $userdata-&gt;{request_values}{$_}[0];
&gt;　　}
&gt;&gt;WORDLIST 型スキンを読み込み
&gt;　my @word_list = Cafemilk_basic::get_wordlist
&gt;　　({
&gt;　　config    =&gt; $config,
&gt;　　userdata  =&gt; $userdata,
&gt;　　log_error =&gt; $log_error,
&gt;　　log_alert =&gt; $log_alert,
&gt;　　status    =&gt; $status,
&gt;　　filename  =&gt; &quot;./$config-&gt;{path}{skin}/user/cgi/$config-&gt;{default}{user_type}/$userdata-&gt;{device_type}/$userdata-&gt;{language_type}/$userdata-&gt;{currency_type}/$userdata-&gt;{template_type}/list_prefecture.txt&quot;,
&gt;　　});
&gt;　if ($input_values{input_1_address_1})
&gt;　　{
&gt;　　$input_values{input_1_address_1} = $word_list[$input_values{input_1_address_1}];
&gt;　　}
&gt;　if ($input_values{input_2_address_1})
&gt;　　{
&gt;　　$input_values{input_2_address_1} = $word_list[$input_values{input_2_address_1}];
&gt;　　}
&gt;&gt;レコードの作成の準備
&gt;　my %parameter;
&gt;　# A
&gt;　# 01 mode
&gt;　$parameter{mode}        = &quot;1&quot;;
&gt;　# 02 1_zipcode_1
&gt;　$parameter{&#039;1_zipcode_1&#039;}         = $input_values{input_1_zipcode_1};
&gt;　# 03 1_zipcode_2
&gt;　$parameter{&#039;1_zipcode_2&#039;}         = $input_values{input_1_zipcode_2};
&gt;　# 04 1_address_1
&gt;　$parameter{&#039;1_address_1&#039;}         = $input_values{input_1_address_1};
&gt;　# 05 1_address_2
&gt;　$parameter{&#039;1_address_2&#039;}         = $input_values{input_1_address_2};
&gt;　# 06 1_address_3
&gt;　$parameter{&#039;1_address_3&#039;}         = $input_values{input_1_address_3};
&gt;　# 07 1_address_4
&gt;　$parameter{&#039;1_address_4&#039;}         = $input_values{input_1_address_4};
&gt;　# 08 1_address_5
&gt;　$parameter{&#039;1_address_5&#039;}         = $input_values{input_1_address_5};
&gt;　# 09 1_name_sei
&gt;　$parameter{&#039;1_name_sei&#039;}          = $input_values{input_1_name_sei};
&gt;　# 10 1_name_mei
&gt;　$parameter{&#039;1_name_mei&#039;}          = $input_values{input_1_name_mei};
&gt;
&gt;&gt;中略
&gt;
&gt;　# D
&gt;　# 01 year
&gt;　$parameter{year}         = $status-&gt;{datetime}{year};
&gt;　# 02 month
&gt;　$parameter{month}        = $status-&gt;{datetime}{month};
&gt;　# 03 day
&gt;　$parameter{day}          = $status-&gt;{datetime}{day};
&gt;　# 04 ordercode
&gt;　$parameter{ordercode}    = $userdata-&gt;{ordercode};
&gt;　# 05 payment_name
&gt;　$parameter{payment_name} = $userdata-&gt;{cart_check}{payment_name};
&gt;　# 06 user_name
&gt;　$parameter{user_name}    = $userdata-&gt;{user_registry_values}{user_name};
&gt;　# 07 get_point
&gt;　$parameter{get_point}    = $userdata-&gt;{cart_check}{get_point};
&gt;　# 08 total_point
&gt;　$parameter{total_point}  = $userdata-&gt;{cart_check}{total_point};
&gt;&gt;レコードの仕上げと return
&gt;　# encode &amp; pair
&gt;　my @pair;
&gt;　foreach (keys %parameter)
&gt;　　{
&gt;　　my $key = $_;
&gt;　　my $encode = Cafemilk_basic::url_encode
&gt;　　　({
&gt;　　　config    =&gt; $config,
&gt;　　　userdata  =&gt; $userdata,
&gt;　　　log_error =&gt; $log_error,
&gt;　　　log_alert =&gt; $log_alert,
&gt;　　　status    =&gt; $status,
&gt;　　　text      =&gt; $parameter{$key},
&gt;　　　});
&gt;　　my $pair = &quot;$key=$encode&quot;;
&gt;　　push (@pair,$pair);
&gt;　　}
&gt;　my $record = join(&quot;&amp;&quot;,@pair);
&gt;　}
&gt;&gt;お約束
&gt;1;    </description>
    <dc:date>2009-09-25T13:40:31+09:00</dc:date>
    <utime>1253853631</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/cafemilk/pages/27.html">
    <title>プラグイン plugin 型</title>
    <link>https://w.atwiki.jp/cafemilk/pages/27.html</link>
    <description>
      *plugin 型
**用語に注意
-まずは用語に注意することを覚えてください。
--プラグインには exeute 型と plugin 型があります。
--単に plugin と書く場合、それは plugin 型プラグインを意味しています。
--plugin とプラグインは、発音は同じですが意味は同じではありません。
--plugin 型プラグインはスキン内のプラグインタグによって呼び出されます。
**plugin の役割 1
-わかりやすく言うと、ブラウザに示される各ページのスキン部品が plugin です。
-execute 型プラグインはページ特有の処理 (execute) を行い、必要に応じて plugin 型プラグインの実行を行います。
-plugin 型プラグインが担う補助的な役割は主にスキン部品部分の作成です。
-plugin 型プラグインは execute と同様、処理を実行することができます。
--個々の execute においては execute 型プラグインが主体となって重要な処理を行い、plugin 型プラグインはその補助的な処理を行います。
-plugin 型プラグインはそれ自身が plugin 型プラグインの実行を行うことができます。
--plugin は入れ子状もしくはツリー状に実行可能です。
--これは、スキンやスキン部品の中にスキン部品の多様な挿入が可能であるということを意味します。
-plugin 型プラグインはスキンを要求します。
--execute 型プラグインはウェブ表示全体のレイアウトを指定するスキンを要求します。
--それに対し、plugin 型プラグインは部品となるスキンを要求します。
--plugin 型プラグインにより取得されたスキンは、呼び出し元が execute 型プラグインである場合は execute 型プラグインにより取得されたスキンに挿入される形になります。
--plugin 型プラグインにより取得されたスキンは、呼び出し元が plugin 型プラグインである場合は plugin型プラグインにより取得されたスキンに挿入される形になります。
**plugin の役割 2
-製品はメール書式もテンプレートとなっており、メール書面のスキン部品も plugin です。
--その仕様は execute スキンの場合ととほぼ同じです。
**処理の準備
-処理の準備は plugin を呼び出す execute もしくは plugin が行います。
-execute もしくは plugin はスキンの読み込みによって実行すべき plugin 名を受け取ります。
--plugin の実行はスキンの中に専用タグ (プラグインタグ) を用いて記述します。
--スキンの側から見た plugin は純粋にスキン部品です。
-受け取るプラグインタグは例えば以下のようになります。
&gt;&amp;tt(){&lt;#####user_inquiry_step3#####&gt;}
-プラグインタグには : 区切りにてオプションをつけることが可能です。
--しかしこれはほとんど使用されていないようです。
-オプション付きのプラグインタグは例えば以下のようになります。
&gt;&amp;tt(){&lt;#####mail_cart_record:package#####&gt;}
-execute もしくは plugin は、その execute もしくは plugin に固有の plugin を許可しなければなりません。
-あらかじめ許可されている (固有ではない) plugin のリストは以下の通りです。
--許可される固有の plugin の plugin 名はこのリストに追記されることになります。
&gt;$config-&gt;{list}{plugin}
-$config-&gt;{list}{plugin} を設定しているファイルは以下の通りです。
&gt;&amp;tt(){[Apache_server]}
&gt;&amp;tt(){　└　[cgi-bin]}
&gt;&amp;tt(){　 　　└　[config]}
&gt;&amp;tt(){　 　　 　　└　[admin]}
&gt;&amp;tt(){　 　　 　　 　　└　config_basic.pl}
-固有の plugin を許可するコードは例えば以下のようになります。
&gt;my @list =
&gt;　qw(
&gt;　user_inquiry_step3
&gt;　);
&gt;push (@{$config-&gt;{list}{plugin}},@list);
-plugin が許可されていない場合、スキン内に該当のプラグインタグがあっても無視されます。
**呼び出し
-plugin の呼び出しはテンプレートエンジンによって行われますのであまり気にする必要はありません。
--しかし plugin から plugin を呼び出す場合はテンプレートエンジンを操作するコードを書く (plugin にテンプレートコントローラを内蔵する) 必要があります。
--呼び出すファイル名は、plugin/pin_ + plugin 名 + .pl となります。
-plugin 名が user_inquiry_step3 である場合、以下のようになります。
&gt;&amp;tt(){plugin/pin_user_inquiry_step3.pl}

**package 名
-plugin 型プラグインは package を宣言しなければなりません。
--宣言する package 名は、Cart_plugin となります。
-宣言は以下のようになります。
&gt;################################################################################
&gt;#                                                                              #
&gt;#                          CAFEMILK SHOPPING CART  V5                          #
&gt;#                       SOHO WORKSHOP CAFEMILK  全権留保                       #
&gt;#                                                                              #
&gt;################################################################################
&gt;
&gt;use strict;
&gt;# use warnings;
&gt;use utf8;
&gt;# use encoding &quot;utf8&quot;;
&gt;
&gt;package Cart_plugin;

**サブルーチン
-plugin 型プラグインは、ウェブ処理用とメール処理用の二つのサブルーチンを持たなければなりません。
--サブルーチン名は、plugin 名 + _html と plugin 名 + _mail となります。
-plugin 名が user_inquiry_step3 である場合、ウエブ処理用のサブルーチンは以下のようになります。
&gt;sub user_inquiry_step3_html

**plugin の処理
-以下は比較的簡単な plugin の例です。
--読み込むスキンが一つだけで、テンプレートエンジンの操作も最小限です。
&gt;################################################################################
&gt;#                                                                              #
&gt;#                          CAFEMILK SHOPPING CART  V5                          #
&gt;#                       SOHO WORKSHOP CAFEMILK  全権留保                       #
&gt;#                                                                              #
&gt;################################################################################
&gt;
&gt;use strict;
&gt;# use warnings;
&gt;use utf8;
&gt;# use encoding &quot;utf8&quot;;
&gt;
&gt;&gt;コーディングルールにより package 名を宣言
&gt;package Cart_plugin;
&gt;&gt;以下はウェブ処理用
&gt;sub user_inquiry_step3_html
&gt;　{
&gt;&gt;コーディングルールによって義務づけられた各種情報の格納処理
&gt;　my $package  = shift;
&gt;　my $argument = shift;
&gt;　my $config    = $argument-&gt;{config};
&gt;　my $userdata  = $argument-&gt;{userdata};
&gt;　my $log_error = $argument-&gt;{log_error};
&gt;　my $log_alert = $argument-&gt;{log_alert};
&gt;　my $status    = $argument-&gt;{status};
&gt;&gt;HTML テンプレートエンジンの使用にあたって処理名を準備
&gt;　my $pin_name = &#039;user_inquiry_step3_html&#039;;
&gt;&gt;HTML テンプレートエンジンで使用するスキンのパスを準備
&gt;　my $path = &quot;./$config-&gt;{path}{skin}/user/cgi/$config-&gt;{default}{user_type}/$userdata-&gt;{device_type}/$userdata-&gt;{language_type}/$userdata-&gt;{currency_type}/$userdata-&gt;{template_type}/pin_user_inquiry_step3.html&quot;;
&gt;&gt;コーディングルールにより %input_values にリクエストされた各情報を格納……してません。
&gt;&gt;%input_values を宣言しているだけ。
&gt;　my %input_values;
&gt;&gt;コーディングルールにより $userdata-&gt;{tag_data} に HTML テンプレート用の各情報を格納
&gt;&gt;execute から execute 処理の成功を知らせる $status-&gt;{execute_success} を受け取ってその内容にしたがってテンプレートタグの値を変更している。
&gt;　if ($status-&gt;{execute_success})
&gt;　　{
&gt;　　$userdata-&gt;{tag_data}{temporal}{display_success_2} = &#039;none&#039;;
&gt;　　}
&gt;　else
&gt;　　{
&gt;　　$userdata-&gt;{tag_data}{temporal}{display_submit} = &#039;none&#039;;
&gt;　　$userdata-&gt;{tag_data}{temporal}{display_success_1} = &#039;none&#039;;
&gt;　　}
&gt;&gt;HTML テンプレートエンジンのオブジェクトを作成
&gt;　my $skin = Cafemilk_skin_html-&gt;new
&gt;　　({
&gt;　　config    =&gt; $config,
&gt;　　userdata  =&gt; $userdata,
&gt;　　log_error =&gt; $log_error,
&gt;　　log_alert =&gt; $log_alert,
&gt;　　status    =&gt; $status,
&gt;　　name      =&gt; $pin_name,
&gt;　　});
&gt;&gt;スキンの読み込み
&gt;　$skin-&gt;set_path($path);
&gt;&gt;スキン内の HTML MIDDLE テンプレートタグを読み込む
&gt;　$skin-&gt;load_tag_middle();
&gt;&gt;許可されるテンプレートタグを指定
&gt;&gt;許可されるのは temporal のみ
&gt;　my @list = qw(temporal);
&gt;&gt;許可されたリストに基づいて HTML MIDDLE テンプレートタグを処理する
&gt;　$skin-&gt;replace_tag_middle
&gt;　　({
&gt;　　allow   =&gt; \@list,
&gt;　　package =&gt; &quot;Cafemilk_tag_html&quot;,
&gt;　　});
&gt;&gt;コーディングルールにしたがい $userdata-&gt;{tag_data}{temporal} は内容をクリア 
&gt;　undef $userdata-&gt;{tag_data}{temporal};
&gt;&gt;HTML テンプレートの結果を取得して return
&gt;　my $source = $skin-&gt;get_source();
&gt;　}
&gt;&gt;以下はメール処理用
&gt;&gt;メール処理用サブルーチンは必要ないがコーディングルール上記述する
&gt;sub user_inquiry_step3_mail
&gt;　{
&gt;　# none
&gt;　}
&gt;&gt;最後に何か retern するのが Perl のお約束
&gt;1;
-以上の例では、HTML テンプレートエンジンの処理は部分的に実施されています。
--ここでタグの取得と処理が行われているのは MIDDLE テンプレートタグのみです。
--タグはプラグインタグとテンプレートタグ、それぞれに HIGH, MIDDLE, LOW がありますから、その一部しか活用していないことになります。
-以下は plugin が大量のスキンを読み込んでいる例です。
&gt;&gt;HTML 型スキンの呼び出し
&gt;　my %path;
&gt;　my %source;
&gt;　my $common = &quot;./$config-&gt;{path}{skin}/user/cgi/$config-&gt;{default}{user_type}/$userdata-&gt;{device_type}/$userdata-&gt;{language_type}/$userdata-&gt;{currency_type}/$userdata-&gt;{template_type}&quot;;
&gt;　my @list = 
&gt;　　qw(
&gt;　　cell_head cell_body_image cell_body_text cell_body_flash cell_border
&gt;　　cell_foot cell_nocart cell_body_noitem cell_body_block
&gt;　　);
&gt;　foreach (@list)
&gt;　　{
&gt;　　my $line = $_;
&gt;　　$path{$line}       = &quot;$common/pin_user_cart_main_$line.html&quot;;
&gt;　　my $skin = Cafemilk_skin_html-&gt;new
&gt;　　　({
&gt;　　　config    =&gt; $config,
&gt;　　　userdata  =&gt; $userdata,
&gt;　　　log_error =&gt; $log_error,
&gt;　　　log_alert =&gt; $log_alert,
&gt;　　　status    =&gt; $status,
&gt;　　　name      =&gt; $pin_name,
&gt;　　　});
&gt;　　$skin-&gt;set_path($path{$line});
&gt;　　$source{$line} .= $skin-&gt;get_source();
&gt;　　}
&gt;&gt;続いてWORDLIST 型スキンの呼び出し
&gt;　my @word_list_price_foot = Cafemilk_basic::get_wordlist
&gt;　　({
&gt;　　config    =&gt; $config,
&gt;　　userdata  =&gt; $userdata,
&gt;　　log_error =&gt; $log_error,
&gt;　　log_alert =&gt; $log_alert,
&gt;　　status    =&gt; $status,
&gt;　　filename  =&gt; &quot;./$config-&gt;{path}{skin}/user/cgi/$config-&gt;{default}{user_type}/$userdata-&gt;{device_type}/$userdata-&gt;{language_type}/$userdata-&gt;{currency_type}/$userdata-&gt;{template_type}/list_price_foot.txt&quot;,
&gt;　　});
&gt;　my @word_list_item_alert = Cafemilk_basic::get_wordlist
&gt;　　({
&gt;　　config    =&gt; $config,
&gt;　　userdata  =&gt; $userdata,
&gt;　　log_error =&gt; $log_error,
&gt;　　log_alert =&gt; $log_alert,
&gt;　　status    =&gt; $status,
&gt;　　filename  =&gt; &quot;./$config-&gt;{path}{skin}/user/cgi/$config-&gt;{default}{user_type}/$userdata-&gt;{device_type}/$userdata-&gt;{language_type}/$userdata-&gt;{currency_type}/$userdata-&gt;{template_type}/list_item_alert.txt&quot;,
&gt;　　});
&gt;　my @word_list_tax_status = Cafemilk_basic::get_wordlist
&gt;　　({
&gt;　　config    =&gt; $config,
&gt;　　userdata  =&gt; $userdata,
&gt;　　log_error =&gt; $log_error,
&gt;　　log_alert =&gt; $log_alert,
&gt;　　status    =&gt; $status,
&gt;　　filename  =&gt; &quot;./$config-&gt;{path}{skin}/user/cgi/$config-&gt;{default}{user_type}/$userdata-&gt;{device_type}/$userdata-&gt;{language_type}/$userdata-&gt;{currency_type}/$userdata-&gt;{template_type}/list_tax_status.txt&quot;,
&gt;　　});
&gt;　my @word_list_ship_status = Cafemilk_basic::get_wordlist
&gt;　　({
&gt;　　config    =&gt; $config,
&gt;　　userdata  =&gt; $userdata,
&gt;　　log_error =&gt; $log_error,
&gt;　　log_alert =&gt; $log_alert,
&gt;　　status    =&gt; $status,
&gt;　　filename  =&gt; &quot;./$config-&gt;{path}{skin}/user/cgi/$config-&gt;{default}{user_type}/$userdata-&gt;{device_type}/$userdata-&gt;{language_type}/$userdata-&gt;{currency_type}/$userdata-&gt;{template_type}/list_ship_status.txt&quot;,
&gt;　　});
&gt;　my @word_list_cart_message = Cafemilk_basic::get_wordlist
&gt;　　({
&gt;　　config    =&gt; $config,
&gt;　　userdata  =&gt; $userdata,
&gt;　　log_error =&gt; $log_error,
&gt;　　log_alert =&gt; $log_alert,
&gt;　　status    =&gt; $status,
&gt;　　filename  =&gt; &quot;./$config-&gt;{path}{skin}/user/cgi/$config-&gt;{default}{user_type}/$userdata-&gt;{device_type}/$userdata-&gt;{language_type}/$userdata-&gt;{currency_type}/$userdata-&gt;{template_type}/list_cart_message.txt&quot;,
&gt;　　});
-この場合、商品の一覧を表示するにあたって、Flash が用いられているか / 画像が用いられているか / テキストのみか / などの諸条件に応じて使用するスキンを選択する必要があるので、それらのパスを一括して指定し、さらに読み込みまで行っています。
-また、各スキンにおいて要求されるテンプレートタグの値を用意するため、WORDLIST 型スキンも多数を読み込んでいます。
--このあと、それらのスキンを処理したものを、ヘッダとフッタの間に、適宜ボーダーを挟みながら繰り返し挿入していくコードがあります。
--スキンには繰り返しなどの制御命令が書けない仕様なので、繰り返しは plugin 型プラグイン内にて書くことになります。
-読み込まれているスキンが多数ある場合、それらのスキンの名称を見れば、その振る舞いがだいたい解るものです。
-plugin ではまれにオプションが用いられます。
--plugin 型プラグイン内におけるオプションの取得方法は以下の通りです。
&gt;sub mail_cart_record_mail
&gt;　{
&gt;　my $package  = shift;
&gt;　my $argument = shift;
&gt;　my $config    = $argument-&gt;{config};
&gt;　my $userdata  = $argument-&gt;{userdata};
&gt;　my $log_error = $argument-&gt;{log_error};
&gt;　my $log_alert = $argument-&gt;{log_alert};
&gt;　my $status    = $argument-&gt;{status};
&gt;&gt;一つめのオプションを取得
&gt;&gt;複数ある場合は連番となる
&gt;　my $target    = $argument-&gt;{values}[0];    </description>
    <dc:date>2009-09-24T23:30:48+09:00</dc:date>
    <utime>1253802648</utime>
  </item>
  </rdf:RDF>
