[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. Напишите первый комментарий
*Комментарий будет опубликован после проверки модератором

Похожие статьи

Генератор настроек MIGX

Документация на русском по MODX MIGX

pdoPage и getImageList - Постраничная навигация MIGX

Подсказки по работе и заготовки для MiniShop2

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

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

Генерация YML для выгрузки в маркет

Примеры работы с API MODX

Примеры выборки where, optionFilters, innerJoin

pThumb - ресайз изображений. Примеры использования.

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

Примеры использования

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

Добавить в письмо контактную информацию

Вывести getImageList только если он не пустой

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

Оформление и настройка easyComm. Комментарии и отзывы на сайте.

Поиск на сайте с пакетом SimpleSearch

Подсчет и вывод количества потомков ресурса в MODX

Простая и симпатичная галерея fancybox

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

Вывод tv-параметров в формате -

Отредактировать письмо о заказе - добавить ТВ поле, или что-то еще

Quip для MODX. Более рабочий вариант

Сниппет для вывода размера и расширения файла

pdoResources Заготовки для работы

Простой аудио-плеер HTML5

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

Слайдер Slick slider в контенте ресурса

Как контролировать кэш CSS и скриптов

Изменить цену на товар в зависимости от количества при добавлении в корзину minishop2

Подключить MODX в стороннем PHP файле

Простейшая авторизация

Как создать ресурс процессором $modx->runProcessor('resource/create', $props)

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

Массово обновить ТВ, или другое поле через базу

Сообщение о том, что сайт использует Cookie

Создать свою страницу в админке

Изменить формат номера заказа

Получить grandparent. Вывести родитель родителя

Симпатичный список файлов, загружаемых к ресурсу через MIGX

Установить шаблон по-умолчанию для новых, создаваемых ресурсов

Вывести все доступные плейсхолдеры

Отредактировать шаблон письма

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

Добавить скрипт перед тегом body

Общая сумма по каждому товару в корзине Minishop2

Создать раздел с паролем на сайте MODX

Что делать если ее приходит почта администратору

Фильтрация по TV параметрам в msProducts

Дата на русском

FontAwesome - часто используемые иконки для шаблонов MODX

Создать пакет с пользовательской таблицей

Загрузка сниппета после загрузки страницы через AjaxSnippet

Заготовки для работы

Курсы валют с cbr.ru на PHP

getResources заготовки

Обязательный чекбокс при оформлении заказа

Обработка остатков заказа в miniShop2

Соответствие названия классов с названиями таблиц в MySQL

Разбить вывод pdoResources на несколько колонок (блоков)

Баннеры с использованием BannerY

Обновить alias (псевдоним) у всех ресурсов

CSS для постраничной навигации pdoPage

Вывести время загрузки (формирования) страницы

Расширить таблицу site_content (объект modResource) за 5 минут

Счетчик посещений и скачиваний для сортировки ресурсов

Вырезать кавычки — фильтр-сниппет MODX

Бесплатная доставка от 5000 рублей в MiniShop2

Динамическое поле emailSubject в FormIt

Скрыть информацию о том, что сайт работает на MODX

Отсортировать ресурсы по количеству комментариев Quip MODx

Изменить цену на товар, если в корзине лежит товар из особой категории minishop2

Создать редирект через autoRedirector API

Cортировать по списку id в pdoResources и pdoTools

Ответ для сервиса moneta.ru

Вывести 404 ошибку по настройке TV MODX

Email сделать не обязательным полем

Как разместить исходный код сниппета на сайте, в документации

Ускорить установку MODX revo до пары кликов

Постраничная навигация — набор параметров и CSS PdoPage

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

Не работает подгрузка товаров ajax mfilter2 на мобильном

Сделать поле размер обязательным

Настройка стилей для комментариев Tickets

Подключить текстовой редактор к доп. полям ресурса

Динамическая замена шаблона ресурса - плагин

Кастомный чанк для AdminPanel

Разместить корзину внутри блока с оформлением заказа

Плагин для формирования замороженных URL с редиректом

xPDO Выборка из одной таблицы с зацепкой значения из другой

Приветственный экран / заглушка на сайт

Вложенные условия в xPDO MODX

Вывести список всех родителей в ТВ поле ресурса

Как получить данные пользователя сразу после авторизации через API

Вывести список всех емэйлов miniShop2

Если getParentIds не работает в плагине

Контролировать кэширование файлов CSS и JS MiniShop2

Не приходят / не отправляются письма - в чем причина?

Кэширование в MODX: использование $modx->cacheManager

Наш сайт использует куки, нажмите «ОК» если вы не против
OK