MODx Evolutionは、CMSとしても、ライトなWebアプリケーションフレームワークとしても使い勝手が良いのですが、エレメントの管理に常に悩まされます。エレメント(テンプレート、テンプレート変数、チャンク、スニペット、プラグイン)は管理画面上から手軽に追加・編集可能な利点がある反面、DB上でコードが管理されているのでバージョン管理やコードの比較、バックアップがしづらい等、そのような問題がメンテ時の欠点として出てきます。(手軽さとメンテのしやすさはトレードオフの関係です)
そこで、コードを出力してファイルとして管理できるようにしました。ざっくりと書いた感じなので、調整が必要な場合もあるかも知れませんが、これによってメンテが少しでも楽になれば。。
コード
<?php
$dbname = 'DB名';
$dbhost = 'DBホスト(FQDN or IP)';
$dsn = 'mysql:dbname=' . $dbname . ';host=' . $dbhost;
$user = 'ユーザー名';
$password = 'パスワード';
$dbo = new PDO($dsn, $user, $password);
$dbo->query('set names UTF8');
$base_dir = dirname(__FILE__);
$prefix = 'modx_'; // MODxテーブルプレフィックス
$tables = [
'site_snippets',
'site_templates',
'site_tmplvars',
'site_modules',
'site_plugins',
'site_htmlsnippets',
];
foreach ($tables as $table) {
$sql = 'select * from ' . $prefix . $table . ';';
$my_dir = $base_dir . '/' . $table;
mkdir ($my_dir, 0755);
foreach ($dbo->query($sql)->fetchAll(PDO::FETCH_ASSOC) as $row) {
$tmp = $row;
unset($tmp['id']);
switch ($table) {
case 'site_snippets':
$filen_base = '/' . str_replace(' ', '_', $tmp['name']);
file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
file_put_contents($my_dir . $filen_base . '.php', $row['snippet']);
break;
case 'site_templates':
$filen_base = '/' . str_replace(' ', '_', $tmp['templatename']);
file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
file_put_contents($my_dir . $filen_base . '.html', $row['content']);
break;
case 'site_tmplvars':
$filen_base = '/' . str_replace(' ', '_', $tmp['name']);
file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
file_put_contents($my_dir . $filen_base . '.html', $row['elements']);
break;
case 'site_modules':
$filen_base = '/' . str_replace(' ', '_', $tmp['name']);
file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
file_put_contents($my_dir . $filen_base . '.php', $row['modulecode']);
break;
case 'site_plugins':
$filen_base = '/' . str_replace(' ', '_', $tmp['name']);
file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
file_put_contents($my_dir . $filen_base . '.php', $row['plugincode']);
break;
case 'site_htmlsnippets':
$filen_base = '/' . str_replace(' ', '_', $tmp['name']);
file_put_contents($my_dir . $filen_base . '.json', json_encode($tmp));
file_put_contents($my_dir . $filen_base . '.html', $row['snippet']);
break;
}
}
}