Для того чтобы более-менее полноценно использовать 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)
Не писать ответ