Скрипт выборки шаблонов для проверки

Перевожу очередной сайт на смарти и меняю соответственно код всех шаблонов. А шаблонов 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;
}