カナによる五十音順にソートを行う -EC-CUBE-

"EC-CUBE"には価格順や新着順という数値や日付でのソートが可能だが、商品名でのソートを行いたいのでカスタマイズすることにした。

商品名に漢字があると読み方によって順番が変わるので、あらかじめ商品名とは別にソート用にカナを登録するカラムを用意して五十音順にソートするための要素を加えた。

この状態でカナが登録されているカラムでSQLのソート処理を行うが思うようにソートされない。

調べてみると、データベースの設定にも左右されることがわかった。

PostgreSQLの場合、データベースの変数のうち「lc_collate」と「lc_ctype」が"C"でないと正常にソートされないらしい。

「lc_collate」は文字列の並び換え順を、「lc_ctype」は文字の分類を設定する値でまさに今回の目的のための設定項目だ。

これはPostgreSQLのドキュメントにも明記されている。


システムがロケールをサポートしていないように動作させたい場合は、特別なロケールのC(標準ISO )、もしくはPOSIXを使用してください。

[引用] PostgreSQL 8.2.0文書



デフォルトでは"US.utf-8"になっているので"C"に変えたいのだが、DBインストール後に"initdb"コマンドを通す必要があるとのこと。
また、「lc_collate」と「lc_ctype」は"initdb"の実行後は変更できなくなるらしい。

そういえば"initdb"を行った記憶が無いが、パッケージからインストールしたときはインストールの過程で自動的に行ってくれるらしい。

ちなみにこの対応は"CPI"など低コストだがroot権限が無いサーバの場合は対応できず、"ラピッドサイト"のようにVPSホスティングやroot権限が与えられているサーバでのみ対応できる。


"initdb"はデータベースの構成情報を生成するのでrootでは無く、データベースを稼働させるユーザで行わなければならない。
PostgreSQLの初期インストール時のユーザは"postgres"なのでデータベースを止めた上でこのユーザに切り替える。


service postgresql start
su - postgres



次に、postgresの情報があるディレクトリ"data"を消すことで、"initdb"が再受付できる状態になる。
("data"を消す前にバックアップ(ダンプ)を取ってリストアできるようにしておく。)


cd /var/lib/pgsql/
rm -rf data



最後に今回のメインとも言える"initdb"で設定値を指定する。


initdb -E UNICODE --no-locale -D /var/lib/pgsql/data



念のためデータベースの管理ツール"phpPgAdmin"で設定値を見ると、"C"になっているのがわかる。

 lc_collateとlc_ctype


一度データベースの構成ファイルを削除して作り直しているのでダンプファイルをリストアして情報を復旧させ、ブラウザで五十音になっているか確認する。

尚、下のサンプルは"EC-CUBE"本来の商品を登録して購入してもらうECサイトの使い方ではなく、地域ごとに情報をもたせた情報サイトにカスタマイズしている。

  情報の五十音順


ここで注意点はカナを登録するときに半角と全角で挙動が変わるので、データベースに登録する際に強制的に半角か全角にエンコードして統一する必要がある。

この点は"EC-CUBE"のソース内にデータベース登録前に「lfConvertParam」という関数により半角カナを全角カナに統一化しているので流用すると問題ないだろう。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 1

驚いた

この記事へのコメント

この記事へのトラックバック