月々の使用料無料でクレジットカード決済を導入できるのがPayPal決済のメリット。PayPal決済を導入するには「PayPalビジネスアカウント」の取得が必要ですが、これも無料で手続きできます。で、決済方法にもいろいろな種類があってまた迷うわけですが、ペイパルアカウントを持っていない一見のお客さんにもクレジットカードを使ってもらおうと思うと、「ウェブペイメントスタンダード」しかないようです。(「エクスプレスチェックアウト」は画面遷移が少なくて魅力的なのですが、お客さんがペイパルアカウントを持っているか、決済時にアカウントを作るかしなければならないんです。)
このウェブペイメントスタンダードは、「自サイトで購入手続き→PayPal決済画面に遷移→自サイトに戻る」という流れになります。この流れを実現するために必要なモジュールが「ペイパルエクスプレス チェックアウト決済モジュール」。エクスプレスとついていますが、スタンダードもこのモジュールで対応できます。
早速テストしてみて最初にハマッたのが、パーミッションの設定。public_html/user_data内のpaypal_cancel.phpとpaypal_recv.phpが666になっているとうまく動かないようなので644にしてやります。ただこの症状、必ず発生するってわけでもなくて、3サイトで試したところ1箇所だけで発生しました。いずれにしても導入時には確認しておいたほうがいいかも知れません。
特に問題がなければ、以上で設定は終了。クレジットカードに対応したショッピングサイトの完成です。(ホントは決済完了のステイタスをEC-CUBEに連携するとか、いろいろと課題はあるんですケド。)
…さて。
ここからが本題なのですが、通常発送の商品のみを扱うのだったら問題ないのですが、ダウンロード商品を扱う場合に大変なことがおこります。
通常なら、この画面がしばらく表示された後に「PayPal決済サイトへ遷移しています。しばらくお待ち下さい。」の文字とともにPayPalの画面に遷移するのですが、ダウンロード商品の場合はここで止まってしまい、先に進めません。仕方がないので「戻る」ボタンで戻るのですが、これじゃあPayPalでダウンロード商品を購入できません。
調べてみてもなかなか情報が見つからなかったのですが、ようやくそれっぽい情報を見つけることができました。
この中にあった回答
ウェブペイメント・スタンダードでは、セラープロテクション(売り手保護 https://www.paypal.com/jp/cgi-bin/webscr?cmd=xpt/Marketing/securitycenter/sell/SellerProtection-outside) の対応に伴って、配送先住所の入力が必須になっているため、ダウンロード商品の場合だとエラーになるようです。
data/downloads/module/mdl_paypal/LC_Page_Mdl_Paypal_Helper_Link.php の 147行目付近以降の EXIST_CHECK をはずしてみるといかがでしょうか。
とのことなので、早速該当する箇所を修正してみます。LC_Page_Mdl_Paypal_Helper_Link.phpの145行目からペイパルスタンダードのパラメータの記述が始まるのですが、「city」「address1」「state」「zip」「first_name」「last_name」の「array("EXIST_CHECK"), 」を消してやります。
$objFormParam->addParam("amount", "amount", STEXT_LEN, "n", array("NUM_CHECK", "EXIST_CHECK", "MAX_LENGTH_CHECK"), $arrOrder['payment_total']);
$objFormParam->addParam("undefined_quantity", "undefined_quantity", 1, "KVa", array("EXIST_CHECK", "MAX_LENGTH_CHECK"), PAYPAL_UNDEFINED_QUANTITY);
$objFormParam->addParam("city", "city", MTEXT_LEN, "KVa",
array("EXIST_CHECK"),$arrShipping[$min]['shipping_addr01']);$objFormParam->addParam("address1", "address1", MTEXT_LEN, "KVa",
array("EXIST_CHECK"),$arrShipping[$min]['shipping_addr02']);$objFormParam->addParam("state", "state", MTEXT_LEN, "KVa",
array("EXIST_CHECK"),$this->arrPref[$arrShipping[$min]['shipping_pref']]);$objFormParam->addParam("zip", "zip", MTEXT_LEN, "KVa",
array("EXIST_CHECK"),$arrShipping[$min]['shipping_zip01'] . $arrShipping[$min]['shipping_zip02']);$objFormParam->addParam("first_name", "first_name", MTEXT_LEN, "KVa",
array("EXIST_CHECK"),$arrShipping[$min]['shipping_name02']);$objFormParam->addParam("last_name", "last_name", MTEXT_LEN, "KVa",
array("EXIST_CHECK"),$arrShipping[$min]['shipping_name01']);
これで、ダウンロード商品をPayPal決済できるようになりました。
ただ、副作用というか、ちょっと新たな問題が発生しました。上記のデータチェックはずしを行うとダウンロード商品が購入できるようになる代わりに、遷移した後の画面でPayPalアカウントを使わずにクレジット決済をしようとするときに表示される入力フォームの項目すべてを手で埋めなければなりません。ちなみに改造前のファイルの場合はこんな感じで、会員登録したときの氏名・住所等が最初から入っています。
これをお客様サービスの低下と捉えるかどうかは微妙ですが、今のところどちらかを犠牲にしなければならない状態です。もっと核の部分をいじれば解決するんでしょうけど。
今回のファイル修正は、「ダウンロード商品を扱いたい」かつ「ペイパルウェブペイメントスタンダードを導入したい」場合に限ってのことなので、ダウンロード商品を扱わないのであればまったく関係のないお話なのでした。
最近の自分の中でのウェブデザインのワンパターン化(高さ100px程度のヘッダ、右メニュー2カラム。WordPressのテーマばかりいじっていたので。)を打破するべく、いろいろ考えてみた結果、ヘッダ・フッタを天地に固定してみようと考えました。他人の知恵を借りつつ、自分でいろいろ試してみると結構興味深いものがあったので、ちょっとまとめてみます。
まずは先人の知恵を覗いてお勉強。
サイドメニューの有無等によってCSSの記述に違いはあるものの、まぁだいたい想定内。これを元にベースとなるCSSとHTMLを書いてみました。まずはCSS。
body {
padding: 30px 0 30px 0;
overflow-y: scroll;
}#header {
background-color: #000000;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 30px;
}#footer {
background-color: #000000;
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 30px;
}#header p {
margin: 0px;
padding: 5px;
color: #FFFFFF;
}#footer p {
margin: 0px;
padding: 5px;
text-align: center;
color: #FFFFFF;
}
それからHTML。
<body>
<div id="contents">
<h1>1</h1>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<h2>11</h2>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<h3>21</h3>
<p>22</p>
<p>23</p>
<p>24</p>
<p>25</p>
<p>26</p>
<p>27</p>
<p>28</p>
<p>29</p>
<p>30</p>
</div><div id="header">
<p>ヘッダ固定のhtml&cssサンプル</p>
</div><div id="footer">
<p>フッタ固定のhtml&cssサンプル</p>
</div></body>
SEOにどれくらい効果があるかわかりませんが、ヘッダのdiv要素を下に置いてみました。これで十分、FirefoxやInternet Explorer8では表示されます。もちろん、ヘッダのdiv要素を上に配置しても同じように表示されます。ファイルにしたのがこれ。
で、ここからが本題みたいなものでして。実は上記の記述では、Internet Explorer6(IE6)で見たときにグチャグチャに表示されてしまいます。もう今さらIE6なんてどうでもいいよなーと思いながら、とりあえず対応してみたいと思います。参考になったのは次のサイト。
CSSハックでIE6用には別のCSSを適用してうまく表示できています。ところがよく見ると、ヘッダもフッタもコンテンツもdiv要素を3階層の入れ子にしていて、どうもそれが気になってしまうのです。できるだけシンプルにしたい…。そこでdivの入れ子は2階層にとどめて、CSSでコントロールできるかどうか試してみました。まずはHTML部分を2種類用意します。
<body>
<div id="contents_wrap">
<div id="contents">
<h1>1</h1>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<h2>11</h2>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<h3>21</h3>
<p>22</p>
<p>23</p>
<p>24</p>
<p>25</p>
<p>26</p>
<p>27</p>
<p>28</p>
<p>29</p>
<p>30</p>
</div>
</div><div id="header">
<div id="head">
<p>ヘッダ固定のhtml&cssサンプル</p>
</div>
</div><div id="footer">
<div id="foot">
<p>フッタ固定のhtml&cssサンプル</p>
</div>
</div></body>
これがヘッダを下に持ってきて、SEOに効くかもしれない版。次はヘッダをコンテンツの上に置いた普通っぽい版。
<body>
<div id="header">
<div id="head">
<p>ヘッダ固定のhtml&cssサンプル</p>
</div>
</div><div id="contents_wrap">
<div id="contents">
<h1>1</h1>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<h2>11</h2>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<h3>21</h3>
<p>22</p>
<p>23</p>
<p>24</p>
<p>25</p>
<p>26</p>
<p>27</p>
<p>28</p>
<p>29</p>
<p>30</p>
</div>
</div><div id="footer">
<div id="foot">
<p>フッタ固定のhtml&cssサンプル</p>
</div>
</div></body>
こんな感じで、ヘッダもフッタもコンテンツを設定します。div要素contents_wrapは、IE6が使います。次にCSSを2種類用意しました。1つ目はIE6非対応版。
body {
padding: 30px 0 30px 0;
overflow-y: scroll;
}#header {
background-color: #000000;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 30px;
}#footer {
background-color: #000000;
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 30px;
}#header p {
margin: 0px;
padding: 5px;
color: #FFFFFF;
}#footer p {
margin: 0px;
padding: 5px;
text-align: center;
color: #FFFFFF;
}
それからIE6対応版。
body {
margin: 0;
padding: 0;
}#header {
position: fixed;
top: 0;
width: 100%;
}#head {
background-color: #000000;
height: 30px;
}#contents {
overflow: auto;
margin: 0 auto;
padding: 38px 8px 38px 8px;
}#footer {
position: fixed;
bottom: 0;
width: 100%;
}#foot {
background-color: #000000;
height: 30px;
}#header p {
margin: 0px;
padding: 5px;
color: #FFFFFF;
}#footer p {
margin: 0px;
padding: 5px;
text-align: center;
color: #FFFFFF;
}/* for IE6 */
html, body {
_height: 100%;
_overflow: hidden;
}#header, #footer {
_position: absolute;
_margin-right: 17px; /* IE6 scroll bar space */
}#head, #foot {
_margin-right: 17px; /* IE6 scroll bar space */
}#contents_wrap {
_width: 100%;
_height: 100%;
_overflow: auto;
}
この2つのHTMLと2つのCSSで4パターンのファイルを作ってみました。CSSの値等はなるべくどのファイルも同じように表示されるようにしてみました。
いかがでしょうか。Firefox12とIE8で確認したところ、どれも同じように表示されました(我が家の環境では)。少なくともぐちゃぐちゃでわけがわからないということはないと思います。さて、IE6非対応のファイルがどのように表示されるのかIE6があれば試してほしいのですが、もうIE6なんて断捨離執行済みの人のためにスクリーンショットを載せておきますネ。
あちゃー。1つめの画像が「ヘッダ・フッタ固定のhtml&cssサンプル(IE6非対応・ヘッダ上に配置)」で次が「ヘッダ・フッタ固定のhtml&cssサンプル(IE6非対応・ヘッダ下に配置)」なのですが、どちらもスクロールに対してヘッダ・フッタが固定されていないし、コンテンツ部分のスクロールバーが2重になっているし、ひどいもんです。「乱れ初めにし我ならなくに」って感じ(?)ですかね。
div要素を入れ子にしなくてもできないかなーといろいろ試してみたのですが、今のところこれが精一杯です。でもIE6はもう対応しなくてもいいんじゃないかなって改めて思いましたー。
ここ最近いろいろと試しているEC-CUBE。2.13系のテンプレート作りにハマっています。2.12系の構築には「デザインテンプレート・シンプルバージョン(2.11系・無料)」を元に作りこむことができたのですが、さすがに2.13系ではうまく動いてくれないので、2.13系のデフォルトテンプレートを使って構築することにしました。
さて、今まで気づかなかったデフォルトテンプレートの気になる部分。今回はそれを直してみようと思います。
お気づきでしょうか。トップ画面から現在のカゴの中に移動すると、全体のデザインがずれてしまうのです。最初はCSSのバグかなと思ったのですが、よく見るとスクロールバーの表示・非表示で画面中心が移動しているのが原因みたい。
スクロールバーが表示されない高さのときもバーの領域を確保しておくことで、この現象を回避できそうです。さっそく、common.cssに以下の記述を追加してみました。
html {
overflow-y: scroll;
}
さてさて、
これで、気色悪い動きがなくなりましたー!!
最近ふたたびEC-CUBEをいじっています。ただ、テンプレートのことや運用の都合で2.12系を使い続けていて、まだ2.13系には手を出していないのですが…。ソースコードをチラ見したところ2.13系のほうが好きなんですけどね。
さて、商品名ってどうしてもある程度長いものになる傾向があって、それはそれで一向に構わないのですが、何とかしたいナと思うことがあります。たとえば、
このように「よく一緒に購入されている商品」や「最近チェックした商品」など、リストを横に並べるタイプのプラグイン。
商品名が長くなると文字列が折り返されるので、商品名の長さにばらつきがあると販売価格の表示が上下してちょっと美しくない。これを何とかしたかったのです。そんなわけで探したのが「EC-CUBEの小技:長すぎる商品名を…で省略する方法」。もうそのまんまです。ここには、
まず、情報参照元がこちら
Smarty研究(2)マルチバイト文字に対応した truncate 修飾子を作る
こちらの情報どおりに
modifier.mb_truncate.php ファイルを作り
/data/module/Smarty/libs/pluginsにアップロードするだけ。
使用するときは以下のように。
例として商品名を省略します。
<!--{$arrProduct.name|mb_truncate:18:"..."}-->
これで、日本語18文字目より後の文字は「...」で省略されます。
と書かれています。
引用の中のハイパーリンク「Smarty研究(2)マルチバイト文字に対応した truncate 修飾子を作る」を見てみました。
truncate は、文字列を指定の文字数までで切ってくれます。切った後につける文字列も指定できるので、
たとえば
$smarty->assign('string', 'abcdefghijklmnopqrstuvwxyz');
として
{$string|truncate:5:"..."}
などとすれば、文字列は 5 つめで切り捨てられ
abcde...
と表示されます。
しかしこの修飾子、文字列判定にはバイト数を使用しており、マルチバイト文字列で使用すると文字化けを起こしてしまう可能性があるのです。
なんだよちくしょー、と Smarty のプラグインディレクトリの中の「modifier.truncate.php」を開いてみたら、単に文字数取得に使われている関数が「strlen」、文字列切り出しの関数に「substr」を利用しているだけの事です。
となれば、ここをマルチバイト対応にすればよいのではないか?
てことで作った修飾子がこちらです。
function smarty_modifier_mb_truncate($string, $length = 80, $etc = '...') {
if ($length == 0) {return '';}
if (mb_strlen($string) > $length) {
return mb_substr($string, 0, $length).$etc;
} else {
return $string;
}
}文字数を取得する部分には「mb_strlen」を、文字列切り出しには「mb_substr」を利用しています。
日本語には必要ないと思われる第4、第5引数はバッサリカットして見た目もスッキリ。
これを「modifier.mb_truncate.php」という名前で保存し、「smarty/libs/plugins」の中に放り込めば、テンプレート内で
{$string|mb_truncate:5:"..."}
このように使用できます。
ということで、マルチバイトに対応してくれています。まさに理想的。恩恵を受けているだけではアレなので、PHPファイルにしてzip圧縮したものを置いておきますネ。
ところで、このファイルを入れる場所ですが、今までの記事を見ると/data/module/Smarty/libs/pluginsと書かれています。今まで考えたことなかったのですが、この機会にEC-CUBEの構造を調べてみました。
で、これらを読むと、「Smarty」に入れるよりも「smarty_extends」のほうがよりふさわしいのかなと思って、smarty_extendsに入れてみます。
商品名等を表示している部分、
<p><a href="<!--{$smarty.const.P_DETAIL_URLPATH}--><!--{$arrCheckItems[cnt].product_id}-->"><!--{$arrCheckItems[cnt].name}--></a></p>
を
<p><a href="<!--{$smarty.const.P_DETAIL_URLPATH}--><!--{$arrCheckItems[cnt].product_id}-->"><!--{$arrCheckItems[cnt].name|mb_truncate:8:"..."}--></a></p>
に変更することで、このようにすっきりと表示されましたー。やったー!!
2週間くらい前に変更したWordPress自作テーマ。今回のテーマに使った配色をカラーパレットにしてみました。
左から順に、
です。
この他にも、bodyの基本背景色として#FFFFFFなどいろいろと設定はしているのですが、7色に限定するなら上記のコードになるかな、って思います。
さて、この色設定に関して参考にしたのが、初音ミクのカラーパレット。
左から順に、
となっています。
もちろんこの色は、実際に使われている画像から抽出されたものなので間違っているわけではないのですが、このまま使ってしまうと全体的にちょっと緑がキツい感じ。なので薄い黄色(#FFFF99)を入れてみました。
初音ミクってよく「緑髪」なんて言われますが、緑色か水色かどっちだ? ということで意見が分かれるみたい。でも、いわゆる緑ということは考えられなくて、個人的には水色に近い気がします。波長で表現するなら500nmくらいかな。本当に緑色と青色の中間。
実際に分析してみると、R:G:Bが1:2:2くらいで、ウェブセーフカラーで最も近いのは#66CCCC (102,204,204)あたりのようです。実際にはグラデーションがかかっていたり、使われる面積によって感じ方が変わったりして、何色かわからないですケド。
●←#66CCCCってこんな色。
しかし、テーマにはあえて#66CCCCを使わず、広い面積(ヘッダー等)には#99CCCC、狭い面積(A要素の文字)には#00CCCCにして、周囲の色とのバランスを取りました。ヘッダーに#66CCCCだと、彩度が高くて。