Для того чтобы более-менее полноценно использовать Github нужно максимум всего перевести в файлы. Для основных элементов в MODX есть встроенная система перевода в статичный вид. Можно отметить элемент галочкой и он будет статичным. Однако надо как-то это процесс автоматизировать. Ну и перевести разом все существующие элементы в статичный вид.
Переводить в статику мы будем:
- Чанки
- Шаблоны
- Сниппеты
- Плагины
Обазательно сделайте бэкап базы данных перед всеми будущими манипуляциями
Вот что мы сделаем:
- Создадим файлик
set_static.phpдля первичного разового перевода в статичный вид всех элементов - Создадим плагин
setStatic, который будет сробатывать, когда мы будем сохранять элементы в будущем - Выпьем кефира и скушаем банан (это по желанию)
Вы можете изменить название папок, вот список папок по-умолчанию:
- _templates
- _plugins
- _snippets
- _chunks
set_static.php для первичного разового перевода в статичный вид всех элементов
echo "Закомментируйте первые строки в файле";
die;
// Подключаем MODX
define('MODX_API_MODE', true);
require $_SERVER['DOCUMENT_ROOT'].'/index.php';
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_WARN);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
define('FILESYSTEM_SOURCE_ID', 1); // id источника файлов Filesystem
define('NEW_DIR_PERMISSON', 0720); // Права на новые папки
// Функция для упрощения записи запросов к БД
function sQuery($query){
global $modx;
$statement = $modx->prepare($query);
if($statement->execute()){
$res = $statement->fetchAll(PDO::FETCH_ASSOC);
}else{
$res = array();
$error = $statement->errorInfo();
if(!empty($error[2])){
trigger_error($error[2], E_USER_ERROR);
return false;
}
}
return $res;
}
$static_elems = array(
'template' => array(
'table' => $modx->getOption('table_prefix').'site_templates',
'content_column' => 'content',
'name_column' => 'templatename',
'prepend' => '',
'static_folder_name' => '_templates',
'static_file_extention' => 'html',
),
'plugin' => array(
'table' => $modx->getOption('table_prefix').'site_plugins',
'content_column' => 'plugincode',
'name_column' => 'name',
'prepend' => "<?php".PHP_EOL,
'static_folder_name' => '_plugins',
'static_file_extention' => 'php',
),
'snippet' => array(
'table' => $modx->getOption('table_prefix').'site_snippets',
'content_column' => 'snippet',
'name_column' => 'name',
'prepend' => "<?php".PHP_EOL,
'static_folder_name' => '_snippets',
'static_file_extention' => 'php',
),
'chunk' => array(
'table' => $modx->getOption('table_prefix').'site_htmlsnippets',
'content_column' => 'snippet',
'name_column' => 'name',
'prepend' => '',
'static_folder_name' => '_chunks',
'static_file_extention' => 'html',
),
);
foreach($static_elems as $table){
$result = sQuery("SELECT id, ".$table['name_column'].", ".$table['content_column']." FROM ".$table['table']);
foreach($result as $row){
$dirname = $table['static_folder_name'];
$static_file_name = $dirname."/".$row[ $table['name_column'] ].".".$table['static_file_extention'];
if($row['static_file'] == $static_file_name && (int)$row['static']){
continue;
}
if(!file_exists($dirname)){
mkdir($dirname, NEW_DIR_PERMISSON, true);
}
file_put_contents($static_file_name, $table['prepend'].$row[ $table['content_column'] ].PHP_EOL);
sQuery("UPDATE ".$table['table']." SET static = 1, source = ".FILESYSTEM_SOURCE_ID.", static_file = '".$static_file_name."' WHERE id = ".$row['id']);
}
}
Плагин setStatic, который будет сробатывать, когда мы будем сохранять элементы в будущем
$action = array();
$elems = array(
'template' => array(
'table' => $modx->getOption('table_prefix').'site_templates',
'content_column' => 'content',
'name_column' => 'templatename',
'static_folder_name' => '_templates',
'static_file_extention' => 'html',
),
'plugin' => array(
'table' => $modx->getOption('table_prefix').'site_plugins',
'content_column' => 'plugincode',
'name_column' => 'name',
'static_folder_name' => '_plugins',
'static_file_extention' => 'php',
),
'snippet' => array(
'table' => $modx->getOption('table_prefix').'site_snippets',
'content_column' => 'snippet',
'name_column' => 'name',
'static_folder_name' => '_snippets',
'static_file_extention' => 'php',
),
'chunk' => array(
'table' => $modx->getOption('table_prefix').'site_htmlsnippets',
'content_column' => 'snippet',
'name_column' => 'name',
'static_folder_name' => '_chunks',
'static_file_extention' => 'html',
),
);
$eventName = $modx->event->name;
switch($eventName) {
case "OnChunkFormSave":
$action['id'] = $id;
$action['type'] = "chunk";
break;
case "OnPluginFormSave":
$action['id'] = $id;
$action['type'] = "plugin";
break;
case "OnSnipFormSave":
$action['id'] = $id;
$action['type'] = "snippet";
break;
case "OnTempFormSave":
$action['id'] = $id;
$action['type'] = "template";
break;
}
if(!empty($action['id'])){
$elem = $elems[ $action['type'] ];
$query = "SELECT id, ".$elem['name_column'].", ".$elem['content_column'].", static_file, static FROM ".$elem['table']." WHERE id = ".$action['id'];
$statement = $modx->prepare($query);
if($statement->execute()){
$res = $statement->fetchAll(PDO::FETCH_ASSOC);
if(!empty($res[0]['id'])){
$row = $res[0];
$dirname = $elem['static_folder_name'];
$static_file_name = $dirname."/".$row[ $elem['name_column'] ].".".$elem['static_file_extention'];
if($row['static_file'] != $static_file_name || !intval($row['static'])){
if(!file_exists(MODX_BASE_PATH.$dirname)){
mkdir(MODX_BASE_PATH.$dirname, 0720, true);
}
file_put_contents(MODX_BASE_PATH.$static_file_name, $row[ $elem['content_column'] ]);
$query = "UPDATE ".$elem['table']." SET static = 1, source = 1, static_file = '".$static_file_name."' WHERE id = ".$row['id'];
$statement = $modx->prepare($query);
$statement->execute();
}elseif(false){
}
}
}
}
Плагин нужно настроить на события:
- OnChunkFormSave
- OnPluginFormSave
- OnSnipFormSave
- OnTempFormSave
Нюанс (критика предлагаемого метода)
Стоит учесть важный момент — в базе данных остается код элемента, и вообще информация о существовании элемента по-прежнему хранится в базе данных. То есть, если вы на локальной машине создали новый сниппет, и просто перенесли файлик на сервер, то MODX на сервере ничего не будет знать о новом сниппете. Вам понадобится создать сниппет-пустышку на сервере. Чтобы в БД появилась запись о нем, а уже после этого скопировать файлик — тогда все ок, система его обработает корректно.
На этом все
Надеюсь, вам помогла эта заметка. Пишите свои идеи о вариантах решения подобной задачи:)
Комментарии (0)
Не писать ответ