Плагин при изменении любого модуля, плагина или сниппета, сохраняет в каталог на диске (assets/cache).
Сохраняются файлы:
/assets/cache/modules/<name>.txt - модули
/assets/cache/plugins/<name>.txt - плагины
/assets/cache/snippets/<name>.txt - сниппеты
/assets/cache/events.txt - список событий
/assets/cache/plugins_priority.txt - приоритет вызова плагинов
После чего удобнее стало сравнивать локальную копию сайта и рабочую.
$e = &$modx->Event;
$id = intval($e->params['id']);
$tbl_categories = $modx->getFullTableName("categories");
$pp = array(
"OnModFormSave" => array(
"tbl" => $modx->getFullTableName("site_modules"),
"field" => "name, description, modulecode, properties, {$tbl_categories}.category as category_name",
"folder" => "modules",
),
"OnPluginFormSave" => array(
"tbl" => $modx->getFullTableName("site_plugins"),
"field" => "name, description, plugincode, properties, {$tbl_categories}.category as category_name",
"folder" => "plugins",
),
"OnSnipFormSave" => array(
"tbl" => $modx->getFullTableName("site_snippets"),
"field" => "name, description, snippet, properties, {$tbl_categories}.category as category_name",
"folder" => "snippets",
),
);
switch ($e->name) {
case "OnModFormSave":
case "OnPluginFormSave":
case "OnSnipFormSave":
$p = $pp[$e->name];
$ds = $modx->db->query("SELECT {$p['field']} FROM {$p['tbl']} LEFT JOIN {$tbl_categories} ON {$p['tbl']}.category={$tbl_categories}.id WHERE {$p['tbl']}.id='{$id}'");
if ($row = $modx->db->getRow($ds)) {
//
$alias = strtolower($modx->stripAlias(str_replace(array(":", ",", "/", "\\", " "), " ", $row["name"])));
//
if ($e->name=="OnPluginFormSave") {
$spe = $modx->getFullTableName("site_plugin_events");
$se = $modx->getFullTableName("system_eventnames");
$ds2 = $modx->db->query("SELECT name FROM {$spe} JOIN {$se} ON {$se}.id = {$spe}.evtid WHERE pluginid='{$id}' ORDER BY name");
$row["events"] = array();
while ($row2 = $modx->db->getRow($ds2)) {
$row["events"][] = $row2["name"];
}
$row["events"] = implode("\n", $row["events"]);
}
//
$file = MODX_BASE_PATH."assets/cache/{$p['folder']}/{$alias}.txt";
$out = "";
foreach ($row as $k=>$v) $out .= "== ".trim($k)." ==\r\n".trim($v)."\r\n\r\n";
file_put_contents($file, trim($out));
@chmod($file, 0664);
}
break;
case "OnSiteRefresh":
$spe = $modx->getFullTableName("site_plugin_events");
$se = $modx->getFullTableName("system_eventnames");
$sp = $modx->getFullTableName("site_plugins");
foreach ($pp as $k=>$p) {
$ds = $modx->db->query("SELECT {$p['field']} FROM {$p['tbl']} LEFT JOIN {$tbl_categories} ON {$p['tbl']}.category={$tbl_categories}.id");
while ($row = $modx->db->getRow($ds)) {
//
$alias = strtolower($modx->stripAlias(str_replace(array(":", ",", "/", "\\", " "), " ", $row["name"])));
//
if ($p["folder"]=="plugins") {
$ds2 = $modx->db->query("SELECT {$se}.name FROM {$p['tbl']} JOIN {$spe} ON {$spe}.pluginid = {$p['tbl']}.id JOIN {$se} ON {$se}.id = {$spe}.evtid WHERE {$p['tbl']}.name='{$row['name']}' ORDER BY {$se}.name");
$row["events"] = array();
while ($row2 = $modx->db->getRow($ds2)) {
$row["events"][] = $row2["name"];
}
$row["events"] = implode("\n", $row["events"]);
}
//
$file = MODX_BASE_PATH."assets/cache/{$p['folder']}/{$alias}.txt";
$out = "";
foreach ($row as $k=>$v) $out .= "== ".trim($k)." ==\r\n".trim($v)."\r\n\r\n";
file_put_contents($file, trim($out));
@chmod($file, 0664);
}
}
$services = array(
"Parser Service Events",
"Manager Access Events",
"Web Access Service Events",
"Cache Service Events",
"Template Service Events",
"User Defined Events"
);
$data = array();
$ds = $modx->db->query("SELECT * FROM {$se} ORDER BY service DESC, groupname, name");
while ($row = $modx->db->getRow($ds)) {
if (empty($row['groupname'])) $row['groupname'] = $services[$row['service']-1];
$data[$row['groupname']][$row['name']] = 1;
}
$out = "";
foreach ($data as $k=>$v) {
$out .= "== ".trim($k)." ==\r\n".trim(implode("\r\n", array_keys($v)))."\r\n\r\n";
}
$file = MODX_BASE_PATH."assets/cache/events.txt";
file_put_contents($file, trim($out));
@chmod($file, 0664);
$data = array();
$ds = $modx->db->query("SELECT sysevt.name as evtname, plugs.name FROM {$se} sysevt INNER JOIN {$spe} pe ON pe.evtid = sysevt.id INNER JOIN {$sp} plugs ON plugs.id = pe.pluginid ORDER BY sysevt.name, pe.priority");
while ($row = $modx->db->getRow($ds)) {
$data[$row['evtname']][$row['name']] = 1;
}
$out = "";
foreach ($data as $k=>$v) {
$out .= "== ".trim($k)." ==\r\n".trim(implode("\r\n", array_keys($v)))."\r\n\r\n";
}
$file = MODX_BASE_PATH."assets/cache/plugins_priority.txt";
file_put_contents($file, trim($out));
@chmod($file, 0664);
break;
}
Вешать надо на события: OnModFormSave, OnPluginFormSave, OnSiteRefresh, OnSnipFormSave.