Не так давно я писал про довольно хитрое расширение системных таблиц. На самом деле это действительно очень удобная и перспективная технология, но с ней есть одна весьма серьезная сложность — переносимость. Кто знаком со сборкой ShopModxBox и пакетом Vapor, знает — Vapor упаковывает только пользовательскую часть сайта, сам MODX он не упаковывает. То есть получается такой установочный пакет (это действительно установочный пакет и может устанавливаться прям в админке MODX-а). То есть если мы хотим сделать клон сайта из такого пакета, то мы ставим чистый MODX Revolution и или в админке через систему пакетов, или по ssh вызываем скрипт vapor/import.php и устанавливаем этот пакет.
Так в чем же проблема? Проблема в том, что если мы на исходном сайте изменили системную табличку (изменили сами поля или новые добавили), то эти изменения не накатятся просто так на новый сайт (ведь там уже эти таблицы имеются). Надо как-то изменить исходные таблицы на новом сайте.
Решение оказалось весьма не сложным. В vapor.php имеется массив системных классов. Вот эти классы будут упаковываться на исходном сайте и распаковываться на целевом сайте как объекты. При этом таблицы для них не будут удаляться/создаваться (то есть создаваться будут, если таблицы нет, но во-первых, нам надо еще и исходную удалить, а во-вторых, созданная таблица не будет иметь кастомных колонок). Нам надо именно удалить таблицы, и затем создать новые. Так вот, почитав код, я выяснил, что достаточно просто исключить (закомментировать) имя класса из массива системных классов, и тогда его таблица будет упакована как обычная таблица (для нее будет создан чистый SQL с конструкциями DROP IF EXISTS и CREATE). Вот тогда на целевом сайте будет создана новая таблица со всеми изменениями.
P.S. Зачем мне все это нужно было, вы узнаете чуть позже :) (немного интриги))))
Кстати, теперь при установке NewsModxBox сессия пользователя не слетает, так как удаление и создание с наполнением таблицы modx_users занимает минимальное время. Надо будет и в ShopModxBox так сделать.