[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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

getResources заготовки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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