ワイヤード・パンチ

元・大阪人が、岡山の山奥でも生きていけることを証明するためのブログ。

Osclassで都道府県を正しく並び替える方法。

現在、仕事のうえでOsclassというツールを使って、とあるマッチングサイトを作るという作業を行っています。

しかしこのOsclass、解説サイトがあまりに少なく、なおかつ公式ドキュメントも内容がスカスカのため、正直言ってかなり困っている状態です。

そのうえ、都道府県の一覧を取得できる関数はあるのですが、順番がむちゃくちゃに取得されてしまうので、正式な順番に並び替えるのも一苦労では済みません。

広告

そもそも都道府県の一覧を出すには?

while(osc_has_list_regions()) {
	osc_list_region_url();
	osc_list_region_name();
}

search.php、つまり検索結果の一覧ページにいるときに上記の関数を実行すれば、投稿が存在している都道府県の検索ページへのリンクおよび名前が取得できます。

しかし、実際にこの関数を使ってみると、なぜか並び順がバラバラです。

都道府県には「JIS X 0401」という規格が存在し、それどおりの並び順で表示されてほしいのです。

管理画面でなら並び替え方法がある。

osclassで地域(ロケーション)を北海道〜沖縄の順に並べ替える方法 【ICT】 – りむの医療系サイト制作な日々

上記のサイトによると、管理画面上であれば並び順を正しくできるとのこと。

詳しくは上記のサイトを見ていただくとして、ざっと手順を説明すると、phpmyadminでoc_t_regionという、都道府県が入ったテーブルをまず編集することになります。

それぞれの都道府県に、s_slugというスラッグを表す値があり、初めはその値がめちゃくちゃになっているので、スラッグを二桁の数字に名前を変えて、順番どおりにしていきます。

スラッグに関しては、Wordpressのスラッグと同じ意味でしょう。URLの一部としても使われます。

そして、スラッグを書き換えたあとは、oc-includes/osclass/model/Region.phpというコアファイルを編集します。

ソートの方法がs_name、つまり名前順になっている箇所を、s_slugに書き換えて完了、ということです。

公開画面上でも並び替える方法。

上記の記事は公開画面上でのこと。

osc_has_list_regionsは公開画面上で使う関数なので、これも並び替えを有効化させないといけません。

さっきのテーブルおよびコアファイルを書き換えるだけでは、公開画面上には反映されません。

よって、公開画面に影響しているコアファイルを書き換えることになります。

oc-includes/osclass/helpers

ますは上記パスのファイルを開きます。

次に、その中に下記の記述があります。

function osc_has_list_regions($country = '%%%%') {
	if ( !View::newInstance()->_exists('list_regions') ) {
		View::newInstance()->_exportVariableToView('list_regions', RegionStats::newInstance()->listRegions($country) );
	}
	$result = View::newInstance()->_next('list_regions');
	if (!$result) {
		View::newInstance()->_reset('list_regions');
	}
	return $result;
}

これを下記のように書き換えます。

function osc_has_list_regions($country = '%%%%') {
	if ( !View::newInstance()->_exists('list_regions') ) {
		$regions = RegionStats::newInstance()->listRegions($country);
		foreach ((array) $regions as $key => $value) {
			$sort[$key] = $value['region_slug'];
		}
		array_multisort($sort, SORT_ASC, $regions);
		View::newInstance()->_exportVariableToView('list_regions', $regions);
	}
	$result = View::newInstance()->_next('list_regions');
	if (!$result) {
		View::newInstance()->_reset('list_regions');
	}
	return $result;
}

これで、都道府県がスラッグ順、つまり番号順に並び替えたとおりに表示されるようになります。

どういう処理をしているかというと、いったん全都道府県を配列に格納して、スラッグでソートをかけています。

PHPの多次元連想配列のソート

詳しくは、上記のサイトなどが参考になるでしょう。

余談。Osclassはカスタマイズ性がひどすぎる…。

とりあえずここまでで、都道府県を番号順に並び替えるための処理を紹介してきましたが、正直言ってこれ、非推奨のやり方です。

まず、phpmyadminから直接テーブルの値を変更する必要があるということ。

ややこしいテーブル書き換えをさせないためにCMSが存在するというのに、これでは意味がありません。

そもそも都道府県なんて通常は、番号順で出てくるのが当たり前。

いくら都道府県のデータを初めから持っていたとしても、わざわざユーザに改造させないとそうならないのは、不便すぎます。

それ以上に大問題なのが、コアファイルを書き換える必要もあるということ。

Osclassの根幹に関わるファイルであり、本来ならばユーザが触るべきファイルではありません。

些細な変更で全体に影響を及ぼす場合があり、なおかつアップデートがあった際に、変更したものが戻ってしまうこともあります。

WordPressのfunctions.phpのように、Osclassにもいちおう同じくfunctions.phpがあり、本体を壊すことなく機能を追加したり変更することはできます。

もしかしたらさっきまでの内容もfunctions.phpで実現できたかもしれませんが、何しろ公式ドキュメントがあまりにも不親切で、なおかつ解説サイトもほとんどないので、探そうにも探せません。

コアファイルを頑張って読み解けば見つかる可能性もありますが、仕事のうえでそんな時間がかかること、とてもやっていられません。

このように、情報が少ないものを仕事で用いることは、あまりにも危険です。

今回のこと以外の機能を実装する際も、コアファイルと何度もにらめっこすることで、ようやく少しずつ進展していってはいますが、本当に割に合いません。

「phpがわかるならできる」とか「他の人がやってたものの急な引き継ぎだけど、おいしい仕事だと思うよ」とか、そんな言葉に乗せられて引き受けてしまった、今回のOsclassの仕事。

本当に早くやめたいです。二度と触りたくありません。

こんな得体の知れないものの仕事を引き受けてしまった自分の後悔もありますが、これを仕事で使おうとした上の判断もおかしい…。