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

2014年04月26日 正午の月齢:26.7  月名:二十七日月  潮汐:中潮 月齢:26.7[二十七日月] 潮汐:中潮 | 3年前 | 旧暦:2014年03月27日 | 大安
In EC-CUBE | EC-CUBE 長すぎる文字列の省略を実装してみた。 はコメントを受け付けていません。

この記事を読むのに必要な時間の目安: 5分ぐらい

この記事は2年以上前のものです。情報が古い場合があります。

最近ふたたび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>

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

関係あるかも知れない記事

前の記事・次の記事

前の記事
<<
次の記事
>>

コメントはありません

ごめんなさい、コメントフォームは閉鎖しています。