Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Service/Template/Rebuild.php
<?php

namespace XF\Service\Template;

class
Rebuild extends \XF\Service\AbstractService
{
   
/**
     * @var \XF\Tree
     */
   
protected $styleTree;

    protected function
setupStyleTree()
    {
        if (
$this->styleTree)
        {
            return;
        }

       
/** @var \XF\Repository\Style $repo */
       
$repo = $this->app->em()->getRepository('XF:Style');
       
$this->styleTree = $repo->getStyleTree(false);
    }

    public function
rebuildFullTemplateMap()
    {
       
$this->setupStyleTree();

       
$templatesGrouped = [];
       
$templateRes = $this->db()->query("
            SELECT template_id, type, title, style_id
            FROM xf_template
        "
);
        while (
$template = $templateRes->fetch())
        {
           
$templatesGrouped[$template['style_id']][$template['type']][$template['title']] = $template['template_id'];
        }

       
$this->db()->beginTransaction();
       
$this->db()->delete('xf_template_map', null); // not using emptyTable for transaction safety
       
$this->_rebuildTemplateMap(0, [], $templatesGrouped);
       
$this->db()->commit();
    }

    public function
rebuildTemplateMapForTitle($type, $title)
    {
       
$this->setupStyleTree();

       
$templatesGrouped = [];
       
$templateRes = $this->db()->query("
            SELECT template_id, type, title, style_id
            FROM xf_template
            WHERE type = ? AND title = ?
        "
, [$type, $title]);
        while (
$template = $templateRes->fetch())
        {
           
$templatesGrouped[$template['style_id']][$template['type']][$template['title']] = $template['template_id'];
        }

       
$this->db()->beginTransaction();
       
$this->db()->delete('xf_template_map', 'type = ? AND title = ?', [$type, $title]);
       
$this->_rebuildTemplateMap(0, [], $templatesGrouped);
       
$this->db()->commit();
    }

    protected function
_rebuildTemplateMap($id, array $map, array $templateList)
    {
        if (isset(
$templateList[$id]))
        {
            foreach (
$templateList[$id] AS $type => $templates)
            {
                foreach (
$templates AS $title => $templateId)
                {
                   
$map[$type][$title] = $templateId;
                }
            }
        }

       
$sql = [];
        foreach (
$map AS $type => $templates)
        {
            foreach (
$templates AS $title => $templateId)
            {
               
$sql[] = [
                   
'type' => $type,
                   
'title' => $title,
                   
'style_id' => $id,
                   
'template_id' => $templateId
               
];
            }
        }
        if (
$sql)
        {
           
$this->db()->insertBulk('xf_template_map', $sql);
        }

        foreach (
$this->styleTree->childIds($id) AS $childId)
        {
           
$this->_rebuildTemplateMap($childId, $map, $templateList);
        }
    }
}