Скрипт выборки шаблонов для проверки
Перевожу очередной сайт на смарти и меняю соответственно код всех шаблонов. А шаблонов 17 штук (наследство). Процесс был рутинный и что-то я засомневался, а вдруг где какой шаблон не так прописался и что надо бы проверить. А как проверить? Логично — открыть по одному документу каждого шаблона во фронте и посмотреть нет ли ошибок и вообще корректно ли открывается. Но документов много и по каждому идти выискивать документы по каждому шаблону не удобно. Вот написал скрипт, который делает такую выборку и сразу формирует ссылки на эти документы, по одному на каждый шаблон. Остается только кликнуть по разу каждую ссылку и посмотреть как что отображается.
<?php
ini_set('display_errors', 1);
$q = $modx->newQuery('modTemplate', array(
"resource.published" => 1,
"resource.deleted" => 0,
));
$q->innerJoin('modResource', 'resource', "resource.template = modTemplate.id");
$alias = $q->getAlias();
$q->select(array(
"{$alias}.id",
"uri",
"templatename as name",
"pagetitle",
"resource.id as resource_id",
"count(*) as `total`",
));
$q->groupby("{$alias}.id");
// print $modx->getCount('modTemplate', $q);
$base_url = $modx->getOption('base_url');
foreach($modx->getIterator('modTemplate', $q) as $object){
print "<br /><a href='{$base_url}{$object->uri}' target='_blank'>{$object->name} ({$object->id}) / {$object->pagetitle} ({$object->resource_id}) / {$object->total} документов</a>";
}
К слову, если кому интересно, можете доработать скрипт так, чтобы по каждому УРЛу выполнялся CURL-запрос и проверял код ответа (200 должен быть) и был ли получен какой контент. Будет такой автоматизированный тест на наличие технических ошибок в шаблонах.
UDP: немного доработал скрипт, теперь он еще и выводит количество документов по каждому шаблону. Небольшая ревизия чтобы не было кучи шаблонов по одному документу. Получается типа вот такого: руFirstPage / Главная (1) / 5 документов ruEventPage / Голоса влюблённых женщин (1113) / 803 документов ruEvents / Выставки (13) / 4 документов ruHystoryPage / История (14) / 1 документов
UPD: Полезная модификация скрипта: перегоняем MODX-шаблоны в Smarty, то есть код шаблона записываем в smarty-файл, а в сам MODX-шаблон прописываем вызов сниппета.
<?php
ini_set('display_errors', 1);
print '<pre>';
$old_category = 15;
$new_category = 0;
$trash_category = 16;
$q = $modx->newQuery('modTemplate', array(
"category" => $old_category,
));
$alias = $q->getAlias();
$q->select(array(
"{$alias}.*",
));
$base_url = $modx->getOption('base_url');
$path = MODX_CORE_PATH . 'components/modxsite/templates/skinname/v1/tpl/';
$resource = $modx->newObject("modResource");
foreach($modx->getIterator('modTemplate', $q) as $object){
if(!$tpl_file = $resource->cleanAlias($object->templatename)){
print "Error. Can not create filename";
return;
continue;
}
$tpl_file .= '.tpl';
$snippet = "[[!smarty?tpl=`tpl/{$tpl_file}`]]";
$abs_path = $path . $tpl_file;
if(!$fo = fopen($abs_path, 'w+')){
print "Error. Can not open file {$abs_path}";
return;
}
if(fwrite($fo, $object->content)){
$copy_template = $modx->newObject("modTemplate");
$copy_template->fromArray(
$object->toArray()
);
$copy_template->fromArray(array(
"category" => $trash_category,
"templatename" => "Copy of " . $object->templatename,
));
$object->fromArray(array(
"content" => $snippet,
"category" => $new_category,
));
if($object->save()){
$copy_template->save();
}
}
else{
print "Error. Can not write file";
fclose($fo);
return;
}
fclose($fo);
print "\n" . $object->templatename;
// break;
}