PowerCMS Xで階層構造を持ったモデルをリレーションする際の注意点
はじめに:PowerCMS Xについて
こんにちは。エンジニアの高山です。
マイロプスはCMS案件の経験が豊富で、国産CMSであるPowerCMS Xも取り扱っております。
よく似た名前のCMSで「X」のつかない「PowerCMS」というものもありますが、関係がありつつも別物です。紛らわしいので以降の文では、XのつかないPowerCMSの方を「無印PowerCMS」と呼ぶ事にします。
PowerCMS Xは、無印PowerCMSのベンダーであるアルファサード株式会社が無印PowerCMS構築のノウハウを活かして開発したCMSで、無印PowerCMSやMovableTypeといった、<mt:hogehoge>のようないわゆる「mtタグ」を用いるCMSの構築ノウハウがかなり応用できます。
ただ、PowerCMS Xは公式サイトにもあるようにゼロベースで設計・実装されたCMSであり、無印PowerCMSの後継や上位版ではありません。
似ているところがあるからこそ、多機能だからこそ、こうすればうまくいくはずという思い込みから意外なポイントで詰まってしまうことも...。
今回は、私がやらかした失敗の一つを紹介します。
「リレーション」編集表示のタイプは要注意
PowerCMS Xの便利な点として、モデル同士をリレーション機能によって自由自在に紐づけられる事、フォルダ構成のような階層構造を持ったモデルを簡単に作れる事などが挙げられます。
私がたくさん手戻りを発生させたのは、そんな階層構造を持ったモデルのリレーションに関係する操作の際でした。
※事実に基づきつつ、案件の詳細は特定できないよう若干フィクションを交えております。
問題発生時の状況
長年運営されてきた巨大サイトのリニューアル案件を担当していた時のことです。
私は旧サイトのコンテンツ流し込みのためのモデルを作成しました。方針として、取り急ぎ最低限の設定をし、後から調整しようと考えておりました。
そのため、リレーションのカラム編集画面の「タイプ」(ダイアログ、ドロップダウン、階層など)の精査は後回しにしていました。
しかし、この判断は甘かったと後で気付くことになります。
何が起きたか
例えば
2D
├RPG
├パズル
└格闘
3D
├RPG
└格闘
というような階層を持った「genre」というモデルがあるとします。
このgenreモデルは、また別の「game」というモデルのgenreカラムからリレーションされています。

旧サイトからのコンテンツ移行作業で大量のgameオブジェクトを流し込んだ時、その問題は発生しました。
「このgameオブジェクト、3D格闘のはずが2D格闘になってる!」
検証していくと、どうやら「2D/格闘」と「3D/格闘」のように、「親違いで同じ名前の子オブジェクトが存在するもの」においてズレが発生しているようでした。
試しに、その現象が起きているオブジェクトをエクスポートして、生成されたzipファイルを何も手を加えずにインポートしたところ、それだけでもズレが...。
何がいけなかった?
エクスポートされたcsvデータをよく確認したところ、genreカラムが「3D/格闘」ではなく「格闘」となっており、子の情報しか持っていませんでした。別の作業の際にきちんと親子関係を持ってエクスポートされたモデルも見た覚えがあったのに、一体なぜ...?
正しくエクスポートできるものと設定を比較したところ、どうやら編集画面の「タイプ」の設定が「階層」になっていないことが原因のようでした。
モデルごとの設定画面から、編集画面の「タイプ」を「階層」にしたら親の情報も持つようになり、正常にエクスポート/インポートができるようになりました。
皆様も、リレーションのカラムの編集画面「タイプ」は、初めから適切なものを設定しておきましょう...。
分かってしまえばなんてことはないのですが、エクスポートしてほぼそのままインポートしただけで壊れるなどとは想像できず、思いもよらぬ修正作業を発生させてしまいました...。
以上、PowerCMS X初心者がつまずきがちなポイントでした。
ありがとうございました。
お仕事のご相談、採用についてなど、お気軽にお問い合わせください。