При перегенерации схемы таблица не изменяется
Была xml-схема с рабочей моделью и таблицами.
Затем меня чёрт дернул поменять названия пары полей, везде в коде всё изменил/поправил на новые названия, потом поправил схему.
Перегенерирую схему вот этим вот кодом:
И вот, блин, незадача — поля во вновь создаваемой таблице остаются со старыми названиями!
Что за фигня? Я удалял все файлы модели, чистил кэш, перепроверял xml-схему — вот всё как надо! Таблица нормально дропается, но потом создаётся со старыми названиями полей. Как быть? Что делать? Куда копать?
Затем меня чёрт дернул поменять названия пары полей, везде в коде всё изменил/поправил на новые названия, потом поправил схему.
Перегенерирую схему вот этим вот кодом:
<?php
define('MODX_API_MODE', true);
require_once dirname(dirname(dirname(dirname(__FILE__)))).'/index.php';
/*******************************************************/
$package = 'ms2discount'; // Class name for generation
$suffix = 'ms2discount_'; // Suffix of tables.
$prefix = $modx->config['table_prefix']; // table prefix
// Folders for schema and model
$Model = dirname(__FILE__).'/model/';
$Schema = dirname(__FILE__).'/model/schema/';
$xml = $Schema.$package.'.mysql.schema.xml';
// Remove old files
rrmdir($Model.$package .'/mysql');
//unlink($xml);
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
$modx->error->message = null;
$modx->loadClass('transport.modPackageBuilder', '', false, true);
$manager = $modx->getManager();
$generator = $manager->getGenerator();
$generator->parseSchema($xml, $Model);
$modx->addPackage($package, $Model);
$manager->removeObjectContainer('myClassObject');
$manager->createObjectContainer('myClassObject');
print "\nDone\n";
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object);
else unlink($dir."/".$object);
}
}
reset($objects);
rmdir($dir);
}
}(это код из генерации схемы из minishop2, т.е. рабочий)И вот, блин, незадача — поля во вновь создаваемой таблице остаются со старыми названиями!
Что за фигня? Я удалял все файлы модели, чистил кэш, перепроверял xml-схему — вот всё как надо! Таблица нормально дропается, но потом создаётся со старыми названиями полей. Как быть? Что делать? Куда копать?
Техническая поддержка MODX
Сайт лежит, тормозит или остался без разработчика?
Переезд с MODX 2 на 3, PHP 7 на 8, скорость и безопасность. Поддержка со сроками и ответственностью, а не совет в чате.
Подробнее
Реклама
Комментарии: 9
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Вась, помоги, пожалуйста. Чёт совсем у меня вариантов нету.
Проверь, может ты редактируешь ее не там, откуда она берется для генерации? Директория разработки на сервере не подмонтирована, или что-то такое.
В сгенерированных map-файлах всё прописано согласно схемы, все поля, типы, индексы. А вот сами таблицы генерируются по старому.
Пути верные, сервер — простой шаред, в котором монтировать ничего нельзя, так что — нет, это тоже отпадает (к тому же до этого проблем не было).
Вот сейчас полностью снёс папку с кэшем, очистил папку модели компонента, убрал из xml-схемы всё — оставил описание одной таблицы и 2х полей и перегенерировал.
В итоге — сгенерировались xpdo-файлы этого класса, в map-ах только нужные 2 поля, в таблице — все старые 10 полей, плять. Со всеми индексами и типами.
Да откуда он вообще берёт эти старые данные? Мистики и волшебства в таких вопросах не бывает. Но вот в каком направлении копать?
Дальше фантазии не хватает.
При выполнении
на выходе в методе parseSchema генерируются правильные map-файлы.
Затем, при выполнении
в этом методе есть вызов $xpdo->getFieldMeta(), а вот уже в нём набиваются мета-данные для создания таблицы. И вот там-то в массиве $this->map лежат старые мета-данные. Как они туда попадают — для меня ещё загадка.
В removeObjectContainer() ничего сверхъестественного нет, чтобы повлиять на такой исход событий. Сейчас порою addPackage(). Может там какая веселуха происходит.
В общем, у меня компонент был добавлен через addExtensionPackage() и из-за этого все мета-данные брались из кэша, только совершенно не понятно из какого — папка core/cache чистилась полностью.
В общем, сделал removeExtensionPackage() и теперь таблицы генерируются нормально
Вот еще один минус шаредов — не знаешь, как настроено.