B豚の備忘録 | EC-CUBEやWORDPRESS、オープンソースの情報メモ
【EC-CUBE】会員ランクを設定し、ランクごとの割引率で販売する その3
- 2009-12-29 (火)
- EC-CUBE
さて、最後です。(は~、疲れた;)
最後にテンプレ関係を直していきます。
【ステップ3】
・/data/Smarty/templates/default/admin/customer/index.tpl (L146あたり)
<tr>
<td bgcolor=”#f2f1ec” width=”110″>会員状態</td>
<td bgcolor=”#ffffff” width=”499″ colspan=”3″><!–{html_checkboxes name=”status” options=$arrStatus separator=” ” selected=$arrForm.status}–></td>
</tr>
<tr>
<td bgcolor=”#f2f1ec” width=”110″>会員ランク</td>
<td bgcolor=”#ffffff” width=”499″ colspan=”3″><!–{html_checkboxes name=”customer_rank” options=$arrCustomer_rank separator=” ” selected=$arrForm.customer_rank}–></td>
</tr>
・/data/Smarty/templates/default/admin/customer/edit.tpl (L126あたり)
<table width=”678″ border=”0″ cellspacing=”1″ cellpadding=”8″ summary=” “>
<tr>
<td bgcolor=”#f2f1ec” width=”190″>顧客ID<span> *</span></td>
<td bgcolor=”#ffffff” width=”527″><!–{$list_data.customer_id|escape}–></td>
</tr>
<tr>
<td bgcolor=”#f2f1ec” width=”190″>会員状態<span> *</span></td>
<td bgcolor=”#ffffff” width=”527″>
<span><!–{$arrErr.status}–></span>
<input type=”radio” name=”status”value=1 id=”no_mem” <!–{if $list_data.status == 1}–> checked=”checked” <!–{/if}–> <!–{if $list_data.status == 2}–>disabled<!–{/if}–>><label for=”no_mem”>仮会員</label>
<input type=”radio” name=”status”value=2 id=”mem”<!–{if $list_data.status == 2}–> checked=”checked” <!–{/if}–>><label for=”mem”>本会員</label>
</td>
</tr><tr>
<td bgcolor=”#f2f1ec” width=”190″>会員ランク<span> *</span></td>
<td bgcolor=”#ffffff” width=”527″>
<span><!–{$arrErr.customer_rank}–></span>
<!–{html_radios name=”customer_rank” options=$arrCustomer_rank separator=” ” selected=$list_data.customer_rank}–>
</td>
</tr>
・/data/Smarty/templates/default/admin/customer/edit_confirm.tpl (L100あたり)
<td width=”190″ bgcolor=”#f2f1ec”>
会員状態<span> *</span></td>
<td width=”527″ bgcolor=”#ffffff”>
<!–{if $arrForm.status == 1}–>仮会員<!–{else}–>本会員<!–{/if}–></td>
<td width=”190″ bgcolor=”#f2f1ec”>
会員ランク<span> *</span></td>
<td width=”527″ bgcolor=”#ffffff”>
<!–{if $arrForm.customer_rank == 5}–>ランク5<!–{elseif $arrForm.customer_rank == 4}–>ランク4<!–{elseif $arrForm.customer_rank == 3}–>ランク3<!–{elseif $arrForm.customer_rank == 2}–>ランク2<!–{else}–>ランク1<!–{/if}–></td>
・/data/Smarty/templates/default/admin/mail/index.tpl (L145あたり)
<tr>
<td bgcolor=”#f2f1ec” width=”110″>会員ランク</td>
<td bgcolor=”#ffffff” colspan=”3″>
<!–{if $arrErr.customer_rank}–><span><!–{$arrErr.customer_rank}–></span><!–{/if}–>
<span style=”<!–{$arrErr.customer_rank|sfGetErrorColor}–>”>
<!–{html_checkboxes_ex name=”customer_rank” options=$arrCustomer_rank separator=” ” selected=$list_data.customer_rank}–>
</span>
</td>
</tr><tr>
<td bgcolor=”#f2f1ec” width=”110″>メールアドレス</td>
<td bgcolor=”#ffffff” colspan=”3″>
<!–{if $arrErr.email}–><span><!–{$arrErr.email}–></span><!–{/if}–>
<span style=”<!–{$arrErr.email|sfGetErrorColor}–>”>
<input type=”text” name=”email” maxlength=”<!–{$smarty.const.STEXT_LEN}–>” value=”<!–{$list_data.email|escape}–>” size=”60″ style=”<!–{$arrErr.email|sfGetErrorColor}–>”/>
</span>
</td>
</tr>
・/data/Smarty/templates/default/admin/mail/query.tpl (L132あたり)
<tr>
<td bgcolor=”#f0f0f0″ width=”110″>会員ランク</td>
<td bgcolor=”#ffffff” width=”507″ colspan=”3″><!–{$list_data.customer_rank_disp|default:”(未指定)”}–></td>
</tr><tr>
<td bgcolor=”#f0f0f0″ width=”110″>メールアドレス</td>
<td bgcolor=”#ffffff” width=”507″ colspan=”3″><!–{$list_data.email|escape|default:”(未指定)”}–></td>
</tr>
以上です。
実は、テストは、コミュ版でやっていて、あとから、正式版の対応するソースを探したので、もしかしたら、漏れとかあるかもしれません。多分大丈夫と思いますが、もし、有って気づいたら直します。
- Comments (Close): 0
- Trackbacks: 1
【EC-CUBE】会員ランクを設定し、ランクごとの割引率で販売する その2
- 2009-12-29 (火)
- EC-CUBE
【ステップ2】
・/data/class/SC_CustomerList.php (L122あたり)
//性別
if (!isset($this->arrSql['sex'])) $this->arrSql['sex'] = “”;
if ( is_array( $this->arrSql['sex'] ) ){
$arrSexVal = $this->setItemTerm( $this->arrSql['sex'] ,”sex” );
foreach ($arrSexVal as $data) {
$this->arrVal[] = $data;
}
}
//会員ランク
if (!isset($this->arrSql['customer_rank'])) $this->arrSql['customer_rank'] = “”;
if ( is_array( $this->arrSql['customer_rank'] ) ){
$arrCustomer_rankVal = $this->setItemTerm( $this->arrSql['customer_rank'] ,”customer_rank” );
foreach ($arrCustomer_rankVal as $data) {
$this->arrVal[] = $data;
}
}
//職業
(L360あたり)
// 検索用SQL
function getList() {
$this->select = “SELECT customer_id,name01,name02,kana01,kana02,sex,email,tel01,tel02,tel03,pref,status,customer_rank FROM dtb_customer “;
return $this->getSql(0);
}
(L395あたり)
function getMailMagazineColumn($is_mobile= false) {
if($is_mobile == true) {
$email_column = “dtb_customer.email_mobile as email”;
} else {
$email_column = “dtb_customer.email”;
}$column =”dtb_customer.customer_id,
dtb_customer.name01,
dtb_customer.name02,
dtb_customer.kana01,
dtb_customer.kana02,
dtb_customer.sex,
$email_column,
dtb_customer.tel01,
dtb_customer.tel02,
dtb_customer.tel03,
dtb_customer.pref,
dtb_customer.create_date,
dtb_customer.mailmaga_flg,
dtb_customer.customer_rank”;
return $column;
}
・/data/class/helper/SC_Helper_DB.php (L366あたり)
// 価格の登録
$objCustomer = new SC_Customer();
$objQuery = new SC_Query();
if($objCustomer->isLoginSuccess()) {
$customer_rank = $objCustomer->getValue(‘customer_rank’);
$discount_rank = $objQuery->get(“mtb_customer_discount”, “name”, “rank=?”, array($customer_rank));
if ($discount_rank != “”) {
if ($arrData['price02'] != “”) {
$objCartSess->setProductValue($arrCart['id'], ‘price’, $arrData['price02']*$discount_rank);
$objPage->arrProductsClass[$cnt]['uniq_price'] = $arrData['price02']*$discount_rank;
} else {
$objCartSess->setProductValue($arrCart['id'], ‘price’, $arrData['price01']*$discount_rank);
$objPage->arrProductsClass[$cnt]['uniq_price'] = $arrData['price01']*$discount_rank;
}
}else{
if ($arrData['price02'] != “”) {
$objCartSess->setProductValue($arrCart['id'], ‘price’, $arrData['price02']);
$objPage->arrProductsClass[$cnt]['uniq_price'] = $arrData['price02'];
} else {
$objCartSess->setProductValue($arrCart['id'], ‘price’, $arrData['price01']);
$objPage->arrProductsClass[$cnt]['uniq_price'] = $arrData['price01'];
}
}
}
※最後の「}」を忘れないように注意!
・/data/class/helper/SC_Helper_CSV.php(L53あたり)
※これは、もしかしたら不要かも。。。
* デフォルトコンストラクタ.
*/
function SC_Helper_CSV() {
$this->init();$masterData = new SC_DB_MasterData_Ex();
$this->arrPref = $masterData->getMasterData(“mtb_pref”,
array(“pref_id”, “pref_name”, “rank”));
$this->arrSex = $masterData->getMasterData(“mtb_sex”);
$this->arrDISP = $masterData->getMasterData(“mtb_disp”);
$this->arrRECOMMEND = $masterData->getMasterData(“mtb_recommend”);
$this->arrCustomer_rank = $masterData->getMasterData(“mtb_customer_rank”);
}
・/data/class/page/admin/customer/SC_Page_Admin_Customer.php (L62あたり)
$this->arrJob = $masterData->getMasterData(“mtb_job”);
$this->arrJob["不明"] = “不明”;
$this->arrSex = $masterData->getMasterData(“mtb_sex”);
$this->arrPageRows = $masterData->getMasterData(“mtb_page_rows”);
$this->arrMAILMAGATYPE = $masterData->getMasterData(“mtb_mail_magazine_type”);
$this->arrCustomer_rank = $masterData->getMasterData(“mtb_customer_rank”);
$this->arrHtmlmail[''] = “すべて”;
(L154あたり)
25 => array(“sql” => “cast(create_date as date) AS create_date”,
“csv” => “create_date”,
“header” => “登録日”),
26 => array(“sql” => “cast(update_date as date) AS update_date”,
“csv” => “update_date”,
“header” => “更新日”),
27 => array(“sql” => “customer_rank”,
“csv” => “customer_rank”,
“header” => “会員ランク”)
);
}
※26 =>・・・の最後に、「,」が入っています。お見逃し無く。
(L188あたり)
// 検索ワードの引き継ぎ
foreach ($_POST as $key => $val) {
switch($key) {
case ’sex’:
case ’status’:
case ‘customer_rank’:
$this->arrHidden[$key] = SC_Utils_Ex::sfMergeParamCheckBoxes($val);
if(!is_array($val)) {
$this->arrForm[$key] = split(“-”, $val);
}
break;
・/data/class/page/admin/customer/SC_Page_Admin_Customer_Edit.php(L58あたり)
function init() {
parent::init();
$this->tpl_mainpage = ‘customer/edit.tpl’;
$this->tpl_mainno = ‘customer’;
$this->tpl_subnavi = ‘customer/subnavi.tpl’;
$this->tpl_subno = ‘index’;
$this->tpl_pager = TEMPLATE_DIR . ‘admin/pager.tpl’;
$this->tpl_subtitle = ‘顧客マスタ’;$masterData = new SC_DB_MasterData_Ex();
$this->arrPref = $masterData->getMasterData(“mtb_pref”, array(“pref_id”, “pref_name”, “rank”));
$this->arrJob = $masterData->getMasterData(“mtb_job”);
$this->arrSex = $masterData->getMasterData(“mtb_sex”);
$this->arrReminder = $masterData->getMasterData(“mtb_reminder”);
$this->arrCustomer_rank = $masterData->getMasterData(“mtb_customer_rank”);
}
(L109あたり)
array( “column” => “reminder”, “convert” => “n” ),
array( “column” => “reminder_answer”, “convert” => “aKV” ),
array( “column” => “mailmaga_flg”, “convert” => “n” ),
array( “column” => “note”, “convert” => “aKV” ),
array( “column” => “point”, “convert” => “n” ),
array( “column” => “status”, “convert” => “n” ),
array( “column” => “customer_rank”, “convert” => “n” )
);
(L320あたり)
$objErr->doFunc(array(“ご性別”, “sex”) ,array(“SELECT_CHECK”, “NUM_CHECK”));
$objErr->doFunc(array(“ご職業”, “job”) ,array(“NUM_CHECK”));
$objErr->doFunc(array(“会員ランク”, “customer_rank”) ,array(“SELECT_CHECK”, “NUM_CHECK”));
if ($array["password"] != DEFAULT_PASSWORD) {
$objErr->doFunc(array(“パスワード”, ‘password’, PASSWORD_LEN1, PASSWORD_LEN2), array(“EXIST_CHECK”, “ALNUM_CHECK”, “NUM_RANGE_CHECK”));
}
・/data/class/page/admin/mail/SC_Page_Admin_Mail.php (L57あたり)
$masterData = new SC_DB_MasterData_Ex();
$this->arrPref = $masterData->getMasterData(“mtb_pref”, array(“pref_id”, “pref_name”, “rank”));
$this->arrJob = $masterData->getMasterData(“mtb_job”);
$this->arrJob["不明"] = “不明”;
$this->arrSex = $masterData->getMasterData(“mtb_sex”);
$this->arrCustomer_rank = $masterData->getMasterData(“mtb_customer_rank”);
$this->arrMailType = $masterData->getMasterData(“mtb_mail_type”);
$this->arrPageRows = $masterData->getMasterData(“mtb_page_rows”);
// ページナビ用
(L96あたり)
//—- 検索項目
$this->arrSearchColumn = array(
array( “column” => “name”, “convert” => “aKV”),
array( “column” => “pref”, “convert” => “n” ),
array( “column” => “kana”, “convert” => “CKV”),
array( “column” => “sex”, “convert” => “” ),
array( “column” => “customer_rank”, “convert” => “” ),
array( “column” => “tel”, “convert” => “n” ),
array( “column” => “job”, “convert” => “” ),
array( “column” => “email”, “convert” => “a” ),
(L191あたり)
// 配信形式
$list_data['htmlmail_disp'] = $this->arrHtmlmail[$list_data['htmlmail']];// 性別の変換
if (count($list_data['sex']) > 0) {
foreach($list_data['sex'] as $key => $val){
$list_data['sex'][$key] = $this->arrSex[$val];
$sex_disp .= $list_data['sex'][$key] . ” “;
}
$list_data['sex_disp'] = $sex_disp;
}// 会員ランクの変換
if (count($list_data['customer_rank']) > 0) {
foreach($list_data['customer_rank'] as $key => $val){
$list_data['customer_rank'][$key] = $this->arrCustomer_rank[$val];
$customer_rank_disp .= $list_data['customer_rank'][$key] . ” “;
}
$list_data['customer_rank_disp'] = $customer_rank_disp;
}// 職業の変換
if (count($list_data['job']) > 0) {
foreach($list_data['job'] as $key => $val){
$list_data['job'][$key] = $this->arrJob[$val];
$job_disp .= $list_data['job'][$key] . ” “;
}
$list_data['job_disp'] = $job_disp;
}
- Comments (Close): 0
- Trackbacks: 1
【EC-CUBE】会員ランクを設定し、ランクごとの割引率で販売する その1
- 2009-12-29 (火)
- EC-CUBE
年末は、再び年明けのEC-CUBEの案件に備えて、色々いじくりテスト。
大きなところで、3つのカスタムテストをしてみました。
1個目は、EC-CUBEの管理画面で、お問い合わせの履歴管理をし、そこからお問い合わせへの返信を行う、というもの。2個目は、商品一覧のテンプレートをカテゴリーごとに別のデザインでもてるようにカスタム。(そのうち詳細ページでも同様のことをやって見ようと思う。)もうひとつは、表題の通り。会員ランクを作って、会員のランクごとに、割引率を定め、特別価格で販売するというもの。
3つ目、結構面倒だった。なにって、、、仕組みとプログラムルートをたどっていくのが!!!オイッ!(何への怒り!?)
(--;)
何とかできたので、久しぶりすぎるブログのネタとして、とりあえず、晒します。
どっか、間違ってたら、指摘して(ついでに直して;)ください。。。
とりあえず、ぐだっとサンプルの仕様を書きます。
主な仕様ですが、会員ランクをまずは、5段階(ランク1~ランク5)とし、それぞれ、通常販売価格(会員以外の一般の人の価格)の10%割引から50%割引まで、割り引くことにします。
会員ランクの数と割引率は、管理画面のマスタデータ管理から追加や変更ができることにして、ランクごとの割引率は一律、とします。(ということで、別にランクは最初1つでもいいんだけど、サンプルなので、とりあえず5つ作る)
割引率が関係するので、お客さんが勝手にランクを登録したらマズい。
ので、お客さんが会員登録したときは、デフォルトで、会員ランクを1とします。つまり、非会員、ランク1~ランク5までの実質6段階の割引率設定があるわけです。
そして、管理画面で、顧客データを検索して、個別編集で、顧客情報の会員ランクを変更して、ランクを変えます。(例えば、優良顧客のみ、年会費をもらって高割引率で販売するようにしたり、高額購入者のみ顧客管理で検索してランクを変えて高割引率で販売したり、そういうことを想定しています。お金が絡むので、自動でランクを変えるようにはしません。もし、そういうことしたい人は、がんばってください。そして、ソースを晒してください。お願いします;)
あとは、メルマガ送信の顧客検索でも、会員ランクごとにメルマガを送りたいときもあるので、ここにもランクでの顧客情報検索を追加しておくことにします。そして、顧客情報CSVにも出力項目として追加しますね。
と、まあ、表面での仕様はこんな感じです。
さて、ここで、システム的な仕様ですが、ランクの追加・削除や割引率は、当然管理者が時々変えたくなるかも知れない項目なので、マスターデータで管理したいんですが、”mtb_”のテーブルはmtb_constants以外カラムが全部3つなんですね。で、会員ランクでは、id、名前,rank,それから割引率の4つ使いたいんですけど、それを作って、マスターデータ管理で編集しようとすると、さらに色々基幹の部分を触らないと行けなさそうで、システムのアップデートのときに、とっても、とっても、大変そう・・・
だから、ちょっと、気持ちわるいっていうか、マスターデータの編集のときに面倒さが残るけど、今回は、会員ランク用のmtb_customer_rankテーブルと割引率用のmtb_customer_discountテーブルの2つを作りました。でも、別にやり方次第で、1つのテーブル追加だけでも全然対応できると思います。
例えば、ランクは、mtb_のrankを共用利用して、使えばいいわけです。ソノへんは、適宜都合のいいようにしてチョウダイ。
まあ、ちょっとまだ表面的なこと(例えば、カートの中で割引率○○%です、みたいな表記出すとか)が、まだですが、そういうのは、テンプレの修正ですぐできるので、後でやります。
これで、下記のような最終動作となります。
まず、管理画面のマスターデータ管理から、mtb_customer_rankの編集で、会員のランクを必要な数だけ追加・削除します。そして、同じくマスターデータのmtb_customer_discountで、そのランクに応じた割引率を設定します。ランクの数は2つのテーブルであわして置いてくださいね。
ここまでが、管理者側の前準備です。
そして、実際にユーザーが、会員登録をしてくれた後、管理者は、適宜その会員に適用したいランクを管理画面の顧客管理から変更して登録します。
すると、その後、会員の買い物時には、ショッピングカートで、購入した商品に、その割引が適用されます。また、注文の追加や変更で、管理画面の受注管理から、顧客の購入情報を修正したときも、変更した割引率が適用されます。
注意する点は、顧客情報を編集した時点およびユーザーがログインした時点の会員ランクが適用されるということです。ですので、以前の購入情報を修正する場合、その間に会員ランクが変更されていれば、更新は新しいランクで行われますし、会員ランクの変更後は、再ログインしてもらうことで新しいランクでの買い物ができる、ということです。
って、長くなりだしましたので、早速本題の作業を開始します。
一応、ですが、そこそこ複雑な作業も含みます。また、備忘録として、EC-CUBEの基本の動作とか触り方をわかっている方向きに書いてますので、本当に初心者なんです~、という方には向きません。
(私のスキルもそこまで達者ではないので、)エラーなどのサポートも基本的にできません。
それでも良い方のみ覚悟して実装してくださいね。
この作業、結構長いので、途中でエントリー分けます。
【DBに追加するテーブル】
・mtb_customer_rank(3カラム)
・mtb_customer_discount(3カラム)
【触るファイル】
今回は管理機能メインになるので、テストだし、面倒だから、class_exは使いませんでした。
気になる方は、使ってください。
・/data/class/SC_CustomerList.php
・/data/class/helper/SC_Helper_DB.php
・/data/class/helper/SC_Helper_CSV.php
・/data/class/page/admin/customer/SC_Page_Admin_Customer.php
・/data/class/page/admin/customer/SC_Page_Admin_Customer_Edit.php
・/data/Smarty/templates/default/admin/customer/index.tpl
・/data/Smarty/templates/default/admin/customer/edit.tpl
・/data/Smarty/templates/default/admin/customer/edit_confirm.tpl
・/data/Smarty/templates/default/admin/mail/index.tpl
・/data/Smarty/templates/default/admin/mail/query.tpl
【ステップ1】
データベースにテーブルを2つ追加します。
・mtb_customer_rank (※全てnotnull=空白非許可)
| id | 1 | ※smallint(6)/ユニークキーで作成 |
|---|---|---|
| name | ランク1 | ※textで作成 |
| rank | 1 | ※smallint(6)で作成 |
作成後、セルを追加で4つ作り、ランク1~ランク5までの値を登録する。
・mtb_customer_disucount (※全てnotnull=空白非許可)
| id | 1 | ※smallint(6)/ユニークキーで作成 |
|---|---|---|
| name | 0.9 | ※textで作成 |
| rank | 1 | ※smallint(6)で作成 |
nameの数字は、1を100%価格として、割引後の掛け率。(0.9=10%offということ)
作成後、セルを追加で4つ作り、0.9/0.8/0.7/0.6/0.5の値を登録する。(それぞれランク1~5の割引掛け率に相当する)
さらに、もともとある、dtb_customerテーブルに、customer_rankというカラムをsmallint(6)で追加します。
ここへ、顧客ごとのランクを書き込んでいく仕様にします。
最後に、CSVの出力用に、dtb_csvテーブルの最後に、customer_rankの行を追加し、ID=85の更新日を参考に、rankがその次の値になるように入力します。
できました?
続きのエントリーはこちらです。↓
- Comments (Close): 0
- Trackbacks: 0
jQueryでフォームをすっきりとしたウィザード化するチュートリアル
- 2009-10-01 (木)
- JavaScript
http://www.jankoatwarpspeed.com/post/2009/09/28/webform-wizard-jquery.aspx
長いフォーム、いやですねぇ。
jQueryでフォームをウィザード化して「次へ」ボタンで次のフォームへ、というデザインが可能になるチュートリアル。
デザインの参考になるだけじゃなく、勉強にもなるね!
- Comments (Close): 0
- Trackbacks: 0
絶対にお気に入りにしておくべきCSS3とHTML5のネタ70選
- 2009-08-11 (火)
- WEBデザイン
http://www.webappers.com/2009/08/10/70-must-have-css3-and-html5-tutorials-and-resources/
いっぱい載ってる。全部英語だけど。本書けちゃうね、こりゃ。
- Comments (Close): 0
- Trackbacks: 0
jQueryのUIイロイロ:TABSを使う。
- 2009-08-11 (火)
- JavaScript
昨日、TABの実装について1つのソースをメモったけど、このソース、なんか、デフォルトでスクリプトエラーでてるし;;;
ってことで、普通にjQueryのUIを使って、TABを実装することにした。
んで、その覚書。
jQueryのUIについては、いろんなサイトで紹介されているので、ぐぐって見るといい。とりあえず、みんな本家サイトの翻訳とか抽象的な同じようなネタが多いけども。。。(^^;
今回は、とりあえず、タブを使いたかったので、そのソースを紹介。てかメモ。
先に、jQuery本体とUIのソースをダウンロードしておく。
じゃあ、まずは、HTMLソース。
HTMLソースのHEAD内に、上記サイトで入手したjavascript2つとCSSへのリンクを貼っておく。それと、TABS用のJSソースも記述。
<head>
<script src=”js/jquery-1.3.2.min.js” type=”text/javascript”></script>
<script src=”js/jquery-ui-1.7.2.min.js” type=”text/javascript”></script>
<link type=”text/css” href=”css/custom.css” rel=”stylesheet” /><script type=”text/javascript”>
$(function(){
// Tabs
$(‘#tabs’).tabs();
});
</script>
</head>
そして、BODY内に、タブのソースを記述。
<!– Tabs –>
<h2>TABSの実装サンプル</h2>
<div id=”tabs”>
<ul>
<li><a href=”#tabs-1″>タブ1</a></li>
<li><a href=”#tabs-2″>タブ2</a></li>
<li><a href=”#tabs-3″>タブ3</a></li>
</ul>
<div>
<div id=”tabs-1″>タブ1の内容。jQueryUIでは、色々とオプションも使える。例えば、ソース内の、
$(‘#tabs’).tabs();
この部分を、
$(‘#tabs’).tabs({selected:1});
とすると、2番目のタブがアクティブになった状態でページが開かれる。(※番号は、0から順番にインデックスを振っていくので、1番目のタブなら0、3番目のタブなら2ということになる)。いろんなことができますね~。 </div>
<div id=”tabs-2″>各コンテンツの中身は、こんな感じで適宜作成します。</div>
<div id=”tabs-3″>いろんなことができますね~。 </div>
</div>
そして、実装した画面イメージがこれです。(タブ1が開かれています)

そのほかのオプションとしては、タブのコンテンツの大きさを固定にするとか。色々。THEMEROLLERを使うと、適したCSSをWEB画面上で作成して、ダウンロードすることもできる。
参考サイト:
- Comments (Close): 0
- Trackbacks: 0
webデザインイロイロ。マウスオーバー効果もイロイロ。
- 2009-08-11 (火)
- WEBデザイン
http://www.designwalker.com/2009/08/hover.html
CSSやjQueryを使ったマウスオーバーの効果がイロイロ紹介されてた。
マウスオーバーってデザイン中には、忘れがち。最後のコーディングのところになって、う~ん、どうしよ?ってことが多いもの。。。
デザインのアイデアフラッシュとして◎デスネ。
- Comments (Close): 0
- Trackbacks: 0
B豚的いろいろな標準・・・
- 2009-08-10 (月)
- つぶやき
世間は、お盆休みやね。
B豚は、オフィスにおるますけど。
ここんところ、新しい調べ物が必要になるようなこともなかったし、休み中にガッツリネタいくのも、なんかダルい気がしたのだけど、なんとなくブログ更新したい気分だったので、ネット関連のいろいろなツールとかを、勝手にB豚的2009年のWEB標準として認定してみようと思う。
B豚のワタクシ的標準ですので、評価項目や指標は、一般的なものとは違うかも。ノンクレームで、ご了承くださ~い;;;
ではでは、オープンソースメインで、ダラっと書きますワ~。
ECサイト向けCMSの標準
- EC-CUBE
- 日本大阪発のECサイト向けCMS。いろいろ不足してるところとかバグとかも多かったんだけど、ここ最近で、大きなバグなんかは、だいたい解消できてきてるし、ECサイトを運用する上で必要な色んな管理機能が統合されているのが◎。例えば、管理画面から、注文管理で、帳票の印刷ができたり、受注ステータスの管理ができる他、メルマガ配信とその履歴管理や、キャンペーンページも作れる。
機能は、メジャーなASPサービスに引けを取らないと思う。
ただ、ランキング表示やオススメ機能、プレゼント包装のオプション、送料など、ECサイトで意外と必要になる機能は、デフォルトでは、含まれないので、多かれ少なかれカスタマイズが必要になる。
ので、利用は、PHPでカスタマイズできる開発者か開発外注できる予算のある企業にはオススメ。そうでない場合、使い始めてから、痒いところに手が届かなくて、ソース弄繰り回して(←見事にハマったB豚の経験。)逆にストレスが溜まるので、ASPの利用をお勧めしたい(^^;フロントエンドのインターフェイスは、こういうECサイトの一般的な構造(一覧でカテゴリー内の商品がずらっとリストで表示されて、詳細ページにリンクする形)だが、smartyのテンプレートエンジンを採用しているので、開発はしやすいと思う。
その他の大きなポイントとしては、携帯向けサイトも同じ管理画面で統合して受注管理できるのが◎、国内開発なので、日本語に強い◎、反面、外国語を利用してグローバル展開できない×、共有SSLが使えるとか言いつつ、実際は使えない×、データベースの対応標準がpostgresSQLなので、mySQLだと表示速度とかいろいろ問題が出てくることがある×けど、メジャーなDBをどちらも対応できてるって意味では◎主要なバグ取りが終わって、新しい開発フェーズに進みそうな予感。今後は、EC向け国内CMSの標準になっていくかも。
今後に、期待大。
一般サイト向けCMSの標準
- MODx
- CMS AWARDS 2007 受賞の一般サイト向けCMS。
PHPベースで、データベースは、mySQLを採用。
いろいろと出ているオープンソースCMSの中では、インターフェイスも設計思想も、かなり、エンタープライズ版(1000万とかするような企業向けパッケージ)のCMSに近いと思う。
管理機能は、直感的にわかりやすく、HTMLベースの制作画面を当てはめていけるので、制作サイドでも、開発もしやすい。テンプレートも、出力テンプレートと入力テンプレートを個別に扱えるため、運用面でもメリットが大きい。MODxでの開発に向くのは、カテゴリー階層を持っているような、企業サイトや製品メーカーなどのサイトかな。ドキュメントの管理が、ツリー型なので、どのコンテンツが、どの親カテゴリーに属するのか、直感的。学校サイトでのシラバス公開なんかにも向くかも。
反対に、あまり向かないのが、ニュースやブログみたいな、同じ種類のエントリーを繰り返して投稿して、どんどんコンテンツが増えていくようなサイト。既に投稿したカテゴリー内のエントリーは、そうそう編集しない、というのであれば、特に気にならないが、ツリー構造だから、コンテンツが、ものごっつい増えていくと、そのコンテンツを探すのが大変だったりするかも。あと、残念に思うのが、ここまで高機能で使いやすいCMSなのに、コンテンツの承認フローが実装されていないこと。これが、イタい!企業で使う場合、やっぱり階層的にコンテンツ承認を送る機能は必要だと思う。MTとかWPなどのブログツールとかXOOPSなどと比較・競合するなら、全然OKレベルかも、だけど、エンタープライズ版CMSとでも充分渡り合っていけるCMSだと思うだけに、あと、この承認フローが、プラグインでもいいので、あれば、なぁ、、、というのが、ワタクシ的な致命傷。。。ともあれ、テンプレート開発の自由度の高さ、扱いやすいインターフェイス、どこをとっても、このCMSは、今後益々注目されると思う。私は、かなり好きやね、MODx。感じから言うと、ドキュメンタム社のWEB publisherとかに似ているかな?
SNS向けCMSの標準
- openPNE
- いまさらSNSでもないかな?とか言いつつも、ひそかに学校や企業でクローズなSNSは、重宝される。
SNSは、テーマごとに、情報がツリー構造で保存されていくので、ノウハウ集やプロジェクトの情報共有、クライアントとのやりとり履歴保存なんかには、もってこい。
多くの企業では、今や、メールがすごい量飛び交ってくるので、その整理とか履歴探しだけで、うんざりすることも少なくない。
そういうときに、SNSを利用すれば、履歴や議事録の共有によって、大事な情報は埋もれないで、再利用できる。openPNEは、数あるSNSソフトの中でも、そのインターフェイスの親和性に定評がある。mixiと大体同じフロントインターフェイスなので、mixiを使ったことがあるユーザーなら、難しく考えなくてもすんなりと利用できる。その上、導入も、本当に簡単。
開発会社らしく、各種開発ドキュメントも比較的整備されており(EC-CUBEにも見習って欲しい;;;)カスタマイズが必要な際にも、重宝しそうだ。携帯投稿にも対応してるし、順調にバージョンアップしている点も評価できる!最近では、他のブログツール(wordpressなど)とも連携できたりするらしい。
ブログの標準
- WORDPRESS
- 一昔前は、ブログの標準は、MovableTypeだった。MTが出始めた頃、私も張り切って利用して、こりゃすごいツールだできたな、と感動したもんだ。
ところがMTが有償になって、代わりにWP、どんどん開発が進んで、いまや、世界標準は、完全にWPとなってしまった。当初は、もの足りなかった色々な機能も、有志の開発者によって、どんどん公開されている。必然的に情報も多い。
MTは、独自タグによって、タグさえ覚えれば、開発しやすい構造になっているものの、これだけオープンソースのソフトウエアが出てくると、PHP+データベースっていうのが、開発の常道になってきていて、そういう意味でも、開発業界の標準スキルで対応できる、PHPベースのWPは、重宝するようになるわけやね。日本では、最近になってやっとWPがブログ標準化し始めた感があって、情報も分散しがちだが、海外サイトでは、本当に多くのプラグインやカスタマイズ情報が公開されているから、今後は、そういう情報が、国内にもどんどん流れてくると思う。
PHPとDBスキルは、WEB開発者のマストスキルになってきているようだね。
WYSIWIGエディタの標準
- tinyMCE
- ちょっと、サイト、英語やけども。ぐぐってみれば、日本語化ネタも結構見つかるので、参考にされたし。
WYSIWIGってのは、ワードとかエクセルみたいに、フォーム内で文字装飾できるようにする、JavaScriptのインターフェイスね。ブログツールとかCMSツールの入力フォームのところに、導入して、HTMLタグが書けない人でも、入力をしやすくするもの。いくつかメジャーどころがあって、導入したい元のツールによって、相性とかもあるので、どれがいいかって一概には言えないけど。tinyMCEは、MTなんかでプラグイン化されている他、いろんなCMSでもプラグインとして標準搭載されていたり、人気がある、使いやすいツール。
B豚は、EC-CUBEの商品情報入力欄なんかに追加して入れてマス。
最近のツールは、この手のエディタ機能がデフォルトで入っているものも多いから、それほど個別の需要はなくなってきてるかもしれない。まあ、でも、この手は、必要なときには必要なわけだ;
さて。このエントリーは、また、追記します。とりあえず、ここまで。
- Comments (Close): 0
- Trackbacks: 0
ブラウザのパーツを集める
- 2009-07-27 (月)
- WEBデザイン
http://www.designerstoolbox.com/designresources/elements/
WEBページのデザインをしたり、WFを作成するときに、ラジオボタンやテキストエリアのパーツが必要なことって意外とある。
そういうときのために、ブラウザごとのパーツを公開しているサイト。
一度DLしておけば、ブラウザのバージョンアップまでは使えるので、暇なときに集めておくのも手。
- Comments (Close): 0
- Trackbacks: 0
CSS3とjQueryで作るフラッシュライクなフォトビューアー
- 2009-07-22 (水)
- JavaScript
http://www.marcofolio.net/webdesign/creating_a_polaroid_photo_viewer_with_css3_and_jquery.html
こういう動きをフラッシュ離れと考えるべきか、はたまた、フラッシュには違う役割とか表現がでてきて、JSとフラッシュで棲み分けが進むと考えるべきか。
とにもかくにも、ことのところのJSやCSSは、本当に表現が熱い。昔フラッシュで高いお金を出して外注していたようなことが、さくさくっと、オープンソースでできたりするから、うれしいやら、怖いやら。
と、ごたくはともかく。
こちらは、CSS3とjQueryでポラロイド写真を机上にランダムに散らしたようなフォトギャラリーを実装するソースとデモです。写真の1枚1枚は、マウスドラッグで任意の位置に移動もできる。
こういうのは、結構すきなので、ちょっとソースを見てみることに。よくできてるなぁ。。。
最近残念なのは、IEの表現力の問題とか。なぁんか、足並みが揃わない。IEだけ。でも、国内ユーザーは、未だにIEシェアが高いので、作るほうとしては、なんだかなぁ。。。
私は、基本、作るときからIEでプレビューしてIE中心で作るんだけど、1ユーザーとしては、イライラすることも多い。
もういい加減、クロスブラウザーとか、そういうの、ナシにしてくれないかなぁ。。。プラグインとかオプションとか、違うところだけで選択肢をもてるようになればいいんだけど。
- Comments (Close): 0
- Trackbacks: 0
海外のプロレベルのWEBデザインを学ぶ実践チュートリアル色々
- 2009-07-17 (金)
- WEBデザイン
http://dzineblog.com/2009/01/27-best-photoshop-web-layout-design-tutorials-part-2.html
http://www.2expertsdesign.com/2009/03/13/150-adobe-photoshp-web-design-layout-tutorials/
http://sixrevisions.com/photoshop/25-photoshop-tutorials-for-web-designers/
全部基本は英語だけど、画像を見ながらのチュートリアルなので、いいかも。
さらには、こんなエントリーも。
「WEBデザイナーという肩書きを使う場合にあったらいいかもなスキルとWEBで見れる無料教材とリソース集」
http://phpspot.org/blog/archives/2009/03/webweb_2.html
鉄板な感じがシマスネ。
- Comments (Close): 0
- Trackbacks: 0
んで、そしたら、グラデの美しいサイトデザイン25選も見とくか、と。
- 2009-07-17 (金)
- WEBデザイン
上品できれいですな。
共通して言えることは、大げさすぎない立体感が、いいんでしょうな。
- Comments (Close): 0
- Trackbacks: 0
サイトデザインに手軽に使えるフォトショップのグラデ集30選
- 2009-07-17 (金)
- フォトショップ
ボタンとか背景とか。
ちょっと奥行き出したいときに、グラデ、使いますね。あんまり大げさじゃなくて美しいグラデって意外と難しい。そんな時に、こういうスタイル集って、本当に便利。
普段からお気に入りを集めておくと、重宝しまっせ。
- Comments (Close): 0
- Trackbacks: 0
マストハブな、WORDPRESSプラグイン300選
- 2009-07-17 (金)
- WORDPRESS
http://mashable.com/2007/08/16/wordpress-god300-tools-for-running-your-wordpress-blog/
2007年のアーカイブなんで、ちょっと古いけどね;
なんせ人気プラグイン300選ですから。
バージョンアップしてるものもあるし、参考にはなるかも。
- Comments (Close): 0
- Trackbacks: 0
スクラッチで、wordpressのプラグインを開発するチュートリアル
- 2009-07-17 (金)
- WORDPRESS
http://net.tutsplus.com/tutorials/wordpress/creating-a-custom-wordpress-plugin-from-scratch/
wordpressは今年に入って、国内でもかなり注目度が高い。
テーマやプラグインを色々探すことも多くなってきているが、自分でプラグインを開発するようなこともあるかもしれない。
そこで、スクラッチでWPプラグインを開発するチュートリアルの登場。
問題は、、、英語なんだよね;
でも、わかりやすく書かれているので、がんばって挑戦してみるのもアリ。
- Comments (Close): 0
- Trackbacks: 0
iphoneライクなパスワード入力フィールドを作るjQuery
- 2009-07-17 (金)
- JavaScript
http://css-tricks.com/better-password-inputs-iphone-style/
入力すると、右側に、入力したアルファベットが1文字1文字大きく表示される。入力が間違っていないか、確認しながら、入力できるので、ユーザビリティの向上にはいいかも。
確かに、パスワードフィールドって、何を入れたかわからなくなるときがある。でも、これは、サイトの全体的なユーザビリティデザインを統一して考えないと、ここだけ凝っちゃってもな~という感は残る。
とりあえず、面白いので、あげとく。
- Comments (Close): 0
- Trackbacks: 0
ツカエル便利なjQueryプラグイン10選その2
- 2009-07-17 (金)
- JavaScript
http://www.queness.com/post/295/10-really-interesting-jquery-plugins
「本当に使える」と書いてある通り、こちらも結構パワフルな感じ。
スライドするパンくずリストなど、実用的なものも多い。
- Comments (Close): 0
- Trackbacks: 0
手軽にphpとJSを連携させるjQPie
- 2009-07-17 (金)
- JavaScript
http://projects.cyberlot.net/trac/jqpie/wiki
「jQPie」は、JavaScriptからPHPの関数を呼び出せるインタフェース提供ライブラリ。
軽量実装で、XML、HTML、json handlerをサポートしている。
サーバ側の全てのPHP関数を実行できるととんでもないことになってしまうので、あらかじめ使える関数を登録する。
こんな感じ。
$handler = new Pjq();
$handler->registerCallback(‘getarray’);
$handler->processIncoming();
ちょっと難しいけど、使いどころのありそうなライブラリ。
- Comments (Close): 0
- Trackbacks: 0
もう、こんなに・・・
- 2009-07-16 (木)
- つぶやき
ふとブログを眺めてて思う。あーかいぶ。
2008年6月が、最初で、もう、1年もこんなブログ書いてるんだね。
これを、がんばってるな、と自画自賛すべきか、もっと、しっかり書こうよ、仮にもブログなんだからさ、と反省すべきか。。。
まあ、でも、このペースだから続けられるっていうのも、あるんだけども。
最初は、自分への備忘録として始めた、このブログ。段々アクセス数も、チョイチョイっと増えてきて、そのうち誰に向けてるのかわからなくなったりして。(笑)
しゃべりも、デス・マスとだ・思う、なんてのが、混じってたりしますな。
文句あるなら、見るな!くらいの勢いで自由気ままにやっちゃってるので、別に気にしてないけど、こんなに見てもらえるなら、もっと最初から整理してちゃんと書いとくんだったなぁ、とか、思わなくもない。
でも、自分には、とっても役立っているので、ヨシとする。
がんばっていきまっしょ~。
でも、時にはご褒美も欲しかったりする。
オチはありません。
- Comments (Close): 0
- Trackbacks: 0
手軽にフラッシュボタンをつけるとっても便利なFlashEngine
- 2009-07-16 (木)
- FLASH
なんちゃってWEBデザイナーは、手軽にカッコエエ~フラッシュボタンを付けたい。フラッシュって、ガッツリいくならありだけど、ページもいっぱい作んなきゃだし、正直めんどくさい。
大体トップのメインとこくらいしか使わないし。
時々バナー作るだけだし。
手軽に、楽に、いきたい。ほんと。
んで、見つけました。
これ、便利。
気に入った!
画像を用意して、リンク位置とか設定するだけで、カッコエエ効果の付いたフラッシュビジュアルが作れるエンジン。
フラッシュファイルとXMLとかJSがセットになってて、こちらでは、ベースになる画像とマウスオーバー時の画像なんかを用意するだけ。
んで、ちょっと座標とかちょこちょこ設定すると。。。
あ~ら、不思議。なんか、えらい凝ったフラッシュできた!みたいな感じになってますけど。
これ、トップページのフラッシュまで予算取れないときとか、ECサイトなんかで、結構いいですね。(^^)//
- Comments (Close): 0
- Trackbacks: 0
WORDPRESSで制作したサイトを多言語対応にする-その1-
- 2009-07-16 (木)
- WORDPRESS
マルチリンガルのやり方は、大きく分けて2通り。
日本語で書いたエントリーを自動翻訳させるパターンが、その1つ。
でも、これだと、変な翻訳になってもノーサポート。なので、コーポレートサイトなどには適さない。
もうひとつが、エントリー、それぞれが、多言語で記述できるというもの。
この場合は、翻訳自体は、自分でやらないといけないけど、エントリーごとに、対応言語の有無を選べたり、まとめられる。こっちのほうが、使い勝手があるかな?
とりあえず、実験。
今回は、「qTranslate」というプラグインを使用して、管理画面のエントリーフォームをタブで切り替えて、それぞれの言語のエントリーを記述し、フロントページからは、言語切り替えリンクボタンで、表示を切り替えられるようにしようと思う。
まずは、WORDPRESSのプラグインディレクトリから、qTranslateをダウンロードして(http://wordpress.org/extend/plugins/qtranslate/)FTPでアップロードするか、WPの管理画面のプラグインメニューから検索して、ブログに取り入れる。
qTranslateプラグインを有効にしたら、プラグインの管理メニューから設定を行う。
設定→言語設定が、qTranslateの設定項目になる。先にプラグインを有効化した時点で、WPの管理画面は、一旦英語表記になると思うので、Setting→Language、ですね。
Language Code: ja
Flag: jp.png
Name: Japanese
Locale: ja_JP
Date Format: ※特にフォーマットを指定する場合はここも入力
Time Format:※特にフォーマットを指定する場合はここも入力
Not Available Message: Sorry, this entry is only available in %LANG:, : and %.
Default LanguageをJapaneseにする。
その他利用する言語を「enable」、使用しない言語は、「disable」に。
qTranslateは、そのままだと、日本語のエンコードをeuc-jpに解釈してしまい、設定によっては文字化けなどが起こる可能性があるため、言語ファイルを用意する。
/wp-content/languagesの中の、「ja.mo」ファイルをコピーして、「ja_JP.mo」という名称で保存。(「ja.mo」は、そのまま残す。)
これで、だいたいOK。
今度は、フロントページで、ユーザーが閲覧する表示言語を選択できるようにする。
ヘッダーやindex.phpテンプレートの、言語選択リンクボタンを表示させる適当な場所に下記のコードを埋め込む。ヘッダーのglobal_navi取得コードの前に入れるとよい。
<?php echo qtrans_generateLanguageSelectCode(‘both’); ?>
国旗のマークアイコンを表示させる場合は(‘image’)、テキストで「日本語」「ENGLISH」などと表示させる場合は(‘text’)、両方表示は(‘both’)を使用する。
以上。
もし、文字化けなどのエラーが出たり、詳しい設定で躓いた場合は、下記サイトが参考になりマスヨ。
http://formula1.gimlet301515.com/WordPress/?p=407
http://saqoosha.net/2009/01/06/1672/
そのほか、自動翻訳などを使いたい場合は、こういうプラグインもあり。
- Comments (Close): 0
- Trackbacks: 0
【EC-CUBE】PAYPAL支払いがちゃんとできるかテストする
- 2009-06-14 (日)
- EC-CUBE
とりあえず、このエントリーは、↓の続き。
http://bton.papalabs.com/?p=1135
PAYPAL決済を導入するに当たって、EC-CUBEからPAYPALのテストサイトへつないで決済テストを行うやり方。
テストなんだよね。テストなんだけど、いっぱい設定とか準備があって、面倒なんだよね。。。
ここからは、英語ばんばんの海外サイトなので、本当のところ気が狂いそう・・・
とか言ってられないので、がんばりましょう!
1)PAYPALの「Developer Central」内の下記URLへアクセスし、
https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/howto_testing_sandbox
Sign Upメニューから、テスト用の新規アカウントを作成しましょう。
画面は英語だけど、基本的には通常のアカウント登録と同じなので、わからなくなったら、日本語の通常PAYPALサイトを参考にするとイイデスヨ。
アカウントを作ったらサンドボックスにログイン。別に本番アカウントのコピーでもOK。
左メニューで、「Sandbox」-「Home」
ページの真ん中の、Test Accounts 「Create a preconfigured buyer or seller account.」リンクから「Create a Sandbox Test Account」ページへ進む。
- country:United States
- Account Type:BuyerとSellerを1つずつ(かそれ以上)作る
- Login Email:サンドボックスでのテスト用にセラーとバイヤーそれぞれ1つずつ用意する。
- Password:決める
バイヤーとセラー両方のテストアカウントが必要なので、それぞれを1つずつ、2回登録する。
作成後、左メニューで「Sandbox」-「Test Accounts」をクリックすると、テストアカウントの確認ができるはず。「View Details」でテスト作成されたアカウントの詳細が確認できる。
クレジットカードや銀行の情報も作成されている。
表の中の、「Payment Review」と「Test Mode」をいずれも「Enabled」に変更しておきましょう。
ここまでできたら、いよいよテスト。
ページ右下の「Enter Sandbox Test Site」ボタンをクリックする。
すると、通常のPAYPALのページみたいなテストサイトがあら現れる。この画面に、先ほど作成した、バイヤーアカウントでログインすれば、購入者の動作確認ができるし、セラーアカウントでログインすれば、販売者の動作確認ができる。それぞれ、買い物をしたあと、画面に代金がどのように計上されるのか(できるのかできないのか、)確認すればいい。
さて、ここで、1つ問題が(ということでもないけど;)
前のエントリーでEC-CUBEに設定したのは、本番の設定。
つまり、テストをするためには、一時的に、
/data/class/pages/shopping/LC_Page_Shopping_Confirm.php
で接続するサイトをPAYPALの本番サイトからテストサイトのURLへ変更して、テストアカウントで接続させないといけない。
なので、先に編集した、L148~L155、テスト用には下記のようになります。
// 決済方法により画面切替
if($payment_type != “”) {
$_SESSION["payment_id"] = $arrData['payment_id'];
header(“Location: ” . URL_SHOP_MODULE);
}else{
if($arrData['payment_id'] == ※payment_id) {
// 設定変更行して下さい ↑ if($arrData['payment_id'] == payment_id) {
$paypalURL = “https://www.sandbox.paypal.com/j1/cgi-bin/webscr?cmd=_xclick&” ;
$paypalURL .= “business=” . “テストアカウントに登録したメールアドレス” . “&” ;
// 設定変更行して下さい ↑$paypalURL .= “business=” . “paypalアカウントのメールアドレス” . “&” ;
$paypalURL .= “lc=JP&item_name=” . “商品名” . “&” ;
// 設定変更行して下さい ↑ $paypalURL .= “lc=JP&item_name=” . “商品名” . “&” ;
$paypalURL .= “invoice=” . $order_id . “&” ;
$paypalURL .= “currency_code=JPY&no_shipping=1&no_note=1&” ;
$paypalURL .= “shipping=” . $arrData['deliv_fee'] . “&” ;
$paypalURL .= “amount=” . ($arrData['payment_total']-$arrData['deliv_fee']) . “&” ;
$paypalURL .= “email=” . $arrData["order_email"] . “&” ;
$paypalURL .= “first_name=” . urlencode(mb_convert_encoding($arrData["deliv_name02"], “UTF-8″,CHAR_CODE)) . “&” ;
$paypalURL .= “last_name=” . urlencode(mb_convert_encoding($arrData["deliv_name01"], “UTF-8″, CHAR_CODE)) . “&” ;// 郵便番号から市町村を得る
$city = $objQuery->get(‘mtb_zip’, ‘city’, ‘zipcode = ?’, $arrData['deliv_zip01'] . $arrData['deliv_zip02']);
$paypalURL .= “address1=” . urlencode(mb_convert_encoding(str_replace($city, “”, $arrData["deliv_addr01"]), “UTF-8″, CHAR_CODE)) . “&” ;
$paypalURL .= “address2=” . urlencode(mb_convert_encoding($arrData["deliv_addr02"], “UTF-8″, CHAR_CODE)) . “&” ;
$paypalURL .= “city=” . urlencode(mb_convert_encoding($city, “UTF-8″, CHAR_CODE)) . “&” ;
$paypalURL .= “zip=” . $arrData["deliv_zip01"] . “-” . $arrData["deliv_zip02"] . “&” ;
$paypalURL .= “night_phone_b=(” . $arrData["order_tel01"] . “)” . $arrData["order_tel02"] . “-” . $arrData["order_tel03"] ;header(“Location: ” . $paypalURL);
} else {
header(“Location: ” . URL_SHOP_COMPLETE);
}
}
PAYPALのURLをPAYPALのサンドボックスのURLに、PAYPALのアカウントをPAYPALのサンドボックスのアカウントに、それぞれ、一時的に変更しましょう~。
これで、LC_Page_Shopping_Confirm.phpをアップロードしたら、EC-CUBEで、決済方法にPAYPALを選んで、テスト決済してみる。
PAYPAL(サンドボックス)サイトで決済して、その後、自サイトへリダイレクトされて戻ってくる、という一連の動作ができれば、OK。何度か動作確認して問題なければ、本番に切り替える。
以上どす。
- Comments (Close): 0
- Trackbacks: 1
【EC-CUBE】PAYPAL支払いAPIを利用する
- 2009-06-14 (日)
- EC-CUBE
EC-CUBEにPAYPAL支払いを導入する。
まずは、PAYPALのWEBサイトで、ビジネスアカウント(代金の受取ができるアカウント)を取得する。ビジネスとプレミアアカウントの違いは、機能的にはあまりないが、ビジネスアカウントの場合、クレジットカードなどの決済名に社名(または店舗、団体名など)が使用できるので、ビジネスで決済したいのであれば、ビジネスアカウントを利用するほうが便利。
上級なテクだが、PAYPAL決済では、定期購読やギフト券の発行などにも対応することもできる。とりあえず、まずは、ベーシックにいくけども。。。
アカウントを作成&メール認証したら、「マイアカウント」→「個人設定」→「ウェブ ペイメントの設定」を表示し、
- ウェブサイト決済の自動復帰
自動復帰:オン
ウェブサイト決済の自動復帰
復帰URL:http://ショップURL/html/shopping/complete.php
- 支払いデータ転送:オン
- 暗号化ウェブサイト決済
暗号化されていないウェブサイト決済の受領拒否:オフ - PayPalアカウントオプションサービス:オフ
- 連絡先電話番号:オフ
- 高速チェックアウトの設定
giropayおよび銀行振替による支払いのサポート:オフ
と設定する。
次に、
「マイアカウント」→「個人設定」→「言語のエンコード」で、
- 「ウェブサイトの言語」 →「日本語」を選択して、下の「詳細オプション」ボタンもクリック。エンコード方式を「UTF-8」にする。
- その下の「PayPalから送信されたデータと同じエンコード方式を使用しますか(IPN、ダウンロード可能なログ、メールなど)?」は、「はい」でOK
最後に「マイアカウント」→「個人設定」→「支払い受領設定」でクレジットカード利用名最上の名前をショップまたは会社の名前に設定する。
PAYPAL側での設定は一旦以上。
PAYPALでは、そのほかに、個別にPAYPALで決済したいお客様向けの決済案内メールを、請求書として送付したり(テンプレート設定ができる)PAYPALの決済画面をショップオリジナルの体裁に変更したり、色々と便利な機能が使える。
必須ではないが、あったほうがお客様にとって便利なオプションもあるので、研究してみるのもいいと思う。
さて、肝心のEC-CUBEでの設定を追加していく。
/data/class/pages/shopping/LC_Page_Shopping_Confirm.php
L148~L155(VER.2.4の場合)
// 決済方法により画面切替
if($payment_type != “”) {
$_SESSION["payment_id"] = $arrData['payment_id'];
header(“Location: ” . URL_SHOP_MODULE);
}else{
if($arrData['payment_id'] == ※payment_id) {
// 設定変更行して下さい ↑ if($arrData['payment_id'] == payment_id) {
$paypalURL = “https://www.paypal.com/j1/cgi-bin/webscr?cmd=_xclick&” ;
$paypalURL .= “business=” . “アカウントに登録したメールアドレス” . “&” ;
// 設定変更行して下さい ↑$paypalURL .= “business=” . “paypalアカウントのメールアドレス” . “&” ;
$paypalURL .= “lc=JP&item_name=” . “商品名” . “&” ;
// 設定変更行して下さい ↑ $paypalURL .= “lc=JP&item_name=” . “商品名” . “&” ;
$paypalURL .= “invoice=” . $order_id . “&” ;
$paypalURL .= “currency_code=JPY&no_shipping=1&no_note=1&” ;
$paypalURL .= “shipping=” . $arrData['deliv_fee'] . “&” ;
$paypalURL .= “amount=” . ($arrData['payment_total']-$arrData['deliv_fee']) . “&” ;
$paypalURL .= “email=” . $arrData["order_email"] . “&” ;
$paypalURL .= “first_name=” . urlencode(mb_convert_encoding($arrData["deliv_name02"], “UTF-8″,CHAR_CODE)) . “&” ;
$paypalURL .= “last_name=” . urlencode(mb_convert_encoding($arrData["deliv_name01"], “UTF-8″, CHAR_CODE)) . “&” ;// 郵便番号から市町村を得る
$city = $objQuery->get(‘mtb_zip’, ‘city’, ‘zipcode = ?’, $arrData['deliv_zip01'] . $arrData['deliv_zip02']);
$paypalURL .= “address1=” . urlencode(mb_convert_encoding(str_replace($city, “”, $arrData["deliv_addr01"]), “UTF-8″, CHAR_CODE)) . “&” ;
$paypalURL .= “address2=” . urlencode(mb_convert_encoding($arrData["deliv_addr02"], “UTF-8″, CHAR_CODE)) . “&” ;
$paypalURL .= “city=” . urlencode(mb_convert_encoding($city, “UTF-8″, CHAR_CODE)) . “&” ;
$paypalURL .= “zip=” . $arrData["deliv_zip01"] . “-” . $arrData["deliv_zip02"] . “&” ;
$paypalURL .= “night_phone_b=(” . $arrData["order_tel01"] . “)” . $arrData["order_tel02"] . “-” . $arrData["order_tel03"] ;header(“Location: ” . $paypalURL);
} else {
header(“Location: ” . URL_SHOP_COMPLETE);
}
}
こんな感じで!とりあえず、アップロードして、PAYPALの決済サイトへつながればOK。
さて、PAYPALのサイトでユーザーが決済完了すると、数秒でこちらのサイトへリダイレクトされて画面が戻ってくるようになっている。ここで注意しないといけないことは、リダイレクトされてくるタイミングで、こちらのDBでは、買い物完了という情報がPAYPALから送られてくる、ということだ。もし、短気なユーザーが「お買い物できたわ~。」と思って、ウインドウを閉じてしまったら、こちらには、決済情報はフィードバックされない;
これを解決する方法もあるのだが、ちょっと更にややこしいので、とりあえずは、ウインドウは閉じないでね、お願いね、とでも書いて、ユーザーに注意を促そう。。。
それでは、最後の仕上げ。
ソースができたら、テストを行う。ただし、PAYPALのサイトで実際に決済してしまうと、請求が来てしまう(!あたりまえ;)ので、先にテストをしておきたい。。。
PAYPALには、サンドボックスという便利なテスト機能があるので、それを利用してテストすることにする。
ここからが、英語ベースで結構面倒なんである・・・が、やっぱりお客様のお金を扱うので、ここは慎重に;
でも、長くなるので、エントリーを分けることにしまっす!→ここを見るべし
参考サイト:
http://eccube.seesaa.net/article/87548448.html
http://www.wiz.gr.jp/wordpress/82
http://blog.katsuma.tv/develop/paypal/
https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/howto_testing_sandbox
- Comments (Close): 0
- Trackbacks: 1
かっこいいフォームデザイン色々25
- 2009-06-10 (水)
- WEBデザイン
http://sixrevisions.com/user-interface/25-stylish-examples-of-web-forms/
フォームデザインの参考に。
こういうアイデアにあふれたフォームであれば、お問い合わせなど送りやすいですね。
- Comments (Close): 0
- Trackbacks: 0
ビューティフルなフラッシュサイト50選
- 2009-06-08 (月)
- FLASH
http://www.smashingmagazine.com/2009/06/07/50-beautiful-flash-websites/
フラッシュの動きやデザインの参考になる海外サイトがいっぱい。
- Comments (Close): 0
- Trackbacks: 0
ビューティフルな高品質フォント色々
- 2009-06-08 (月)
- FONT
http://www.smashingmagazine.com/2009/06/05/beautiful-high-quality-free-fonts-for-your-designs/
英字フォントだが、個性的で美しいものが色々DLできる。
- Comments (Close): 0
- Trackbacks: 0
フリーのサイトデザインPSDとXHTMLテンプレートがダウンロードできる
- 2009-06-08 (月)
- WEBデザイン
http://www.smashingmagazine.com/2009/06/04/6-free-psdxhtml-templates/
ここで公開されている6つのサイトデザインが、テンプレートとPSDとどちらもDLできる。
サイトデザインの勉強にもいいだろうと思う。
- Comments (Close): 0
- Trackbacks: 0
EC-CUBE関連で、パスワード保護していたいくつかのエントリーを一般公開にしました
- 2009-06-05 (金)
- つぶやき
最近、エントリーしてないので、久々にブログの見直し。
2つ、3つエントリーを追加して、その後、EC-CUBE関連で、非公開にしていたいくつかのエントリーを一般公開に変更。(都合で、また、非公開にするかも知んないけど;)
最近、このブログもなぜかアクセスが増えてきて、怖いような、もっとサービスしたいような不思議な気持ち。
とりあえず、微妙にサービス精神が勝ったので、公開項目を増やすことに。
まあ、でも、なんちゅうか、このブログ、落ちて一番困るのは、自分自身かも。。。とにかく、メモってるので、なくなると困る・・・
- Comments (Close): 0
- Trackbacks: 0
PHPで出力色々
- 2009-06-05 (金)
- PHP・PERL
- PHPでPhotoshopのPSDファイルを画像に変換してブラウザに出力。
http://www.catswhocode.com/blog/php-display-adobe-psd-
files-on-a-web-page - PHPからWord、Excel、PowerPointのドキュメントを生成するサンプル
http://www.whenpenguinsattack.com/2007/07/02/how-to-create-microsoft-office-documents-with-php/ - PHPでExcelファイルを生成できるライブラリPHPExcel
http://www.codeplex.com/PHPExcel
http://journal.mycom.co.jp/articles/2009/03/06/phpexcel/index.html (参考:マイコミジャーナル)
http://phpspot.org/blog/archives/2009/03/phpexcelphpexce.html (参考:PHP開発日記)
いろんなことができるんだねっ☆
- Comments (Close): 0
- Trackbacks: 0
【EC-CUBE】商品詳細ページにカスタム入力欄を追加する(プレ)
- 2009-05-19 (火)
- EC-CUBE
表題の件。要するにぼやきのためのエントリー;
長らく悩まされていた詳細ページのフォームへカスタム入力欄(オーダーサイズを入力させたい!)追加ができるようになる。
もう、何が大変って、ちょいちょいっとで起きると思って始めたら、全然;
セッションの引き回しやら管理画面やら、メールやら、ややこしいったらありゃしない。。。
結局、とにかく自力で!PHPの入門マニュアルやら引き出してきて、変数と処理を追っかけまくる羽目になった。
いじるファイルも多いし、作業も面倒。
忘れないうちに、メモっておこうと思うけど、すでにこの時点で忘れかけ・・・(だって、かなりのトライアル&エラーだったんだもぉ~ん。)
マジでハゲるかと思いましたよ。(^^;
とりあえずあとで書くことにして、触ったファイルだけでもメモしておきたい。(メモなので間違ってるかも。まあ、いいや後で修正すれば。)
- detail.tpl
- cart/index.tpl
- LC_Page_Products_Detail.php
- SC_CartSession.php
- SC_Helper_DB.php
- LC_Page_Shopping_Complete.php
- LC_Page_Mypage_History.php
- LC_Page_Admin_Order_Edit.php
- mypage/history.tpl
- shopping/confirm.tpl
- mail_teplate/order_mail.tpl
- admin/order/edit.tpl
- admin/order/disp.tpl
- ctb_order_detail(データベースにカラム追加)
大体これくらい?携帯サイトのほうはまだできていませ~ん。
追記。で、情報も書いてみた。
そして、一般公開にしようかどうかを悩む。。。
ややこしい内容なので、クレーム来てもヤだし。。。
てことで、当面は、個別に知りたい人にだけこっそり教えることにする・・・
- Comments (Close): 0
- Trackbacks: 0
使えるWORDPRESSのテーマ&プラグイン
- 2009-04-21 (火)
- WORDPRESS
DESIGN WORKERさんで、よさげな記事を発見したので、あげあげ♪
- Wordpressで使えるプラグインを9つ
http://www.designwalker.com/2007/07/wordpress-plugin.html - Wordpress便利なプラグイン30選
http://www.designwalker.com/2009/01/wp-plugins.html - 無料のWordpressテーマ100選
http://www.designwalker.com/2008/12/wordpress100.html
- Comments (Close): 0
- Trackbacks: 0
PHPで実装するレコメンドエンジンについての覚書
- 2009-03-28 (土)
- PHP・PERL
「この商品を買った人は、こんな商品も買ってます」
アマゾンでお役立ちの、アレ。
レコメンドエンジン機能という。
これは、協調フィルタリングという手法で実現されているらしいです。
協調フィルタリング(Collaborative Filtering, CF)は、多くのユーザの嗜好情報を蓄積し、あるユーザと嗜好の類似した他のユーザの情報を用いて自動的に推論を行う方法論である。趣味の似た人からの意見を参考にするという口コミの原理に例えられることが多い。
なるほど。
で、実は、この機能を簡単に実装できるPHPのライブラリがありました。
VOGOO: http://www.vogoo-api.com/
フリーとプロ版があり、ふりーは、mySQLとポスグレの2つのDBに対応しているので、EC-CUBEにくっつけて使えそう。
サイトは、英語だけど、サイト内には、チュートリアルもあって、使い方なんかも詳しくかかれているっぽいので、時間が取れたら、ちょっと調べてみることにするワ。
とりあえず、覚書として残す。
参考:http://www.richcontext.jp/rss/richcontext.jsp (こんなのもある)
- Comments (Close): 0
- Trackbacks: 0
【EC-CUBE】初回の買い物は、ポイント●倍にする
- 2009-03-27 (金)
- EC-CUBE
EC-CUBEを再びカスタマイズ。
初回の買い物は、ポイント●倍にして、その倍率は、管理画面のパラメータ設定で変えられるようにする。
その1)初回の買い物かどうか、判定してポイントを●倍にするロジックを追加。
/data/class/SC_CartSession.phpの function getAllProductsPoint() に下記コードを追加。
L206あたり。
$id = $_SESSION[$this->key][$i]['id'][0];
$point = SC_Utils_Ex::sfPrePoint($price, $point_rate, POINT_RULE, $id);
$total+= ($point * $quantity);
}
$objQuery = new SC_Query();
$objCustomer = new SC_Customer();
//customer_idを検証
$customer_id = $objCustomer->getValue(“customer_id”);
$order_count = $objQuery->count(“dtb_order”, “order_id = ? and customer_id = ?”, array($order_id, $customer_id));
if ($order_count == 1) {
$total = $total*FIRST_POINT;
}
return $total;
}// カートへの商品追加
その2)管理画面のパラメータ設定にポイント倍率設定用の項目を増やす。
DBの、mtb_constantsを開いて、カラムを1行追加。
| id | FIRST_POINT |
|---|---|
| name | 1 |
| rank | 523※一番最後に追加 |
| remarks | 初回購入ポイント倍率 |
nameの値が倍率になる。デフォルトは”1″(倍)。
倍率を変更するときは、管理画面のパラメータ設定で値を変えればOK。
その他の注意点としては、キャンセルがあったときなどにポイントの手動付け替えなど、色々懸念することが出てきてしまうので、
- ポイント付与のタイミングを発送済みか支払い確認済みなどのステータスになったとき、などに変更しておいたほうがいい
- 注文のキャンセルがあったときは、自動でポイントが付け替えられるほうがいい
こういうことも一緒にカスタマイズしておいたほうがいい。この辺は、次のバージョンあたりで解消されそうな気もするけども。
- Comments (Close): 0
- Trackbacks: 0
WORDPRESSへフォームをつけた。そして携帯対応にした。
- 2009-03-12 (木)
- WORDPRESS
WORDPRESSには、色んなプラグインがある。
その中に、お問い合わせフォームを簡単に作ろう♪というプラグインがあるのであるが、
この2つで迷い、悩みぬいた挙句(というか、やりたいことを実現するために朝方までソースをいじいじテストした挙句)今回は、contact form 7を利用することにした。
というのも、問題は、KTAI STYLEとの相性というか、、、携帯での文字化け?
フォームのメール入力欄に携帯電話のメールアドレスを使用すると、送られてくる内容確認メールが文字化けするのだ。色んなハックを調べてやってみたんだけど、PCサイトでは、文字化けなく携帯にメールが送られるようになったものの、どうしても、KTAI STYLEの携帯サイトからは、文字化けが直らない・・・
エンコードの問題があるので対応を迫られるのはしょうがない;
とはいえ、これはキビシイ。
cformでは、全体の文字化けは、回避できたけど、formの値の部分のみ文字化けする。(後ちょっとな気がするんだけど;)
てことで、なんとかうまくいったcontact form 7のハック。
wp-contact-form-7.phpのL991あたり。function validateにktai style用のコードを追加。
function validate($contact_form) {
$fes = $this->form_elements($contact_form['form'], false);
$valid = true;
$reason = array();foreach ($fes as $fe) {
$type = $fe['type'];
$name = $fe['name'];
$values = $fe['values'];
$raw_values = $fe['raw_values'];// Ktai ONLY
if (preg_match(‘/^(?:text|textarea)[*]?$/’, $type) && function_exists(‘is_ktai’) && is_ktai())
$_POST[$name] = mb_convert_encoding($_POST[$name], get_bloginfo(‘charset’) ,”SJIS”);// Before validation corrections
if (preg_match(‘/^(?:text|email|captchar|textarea)[*]?$/’, $type))
$_POST[$name] = (string) $_POST[$name];
よし!
これで、簡単にフォームが追加できる!試しに、確認メールをお問い合わせユーザーに返信する設定で、メアドをdocomoにしてみたけど、OKだった。
は~。理屈は分かってんだけど、情報少ないし、大変だった。
参考サイト:http://d.hatena.ne.jp/v-m-s_memo/20081101/1225548282
この中で、ktai styleの作者のゆりこさんのコメントがあって、
「で、修正コードですが、SJIS 決め打ちはいろいろ問題が出そうです。現在は SJIS ないし SJIS-win しかないですが、将来的には is_ktai() が true でも UTF-8 になる可能性があるため、global $Ktai_Style; してから、$Ktai_Style->get(‘charset’) した値を使ってください。これならば、互換性が保てます。」
ということなので、
// Ktai ONLY
global $Ktai_Style;
$ktai_char = $Ktai_Style->get(‘charset’);
if (preg_match(‘/^(?:text|textarea)[*]?$/’, $type) && function_exists(‘is_ktai’) && is_ktai())
$_POST[$name] = mb_convert_encoding($_POST[$name], get_bloginfo(‘charset’) ,$ktai_char);
とかしたら、いいってことなのかな???
また、明日にでもテストしてみよう。。。 →これで、いけましたね。
追記:(09/08/17)
contact form 7のバージョンが新しくなったので、こちらに記載していたコードとコードの位置がどちらも変更になってしまった。(ketai styleもバージョンアップされている)
いい感じになったけど、ハックには不都合;
てことで、検索していたら、こちらで、モジュールを公開されているのを発見!
http://www.icoro.com/200908093906.html
- Comments (Close): 0
- Trackbacks: 1
WORDPRESSで登録メール等が届かない・・・対応
- 2009-03-11 (水)
- WORDPRESS
WORDPRESSでは、新しいユーザーが登録された場合やお問い合わせフォームプラグインなどの設置で、自動的にメールが届く仕組みがある。
・・・はずなのだが、このメールが一向に届かない。
原因は、inetd。
およそのサーバにですね、inetd(※inetd は、FTP、POP3、telnet といったインターネットサービスが使うポート番号を(指定されて)監視する。監視対象のポートにTCPパケットあるいはUDPパケットが届くと、inetd は対応するサーバプログラムを起動し、コネクションを制御させる。by wikipedia)というのが、走っているわけなんですが、このinetdが、メール送信の時に、from情報もしているようで、WORDPRESSのデフォルトのまま設定ではこの監視に引っかかってしまうので、メールを受け取れない。
どういうことかというと。
WORDPRESSは、通知メールの送信に、wordpress@あなたのサイト名のアドレスでメールを送信します。このメールアドレスが、サーバ内に実在していれば、問題がないのだが、実在していないメールアドレスからの送信は、inetdの監視に引っかかってしまう。
て、おいおい。。。
最初からwordpress@domainなんてメアド誰がつくっとるねん;
とかツッコんでしまう。
よって、主な対応方法は、2つかと。。。
- 上記、wordpress@domainというメアドを実際に作ってWPの管理アドレスに設定する。
- または、このメアドをサーバに実在している実際の運用アドレスに変更する。
ま、たいてい、2ですな。
やり方。
/wp-includes/pluggable.php を開いて、L354あたりの、
$from_email = ‘wordpress@’ . $sitename;
を、(1)
$from_email = ‘あなたのめあど@domain‘;
か(2)
$from_email = ‘あなたのめあど@‘. $sitename;
に変更。
ただし、(2)の方法で変更する場合、wordpressで送信されるメールアドレスは、wwwのサブドメインは削除されることに留意すること。(→つまり、ドメインが、www.domain.comでも@から後ろは、domain.comにしかなりませんよ、でも、sub.domain.comだったら、そのままですよ、ということです。まあ、これは普通メアド作るときにも同じようなルールになるので、問題ないかと思うのですが・・・)
こういうところって結構悩みますね。
ちなみに、メアドチェックは、サーバー内で掛かりますよ。他のサービスで持ってるメアドで運用しようとしている場合は、要注意です。
- Comments (Close): 0
- Trackbacks: 0
WORDPRESSで”とか’の記号が全角になってしまう;
- 2009-03-05 (木)
- WORDPRESS
wp-includes/formatting.php L60あたり、
$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);
をコメントアウト。
//$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);
これだけです。
- Comments (Close): 0
- Trackbacks: 0
【EC-CUBE】詳細ページに商品への問い合わせボタンを追加する
- 2009-03-05 (木)
- EC-CUBE
- 商品の詳細ページに、商品についての問い合わせボタンを追加し、問い合わせフォームへ遷移させる。
- 問い合わせフォームには、商品詳細ページから飛んできた問い合わせについては、フォームに商品名や品番などを自動入力されるように変更する。
フォーラムを見て、こんなことをやってみました。(ryoさん、ありがとうございます)
まず、/data/Smarty/templates/defaults/detail.tpl 内の、問い合わせボタンを追加したい位置に、問い合わせボタン用のフォームを追加する。(そのとき、注文用のフォームとかぶったり、入れ子にならないように注意!)
<form method=”post” action=”<!–{$smarty.const.SITE_URL}–>contact/”>
<input type=”hidden” name=”products_name” value=”<!–{$arrProduct.name|escape}–>” />
<input type=”submit” name=”" value=”この商品について問い合わせる” />
</form>
※ SSLに飛ばすなら赤字を「$smarty.const.SSL_URL」に変更。
つぎに、/data/Smarty/templates/contact/index.tpl のL67あたり、お問い合わせ内容を記入してもらうtextareaに下記コードを追加。
<tr>
<th>お問い合わせ内容<span class=”attention”>※</span><br />
<span class=”mini”>(全角<!–{$smarty.const.MLTEXT_LEN}–>字以下)</span></th>
<td><span class=”attention”><!–{$arrErr.contents}–></span>
<textarea name=”contents” class=”area380″ cols=”60″ rows=”20″ style=”<!–{$arrErr.contents|sfGetErrorColor}–>”><!–{if $smarty.post.products_name != ” }–><!–{$smarty.post.products_name|escape}–>に関するお問い合わせ<!–{/if}–>
<!–{$contents|escape}–></textarea></td>
</tr>
<!–{if $smarty.post.products_name != ” }–><!–{/if}–>
を記載することによって、「(商品名)に関するお問い合わせ」という部分が、商品ページからの遷移の場合のみ追加されることになる。(=通常のお問い合わせの場合入らない)
- Comments (Close): 0
- Trackbacks: 0
【EC-CUBE】最近チェックした商品の履歴を○○件表示させる
- 2009-03-03 (火)
- EC-CUBE
商品の詳細ページと一覧ページで最近チェックした商品の履歴を表示させる。
- 履歴はクッキーで(1ヶ月)保持する
- 最新の閲覧商品を(4件)表示させ、重複する閲覧履歴は表示しない
- 表示テンプレートはブロックで生成し、一覧ページにも詳細ページにも共通して使えるようにする
その1)表示用ブロックを作成する。
管理画面から新規ブロックを作成し、下記コードを保存。
(下記はオススメ商品ブロックに倣った2列表示のテンプレートコード。商品名、価格、説明適宜修正する。)
<!–▼閲覧履歴ここから–>
<!–{if $arrItemHistory}–>
<div id=”whoboughtarea” class=”clearFix”>
<h2><img src=”<!–{$TPL_DIR}–>img/products/title_history.jpg” width=”580″ height=”30″ alt=”閲覧履歴” /></h2>
<div class=”whoboughtblock”>
<!–{section name=cnt loop=$arrItemHistory}–>
<!–{if ($smarty.section.cnt.index % 2) == 0}–>
<!–{if $arrItemHistory[cnt].product_id}–>
<!– 左列 –>
<div class=”whoboughtleft”>
<!–{if $arrItemHistory[cnt].main_list_image != “”}–>
<!–{assign var=image_path value=”`$arrItemHistory[cnt].main_list_image`”}–>
<!–{else}–>
<!–{assign var=image_path value=”`$smarty.const.NO_IMAGE_DIR`”}–>
<!–{/if}–>
<a href=”<!–{$smarty.const.DETAIL_P_HTML}–><!–{$arrItemHistory[cnt].product_id}–>”>
<img src=”<!–{$smarty.const.SITE_URL}–>resize_image.php?image=<!–{$image_path|sfRmDupSlash}–>&width=65&height=65″ alt=”<!–{$arrItemHistory[cnt].name|escape}–>” />
</a><!–{assign var=price02_min value=`$arrItemHistory[cnt].price02_min`}–>
<!–{assign var=price02_max value=`$arrItemHistory[cnt].price02_max`}–>
<h3><a href=”<!–{$smarty.const.DETAIL_P_HTML}–><!–{$arrItemHistory[cnt].product_id}–>”><!–{$arrItemHistory[cnt].name|escape}–></a></h3><p>価格<span class=”mini”>(税込)</span>:<span class=”price”>
<!–{if $price02_min == $price02_max}–>
<!–{$price02_min|sfPreTax:$arrSiteInfo.tax:$arrSiteInfo.tax_rule|number_format}–>
<!–{else}–>
<!–{$price02_min|sfPreTax:$arrSiteInfo.tax:$arrSiteInfo.tax_rule|number_format}–>~<!–{$price02_max|sfPreTax:$arrSiteInfo.tax:$arrSiteInfo.tax_rule|number_format}–>
<!–{/if}–>円</span></p>
<p class=”mini”><!–{$arrItemHistory[cnt].main_list_comment|escape|nl2br}–></p>
</div>
<!– /左列 –>
<!–{/if}–>
<!–{/if}–><!–{if ($smarty.section.cnt.index % 2) != 0}–>
<!–{* assign var=nextCnt value=$smarty.section.cnt.index+1 *}–>
<!–{if $arrItemHistory[cnt].product_id}–>
<!– 右列 –>
<div class=”whoboughtright”>
<a href=”<!–{$smarty.const.DETAIL_P_HTML}–><!–{$arrItemHistory[cnt].product_id}–>”>
<!–{if $arrItemHistory[cnt].main_list_image != “”}–>
<!–{assign var=image_path value=”`$arrItemHistory[cnt].main_list_image`”}–>
<!–{else}–>
<!–{assign var=image_path value=”`$smarty.const.NO_IMAGE_DIR`”}–>
<!–{/if}–>
<img src=”<!–{$smarty.const.SITE_URL}–>resize_image.php?image=<!–{$image_path|sfRmDupSlash}–>&width=65&height=65″ alt=”<!–{$arrItemHistory[cnt].name|escape}–>” />
</a>
<!–{assign var=price02_min value=`$arrItemHistory[cnt].price02_min`}–>
<!–{assign var=price02_max value=`$arrItemHistory[cnt].price02_max`}–>
<h3><a href=”<!–{$smarty.const.DETAIL_P_HTML}–><!–{$arrItemHistory[cnt].product_id}–>”><!–{$arrItemHistory[cnt].name|escape}–></a></h3><p>価格<span class=”mini”>(税込)</span>:<span class=”price”>
<!–{if $price02_min == $price02_max}–>
<!–{$price02_min|sfPreTax:$arrSiteInfo.tax:$arrSiteInfo.tax_rule|number_format}–>
<!–{else}–>
<!–{$price02_min|sfPreTax:$arrSiteInfo.tax:$arrSiteInfo.tax_rule|number_format}–>~<!–{$price02_max|sfPreTax:$arrSiteInfo.tax:$arrSiteInfo.tax_rule|number_format}–>
<!–{/if}–>円</span></p>
<p class=”mini”><!–{$arrItemHistory[cnt].main_list_comment|escape|nl2br}–></p>
</div>
<!– /右列 –>
<!–{/if}–>
<!–{/if}–>
<!–{/section}–>
</div>
</div>
<!–{/if}–>
その2)詳細ページ用のphpに、コードを2箇所追加する。
/data/class/paes/products/LC_Page_Products_Detail.php
L100あたり、
// レイアウトデザインを取得
$helper = new SC_Helper_PageLayout_Ex();
$helper->sfGetPageLayout($this, false, “products/detail.php”);// パラメータ管理クラス
$this->objFormParam = new SC_FormParam();
// パラメータ情報の初期化
$this->lfInitParam();
// POST値の取得
$this->objFormParam->setParam($_POST);// ファイル管理クラス
$this->objUpFile = new SC_UploadFile(IMAGE_TEMP_DIR, IMAGE_SAVE_DIR);
// ファイル情報の初期化
$this->lfInitFile();// 商品閲覧履歴取得
$this->Get_ItemHistory();// 管理ページからの確認の場合は、非公開の商品も表示する。
if(isset($_GET['admin']) && $_GET['admin'] == ‘on’) {
SC_Utils_Ex::sfIsSuccess(new SC_Session());
$status = true;
$where = “del_flg = 0″;
} else {
$status = false;
$where = “del_flg = 0 AND status = 1″;
}
そして、コードの一番最後のほう、 function lfConvertParam()の後ろにも追加。
function lfConvertParam() {
if (!isset($this->arrForm['quantity']['value'])) $this->arrForm['quantity']['value'] = “”;
$value = $this->arrForm['quantity']['value'];
$this->arrForm['quantity']['value'] = htmlspecialchars($value, ENT_QUOTES, CHAR_CODE);
}
//商品詳細閲覧履歴取得、表示データ取得処理
function Get_ItemHistory() {
$cnt = 0;
// ページを再読み込み後に表示
if (isset($_COOKIE['product'])) {
foreach ($_COOKIE['product'] as $name => $value) {
$objQuery = new SC_Query();
// DBから一覧表示用商品情報取得
$arrRet = $objQuery->select(“*”, “vw_products_allclass AS alldtl”, “product_id =”.$value);
$this->arrItemHistory[$cnt] = $arrRet[0];
$cnt = $cnt+1;
}
}//クッキーに重複項目がないか判定処理
$duplicateFlg = true;
if (isset($_COOKIE['product'])) {
foreach ($_COOKIE['product'] as $name => $value) {
if($value == $_GET['product_id']){
$duplicateFlg = false;
}
}
}
//重複がない場合クッキーに設定
if($duplicateFlg){
if($cnt < 4){
$cnt = $cnt + 1;
setcookie(“product[".$cnt."]“, $_GET['product_id'],time()+60*60*24*30 );
}else{
$reNum = 1;
foreach ($_COOKIE['product'] as $name => $value) {
if($reNum > 1){
$setNum = $reNum -1;
setcookie(“product[".$setNum."]“, $value, time()+60*60*24*30 );
}
$reNum = $reNum + 1;
}
setcookie(“product[4]“, $_GET['product_id'], time()+60*60*24*30 );
}
}
}
}
?>
その3)一覧ページ用phpにも同様にコードを追加する。
/data/class/paes/products/LC_Page_Products_list.php
L82あたり、
// レイアウトデザインを取得
$helper = new SC_Helper_PageLayout_Ex();
$helper->sfGetPageLayout($this, false, DEF_LAYOUT);//2008.04.11 商品閲覧履歴取得
$this->Get_ItemHistory();// 管理ページからの確認の場合は、非公開の商品も表示する。
if(isset($_GET['admin']) && $_GET['admin'] == ‘on’) {
SC_Utils_Ex::sfIsSuccess(new SC_Session());
$status = true;
$where = “del_flg = 0″;
} else {
$status = false;
$where = “del_flg = 0 AND status = 1″;
}//表示件数の選択
if(isset($_POST['disp_number'])
&& SC_Utils_Ex::sfIsInt($_POST['disp_number'])) {
$this->disp_number = $_POST['disp_number'];
} else {
コードの最後のほう、
function lfconvertParam () {
foreach ($this->arrForm as $key => $value) {
if (preg_match(‘/^quantity[0-9]+/’, $key)) {
$this->arrForm[$key]
= htmlspecialchars($this->arrForm[$key], ENT_QUOTES, CHAR_CODE);
}
}
}
//2008.04.11 商品詳細閲覧履歴取得、表示データ取得処理
function Get_ItemHistory() {
$cnt = 0;
// ページを再読み込み後に表示
if (isset($_COOKIE['product'])) {
foreach ($_COOKIE['product'] as $name => $value) {
$objQuery = new SC_Query();
// DBから一覧表示用商品情報取得
$arrRet = $objQuery->select(“*”, “vw_products_allclass AS alldtl”, “product_id =”.$value);
$this->arrItemHistory[$cnt] = $arrRet[0];
$cnt = $cnt+1;
}
}//クッキーに重複項目がないか判定処理
$duplicateFlg = true;
foreach ($_COOKIE['product'] as $name => $value) {
if($value == $_GET['product_id']){
$duplicateFlg = false;
}
}//重複がない場合クッキーに設定
if($duplicateFlg){
if($cnt < 4){
$cnt = $cnt + 1;
setcookie(“product[".$cnt."]“, $_GET['product_id'],time()+60*60*24*30 );
}else{
$reNum = 1;
foreach ($_COOKIE['product'] as $name => $value) {
if($reNum > 1){
$setNum = $reNum -1;
setcookie(“product[".$setNum."]“, $value, time()+60*60*24*30 );
}
$reNum = $reNum + 1;
}
setcookie(“product[4]“, $_GET['product_id'], time()+60*60*24*30 );
}
}
}
}
?>
を追加。
その4)最後に、管理画面から、先に作っていた表示用ブロックを詳細ページまたは一覧ページのレイアウトに追加。
- Comments (Close): 0
- Trackbacks: 0
自サイトでアフィリエイトを行うプログラム
- 2009-03-03 (火)
- ECサイト向け
アフィリエイトといえば、A8やもしもが有名だけど、少しの商品・低予算でアフィリエイトを行いたい、アフィリエイトの形態を独自に決めたい、直接リンク元情報を得たいといった場合には、自サイトで独自にアフィリエイトを行いたい場合がある。
ASPは、統括管理ができたり、使い安い反面、費用や用途に制限があったりするが、自社でプログラムをインストールするなら、カスタマイズもできるし、管理情報も自社で持てる。また、長期利用してもコストの心配も要らない。
で、見つけたのがこれ。オンライン・デモもあるので先に試してみることができる。
Affiliate Pro。
※サイトを開くといきなり音が出て、ちょっとイラつくので注意(^^;
海外ソフトだが、管理画面も日本語翻訳されていて、機能も高価なASPに負けないくらい豊富。価格は、$49でお財布に優しいし、購入すれば、自分で運営している色々なサイトに使用できるので、お徳ではないでしょうか。色々見た中では、手頃でよさげ。
その他のソフトを探すなら、こういうアフィリエイトやコマースソフトの一覧サイトもあります。http://www.topshareware.com/affiliate/downloads/1.htm
- Comments (Close): 0
- Trackbacks: 0
- Search
- Feeds
- Meta


























