[MODX] Сделать все элементы статичными для Git и IDE

Для того чтобы более-менее полноценно использовать Github нужно максимум всего перевести в файлы. Для основных элементов в MODX есть встроенная система перевода в статичный вид. Можно отметить элемент галочкой и он будет статичным. Однако надо как-то это процесс автоматизировать. Ну и перевести разом все существующие элементы в статичный вид.

Переводить в статику мы будем:

  • Чанки
  • Шаблоны
  • Сниппеты
  • Плагины

Обазательно сделайте бэкап базы данных перед всеми будущими манипуляциями

Вот что мы сделаем:

  1. Создадим файлик set_static.php для первичного разового перевода в статичный вид всех элементов
  2. Создадим плагин setStatic, который будет сробатывать, когда мы будем сохранять элементы в будущем
  3. Выпьем кефира и скушаем банан (это по желанию)

Вы можете изменить название папок, вот список папок по-умолчанию:

  • _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)

  1. Напишите первый комментарий
*Комментарий будет опубликован после проверки модератором

[MODx] Генератор настроек MIGX

[MODx, MIGx] Документация на русском по MIGX

[MODX] Импорт и экспорт в MiniShop2. Реализация 1

[MODx] minishop2 tips

[JS] Маска для ввода телефона +7(___)___-__-__

[MODx, miniShop2] Генерация YML для выгрузки в маркет

Как включить HTTPS (SSL) в MODX - Подробная инструкция

[MODx] Подсказки по API

[OpenCart] Вывести на главную все категории с картинками

[MODx] Сайт на обслуживании (выключить сайт)

[MODx, MIGX] Примеры использования

Универсальная форма обратной связи — feedBackForm

[PHP, JSON] Пример перевода с помощью Yandex Translate API

[MODx, Gallery] Галерея. Вывести обложки альбомов и фотографии

Расширение свойств товаров minishop2

[Opencart] Вернуть английский язык, если вы его удалили

[OpenCart] Вывести модуль напрямую через контроллер

[MODX, MIGX] Вывести getImageList только если он не пустой

[MODx, Quip] Более рабочий вариант.

[MODX, MIGX] Тип поля "Список ресурсов" (resourcelist) с ограничением по родителю (parents)

Красивое адаптивное меню под pdoMenu

[MODx] Вывод tv-параметров в формате [название TV] - [значение TV]

[MODx] Создать источник файлов

[MODX] Вывести список всех опций MiniShop2

[PHP] Простое логирование

Все записи