baserCMS4系において、sqlite利用時に以下の事象が発生します。mysql利用時は発生しません。
- ゴミ箱にひとつでもコンテンツが存在する状態でコンテンツを追加すると、コンテンツツリー構造に重複番号が追加され不整合が発生する
- コンテンツを削除した場合に、lft, rghtの両方に重複番号が追加され、かつ欠番が発生しコンテンツツリー構造に不整合が発生する
- コンテンツを複数個まとめて(例:フォルダ+下位コンテンツ)削除した場合に、コンテンツツリー構造に不整合が発生する
上記が具体的にどういった影響が出るかというと、主に以下の症状に繋がります。
- A. コンテンツのURLが、本来あるべきURLにならず間違ったURLとして保存されている
- コンテンツのURLが正しくないことで、公開側のパンくずリストが正しく表示されない
- B. コンテンツのレイアウトテンプレートが正しく適用されない=レイアウトが正しく適用されない
- コンテンツのレイアウトテンプレートに、親フォルダの設定が適用されない
- C. コンテンツの並び替えを行う際にエラーが起こることがある
baserCMSプロジェクト側にissue発行済みです。
baserproject/basercms https://github.com/baserproject/basercms/issues/2734
この問題に対して、sqlite利用時にコンテンツデータを修復できるツールを作成してあります。
想定している対象者
- baserCMSでウェブサイトを制作をしている方
- PHPer
修復ツール
- ContentsRepair: https://github.com/ecatchup/ContentsRepair
- sqlite利用時に、コンテンツ管理のツリー構造で並べ替えがうまくいかなくなった場合に、ツリー構造の修復を試みるためのbaserCMS4系専用のプラグインです。
- 管理側 admin-second, admin-third 両対応
- README に記載のあるようにシステム管理グループのユーザのみがツール画面利用可
- sqlite利用時に、コンテンツ管理のツリー構造で並べ替えがうまくいかなくなった場合に、ツリー構造の修復を試みるためのbaserCMS4系専用のプラグインです。
コンテンツデータ修復管理が提供する機能
- コンテンツデータの整合性をチェックする
- 管理側ユーティリティ → ツリー構造をチェックする と同機能
- コンテンツデータの整合性を修復する
- 不整合となっているコンテンツデータに対して修復を試みる
- コンテンツを削除した際に、ゴミ箱に入る動作を無効化する
- ゴミ箱に入れる一次削除(論理削除)が、物理削除になる
- baserの基本動作として、削除操作で「ゴミ箱に入ります」案内が出ますがそのまま削除となります
- ※本機能は無効化できるようREADMEに手順を記載してあります
baserCMSでは、コンテンツデータの並び順管理にCakePHPのTreeBehaviorを利用しています。
修復内容はTreeBehaviorが持つリカバリー機構を用いてます。
https://book.cakephp.org/2.0/ja/core-libraries/behaviors/tree.html#id8
コンテンツデータの整合性修復
baserCMSコアが持つユーティリティ内ツリー構造リセットと異なるのは、こちらは実行画面に記載のあるようにリセットを実行した場合、階層構造はリセットされます。
具体的には、フォルダの中に入っていたコンテンツが外に出され、階層構造ではなくなりクリーンな状態に修正することができます。
一方修復ツールでは、階層構造は可能な限り以前のままとなる仕組みとなっています。
ただし、コンテンツの並び順は既に破損状態にあるため順序の保証は不可能です。
また、修復ツールではコアのツリー構造リセットと異なり、現存するデータをもとに修復にトライするため実行負荷が高く、環境に依っては実行中にタイムアウトする等の動作が起こりやすいです。
よって、修復ツールでタイムアウトが起こり実行完了できない場合は、リセットを用いるというように使い分けると良いでしょう。
実行前に、コンテンツ一覧画面のスクリーンショットを撮っておくなどしてご利用ください。
コンテンツを削除した際のゴミ箱に入る動作を無効化
ゴミ箱機能を無効化するのは、SQLite+SoftDeleteBehavior の組み合わせでの挙動に問題があるため、ゴミ箱機能で利用しているSoftDeleteを無効化することで、コンテンツデータの不整合発生を防止できるようにしてあります。
baserの基本動作として、削除操作で「ゴミ箱に入ります」案内が出ますが、こちらの機能は無効化できないためゴミ箱には入らずそのまま削除となります。
本機能は無効化できるようREADMEに手順を記載してあります。