Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/DevelopmentOutput/AbstractHandler.php
<?php

namespace XF\DevelopmentOutput;

use
XF\DevelopmentOutput;
use
XF\Mvc\Entity\Entity;

use function
array_key_exists;

abstract class
AbstractHandler
{
   
/**
     * @var DevelopmentOutput
     */
   
protected $developmentOutput;
    protected
$shortName;

    public function
__construct(DevelopmentOutput $developmentOutput, $shortName)
    {
       
$this->developmentOutput = $developmentOutput;
       
$this->shortName = $shortName;
    }

    abstract protected function
getTypeDir();
   
    abstract public function
export(Entity $entity);
    abstract public function
import($name, $addOnId, $contents, array $metadata, array $options = []);

   
/**
     * @param $name
     * @param $addOnId
     * @param $json
     * @param array $options
     * @return null|Entity
     */
   
protected function getEntityForImport($name, $addOnId, $json, array $options)
    {
       
$entity = \XF::em()->find($this->shortName, $name);
        if (!
$entity)
        {
           
$entity = \XF::em()->create($this->shortName);
        }

       
$entity = $this->prepareEntityForImport($entity, $options);

        return
$entity;
    }

    protected function
prepareEntityForImport(Entity $entity, array $options)
    {
        if (!empty(
$options['import']))
        {
           
$entity->getBehavior('XF:DevOutputWritable')->setOption('write_dev_output', false);
        }
        return
$entity;
    }

    public function
hasNameChange(Entity $entity)
    {
        if (
$entity->isUpdate())
        {
            if (
$entity->isChanged('addon_id'))
            {
                return
true;
            }
            if (
$this->getFileName($entity, true) !== $this->getFileName($entity, false))
            {
                return
true;
            }
        }

        return
false;
    }

    public function
delete(Entity $entity, $new = true)
    {
        if (!
$this->isRelevant($entity, $new))
        {
            return
false;
        }
       
       
$fileName = $this->getFileName($entity, $new);
       
$addOnId = $new ? $entity->getValue('addon_id') : $entity->getExistingValue('addon_id');
        return
$this->developmentOutput->deleteFile($this->getTypeDir(), $addOnId, $fileName);
    }

    protected function
isRelevant(Entity $entity, $new = true)
    {
       
$addOnId = $new ? $entity->getValue('addon_id') : $entity->getExistingValue('addon_id');
       
$entityClass = \XF::stringToClass($this->shortName, '%s\Entity\%s');

        if (!
$addOnId || $this->developmentOutput->isAddOnSkipped($addOnId))
        {
            return
false;
        }

        return (
$entity instanceof $entityClass);
    }
   
    protected function
getFileName(Entity $entity, $new = true)
    {
       
$id = $new ? $entity->getEntityId() : $entity->getExistingEntityId();
        return
"{$id}.json";
    }

    protected function
pullEntityKeys(Entity $entity, array $keys)
    {
       
$json = [];
        foreach (
$keys AS $key)
        {
           
$json[$key] = $entity->isValidColumn($key) ? $entity->getValue($key) : $entity->get($key);
        }

        return
$json;
    }

    protected function
setEntityKeys(Entity $entity, array $keys, array $values)
    {
       
$json = [];
        foreach (
$keys AS $key)
        {
            if (
array_key_exists($key, $values))
            {
               
$entity->$key = $values[$key];
            }
        }

        return
$json;
    }
}