tabimoba.net

とあるエンジニアの雑記帳

MODx Evolutionのエレメントをファイル出力する

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;
                }
        }
}