concrete5 でトピックをインポートするxmlで、47都道府県を一括登録

concrete5(ホームページ作成・管理ソフトウェア。CMS)では、トピック(情報を分類するタグのようなもの。WordPressのカスタムタクソノミーみたいなもの。)を作成できます。

もちろん、管理画面からトピックを作成して登録できるのですが、トピックの数が多い場合は、一個一個登録するのは骨が折れますね。なので、xmlデータからインポートする方法を紹介します。

## 登録したいデータ
登録したいデータは、日本の都道府県です。全部で47個なので、一個一個登録すると少し大変です。

あらかじめxmlデータを作成してインポートするようにすれば、

* 一個一個登録しなくても良い
* 登録漏れ・二重登録などのミスを防ぐ
* 一回xmlを作っておけば、使いまわしできる

といったメリットがあります。

## concrete5でインポートする
concrete5本体のソースコードを調べることで、xmlからインポートできることが分かります。
concrete5(ver.8.2.1)のソースコードを読んでいくと、concrete/src/Tree/Type/Topic.php の Topic クラスで、トピックを処理することが分かりました。

class Topic extends Tree

となっていたので、Tree クラスを継承しています。Tree クラスは、concrete/src/Tree/Tree.php にあります。
Tree クラスには、

    public static function import(SimpleXMLElement $sx)
    {
        $type = TreeType::getByHandle((string) $sx['type']);
        $class = $type->getTreeTypeClass();
        $tree = call_user_func_array([$class, 'importDetails'], [$sx]);
        $parent = $tree->getRootTreeNodeObject();
        $parent->importChildren($sx);
    }

というメソッドがあるので、これを使えば良さそうですね。

##　xmlの形式を調査する
では、xmlの形式は、どうなっているのでしょうか。こちらも、concrete5のソースコードを調べれば分かります。

concrete5をインストールするとき、【サンプルコンテンツを入れる】【サンプルコンテンツ無し】という選択ができます。【サンプルコンテンツを入れる】を選択すると、トピックがいくつか登録されます。サンプルコンテンツの情報は、concrete/config/install/packages/elemental_full/content.xml にあります。
そこでは、

    <tree type="topic" name="Blog Entries">
        <category name="Reviews">
            <topic name="Gadgets"/>
            <topic name="Movies"/>
            <topic name="Books"/>
            <topic name="Music"/>
        </category>
        <topic name="Projects"/>
        <topic name="Sports"/>
        <topic name="Humor"/>
    </tree>

のように定義されていました。なので、これを参考にして、都道府県を登録するxmlデータを作りました。

    <tree type="topic" name="Prefecture">
        <category name="Hokkaido Tohoku" default="1">
            <topic name="Hokkaido"/>
            <topic name="Aomori"/>
            <topic name="Iwate"/>
            <topic name="Miyagi"/>
            <topic name="Akita"/>
            <topic name="Yamagata"/>
            <topic name="Fukushima"/>
        </category>
        <category name="Kanto" default="1">
            <topic name="Ibaraki"/>
            <topic name="Tochigi"/>
            <topic name="Gunma"/>
            <topic name="Saitama"/>
            <topic name="Chiba"/>
            <topic name="Tokyo"/>
            <topic name="Kanagawa"/>
        </category>
        <category name="Chubu" default="1">
            <topic name="Niigata"/>
            <topic name="Toyama"/>
            <topic name="Ishikawa"/>
            <topic name="Fukui"/>
            <topic name="Yamanashi"/>
            <topic name="Nagano"/>
            <topic name="Gifu"/>
            <topic name="Shizuoka"/>
            <topic name="Aichi"/>
        </category>
        <category name="Kinki" default="1">
            <topic name="Mie"/>
            <topic name="Shiga"/>
            <topic name="Kyoto"/>
            <topic name="Osaka"/>
            <topic name="Hyogo"/>
            <topic name="Nara"/>
            <topic name="Wakayama"/>
        </category>
        <category name="Chugoku" default="1">
            <topic name="Tottori"/>
            <topic name="Shimane"/>
            <topic name="Okayama"/>
            <topic name="Hiroshima"/>
            <topic name="Yamaguchi"/>
        </category>
        <category name="Shikoku" default="1">
            <topic name="Tokushima"/>
            <topic name="Kagawa"/>
            <topic name="Ehime"/>
            <topic name="Kochi"/>
        </category>
        <category name="Kyushu Okinawa" default="1">
            <topic name="Fukuoka"/>
            <topic name="Saga"/>
            <topic name="Nagasaki"/>
            <topic name="Kumamoto"/>
            <topic name="Oita"/>
            <topic name="Miyazaki"/>
            <topic name="Kagoshima"/>
            <topic name="Okinawa"/>
        </category>
    </tree>

全体のコードは、[github](https://github.com/ounziw/ounziw_japan_prefecture/blob/master/controller.php) でご覧いただけます。

## パッケージで公開する
元々この機能は、自社サービス「[マイ見積](https://my-mitsu.com/)」のパートナー会社の一覧を都道府県表示するために作成しました。
ホームページで都道府県での分類が必要になるケースは結構あるでしょうから、[公式サイトにパッケージ登録](https://www.concrete5.org/marketplace/addons/rescueworks-japan-prefecture/)しました。ライセンスはMITです。MITライセンスに従う限り、誰でも無償で利用できます。

サンプルサイトとして[全国の鉄道](https://www.rescuework.jp/railway)を作成しています。

## 追記　多言語対応について
concrete5 の機能を利用して、多言語対応を行っております。インポートするデータのxmlには英語(ローマ字)でデータを記載していますが、対訳データを用意することにより、多言語対応を行っております。
標準では、英語と日本語に対応していますが、ご自身で翻訳すれば、その他の言語にも対応します。