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

2014年04月26日 18時00分 正午の月齢:26.7  月名:二十七日月  潮汐:中潮 月齢:26.7[二十七日月] 潮汐:中潮
(最終更新日:2019年09月02日)
10年前に投稿 | ウェブ・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>

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

古い記事・新しい記事

古い記事 [2014年03月20日]
新しい記事 [2014年05月06日]

コメントはありません

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

Translate »