Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/croogo/croogo/FileManager/src/Event/BaseStorageHandler.php
<?php

namespace Croogo\FileManager\Event;

use
Cake\Core\App;
use
Cake\Log\LogTrait;
use
Cake\ORM\TableRegistry;
use
Cake\Utility\Hash;
use
DOMDocument;
use
Exception;
use
InvalidArgumentException;

abstract class
BaseStorageHandler
{

    use
LogTrait;

    protected
$_storage = null;

   
/**
     * Instance config
     */
   
protected $_config = [];

   
/**
     * Constructor
     */
   
public function __construct($config = [])
    {
       
$name = get_class($this);
       
$config = Hash::merge([
           
'alias' => $name,
           
'className' => $name,
        ],
$config);
       
$this->_config = $config;
        list(
$plugin, $storage) = pluginSplit(App::shortName($config['alias'], 'Event', 'StorageHandler'));
       
$this->_storage = $storage;

        try {
           
$this->Attachments = TableRegistry::get('Croogo/FileManager.Attachments');
        } catch (
Exception $e) {
           
$this->log(App::shortName(get_class($this), 'Event', 'StorageHandler') . ': ' . $e->getMessage(), LOG_CRIT);
        }
    }

    abstract protected function
_parentAsset($attachment);

    protected function
_check($event)
    {
        if (empty(
$event->getData('record')['adapter'])) {
            return
false;
        }
       
$return = $this->_storage == $event->getData('record')['adapter'];

        return
$return;
    }

    public function
storage()
    {
        return
$this->_storage;
    }

   
/**
     * Parse <img> tag and retrieves the value of the 'src' attribute
     */
   
protected function _pathFromHtml($html)
    {
        if (!
$html) {
            return;
        }
       
$doc = new DOMDocument();
       
$doc->loadHTML($html);
       
$imgTags = $doc->getElementsByTagName('img');
        if (
$imgTags->length == 0) {
            return;
        }

        return
$imgTags->item(0)->getAttribute('src');
    }

   
/**
     * TODO: refactor this out and use Imagine in the future
     */
   
protected function __getImageInfo($path)
    {
        if (!
file_exists($path)) {
            return [];
        }

       
$fp = finfo_open(FILEINFO_MIME_TYPE);
       
$mimeType = finfo_file($fp, $path);

        switch (
$mimeType) {
            case
'image/jpeg':
            case
'image/jpg':
            case
'image/png':
            case
'image/gif':
               
$size = getimagesize($path);
                list(
$width, $height) = $size;
                break;
            default:
               
$width = $height = null;
                break;
        }

        return
compact('width', 'height', 'mimeType');
    }

   
/**
     * Registers a resized asset into the database
     *
     * Triggered by AssetsImageHelper::resize()
     */
   
public function onResizeImage($Event)
    {
        if (!
$this->_check($Event)) {
            return
true;
        }
        if (!
$Event->getData('record')) {
            return
true;
        }

       
$src = $this->_pathFromHtml($Event->getData('record')['result']);

        if (!
$src) {
            return
false;
        }

        try {
           
$base = $Event->getSubject()->getRequest()->getAttribute('base');
           
$filename = rtrim(WWW_ROOT, '/') . preg_replace(
               
'/^' . preg_quote($base, '/') . '/',
               
'',
               
$src
           
);
           
$attachment = $this->Attachments->createFromFile($filename);
            if (
is_string($attachment)) {
                return
false;
            }
        } catch (
InvalidArgumentException $e) {
           
$this->log(get_class($this) . ': ' . $e->getMessage());
            throw
$e;
        }

        return
$this->_createAsset($attachment);
    }

   
/**
     * Create AssetsAsset record from $attachment when necessary
     */
   
protected function _createAsset($attachment)
    {
       
$hash = $attachment->hash;
       
$path = $attachment->import_path;
       
$Assets = TableRegistry::get('Croogo/FileManager.Assets');
       
$existing = $Assets->find()
            ->
where([
               
'OR' => [
                   
$Assets->aliasField('hash') => $hash,
                   
$Assets->aliasField('path') => $path,
                ],
            ])
            ->
count();
        if (
$existing > 0) {
            return
false;
        }

       
$parent = $this->_parentAsset($attachment);
        if (!
$parent) {
            return
false;
        }

       
$asset = $Assets->newEntity([
           
'parent_asset_id' => $parent->id,
           
'model' => $parent->model,
           
'foreign_key' => $parent->foreign_key,
           
'adapter' => $parent->adapter,
           
'path' => $path,
           
'hash' => $hash,
        ]);

        return
$Assets->save($asset);
    }
}