Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Cli/Command/Designer/AbstractImportCommand.php
<?php

namespace XF\Cli\Command\Designer;

use
Symfony\Component\Console\Command\Command;
use
Symfony\Component\Console\Helper\ProgressBar;
use
Symfony\Component\Console\Input\InputArgument;
use
Symfony\Component\Console\Input\InputInterface;
use
Symfony\Component\Console\Output\OutputInterface;
use
XF\Cli\Command\StyleArchiveTrait;

use function
count;

abstract class
AbstractImportCommand extends Command
{
    use
RequiresDesignerModeTrait, StyleArchiveTrait;

   
// [command, name, entity, dir]
   
abstract protected function getContentTypeDetails();

    abstract protected function
getTitleIdMap($typeDir, $styleId);

    abstract public function
importData($typeDir, $fileName, $path, $content, \XF\Entity\Style $style, array $metadata);

    protected function
configure()
    {
       
$contentType = $this->getContentTypeDetails();

       
$this
           
->setName("xf-designer:import-$contentType[command]")
            ->
setDescription("Imports $contentType[name] from specified designer mode files")
            ->
addArgument(
               
'designer-mode',
               
InputArgument::REQUIRED,
               
'Designer mode ID'
           
);
    }

   
/**
     * @var \XF\Entity\Style
     */
   
protected $style;

    protected function
execute(InputInterface $input, OutputInterface $output)
    {
        return
$this->executeType($this->getContentTypeDetails(), $input, $output);
    }

    protected function
executeType(array $contentType, InputInterface $input, OutputInterface $output)
    {
       
$style = $this->getStyleByDesignerModeInput($input, $output);

       
$start = microtime(true);

       
$output->writeln("Importing $contentType[name]...");

       
$designerOutput = \XF::app()->designerOutput();
       
$typeMetadata = $designerOutput->getMetadata($contentType['dir'], $style->designer_mode);
       
$files = $designerOutput->getAvailableTypeFiles($contentType['dir'], $style->designer_mode);

       
$map = $this->getTitleIdMap($contentType['dir'], $style->style_id);

       
$printName = ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE);

        if (!
$printName)
        {
           
$progress = new ProgressBar($output, count($files));
           
$progress->start();
        }
        else
        {
           
$progress = null;
        }

        foreach (
$files AS $fileName => $path)
        {
            if (
$printName)
            {
               
$output->writeln("\t$fileName");
            }
            else
            {
               
$progress->advance();
            }

           
$metadata = $typeMetadata[$fileName] ?? [];
           
$content = file_get_contents($path);

           
$title = $this->importData($contentType['dir'], $fileName, $path, $content, $style, $metadata);

            unset(
$map[$title]);
        }

        if (!
$printName)
        {
           
$progress->finish();
           
$output->writeln("");
        }

       
$this->deleteRemaining($contentType['dir'], $map, $contentType['entity']);

        \
XF::triggerRunOnce();

       
$output->writeln(sprintf(ucfirst($contentType['name']) . " imported. (%.02fs)", microtime(true) - $start));

        return
0;
    }

    protected function
deleteRemaining($typeDir, array $map, $entity)
    {
        if (
$map)
        {
           
$old = \XF::em()->findByIds($entity, $map);
            foreach (
$old AS $entity)
            {
               
$entity->delete();
            }
        }
    }
}