Firefoxで、ウェブフォントの表示と「Webページが指定したフォントを優先」しないことを両立させる。

2014年05月24日 18時00分 正午の月齢:25.2  月名:二十六夜  潮汐:若潮 月齢:25.2[二十六夜] 潮汐:若潮
(最終更新日:2019年09月02日)
11年前に投稿 | ウェブ・IT関係 | コメントはありません

3分ぐらいで読めます。

普段からFirefoxを使っているわけですが、「Webページが指定したフォントを優先する」のチェックは外しています。

firefoxfont

これで、ウェブサイトから押し付けられたフォントを使うことなく、長年親しんでいるMS Pゴシックを使えているわけですが、最近問題が出てきました。詳しい内容は「WordPress3.8をどうしても使えない理由」を見てください。とにかく、見出し程度ならともかく本文にまで「デザイナーの俺様が指定する美しいフォントを使って閲覧しやがれ。」っていう傲慢な態度が気に入らない。

とまぁ、そんなこんなでMS Pゴシックでの閲覧に統一していたわけですが、だんだんウェブフォント(「Webフォント」って書いたほうがGoogleの検索件数は多いんですけど、なんか混ぜて書くのがイヤなのですよ。)の使用率が高まってきてあちこちで使われてきたので、無視できないようになってきました。それでも見た目のコントロールだけのウェブフォントだったらガン無視できていたのですが、そういうわけにもいかないのが「WordPress3.8をどうしても使えない理由」に挙げたWordPress。ま、自分は3.6.1を使い続けるとしても、お客さんに「ウェブフォントってうざいですよね。バージョンアップなんてしなくていいですよ。」とは言えない。そんなわけで否応なしにWordPress3.8以上の管理画面とのふれあいの場が増殖していきます。そのつど「Webページが指定したフォントを優先する」のチェックを入れて作業する(メニューのアイコンくらい無視できるのですが、ビジュアルリッチエディタはアイコンが見えないとどうしようもない)のもどうかと思います。

「なんとかWordPressのウェブフォントアイコンと他のウェブサイトの本文をMS Pゴシックで表示されることを両立できないかな」ということで、試行錯誤の上ほぼ両立できるようになったので、ちょっと紹介しておきますネ。

Firefoxのオプションから設定したのではうまくいかないので、プロファイルフォルダにCSSファイルを作ります。場所がわからなければ「プロファイルフォルダの場所(Firefox / Thunderbird)」を参考に。今回は「"%USERPROFILE%\Application Data\Mozilla\Firefox\Profiles\"」を「ファイル名を指定して実行」欄に入力して、直接場所にたどり着きました。その中の「*******.default」フォルダを開きます。chromeフォルダがある場合はそれを開きます。ない場合はchromeフォルダを作ります(Firefox 4.0 からは、chromeフォルダが無くなった)。

その中に「userContent.css」を作ってUTF-8で保存(もともとあれば開いて追記)。CSSの中には、

body {font-family:"MS Pゴシック" !important;}

と記入します。

さて、Firefoxを再起動してみると…

wordpresswebfonticon

特殊な開き方をするウィンドウや変に埋め込まれたブロック等はMS Pゴシックにはならないものの、とりあえずほとんどのサイトの文章はMS Pゴシックで表示されるようになりました。さらにWordPressのアイコンも表示されています。これでようやく自分自身のサイトもWordPress3.8以上を心置きなく使えそうです。

EC-CUBE 0円商品のPayPal決済を回避する。

2014年05月23日 18時00分 正午の月齢:24.2  月名:二十五日月  潮汐:長潮 月齢:24.2[二十五日月] 潮汐:長潮
(最終更新日:2019年09月02日)
11年前に投稿 | ウェブ・IT関係 | コメントはありません

1分ぐらいで読めます。

引き続きのEC-CUBE&PayPalネタ。

ま、記事にするほどでもないのですが、内部をゴニョゴニョといじって0円商品を登録したり、1円以上の価格の商品だけどポイントを利用して支払額が0円になったりしたときにPayPal決済を選択していたらちょっとマズいなー、と思ったのですが、自己解決しました。

billsetting

「管理画面」→「基本情報管理」→「支払方法設定」→「支払方法登録・編集」と進んで、「利用条件(円)」を「1円~」にすれば、PayPal決済を選べなくなるんですね。

payform

とまぁ、こんな感じで0円だとPayPalが使えなくなりますー。よくできてるなぁ。

EC-CUBE ダウンロード商品で通常モードのPayPal決済に対応させる。

2014年05月22日 18時00分 正午の月齢:23.2  月名:真夜中の月  潮汐:小潮 月齢:23.2[真夜中の月] 潮汐:小潮
(最終更新日:2019年09月02日)
11年前に投稿 | ウェブ・IT関係 | コメントはありません

6分ぐらいで読めます。

月々の使用料無料でクレジットカード決済を導入できるのがPayPal決済のメリット。PayPal決済を導入するには「PayPalビジネスアカウント」の取得が必要ですが、これも無料で手続きできます。で、決済方法にもいろいろな種類があってまた迷うわけですが、ペイパルアカウントを持っていない一見のお客さんにもクレジットカードを使ってもらおうと思うと、「ウェブペイメントスタンダード」しかないようです。(「エクスプレスチェックアウト」は画面遷移が少なくて魅力的なのですが、お客さんがペイパルアカウントを持っているか、決済時にアカウントを作るかしなければならないんです。)

このウェブペイメントスタンダードは、「自サイトで購入手続き→PayPal決済画面に遷移→自サイトに戻る」という流れになります。この流れを実現するために必要なモジュールが「ペイパルエクスプレス チェックアウト決済モジュール」。エクスプレスとついていますが、スタンダードもこのモジュールで対応できます。

早速テストしてみて最初にハマッたのが、パーミッションの設定。public_html/user_data内のpaypal_cancel.phppaypal_recv.php666になっているとうまく動かないようなので644にしてやります。ただこの症状、必ず発生するってわけでもなくて、3サイトで試したところ1箇所だけで発生しました。いずれにしても導入時には確認しておいたほうがいいかも知れません。

特に問題がなければ、以上で設定は終了。クレジットカードに対応したショッピングサイトの完成です。(ホントは決済完了のステイタスをEC-CUBEに連携するとか、いろいろと課題はあるんですケド。)

…さて。

ここからが本題なのですが、通常発送の商品のみを扱うのだったら問題ないのですが、ダウンロード商品を扱う場合に大変なことがおこります。

paypal-link

通常なら、この画面がしばらく表示された後に「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アカウントを使わずにクレジット決済をしようとするときに表示される入力フォームの項目すべてを手で埋めなければなりません。ちなみに改造前のファイルの場合はこんな感じで、会員登録したときの氏名・住所等が最初から入っています。

paypal-reg

これをお客様サービスの低下と捉えるかどうかは微妙ですが、今のところどちらかを犠牲にしなければならない状態です。もっと核の部分をいじれば解決するんでしょうけど。

今回のファイル修正は、「ダウンロード商品を扱いたい」かつ「ペイパルウェブペイメントスタンダードを導入したい」場合に限ってのことなので、ダウンロード商品を扱わないのであればまったく関係のないお話なのでした。

 

CSSでヘッダ・フッタを固定してみる。IE6にも対応(いまさら?)。

2014年05月17日 18時00分 正午の月齢:18.2  月名:寝待月  潮汐:中潮 月齢:18.2[寝待月] 潮汐:中潮
(最終更新日:2019年09月02日)
11年前に投稿 | ウェブ・IT関係 | コメントはありません

11分ぐらいで読めます。

最近の自分の中でのウェブデザインのワンパターン化(高さ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&amp;cssサンプル</p>
</div>

<div id="footer">
<p>フッタ固定のhtml&amp;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&amp;cssサンプル</p>
</div>
</div>

<div id="footer">
<div id="foot">
<p>フッタ固定のhtml&amp;cssサンプル</p>
</div>
</div>

</body>

これがヘッダを下に持ってきて、SEOに効くかもしれない版。次はヘッダをコンテンツの上に置いた普通っぽい版。

<body>

<div id="header">
<div id="head">
<p>ヘッダ固定のhtml&amp;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&amp;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なんて断捨離執行済みの人のためにスクリーンショットを載せておきますネ。

non-ie6 non-ie6_seo

あちゃー。1つめの画像が「ヘッダ・フッタ固定のhtml&cssサンプル(IE6非対応・ヘッダ上に配置)」で次が「ヘッダ・フッタ固定のhtml&cssサンプル(IE6非対応・ヘッダ下に配置)」なのですが、どちらもスクロールに対してヘッダ・フッタが固定されていないし、コンテンツ部分のスクロールバーが2重になっているし、ひどいもんです。「乱れ初めにし我ならなくに」って感じ(?)ですかね。

div要素を入れ子にしなくてもできないかなーといろいろ試してみたのですが、今のところこれが精一杯です。でもIE6はもう対応しなくてもいいんじゃないかなって改めて思いましたー。

EC-CUBE デフォルトテンプレートのセンタリングのズレを直す。

2014年05月06日 18時00分 正午の月齢:7.2  月名:弓張月(上弦)  潮汐:小潮 月齢:7.2[弓張月(上弦)] 潮汐:小潮
(最終更新日:2019年09月02日)
11年前に投稿 | ウェブ・IT関係 | コメントはありません

1分ぐらいで読めます。

ここ最近いろいろと試しているEC-CUBE。2.13系のテンプレート作りにハマっています。2.12系の構築には「デザインテンプレート・シンプルバージョン(2.11系・無料)」を元に作りこむことができたのですが、さすがに2.13系ではうまく動いてくれないので、2.13系のデフォルトテンプレートを使って構築することにしました。

さて、今まで気づかなかったデフォルトテンプレートの気になる部分。今回はそれを直してみようと思います。

デフォルトテンプレート修正前

お気づきでしょうか。トップ画面から現在のカゴの中に移動すると、全体のデザインがずれてしまうのです。最初はCSSのバグかなと思ったのですが、よく見るとスクロールバーの表示・非表示で画面中心が移動しているのが原因みたい。

スクロールバーが表示されない高さのときもバーの領域を確保しておくことで、この現象を回避できそうです。さっそく、common.cssに以下の記述を追加してみました。

html {
overflow-y: scroll;
}

さてさて、

デフォルトテンプレート・修正後

これで、気色悪い動きがなくなりましたー!!

EC-CUBE 長すぎる文字列の省略を実装してみた。

2014年04月26日 18時00分 正午の月齢:26.7  月名:二十七日月  潮汐:中潮 月齢:26.7[二十七日月] 潮汐:中潮
(最終更新日:2019年09月02日)
11年前に投稿 | ウェブ・IT関係 | コメントはありません

5分ぐらいで読めます。

最近ふたたびEC-CUBEをいじっています。ただ、テンプレートのことや運用の都合で2.12系を使い続けていて、まだ2.13系には手を出していないのですが…。ソースコードをチラ見したところ2.13系のほうが好きなんですけどね。

さて、商品名ってどうしてもある程度長いものになる傾向があって、それはそれで一向に構わないのですが、何とかしたいナと思うことがあります。たとえば、

truncate-off

このように「よく一緒に購入されている商品」「最近チェックした商品」など、リストを横に並べるタイプのプラグイン。

商品名が長くなると文字列が折り返されるので、商品名の長さにばらつきがあると販売価格の表示が上下してちょっと美しくない。これを何とかしたかったのです。そんなわけで探したのが「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に入れてみます。

truncate-on

商品名等を表示している部分、

<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>

に変更することで、このようにすっきりと表示されましたー。やったー!!

Translate »