Phalcon Framework 3.4.4

Exception: Файл /home/esk00474/public_html/public/files/original/publication/9.jpg не существует

/home/esk00474/public_html/app/modules/Image/Storage.php (357)
#0Image\Storage->checkOriginalExists(/home/esk00474/public_html/public/files/original/publication/9.jpg)
/home/esk00474/public_html/app/modules/Image/Storage.php (314)
<?php
 
namespace Image;
 
use Phalcon\Mvc\User\Component;
 
define('IMG_ROOT_REL_PATH', 'files');
define('DIR_SEP', '/');
define('IMG_ROOT_PATH', ROOT . DIR_SEP);
define('IMG_STORAGE_SERVER', '');
define('IMG_EXTENSION', 'jpg');
define('NOIMAGE', '/assets/admin/images/noimage.jpg');
 
define('IMG_DEBUG_MODE', true);
 
class Storage extends Component
{
 
    private static $STRATEGIES = [
        'w', // Масштабируем по ширине
        'wh', // Масштабируем по заданной ширине и высоте. Изображение подганяется в этот прямоугольник
        'a', // Центрируем и обрезаем изображение по заданной высоте и ширине таким образом, чтоб оно полностью заполнило пространство
    ];
    private $id = null;
    private $image_hash = null;
    private $type = null;
    private $strategy = 'w';
    private $width = 100;
    private $height = null;
    private $container = false;
    private $hash = false;
    private $attributes = [];
    private $exists = true;
    private $widthHeight = true;
    private $stretch = true;
 
    public function __construct(array $params = [], array $attributes = [])
    {
        $this->setIdFromParams($params);
        $this->attributes = $attributes;
 
        $this->type = (isset($params['type'])) ? $params['type'] : 'publication';
        $this->strategy = (isset($params['strategy'])) ? $params['strategy'] : 'w';
        $this->container = (isset($params['container'])) ? $params['container'] : false;
        $this->image_hash = (isset($params['image_hash'])) ? $params['image_hash'] : null;
        $this->hash = (isset($params['hash'])) ? $params['hash'] : false;
 
        $this->setDimensionsAttributes($params);
    }
 
    private function setDimensionsAttributes(array $params = [])
    {
        $this->width = (isset($params['width'])) ? $params['width'] : 100;
        $this->height = (isset($params['height'])) ? $params['height'] : null;
 
        $this->widthHeight = (isset($params['widthHeight'])) ? $params['widthHeight'] : true;
        $this->widthHeight = (isset($params['widthHeight']) && MOBILE_DEVICE) ? false : true;
 
        $this->stretch = (isset($params['stretch'])) ? $params['stretch'] : null;
    }
 
    private function setIdFromParams($params)
    {
        if (isset($params['id'])) {
            if (preg_match('/^\d+$/', $params['id'])) {
                $this->id = (int) $params['id'];
            } else {
                $this->id = $params['id'];
            }
        } else {
            if (IMG_DEBUG_MODE) {
                throw new \Exception("ID не определен");
            }
        }
    }
 
    /**
     * HTML-тег изображения, готовый к использованию
     * <img src="" alt="" />
     */
    public function imageHtml()
    {
        //Из заданных параметров и атрибутов составляем html-тэг
        $attributes = $this->attributesForImageHtml();
 
        // Получаем относительный адрес файла кешированного изображения
        $src = $this->cachedRelPath();
 
        if ($this->exists) {
            if ($this->hash) {
                $src .= '?' . microtime();
            }
        } else {
            $src = NOIMAGE;
            $attributes['width'] = $this->width;
            $attributes['height'] = $this->height;
        }
 
        $attr_src = 'src="' . $this->config->base_path . $src . '"';
        $result = '<img ' . $attr_src . $this->attributesResultForImageHtml($attributes) . '/>';
 
        if ($this->container) {
            $result = '<div class="img-container" style="width:' . $this->width . 'px; height:' . $this->height . 'px">' . $result . '</div>';
        }
 
        return $result;
    }
 
    private function attributesForImageHtml()
    {
        $attributes = $this->attributes;
        if ($this->widthHeight) {
            if ($this->stretch && in_array($this->strategy, ['wh', 'a'])) {
                $this->stretch = false;
            }
            if ($this->stretch) {
                if ($this->width) {
                    $attributes['width'] = $this->width;
                }
                if ($this->height) {
                    $attributes['height'] = $this->height;
                }
            } else {
                $widthHeight = $this->getImageWidthHeight();
                if ($widthHeight['width']) {
                    $attributes['width'] = $widthHeight['width'];
                }
                if ($widthHeight['height']) {
                    $attributes['height'] = $widthHeight['height'];
                }
            }
        }
        $attributes['alt'] = (isset($attributes['alt'])) ? htmlspecialchars($attributes['alt'], ENT_QUOTES) : '';
        return $attributes;
    }
 
    private function attributesResultForImageHtml($attributes)
    {
        $attributesHtmlArray = [];
        foreach ($attributes as $el => $val) {
            $attributesHtmlArray[] = $el . '="' . $val . '"';
        }
        $attributesHtml = implode(' ', $attributesHtmlArray);
        $attributesHtmlResult = ($attributesHtml) ? ' ' . $attributesHtml : '';
 
        return $attributesHtmlResult;
    }
 
    /**
     * Относительный адрес файла кешированного изображения
     * /img/preview/405102/405102_1_w_100.jpg
     */
    public function cachedRelPath()
    {
        // Рассчитываем по входящим параметрам относительный путь к кешированному файлу
        $cachedRelPath = $this->calculateCachedRelPath();
        // Совмещаем относительный путь с корневым, получаем абсолютный путь
        $cachedAbsPath = IMG_ROOT_PATH . $cachedRelPath;
        // Проверяем существование такого файла. если файл не существует:
        if (!file_exists($cachedAbsPath)) {
            // Генерируем кеш-файл по заданным параметрам
            $this->generateCachedImage();
        }
        return IMG_STORAGE_SERVER . $cachedRelPath;
 
    }
 
    public function cachedAbsPath()
    {
        return IMG_ROOT_PATH . $this->cachedRelPath();
 
    }
 
    /**
     * Относительный адрес файла оригинального изображения
     */
    public function originalRelPath()
    {
        return IMG_STORAGE_SERVER . $this->calculateOriginalRelPath();
 
    }
 
    /**
     * Абсолютный адрес файла оригинального изображения
     */
    public function originalAbsPath()
    {
        return $this->getOriginalAbsPath();
 
    }
 
    public function save($file)
    {   
        if (file_exists($file)) {
            return copy($file, $this->originalAbsPath());
        }
    }
 
    public function originalWidthHeight()
    {
        $imageSize = getimagesize($this->originalAbsPath());
        if (!empty($imageSize)) {
            return [
                'width'  => $imageSize[0],
                'height' => $imageSize[1]
            ];
        }
 
    }
 
    public function cachedFileSize()
    {
        $path = $this->cachedAbsPath();
        if (file_exists($path)) {
            return filesize($path);
        }
 
    }
 
    public function isExists()
    {
        if (file_exists($this->getOriginalAbsPath())) {
            return true;
        } else {
            return false;
        }
    }
 
    /**
     * Рассчитываем по входящим параметрам относительный путь к кешированному файлу
     * /img/preview/405/405102_1_w_100.jpg
     */
    private function calculateCachedRelPath()
    {
        $pathParts = [];
        $pathParts[] = IMG_ROOT_REL_PATH;
        $pathParts[] = 'cache';
        $pathParts[] = $this->type;
 
        if (is_int($this->id)) {
            $idPart = floor($this->id / 1000);
        } else {
            $idPart = $this->id;
        }
        //$pathParts[] = $idPart;
 
        $fileParts = [];
        $fileParts[] = $this->id;
        if ($this->image_hash) {
            $fileParts[] = $this->image_hash;
        }
        if (in_array($this->strategy, self::$STRATEGIES)) {
            $fileParts[] = $this->strategy;
        } else {
            if (IMG_DEBUG_MODE) {
                throw new \Exception("Параметр 'strategy' указан неверно");
            }
            return;
        }
        $fileParts[] = $this->width;
        if ($this->height) {
            $fileParts[] = $this->height;
        }
 
        // "img/preview/405"
        $path = implode(DIR_SEP, $pathParts);
        // "405102_1_w_100"
        $file = implode('_', $fileParts);
 
        return $path . DIR_SEP . $file . '.jpg';
 
    }
 
    /**
     * Рассчитываем по входящим параметрам относительный путь к оригинальному файлу
     * /img/original/preview/405/405102_1.jpg
     */
    private function calculateOriginalRelPath()
    {
        $pathParts = [];
        $pathParts[] = IMG_ROOT_REL_PATH;
        $pathParts[] = 'original';
        $pathParts[] = $this->type;
 
        if (is_int($this->id)) {
            $idPart = floor($this->id / 1000);
        } else {
            $idPart = $this->id;
        }
        //$pathParts[] = $idPart;
 
        $fileParts = [];
        $fileParts[] = $this->id;
        if ($this->image_hash) {
            $fileParts[] = $this->image_hash;
        }
 
        // "img/original/preview/405"
        $path = implode(DIR_SEP, $pathParts);
        // "405102_1"
        $file = implode('_', $fileParts);
 
        return $path . DIR_SEP . $file . '.jpg';
 
    }
 
    /**
     * генерируем кеш-файл по заданным параметрам
     */
    private function generateCachedImage()
    {
        // Абсолютный путь оригинального изображения
        $originalAbsPath = IMG_ROOT_PATH . $this->calculateOriginalRelPath();
        $this->checkOriginalExists($originalAbsPath);
 
        require_once __DIR__ . '/PHPThumb/ThumbLib.inc.php';
        $image = \PhpThumbFactory::create($originalAbsPath);
        // Для мобильных устройств отдаем изображение с качеством на уровне 60%
        if (MOBILE_DEVICE) {
            $options = ['jpegQuality' => 60];
            $image->setOptions($options);
        }
        switch ($this->strategy) {
            case 'w':
                // Масштабируем по ширине
                $image->resize($this->width);
                break;
            case 'wh':
                // Масштабируем по заданной ширине и высоте. Изображение подганяется в этот прямоугольник
                $image->resize($this->width, $this->height);
                break;
            case 'a':
                // Центрируем и обрезаем изображение по заданной высоте и ширине таким образом, чтоб оно полностью заполнило пространство
                $image->adaptiveResize($this->width, $this->height);
                break;
        }
 
        $this->saveImage($image, $originalAbsPath);
    }
 
    public function cropOriginal($left, $top, $width, $height)
    {
        $originalAbsPath = IMG_ROOT_PATH . $this->calculateOriginalRelPath(); // Абсолютный путь оригинального изображения
        $this->checkOriginalExists($originalAbsPath);
 
        require_once __DIR__ . '/PHPThumb/ThumbLib.inc.php';
        $image = \PhpThumbFactory::create($originalAbsPath);
        $image->crop($left, $top, $width, $height);
 
        $this->saveImage($image, $originalAbsPath);
    }
 
    private function checkOriginalExists($originalAbsPath)
    {
        if (!file_exists($originalAbsPath)) {
            if (IMG_DEBUG_MODE) {
                throw new \Exception("Файл {$originalAbsPath} не существует");
            } else {
                $this->exists = false;
            }
            return;
        }
    }
 
    private function saveImage($image, $originalAbsPath)
    {
        // Если оригинал не заблокирован, блокируем. Это необходимо для предотвращения множественной генерации кеш-файла параллельными запросами
        if ($this->lockOriginal($originalAbsPath)) {
            // Сохраняем кешированное изображение
            $image->save($this->getCachedAbsPath());
            // Снимаем блокировку
            $this->unlockOriginal($originalAbsPath);
        } else {
            if (IMG_DEBUG_MODE) {
                throw new \Exception("Файл {$originalAbsPath} заблокирован механизмом проверки _LOCK или не существует");
            } else {
                $this->exists = false;
            }
            return;
        }
    }
 
    /**
     * Удаляет оригинальные и кешированные изображения
     */
    public function remove($removeAll = true)
    {
        $this->removeCached();
        $this->removeOriginal($removeAll);
    }
 
    /**
     * Удаляет оригинальные изображения
     */
    public function removeOriginal($removeAll = true)
    {
        if (!$removeAll) {
            if (file_exists($this->originalAbsPath())) {
                unlink($this->originalAbsPath());
            }
            return;
        }
 
        $originalAbsPath = IMG_ROOT_PATH . $this->calculateOriginalRelPath();
        
        $originalAbsPathDir = implode(DIR_SEP, array_slice(explode(DIR_SEP, $originalAbsPath), 0, -1)); // Абсолютный путь директории
 
        if ($this->image_hash) {
            $search = $originalAbsPathDir . "/" . $this->id . "_*.jpg";
        } else {
            $search = $originalAbsPathDir . "/" . $this->id . ".jpg";
        }
        $files = glob($search);
        if (!empty($files)) {
            foreach ($files as $file) {
                if (is_file($file)) {
                    unlink($file);
                }
            }
        }
    }
 
    /**
     * Удаляет кешированные изображения
     */
    public function removeCached()
    {
        $cachedAbsPath = IMG_ROOT_PATH . $this->calculateCachedRelPath();
        $cachedAbsPathDir = implode(DIR_SEP, array_slice(explode(DIR_SEP, $cachedAbsPath), 0, -1)); // Абсолютный путь директории
 
        $search = $cachedAbsPathDir . "/" . $this->id . "_*.jpg";
        $files = glob($search);
        if (!empty($files)) {
            foreach ($files as $file) {
                if (is_file($file)) {
                    unlink($file);
                }
            }
        }
    }
 
    /**
     * Размеры кешированного изображения
     */
    public function getImageWidthHeight()
    {
        $cachedAbsPath = IMG_ROOT_PATH . $this->calculateCachedRelPath();
        if (file_exists($cachedAbsPath)) {
            $imageSize = getimagesize($cachedAbsPath);
            if (!empty($imageSize)) {
                return [
                    'width'  => $imageSize[0],
                    'height' => $imageSize[1]
                ];
            }
        } else {
            return [
                'width'  => null,
                'height' => null
            ];
        }
    }
 
    /**
     * Проверяем блокировку оригинала изображения. Если нет, то блокируем
     * @param string $originalAbsPath
     * @return boolean true|false
     */
    private function lockOriginal($originalAbsPath)
    {
        $lockFileName = $this->getLockFileName($originalAbsPath);
        if (file_exists($lockFileName)) {
            return false;
        } else {
            $handle = fopen($lockFileName, 'w+');
            if (flock($handle, LOCK_EX)) {
                fwrite($handle, '1');
                flock($handle, LOCK_UN);
                fclose($handle);
                return true;
            } else {
                if ($handle) {
                    fclose($handle);
                }
                return false;
            }
        }
    }
 
    /**
     * Снимаем блокировку оригинала изображения
     * @param string $originalAbsPath
     */
    private function unlockOriginal($originalAbsPath)
    {
        unlink($this->getLockFileName($originalAbsPath));
    }
 
    /**
     * Возвращает имя файла для блокировки оригинала изображения
     * @param string $originalAbsPath
     * @return string
     */
    private function getLockFileName($originalAbsPath)
    {
        return preg_replace('/\.' . IMG_EXTENSION . '/i', '_lock.' . IMG_EXTENSION, $originalAbsPath);
    }
 
    /**
     * Возвращает абсолютный путь к оригинальному изображению.
     * При необходимости генерируется дерево директорий для сохранения оригинальных файлов
     */
    private function getOriginalAbsPath()
    {
        $originalAbsPath = IMG_ROOT_PATH . $this->calculateOriginalRelPath();
        // Абсолютный путь директории
        $originalAbsPathDir = implode(DIR_SEP, array_slice(explode(DIR_SEP, $originalAbsPath), 0, -1));
 
        // Если директория отсутствует
        if (!is_dir($originalAbsPathDir)) {
            // Создаем дерево директорий
            mkdir($originalAbsPathDir, 0777, true);
        }
 
        return $originalAbsPath;
    }
 
    /**
     * Возвращает абсолютный путь к кешированному изображению.
     * При необходимости генерируется дерево директорий для сохранения кеш-файлов
     */
    private function getCachedAbsPath()
    {
        $cachedAbsPath = IMG_ROOT_PATH . $this->calculateCachedRelPath();
        // Абсолютный путь директории
        $cachedAbsPathDir = implode(DIR_SEP, array_slice(explode(DIR_SEP, $cachedAbsPath), 0, -1));
 
        // Если директория отсутствует
        if (!is_dir($cachedAbsPathDir)) {
            // Создаем дерево директорий
            mkdir($cachedAbsPathDir, 0777, true);
        }
        return $cachedAbsPath;
 
    }
 
}
#1Image\Storage->generateCachedImage()
/home/esk00474/public_html/app/modules/Image/Storage.php (162)
<?php
 
namespace Image;
 
use Phalcon\Mvc\User\Component;
 
define('IMG_ROOT_REL_PATH', 'files');
define('DIR_SEP', '/');
define('IMG_ROOT_PATH', ROOT . DIR_SEP);
define('IMG_STORAGE_SERVER', '');
define('IMG_EXTENSION', 'jpg');
define('NOIMAGE', '/assets/admin/images/noimage.jpg');
 
define('IMG_DEBUG_MODE', true);
 
class Storage extends Component
{
 
    private static $STRATEGIES = [
        'w', // Масштабируем по ширине
        'wh', // Масштабируем по заданной ширине и высоте. Изображение подганяется в этот прямоугольник
        'a', // Центрируем и обрезаем изображение по заданной высоте и ширине таким образом, чтоб оно полностью заполнило пространство
    ];
    private $id = null;
    private $image_hash = null;
    private $type = null;
    private $strategy = 'w';
    private $width = 100;
    private $height = null;
    private $container = false;
    private $hash = false;
    private $attributes = [];
    private $exists = true;
    private $widthHeight = true;
    private $stretch = true;
 
    public function __construct(array $params = [], array $attributes = [])
    {
        $this->setIdFromParams($params);
        $this->attributes = $attributes;
 
        $this->type = (isset($params['type'])) ? $params['type'] : 'publication';
        $this->strategy = (isset($params['strategy'])) ? $params['strategy'] : 'w';
        $this->container = (isset($params['container'])) ? $params['container'] : false;
        $this->image_hash = (isset($params['image_hash'])) ? $params['image_hash'] : null;
        $this->hash = (isset($params['hash'])) ? $params['hash'] : false;
 
        $this->setDimensionsAttributes($params);
    }
 
    private function setDimensionsAttributes(array $params = [])
    {
        $this->width = (isset($params['width'])) ? $params['width'] : 100;
        $this->height = (isset($params['height'])) ? $params['height'] : null;
 
        $this->widthHeight = (isset($params['widthHeight'])) ? $params['widthHeight'] : true;
        $this->widthHeight = (isset($params['widthHeight']) && MOBILE_DEVICE) ? false : true;
 
        $this->stretch = (isset($params['stretch'])) ? $params['stretch'] : null;
    }
 
    private function setIdFromParams($params)
    {
        if (isset($params['id'])) {
            if (preg_match('/^\d+$/', $params['id'])) {
                $this->id = (int) $params['id'];
            } else {
                $this->id = $params['id'];
            }
        } else {
            if (IMG_DEBUG_MODE) {
                throw new \Exception("ID не определен");
            }
        }
    }
 
    /**
     * HTML-тег изображения, готовый к использованию
     * <img src="" alt="" />
     */
    public function imageHtml()
    {
        //Из заданных параметров и атрибутов составляем html-тэг
        $attributes = $this->attributesForImageHtml();
 
        // Получаем относительный адрес файла кешированного изображения
        $src = $this->cachedRelPath();
 
        if ($this->exists) {
            if ($this->hash) {
                $src .= '?' . microtime();
            }
        } else {
            $src = NOIMAGE;
            $attributes['width'] = $this->width;
            $attributes['height'] = $this->height;
        }
 
        $attr_src = 'src="' . $this->config->base_path . $src . '"';
        $result = '<img ' . $attr_src . $this->attributesResultForImageHtml($attributes) . '/>';
 
        if ($this->container) {
            $result = '<div class="img-container" style="width:' . $this->width . 'px; height:' . $this->height . 'px">' . $result . '</div>';
        }
 
        return $result;
    }
 
    private function attributesForImageHtml()
    {
        $attributes = $this->attributes;
        if ($this->widthHeight) {
            if ($this->stretch && in_array($this->strategy, ['wh', 'a'])) {
                $this->stretch = false;
            }
            if ($this->stretch) {
                if ($this->width) {
                    $attributes['width'] = $this->width;
                }
                if ($this->height) {
                    $attributes['height'] = $this->height;
                }
            } else {
                $widthHeight = $this->getImageWidthHeight();
                if ($widthHeight['width']) {
                    $attributes['width'] = $widthHeight['width'];
                }
                if ($widthHeight['height']) {
                    $attributes['height'] = $widthHeight['height'];
                }
            }
        }
        $attributes['alt'] = (isset($attributes['alt'])) ? htmlspecialchars($attributes['alt'], ENT_QUOTES) : '';
        return $attributes;
    }
 
    private function attributesResultForImageHtml($attributes)
    {
        $attributesHtmlArray = [];
        foreach ($attributes as $el => $val) {
            $attributesHtmlArray[] = $el . '="' . $val . '"';
        }
        $attributesHtml = implode(' ', $attributesHtmlArray);
        $attributesHtmlResult = ($attributesHtml) ? ' ' . $attributesHtml : '';
 
        return $attributesHtmlResult;
    }
 
    /**
     * Относительный адрес файла кешированного изображения
     * /img/preview/405102/405102_1_w_100.jpg
     */
    public function cachedRelPath()
    {
        // Рассчитываем по входящим параметрам относительный путь к кешированному файлу
        $cachedRelPath = $this->calculateCachedRelPath();
        // Совмещаем относительный путь с корневым, получаем абсолютный путь
        $cachedAbsPath = IMG_ROOT_PATH . $cachedRelPath;
        // Проверяем существование такого файла. если файл не существует:
        if (!file_exists($cachedAbsPath)) {
            // Генерируем кеш-файл по заданным параметрам
            $this->generateCachedImage();
        }
        return IMG_STORAGE_SERVER . $cachedRelPath;
 
    }
 
    public function cachedAbsPath()
    {
        return IMG_ROOT_PATH . $this->cachedRelPath();
 
    }
 
    /**
     * Относительный адрес файла оригинального изображения
     */
    public function originalRelPath()
    {
        return IMG_STORAGE_SERVER . $this->calculateOriginalRelPath();
 
    }
 
    /**
     * Абсолютный адрес файла оригинального изображения
     */
    public function originalAbsPath()
    {
        return $this->getOriginalAbsPath();
 
    }
 
    public function save($file)
    {   
        if (file_exists($file)) {
            return copy($file, $this->originalAbsPath());
        }
    }
 
    public function originalWidthHeight()
    {
        $imageSize = getimagesize($this->originalAbsPath());
        if (!empty($imageSize)) {
            return [
                'width'  => $imageSize[0],
                'height' => $imageSize[1]
            ];
        }
 
    }
 
    public function cachedFileSize()
    {
        $path = $this->cachedAbsPath();
        if (file_exists($path)) {
            return filesize($path);
        }
 
    }
 
    public function isExists()
    {
        if (file_exists($this->getOriginalAbsPath())) {
            return true;
        } else {
            return false;
        }
    }
 
    /**
     * Рассчитываем по входящим параметрам относительный путь к кешированному файлу
     * /img/preview/405/405102_1_w_100.jpg
     */
    private function calculateCachedRelPath()
    {
        $pathParts = [];
        $pathParts[] = IMG_ROOT_REL_PATH;
        $pathParts[] = 'cache';
        $pathParts[] = $this->type;
 
        if (is_int($this->id)) {
            $idPart = floor($this->id / 1000);
        } else {
            $idPart = $this->id;
        }
        //$pathParts[] = $idPart;
 
        $fileParts = [];
        $fileParts[] = $this->id;
        if ($this->image_hash) {
            $fileParts[] = $this->image_hash;
        }
        if (in_array($this->strategy, self::$STRATEGIES)) {
            $fileParts[] = $this->strategy;
        } else {
            if (IMG_DEBUG_MODE) {
                throw new \Exception("Параметр 'strategy' указан неверно");
            }
            return;
        }
        $fileParts[] = $this->width;
        if ($this->height) {
            $fileParts[] = $this->height;
        }
 
        // "img/preview/405"
        $path = implode(DIR_SEP, $pathParts);
        // "405102_1_w_100"
        $file = implode('_', $fileParts);
 
        return $path . DIR_SEP . $file . '.jpg';
 
    }
 
    /**
     * Рассчитываем по входящим параметрам относительный путь к оригинальному файлу
     * /img/original/preview/405/405102_1.jpg
     */
    private function calculateOriginalRelPath()
    {
        $pathParts = [];
        $pathParts[] = IMG_ROOT_REL_PATH;
        $pathParts[] = 'original';
        $pathParts[] = $this->type;
 
        if (is_int($this->id)) {
            $idPart = floor($this->id / 1000);
        } else {
            $idPart = $this->id;
        }
        //$pathParts[] = $idPart;
 
        $fileParts = [];
        $fileParts[] = $this->id;
        if ($this->image_hash) {
            $fileParts[] = $this->image_hash;
        }
 
        // "img/original/preview/405"
        $path = implode(DIR_SEP, $pathParts);
        // "405102_1"
        $file = implode('_', $fileParts);
 
        return $path . DIR_SEP . $file . '.jpg';
 
    }
 
    /**
     * генерируем кеш-файл по заданным параметрам
     */
    private function generateCachedImage()
    {
        // Абсолютный путь оригинального изображения
        $originalAbsPath = IMG_ROOT_PATH . $this->calculateOriginalRelPath();
        $this->checkOriginalExists($originalAbsPath);
 
        require_once __DIR__ . '/PHPThumb/ThumbLib.inc.php';
        $image = \PhpThumbFactory::create($originalAbsPath);
        // Для мобильных устройств отдаем изображение с качеством на уровне 60%
        if (MOBILE_DEVICE) {
            $options = ['jpegQuality' => 60];
            $image->setOptions($options);
        }
        switch ($this->strategy) {
            case 'w':
                // Масштабируем по ширине
                $image->resize($this->width);
                break;
            case 'wh':
                // Масштабируем по заданной ширине и высоте. Изображение подганяется в этот прямоугольник
                $image->resize($this->width, $this->height);
                break;
            case 'a':
                // Центрируем и обрезаем изображение по заданной высоте и ширине таким образом, чтоб оно полностью заполнило пространство
                $image->adaptiveResize($this->width, $this->height);
                break;
        }
 
        $this->saveImage($image, $originalAbsPath);
    }
 
    public function cropOriginal($left, $top, $width, $height)
    {
        $originalAbsPath = IMG_ROOT_PATH . $this->calculateOriginalRelPath(); // Абсолютный путь оригинального изображения
        $this->checkOriginalExists($originalAbsPath);
 
        require_once __DIR__ . '/PHPThumb/ThumbLib.inc.php';
        $image = \PhpThumbFactory::create($originalAbsPath);
        $image->crop($left, $top, $width, $height);
 
        $this->saveImage($image, $originalAbsPath);
    }
 
    private function checkOriginalExists($originalAbsPath)
    {
        if (!file_exists($originalAbsPath)) {
            if (IMG_DEBUG_MODE) {
                throw new \Exception("Файл {$originalAbsPath} не существует");
            } else {
                $this->exists = false;
            }
            return;
        }
    }
 
    private function saveImage($image, $originalAbsPath)
    {
        // Если оригинал не заблокирован, блокируем. Это необходимо для предотвращения множественной генерации кеш-файла параллельными запросами
        if ($this->lockOriginal($originalAbsPath)) {
            // Сохраняем кешированное изображение
            $image->save($this->getCachedAbsPath());
            // Снимаем блокировку
            $this->unlockOriginal($originalAbsPath);
        } else {
            if (IMG_DEBUG_MODE) {
                throw new \Exception("Файл {$originalAbsPath} заблокирован механизмом проверки _LOCK или не существует");
            } else {
                $this->exists = false;
            }
            return;
        }
    }
 
    /**
     * Удаляет оригинальные и кешированные изображения
     */
    public function remove($removeAll = true)
    {
        $this->removeCached();
        $this->removeOriginal($removeAll);
    }
 
    /**
     * Удаляет оригинальные изображения
     */
    public function removeOriginal($removeAll = true)
    {
        if (!$removeAll) {
            if (file_exists($this->originalAbsPath())) {
                unlink($this->originalAbsPath());
            }
            return;
        }
 
        $originalAbsPath = IMG_ROOT_PATH . $this->calculateOriginalRelPath();
        
        $originalAbsPathDir = implode(DIR_SEP, array_slice(explode(DIR_SEP, $originalAbsPath), 0, -1)); // Абсолютный путь директории
 
        if ($this->image_hash) {
            $search = $originalAbsPathDir . "/" . $this->id . "_*.jpg";
        } else {
            $search = $originalAbsPathDir . "/" . $this->id . ".jpg";
        }
        $files = glob($search);
        if (!empty($files)) {
            foreach ($files as $file) {
                if (is_file($file)) {
                    unlink($file);
                }
            }
        }
    }
 
    /**
     * Удаляет кешированные изображения
     */
    public function removeCached()
    {
        $cachedAbsPath = IMG_ROOT_PATH . $this->calculateCachedRelPath();
        $cachedAbsPathDir = implode(DIR_SEP, array_slice(explode(DIR_SEP, $cachedAbsPath), 0, -1)); // Абсолютный путь директории
 
        $search = $cachedAbsPathDir . "/" . $this->id . "_*.jpg";
        $files = glob($search);
        if (!empty($files)) {
            foreach ($files as $file) {
                if (is_file($file)) {
                    unlink($file);
                }
            }
        }
    }
 
    /**
     * Размеры кешированного изображения
     */
    public function getImageWidthHeight()
    {
        $cachedAbsPath = IMG_ROOT_PATH . $this->calculateCachedRelPath();
        if (file_exists($cachedAbsPath)) {
            $imageSize = getimagesize($cachedAbsPath);
            if (!empty($imageSize)) {
                return [
                    'width'  => $imageSize[0],
                    'height' => $imageSize[1]
                ];
            }
        } else {
            return [
                'width'  => null,
                'height' => null
            ];
        }
    }
 
    /**
     * Проверяем блокировку оригинала изображения. Если нет, то блокируем
     * @param string $originalAbsPath
     * @return boolean true|false
     */
    private function lockOriginal($originalAbsPath)
    {
        $lockFileName = $this->getLockFileName($originalAbsPath);
        if (file_exists($lockFileName)) {
            return false;
        } else {
            $handle = fopen($lockFileName, 'w+');
            if (flock($handle, LOCK_EX)) {
                fwrite($handle, '1');
                flock($handle, LOCK_UN);
                fclose($handle);
                return true;
            } else {
                if ($handle) {
                    fclose($handle);
                }
                return false;
            }
        }
    }
 
    /**
     * Снимаем блокировку оригинала изображения
     * @param string $originalAbsPath
     */
    private function unlockOriginal($originalAbsPath)
    {
        unlink($this->getLockFileName($originalAbsPath));
    }
 
    /**
     * Возвращает имя файла для блокировки оригинала изображения
     * @param string $originalAbsPath
     * @return string
     */
    private function getLockFileName($originalAbsPath)
    {
        return preg_replace('/\.' . IMG_EXTENSION . '/i', '_lock.' . IMG_EXTENSION, $originalAbsPath);
    }
 
    /**
     * Возвращает абсолютный путь к оригинальному изображению.
     * При необходимости генерируется дерево директорий для сохранения оригинальных файлов
     */
    private function getOriginalAbsPath()
    {
        $originalAbsPath = IMG_ROOT_PATH . $this->calculateOriginalRelPath();
        // Абсолютный путь директории
        $originalAbsPathDir = implode(DIR_SEP, array_slice(explode(DIR_SEP, $originalAbsPath), 0, -1));
 
        // Если директория отсутствует
        if (!is_dir($originalAbsPathDir)) {
            // Создаем дерево директорий
            mkdir($originalAbsPathDir, 0777, true);
        }
 
        return $originalAbsPath;
    }
 
    /**
     * Возвращает абсолютный путь к кешированному изображению.
     * При необходимости генерируется дерево директорий для сохранения кеш-файлов
     */
    private function getCachedAbsPath()
    {
        $cachedAbsPath = IMG_ROOT_PATH . $this->calculateCachedRelPath();
        // Абсолютный путь директории
        $cachedAbsPathDir = implode(DIR_SEP, array_slice(explode(DIR_SEP, $cachedAbsPath), 0, -1));
 
        // Если директория отсутствует
        if (!is_dir($cachedAbsPathDir)) {
            // Создаем дерево директорий
            mkdir($cachedAbsPathDir, 0777, true);
        }
        return $cachedAbsPath;
 
    }
 
}
#2Image\Storage->cachedRelPath()
/home/esk00474/public_html/app/modules/Image/Storage.php (87)
<?php
 
namespace Image;
 
use Phalcon\Mvc\User\Component;
 
define('IMG_ROOT_REL_PATH', 'files');
define('DIR_SEP', '/');
define('IMG_ROOT_PATH', ROOT . DIR_SEP);
define('IMG_STORAGE_SERVER', '');
define('IMG_EXTENSION', 'jpg');
define('NOIMAGE', '/assets/admin/images/noimage.jpg');
 
define('IMG_DEBUG_MODE', true);
 
class Storage extends Component
{
 
    private static $STRATEGIES = [
        'w', // Масштабируем по ширине
        'wh', // Масштабируем по заданной ширине и высоте. Изображение подганяется в этот прямоугольник
        'a', // Центрируем и обрезаем изображение по заданной высоте и ширине таким образом, чтоб оно полностью заполнило пространство
    ];
    private $id = null;
    private $image_hash = null;
    private $type = null;
    private $strategy = 'w';
    private $width = 100;
    private $height = null;
    private $container = false;
    private $hash = false;
    private $attributes = [];
    private $exists = true;
    private $widthHeight = true;
    private $stretch = true;
 
    public function __construct(array $params = [], array $attributes = [])
    {
        $this->setIdFromParams($params);
        $this->attributes = $attributes;
 
        $this->type = (isset($params['type'])) ? $params['type'] : 'publication';
        $this->strategy = (isset($params['strategy'])) ? $params['strategy'] : 'w';
        $this->container = (isset($params['container'])) ? $params['container'] : false;
        $this->image_hash = (isset($params['image_hash'])) ? $params['image_hash'] : null;
        $this->hash = (isset($params['hash'])) ? $params['hash'] : false;
 
        $this->setDimensionsAttributes($params);
    }
 
    private function setDimensionsAttributes(array $params = [])
    {
        $this->width = (isset($params['width'])) ? $params['width'] : 100;
        $this->height = (isset($params['height'])) ? $params['height'] : null;
 
        $this->widthHeight = (isset($params['widthHeight'])) ? $params['widthHeight'] : true;
        $this->widthHeight = (isset($params['widthHeight']) && MOBILE_DEVICE) ? false : true;
 
        $this->stretch = (isset($params['stretch'])) ? $params['stretch'] : null;
    }
 
    private function setIdFromParams($params)
    {
        if (isset($params['id'])) {
            if (preg_match('/^\d+$/', $params['id'])) {
                $this->id = (int) $params['id'];
            } else {
                $this->id = $params['id'];
            }
        } else {
            if (IMG_DEBUG_MODE) {
                throw new \Exception("ID не определен");
            }
        }
    }
 
    /**
     * HTML-тег изображения, готовый к использованию
     * <img src="" alt="" />
     */
    public function imageHtml()
    {
        //Из заданных параметров и атрибутов составляем html-тэг
        $attributes = $this->attributesForImageHtml();
 
        // Получаем относительный адрес файла кешированного изображения
        $src = $this->cachedRelPath();
 
        if ($this->exists) {
            if ($this->hash) {
                $src .= '?' . microtime();
            }
        } else {
            $src = NOIMAGE;
            $attributes['width'] = $this->width;
            $attributes['height'] = $this->height;
        }
 
        $attr_src = 'src="' . $this->config->base_path . $src . '"';
        $result = '<img ' . $attr_src . $this->attributesResultForImageHtml($attributes) . '/>';
 
        if ($this->container) {
            $result = '<div class="img-container" style="width:' . $this->width . 'px; height:' . $this->height . 'px">' . $result . '</div>';
        }
 
        return $result;
    }
 
    private function attributesForImageHtml()
    {
        $attributes = $this->attributes;
        if ($this->widthHeight) {
            if ($this->stretch && in_array($this->strategy, ['wh', 'a'])) {
                $this->stretch = false;
            }
            if ($this->stretch) {
                if ($this->width) {
                    $attributes['width'] = $this->width;
                }
                if ($this->height) {
                    $attributes['height'] = $this->height;
                }
            } else {
                $widthHeight = $this->getImageWidthHeight();
                if ($widthHeight['width']) {
                    $attributes['width'] = $widthHeight['width'];
                }
                if ($widthHeight['height']) {
                    $attributes['height'] = $widthHeight['height'];
                }
            }
        }
        $attributes['alt'] = (isset($attributes['alt'])) ? htmlspecialchars($attributes['alt'], ENT_QUOTES) : '';
        return $attributes;
    }
 
    private function attributesResultForImageHtml($attributes)
    {
        $attributesHtmlArray = [];
        foreach ($attributes as $el => $val) {
            $attributesHtmlArray[] = $el . '="' . $val . '"';
        }
        $attributesHtml = implode(' ', $attributesHtmlArray);
        $attributesHtmlResult = ($attributesHtml) ? ' ' . $attributesHtml : '';
 
        return $attributesHtmlResult;
    }
 
    /**
     * Относительный адрес файла кешированного изображения
     * /img/preview/405102/405102_1_w_100.jpg
     */
    public function cachedRelPath()
    {
        // Рассчитываем по входящим параметрам относительный путь к кешированному файлу
        $cachedRelPath = $this->calculateCachedRelPath();
        // Совмещаем относительный путь с корневым, получаем абсолютный путь
        $cachedAbsPath = IMG_ROOT_PATH . $cachedRelPath;
        // Проверяем существование такого файла. если файл не существует:
        if (!file_exists($cachedAbsPath)) {
            // Генерируем кеш-файл по заданным параметрам
            $this->generateCachedImage();
        }
        return IMG_STORAGE_SERVER . $cachedRelPath;
 
    }
 
    public function cachedAbsPath()
    {
        return IMG_ROOT_PATH . $this->cachedRelPath();
 
    }
 
    /**
     * Относительный адрес файла оригинального изображения
     */
    public function originalRelPath()
    {
        return IMG_STORAGE_SERVER . $this->calculateOriginalRelPath();
 
    }
 
    /**
     * Абсолютный адрес файла оригинального изображения
     */
    public function originalAbsPath()
    {
        return $this->getOriginalAbsPath();
 
    }
 
    public function save($file)
    {   
        if (file_exists($file)) {
            return copy($file, $this->originalAbsPath());
        }
    }
 
    public function originalWidthHeight()
    {
        $imageSize = getimagesize($this->originalAbsPath());
        if (!empty($imageSize)) {
            return [
                'width'  => $imageSize[0],
                'height' => $imageSize[1]
            ];
        }
 
    }
 
    public function cachedFileSize()
    {
        $path = $this->cachedAbsPath();
        if (file_exists($path)) {
            return filesize($path);
        }
 
    }
 
    public function isExists()
    {
        if (file_exists($this->getOriginalAbsPath())) {
            return true;
        } else {
            return false;
        }
    }
 
    /**
     * Рассчитываем по входящим параметрам относительный путь к кешированному файлу
     * /img/preview/405/405102_1_w_100.jpg
     */
    private function calculateCachedRelPath()
    {
        $pathParts = [];
        $pathParts[] = IMG_ROOT_REL_PATH;
        $pathParts[] = 'cache';
        $pathParts[] = $this->type;
 
        if (is_int($this->id)) {
            $idPart = floor($this->id / 1000);
        } else {
            $idPart = $this->id;
        }
        //$pathParts[] = $idPart;
 
        $fileParts = [];
        $fileParts[] = $this->id;
        if ($this->image_hash) {
            $fileParts[] = $this->image_hash;
        }
        if (in_array($this->strategy, self::$STRATEGIES)) {
            $fileParts[] = $this->strategy;
        } else {
            if (IMG_DEBUG_MODE) {
                throw new \Exception("Параметр 'strategy' указан неверно");
            }
            return;
        }
        $fileParts[] = $this->width;
        if ($this->height) {
            $fileParts[] = $this->height;
        }
 
        // "img/preview/405"
        $path = implode(DIR_SEP, $pathParts);
        // "405102_1_w_100"
        $file = implode('_', $fileParts);
 
        return $path . DIR_SEP . $file . '.jpg';
 
    }
 
    /**
     * Рассчитываем по входящим параметрам относительный путь к оригинальному файлу
     * /img/original/preview/405/405102_1.jpg
     */
    private function calculateOriginalRelPath()
    {
        $pathParts = [];
        $pathParts[] = IMG_ROOT_REL_PATH;
        $pathParts[] = 'original';
        $pathParts[] = $this->type;
 
        if (is_int($this->id)) {
            $idPart = floor($this->id / 1000);
        } else {
            $idPart = $this->id;
        }
        //$pathParts[] = $idPart;
 
        $fileParts = [];
        $fileParts[] = $this->id;
        if ($this->image_hash) {
            $fileParts[] = $this->image_hash;
        }
 
        // "img/original/preview/405"
        $path = implode(DIR_SEP, $pathParts);
        // "405102_1"
        $file = implode('_', $fileParts);
 
        return $path . DIR_SEP . $file . '.jpg';
 
    }
 
    /**
     * генерируем кеш-файл по заданным параметрам
     */
    private function generateCachedImage()
    {
        // Абсолютный путь оригинального изображения
        $originalAbsPath = IMG_ROOT_PATH . $this->calculateOriginalRelPath();
        $this->checkOriginalExists($originalAbsPath);
 
        require_once __DIR__ . '/PHPThumb/ThumbLib.inc.php';
        $image = \PhpThumbFactory::create($originalAbsPath);
        // Для мобильных устройств отдаем изображение с качеством на уровне 60%
        if (MOBILE_DEVICE) {
            $options = ['jpegQuality' => 60];
            $image->setOptions($options);
        }
        switch ($this->strategy) {
            case 'w':
                // Масштабируем по ширине
                $image->resize($this->width);
                break;
            case 'wh':
                // Масштабируем по заданной ширине и высоте. Изображение подганяется в этот прямоугольник
                $image->resize($this->width, $this->height);
                break;
            case 'a':
                // Центрируем и обрезаем изображение по заданной высоте и ширине таким образом, чтоб оно полностью заполнило пространство
                $image->adaptiveResize($this->width, $this->height);
                break;
        }
 
        $this->saveImage($image, $originalAbsPath);
    }
 
    public function cropOriginal($left, $top, $width, $height)
    {
        $originalAbsPath = IMG_ROOT_PATH . $this->calculateOriginalRelPath(); // Абсолютный путь оригинального изображения
        $this->checkOriginalExists($originalAbsPath);
 
        require_once __DIR__ . '/PHPThumb/ThumbLib.inc.php';
        $image = \PhpThumbFactory::create($originalAbsPath);
        $image->crop($left, $top, $width, $height);
 
        $this->saveImage($image, $originalAbsPath);
    }
 
    private function checkOriginalExists($originalAbsPath)
    {
        if (!file_exists($originalAbsPath)) {
            if (IMG_DEBUG_MODE) {
                throw new \Exception("Файл {$originalAbsPath} не существует");
            } else {
                $this->exists = false;
            }
            return;
        }
    }
 
    private function saveImage($image, $originalAbsPath)
    {
        // Если оригинал не заблокирован, блокируем. Это необходимо для предотвращения множественной генерации кеш-файла параллельными запросами
        if ($this->lockOriginal($originalAbsPath)) {
            // Сохраняем кешированное изображение
            $image->save($this->getCachedAbsPath());
            // Снимаем блокировку
            $this->unlockOriginal($originalAbsPath);
        } else {
            if (IMG_DEBUG_MODE) {
                throw new \Exception("Файл {$originalAbsPath} заблокирован механизмом проверки _LOCK или не существует");
            } else {
                $this->exists = false;
            }
            return;
        }
    }
 
    /**
     * Удаляет оригинальные и кешированные изображения
     */
    public function remove($removeAll = true)
    {
        $this->removeCached();
        $this->removeOriginal($removeAll);
    }
 
    /**
     * Удаляет оригинальные изображения
     */
    public function removeOriginal($removeAll = true)
    {
        if (!$removeAll) {
            if (file_exists($this->originalAbsPath())) {
                unlink($this->originalAbsPath());
            }
            return;
        }
 
        $originalAbsPath = IMG_ROOT_PATH . $this->calculateOriginalRelPath();
        
        $originalAbsPathDir = implode(DIR_SEP, array_slice(explode(DIR_SEP, $originalAbsPath), 0, -1)); // Абсолютный путь директории
 
        if ($this->image_hash) {
            $search = $originalAbsPathDir . "/" . $this->id . "_*.jpg";
        } else {
            $search = $originalAbsPathDir . "/" . $this->id . ".jpg";
        }
        $files = glob($search);
        if (!empty($files)) {
            foreach ($files as $file) {
                if (is_file($file)) {
                    unlink($file);
                }
            }
        }
    }
 
    /**
     * Удаляет кешированные изображения
     */
    public function removeCached()
    {
        $cachedAbsPath = IMG_ROOT_PATH . $this->calculateCachedRelPath();
        $cachedAbsPathDir = implode(DIR_SEP, array_slice(explode(DIR_SEP, $cachedAbsPath), 0, -1)); // Абсолютный путь директории
 
        $search = $cachedAbsPathDir . "/" . $this->id . "_*.jpg";
        $files = glob($search);
        if (!empty($files)) {
            foreach ($files as $file) {
                if (is_file($file)) {
                    unlink($file);
                }
            }
        }
    }
 
    /**
     * Размеры кешированного изображения
     */
    public function getImageWidthHeight()
    {
        $cachedAbsPath = IMG_ROOT_PATH . $this->calculateCachedRelPath();
        if (file_exists($cachedAbsPath)) {
            $imageSize = getimagesize($cachedAbsPath);
            if (!empty($imageSize)) {
                return [
                    'width'  => $imageSize[0],
                    'height' => $imageSize[1]
                ];
            }
        } else {
            return [
                'width'  => null,
                'height' => null
            ];
        }
    }
 
    /**
     * Проверяем блокировку оригинала изображения. Если нет, то блокируем
     * @param string $originalAbsPath
     * @return boolean true|false
     */
    private function lockOriginal($originalAbsPath)
    {
        $lockFileName = $this->getLockFileName($originalAbsPath);
        if (file_exists($lockFileName)) {
            return false;
        } else {
            $handle = fopen($lockFileName, 'w+');
            if (flock($handle, LOCK_EX)) {
                fwrite($handle, '1');
                flock($handle, LOCK_UN);
                fclose($handle);
                return true;
            } else {
                if ($handle) {
                    fclose($handle);
                }
                return false;
            }
        }
    }
 
    /**
     * Снимаем блокировку оригинала изображения
     * @param string $originalAbsPath
     */
    private function unlockOriginal($originalAbsPath)
    {
        unlink($this->getLockFileName($originalAbsPath));
    }
 
    /**
     * Возвращает имя файла для блокировки оригинала изображения
     * @param string $originalAbsPath
     * @return string
     */
    private function getLockFileName($originalAbsPath)
    {
        return preg_replace('/\.' . IMG_EXTENSION . '/i', '_lock.' . IMG_EXTENSION, $originalAbsPath);
    }
 
    /**
     * Возвращает абсолютный путь к оригинальному изображению.
     * При необходимости генерируется дерево директорий для сохранения оригинальных файлов
     */
    private function getOriginalAbsPath()
    {
        $originalAbsPath = IMG_ROOT_PATH . $this->calculateOriginalRelPath();
        // Абсолютный путь директории
        $originalAbsPathDir = implode(DIR_SEP, array_slice(explode(DIR_SEP, $originalAbsPath), 0, -1));
 
        // Если директория отсутствует
        if (!is_dir($originalAbsPathDir)) {
            // Создаем дерево директорий
            mkdir($originalAbsPathDir, 0777, true);
        }
 
        return $originalAbsPath;
    }
 
    /**
     * Возвращает абсолютный путь к кешированному изображению.
     * При необходимости генерируется дерево директорий для сохранения кеш-файлов
     */
    private function getCachedAbsPath()
    {
        $cachedAbsPath = IMG_ROOT_PATH . $this->calculateCachedRelPath();
        // Абсолютный путь директории
        $cachedAbsPathDir = implode(DIR_SEP, array_slice(explode(DIR_SEP, $cachedAbsPath), 0, -1));
 
        // Если директория отсутствует
        if (!is_dir($cachedAbsPathDir)) {
            // Создаем дерево директорий
            mkdir($cachedAbsPathDir, 0777, true);
        }
        return $cachedAbsPath;
 
    }
 
}
#3Image\Storage->imageHtml()
/home/esk00474/public_html/data/cache/volt/%%home%%esk00474%%public_html%%app%%modules%%publication%%views%%index%%publication.volt.php (25)
<!-- site content start -->
<main class="content center-block">
    <div class="content__inner">
        <?= $this->helper->widget('Breadcrumbs')->breadcrumbs('publications', 'type') ?>
        <div class="content__h1-wrap">
          <div class="counter" style="width:25%;">
              <time class="news-list__date d-block">
                <i class="fa fa-calendar"></i> <?= $publicationResult->getDate('Y-m-d H:m:s') ?> 
                <span class="float-right">
                  <i class="fa fa-eye"><?= $publicationResult->getViews() ?></i>
                </span>
              </time>
          </div>
          <div class="content__h1 mt-2" style="width:100%;"><?= $publicationResult->title ?></div>
        </div>
      <div class="news-list <?= $format ?>">
          <?php if ($this->helper->isAdminSession()) { ?>
            <p style="font-weight: bold;font-size:120%;">
              <a class="noajax" href="<?= $this->url->get() ?>publication/admin/edit/<?= $publicationResult->getId() ?>?lang=<?= constant('LANG') ?>"><?= $this->helper->at('Edit publication') ?></a>
            </p>
          <?php } ?>    
          <?php if ($publicationResult->preview_inner) { ?>
            <?php $image = $this->helper->image(['id' => $publicationResult->getId(), 'type' => 'publication', 'width' => 875, 'strategy' => 'w']); ?>
            <div class="image inner">
              <?= $image->imageHTML() ?>                       
            </div>
          <?php } ?>
          <?php if ($publicationResult->getTypeDisplayDate()) { ?>
            <div class="date"><?= $publicationResult->getDate('d.m.Y') ?></div>
          <?php } ?>
          <div class="full-text"><?= $publicationResult->text ?></div>
          <?php if ($this->length($publicationResult->tags) > 0) { ?>
          <?php $homeUrl = $this->helper->currentUrl(constant('LANG')); ?>
          <h3 class="tags"><?= $this->helper->translate('Tags') ?></h3>
          <?php $teglar = $publicationResult->tags->toArray(); ?>
            <?php foreach ($teglar as $tag) { ?>
              <a href="<?= $homeUrl ?>news/<?= $tag['tag'] ?>" class="btn btn-success"><?= $this->helper->translateTag($tag['tag']) ?></a>
            <?php } ?>
          <?php } ?>
          <div class="mb-3"></div>
          <div class="share_links mb-5">
            <div class="item_share">
              <a href="#" class="s_facebook share_item social-sharing_w"><i class="fa fa-facebook"></i></a>
            </div>
            <div class="item_share">
              <a href="#" class="s_twitter share_item social-sharing_w"><i class="fa fa-twitter"></i></a>
            </div>
            <div class="item_share">
              <a href="#" class="s_telegram share_item social-sharing_w"><i class="fa fa-telegram"></i></a>
            </div>           
            <div class="item_share">
              <a href="#" id="printThis" class="print_it share_item social-sharing_w"><i class="fa fa-print"></i></a>
            </div>           
          </div>
          <a href="<?= $this->helper->langUrl(['for' => 'publications', 'type' => $publicationResult->type->getSlug()]) ?>" class="back">&larr; <?= $this->helper->translate('Back to list') ?></a>
      <script type="text/javascript">
        jQuery(document).ready(function () {
          var site_url = $(location).attr('href');
          $(".social-sharing_w").ShareLink({"title":"<?= $publicationResult->getTitle() ?>","text":"<?= $this->helper->announce($publicationResult->getText(), 100) ?>","image":"/<?= $publicationResult->getPreviewSrc() ?>", "url":site_url});
        });
      </script>
      </div>
      <?php if ($publicationResult->type->getSlug() == 'qonun-loyihalari') { ?>
      <input type="hidden" name="advice" id="advice" value="<?= $publicationResult->getTitle() ?>">
  <!-- Comments -->
  <?php if ($this->length($publicationResult->comments) > 0) { ?>
  <?php $commentLength = ($this->length($publicationResult->comments) - 1); ?>
  <h3 style="margin-bottom:20px;"><?= $this->helper->translate('Comments') ?></h3>
    <div class="comments">
    <?php foreach ($publicationResult->comments as $index => $comment) { ?>
      <div class="comment">
        <div class="comment-info">
          <h4><?= $comment->name ?><span class="pull-right"><small><?= $comment->created_at ?></small></span></h4>
        </div>
        <p class="comment-text"><?= $comment->comment ?></p>
        <?php if ($index == $commentLength) { ?>
        <input type="hidden" name="lastCommentId" id="lastCommentId" value="<?= $comment->id ?>">
        <input type="hidden" name="lastCommentType" id="lastCommentType" value="<?= $comment->type ?>">
        <?php } ?>
      </div><!-- /. comment -->
      <hr>
    <?php } ?>
    </div><!-- /. comments -->
    <?php if ($commentLength >= 9) { ?>
      <div class="alert alert-danger" id="noComments" style="display:none;">
        <?= $this->helper->translate('No more comments found') ?>
      </div>
      <div class="show-more-block">
        <button class="btn btn-lg btn-primary" id="showMoreBtn" type="button"><?= $this->helper->translate('Show More') ?></button>
      </div>
    <?php } ?>
  <?php } ?>
  <!-- /. Comments -->
 
      <h3><?= $this->helper->translate('Leave your comment') ?></h3>
      <?= $this->helper->widget('Comments')->commentsBlock() ?>
      <?php } ?>
    </div>
    <aside class="right-bar">
        <?= $this->helper->widget('Menu')->sidebarMenu() ?>
        <div class="right-bar-last-news">
            <?= $this->helper->widget('Publication')->sidebarNews() ?>
        </div>
    </aside>
</main>
 
<!-- site content end -->
#4unknown
#5Phalcon\Mvc\View\Engine\Volt->render(/home/esk00474/public_html/app/modules/Publication/views/index/publication.volt, Array([publicationResult] => Object(Publication\Model\Publication), [type] => press-relizlar, [id] => 9), true)
#6Phalcon\Mvc\View->_engineRender(Array([.volt] => Object(Application\Mvc\View\Engine\Volt), [.phtml] => Object(Phalcon\Mvc\View\Engine\Php)), index/publication, true, true, null)
#7Phalcon\Mvc\View->render(index, publication, Array([type] => press-relizlar, [id] => 9))
/home/esk00474/public_html/app/Bootstrap.php (332)
<?php
 
namespace Eskiz;
use Application\Cache\Manager as CacheManager;
 
/**
 * Bootstrap
 */
 
class Bootstrap
{
 
    public function run()
    {
        $di = new \Phalcon\DI\FactoryDefault();
 
        // Config
        require_once APPLICATION_PATH . '/modules/Cms/Config.php';
        $config = \Cms\Config::get();
        $di->set('config', $config);
 
        // Registry
        $registry = new \Phalcon\Registry();
        $di->set('registry', $registry);
 
        // Loader
        $loader = new \Phalcon\Loader();
        $loader->registerNamespaces($config->loader->namespaces->toArray());
        $loader->registerDirs([APPLICATION_PATH . "/plugins/"]);
        $loader->register();
        require_once APPLICATION_PATH . '/../vendor/autoload.php';
 
        // Database
        $db = new \Phalcon\Db\Adapter\Pdo\Mysql([
            "host"     => $config->database->host,
            "username" => $config->database->username,
            "password" => $config->database->password,
            "dbname"   => $config->database->dbname,
            "charset"  => $config->database->charset,
        ]);
        $di->set('db', $db);
 
        // View
        $this->initView($di);
 
        // URL
        $url = new \Phalcon\Mvc\Url();
        $url->setBasePath($config->base_path);
        $url->setBaseUri($config->base_path);
        $di->set('url', $url);
 
        // Cache
        $this->initCache($di);
 
        // CMS
        $cmsModel = new \Cms\Model\Configuration();
        $registry->cms = $cmsModel->getConfig(); // Отправляем в Registry
 
        // Application
        $application = new \Phalcon\Mvc\Application();
        $application->registerModules($config->modules->toArray());
 
        // Events Manager, Dispatcher
        $this->initEventManager($di);
 
        // Session
        $session = new \Phalcon\Session\Adapter\Files();
        $session->start();
        $di->set('session', $session);
 
        $acl = new \Application\Acl\DefaultAcl();
        $di->set('acl', $acl);
 
        // JS Assets
        $this->initAssetsManager($di);
 
        // Flash helper
        $flash = new \Phalcon\Flash\Session([
            'error'   => 'ui red inverted segment',
            'success' => 'ui green inverted segment',
            'notice'  => 'ui blue inverted segment',
            'warning' => 'ui orange inverted segment',
        ]);
        $di->set('flash', $flash);
 
        $di->set('helper', new \Application\Mvc\Helper());
 
        // Routing
        $this->initRouting($application, $di);
 
        $application->setDI($di);
 
        // Main dispatching process
        $this->dispatch($di);
 
    }
 
    private function initRouting($application, $di)
    {
        $router = new \Application\Mvc\Router\DefaultRouter();
        $router->setDi($di);
        foreach ($application->getModules() as $module) {
            $routesClassName = str_replace('Module', 'Routes', $module['className']);
            if (class_exists($routesClassName)) {
                $routesClass = new $routesClassName();
                $router = $routesClass->init($router);
            }
            $initClassName = str_replace('Module', 'Init', $module['className']);
            if (class_exists($initClassName)) {
                new $initClassName();
            }
        }
        $di->set('router', $router);
    }
 
    private function initAssetsManager($di)
    {
        $config = $di->get('config');
        $assetsManager = new \Application\Assets\Manager();
        $js_collection = $assetsManager->collection('js')
            ->setLocal(true)
            ->addFilter(new \Phalcon\Assets\Filters\Jsmin())
            ->setTargetPath(ROOT . '/assets/admin/js/js.js')
            ->setTargetUri('assets/admin/js/js.js')
            ->join(true);
        if ($config->assets->js) {
            foreach ($config->assets->js as $js) {
                $js_collection->addJs(ROOT . '/' . $js);
            }
        }
 
        // Admin JS Assets
        $assetsManager->collection('modules-admin-js')
            ->setLocal(true)
            ->addFilter(new \Phalcon\Assets\Filters\Jsmin())
            ->setTargetPath(ROOT . '/assets/admin/js/modules-admin.js')
            ->setTargetUri('assets/admin/js/modules-admin.js')
            ->join(true);
 
        // Admin LESS Assets
        $assetsManager->collection('modules-admin-less')
            ->setLocal(true)
            ->addFilter(new \Application\Assets\Filter\Less())
            ->setTargetPath(ROOT . '/assets/admin/js/modules-admin.less')
            ->setTargetUri('assets/admin/js/modules-admin.less')
            ->join(true)
            ->addCss(APPLICATION_PATH . '/modules/Admin/assets/admin.less');
 
        $di->set('assets', $assetsManager);
    }
 
    private function initEventManager($di)
    {
        $eventsManager = new \Phalcon\Events\Manager();
        $dispatcher = new \Phalcon\Mvc\Dispatcher();
 
        $eventsManager->attach("dispatch:beforeDispatchLoop", function ($event, $dispatcher) use ($di) {
            new \Eskiz\Plugin\CheckPoint($di->get('request'));
            new \Eskiz\Plugin\Localization($dispatcher);
            new \Eskiz\Plugin\AdminLocalization($di->get('config'));
            new \Eskiz\Plugin\Acl($di->get('acl'), $dispatcher, $di->get('view'));
            new \Eskiz\Plugin\MobileDetect($di->get('session'), $di->get('view'), $di->get('request'));
        });
 
        $eventsManager->attach("dispatch:afterDispatchLoop", function ($event, $dispatcher) use ($di) {
            new \Eskiz\Plugin\Title($di);
        });
 
        // Profiler
        $registry = $di->get('registry');
        if ($registry->cms['PROFILER']) {
            $profiler = new \Phalcon\Db\Profiler();
            $di->set('profiler', $profiler);
 
            $eventsManager->attach('db', function ($event, $db) use ($profiler) {
                if ($event->getType() == 'beforeQuery') {
                    $profiler->startProfile($db->getSQLStatement());
                }
                if ($event->getType() == 'afterQuery') {
                    $profiler->stopProfile();
                }
            });
        }
 
        $db = $di->get('db');
        $db->setEventsManager($eventsManager);
 
        $dispatcher->setEventsManager($eventsManager);
        $di->set('dispatcher', $dispatcher);
    }
 
    private function initView($di)
    {
        $view = new \Phalcon\Mvc\View();
 
        define('MAIN_VIEW_PATH', '../../../views/');
        $view->setMainView(MAIN_VIEW_PATH . 'main');
        $view->setLayoutsDir(MAIN_VIEW_PATH . '/layouts/');
        $view->setLayout('main');
        $view->setPartialsDir(MAIN_VIEW_PATH . '/partials/');
 
        // Volt
        $volt = new \Application\Mvc\View\Engine\Volt($view, $di);
        $volt->setOptions(['compiledPath' => APPLICATION_PATH . '/../data/cache/volt/']);
        $volt->initCompiler();
 
 
        $phtml = new \Phalcon\Mvc\View\Engine\Php($view, $di);
        $viewEngines = [
            ".volt"  => $volt,
            ".phtml" => $phtml,
        ];
 
        $view->registerEngines($viewEngines);
 
        $ajax = $di->get('request')->getQuery('_ajax');
        if ($ajax) {
            $view->setRenderLevel(\Phalcon\Mvc\View::LEVEL_LAYOUT);
        }
 
        $di->set('view', $view);
 
        return $view;
    }
 
    private function initCache($di)
    {
        $config = $di->get('config');
 
        $cacheFrontend = new \Phalcon\Cache\Frontend\Data([
            "lifetime" => 60,
            "prefix"   => HOST_HASH,
        ]);
 
        $cache = null;
        switch ($config->cache) {
            case 'file':
                $cache = new \Phalcon\Cache\Backend\File($cacheFrontend, [
                    "cacheDir" => APPLICATION_PATH . "/../data/cache/backend/"
                ]);
                break;
            case 'memcache':
                $cache = new \Phalcon\Cache\Backend\Memcache(
                    $cacheFrontend, [
                    "host" => $config->memcache->host,
                    "port" => $config->memcache->port,
                ]);
                break;
            case 'memcached':
                $cache = new \Phalcon\Cache\Backend\Libmemcached(
                    $cacheFrontend, [
                    "host" => $config->memcached->host,
                    "port" => $config->memcached->port,
                ]);
                break;
        }
        $di->set('cache', $cache, true);
        $di->set('modelsCache', $cache, true);
 
        \Application\Widget\Proxy::$cache = $cache; // Modules Widget System
 
        $modelsMetadata = new \Phalcon\Mvc\Model\Metadata\Memory();
        $di->set('modelsMetadata', $modelsMetadata);
 
        $di->set('cacheManager', new CacheManager());
    }
 
    private function dispatch($di)
    {
        $router = $di['router'];
        $router->removeExtraSlashes(true);
        $router->handle();
        $view = $di['view'];
        $dispatcher = $di['dispatcher'];
        $response = $di['response'];        
        $dispatcher->setModuleName($router->getModuleName());
        $dispatcher->setControllerName($router->getControllerName());
        $dispatcher->setActionName($router->getActionName());
        $dispatcher->setParams($router->getParams());
        $moduleName = \Application\Utils\ModuleName::camelize($router->getModuleName());
        $params = $router->getParams();
        if($params){
          if(isset($params['slug'])){
            $params = $params['slug'];
            $lang = \Cms\Model\Language::findFirst("iso='{$params}'");        
            if($lang){            
                $dispatcher->setParams(array('lang'=>$lang->getIso(),'slug'=>'index')); 
                $moduleName = \Application\Utils\ModuleName::camelize('index');
            } 
          }  
        }  
 
        $ModuleClassName = $moduleName . '\Module';
        if (class_exists($ModuleClassName)) {
            $module = new $ModuleClassName;
            $module->registerAutoloaders();
            $module->registerServices($di);
        }
 
        $view->start();
 
        $registry = $di['registry'];
        if ($registry->cms['DEBUG_MODE']) {
            $debug = new \Phalcon\Debug();
            $debug->listen();
 
            $dispatcher->dispatch();
        } else {
            try {
                $dispatcher->dispatch();
            } catch (\Phalcon\Exception $e) {
                // Errors catching
                $view->setViewsDir(__DIR__ . '/modules/Index/views/');
                $view->setPartialsDir('');
                $view->e = $e;
                if ($e instanceof \Phalcon\Mvc\Dispatcher\Exception) {
                    $response->setStatusCode(404, 'Not Found');
                    $view->partial('error/error404');
                } else {
                    $response->setStatusCode(503, 'Service Unavailable');
                    $view->partial('error/error503');
                }
                $response->sendHeaders();
                echo $response->getContent();
                return;
            }
        }
 
        $view->render(
            $dispatcher->getControllerName(),
            $dispatcher->getActionName(),
            $dispatcher->getParams()
        );
 
        $view->finish();
        $response = $di['response'];
 
        // AJAX
        $request = $di['request'];
        $_ajax = $request->getQuery('_ajax');
        if ($_ajax) {
            $contents = $view->getContent();
            $return = new \stdClass();
            $return->html = $contents;
            $return->title = $di->get('helper')->title()->get();
            $return->success = true;
            if ($view->bodyClass) {
                $return->bodyClass = $view->bodyClass;
            }
            $headers = $response->getHeaders()->toArray();
            if (isset($headers[404]) || isset($headers[503])) {
                $return->success = false;
            }
            $response->setContentType('application/json', 'UTF-8');
            $response->setContent(json_encode($return));
        } else {
            $response->setContent($view->getContent());
        }
        $response->sendHeaders();
        echo $response->getContent();
    }
}
#8Eskiz\Bootstrap->dispatch(null)
/home/esk00474/public_html/app/Bootstrap.php (94)
<?php
 
namespace Eskiz;
use Application\Cache\Manager as CacheManager;
 
/**
 * Bootstrap
 */
 
class Bootstrap
{
 
    public function run()
    {
        $di = new \Phalcon\DI\FactoryDefault();
 
        // Config
        require_once APPLICATION_PATH . '/modules/Cms/Config.php';
        $config = \Cms\Config::get();
        $di->set('config', $config);
 
        // Registry
        $registry = new \Phalcon\Registry();
        $di->set('registry', $registry);
 
        // Loader
        $loader = new \Phalcon\Loader();
        $loader->registerNamespaces($config->loader->namespaces->toArray());
        $loader->registerDirs([APPLICATION_PATH . "/plugins/"]);
        $loader->register();
        require_once APPLICATION_PATH . '/../vendor/autoload.php';
 
        // Database
        $db = new \Phalcon\Db\Adapter\Pdo\Mysql([
            "host"     => $config->database->host,
            "username" => $config->database->username,
            "password" => $config->database->password,
            "dbname"   => $config->database->dbname,
            "charset"  => $config->database->charset,
        ]);
        $di->set('db', $db);
 
        // View
        $this->initView($di);
 
        // URL
        $url = new \Phalcon\Mvc\Url();
        $url->setBasePath($config->base_path);
        $url->setBaseUri($config->base_path);
        $di->set('url', $url);
 
        // Cache
        $this->initCache($di);
 
        // CMS
        $cmsModel = new \Cms\Model\Configuration();
        $registry->cms = $cmsModel->getConfig(); // Отправляем в Registry
 
        // Application
        $application = new \Phalcon\Mvc\Application();
        $application->registerModules($config->modules->toArray());
 
        // Events Manager, Dispatcher
        $this->initEventManager($di);
 
        // Session
        $session = new \Phalcon\Session\Adapter\Files();
        $session->start();
        $di->set('session', $session);
 
        $acl = new \Application\Acl\DefaultAcl();
        $di->set('acl', $acl);
 
        // JS Assets
        $this->initAssetsManager($di);
 
        // Flash helper
        $flash = new \Phalcon\Flash\Session([
            'error'   => 'ui red inverted segment',
            'success' => 'ui green inverted segment',
            'notice'  => 'ui blue inverted segment',
            'warning' => 'ui orange inverted segment',
        ]);
        $di->set('flash', $flash);
 
        $di->set('helper', new \Application\Mvc\Helper());
 
        // Routing
        $this->initRouting($application, $di);
 
        $application->setDI($di);
 
        // Main dispatching process
        $this->dispatch($di);
 
    }
 
    private function initRouting($application, $di)
    {
        $router = new \Application\Mvc\Router\DefaultRouter();
        $router->setDi($di);
        foreach ($application->getModules() as $module) {
            $routesClassName = str_replace('Module', 'Routes', $module['className']);
            if (class_exists($routesClassName)) {
                $routesClass = new $routesClassName();
                $router = $routesClass->init($router);
            }
            $initClassName = str_replace('Module', 'Init', $module['className']);
            if (class_exists($initClassName)) {
                new $initClassName();
            }
        }
        $di->set('router', $router);
    }
 
    private function initAssetsManager($di)
    {
        $config = $di->get('config');
        $assetsManager = new \Application\Assets\Manager();
        $js_collection = $assetsManager->collection('js')
            ->setLocal(true)
            ->addFilter(new \Phalcon\Assets\Filters\Jsmin())
            ->setTargetPath(ROOT . '/assets/admin/js/js.js')
            ->setTargetUri('assets/admin/js/js.js')
            ->join(true);
        if ($config->assets->js) {
            foreach ($config->assets->js as $js) {
                $js_collection->addJs(ROOT . '/' . $js);
            }
        }
 
        // Admin JS Assets
        $assetsManager->collection('modules-admin-js')
            ->setLocal(true)
            ->addFilter(new \Phalcon\Assets\Filters\Jsmin())
            ->setTargetPath(ROOT . '/assets/admin/js/modules-admin.js')
            ->setTargetUri('assets/admin/js/modules-admin.js')
            ->join(true);
 
        // Admin LESS Assets
        $assetsManager->collection('modules-admin-less')
            ->setLocal(true)
            ->addFilter(new \Application\Assets\Filter\Less())
            ->setTargetPath(ROOT . '/assets/admin/js/modules-admin.less')
            ->setTargetUri('assets/admin/js/modules-admin.less')
            ->join(true)
            ->addCss(APPLICATION_PATH . '/modules/Admin/assets/admin.less');
 
        $di->set('assets', $assetsManager);
    }
 
    private function initEventManager($di)
    {
        $eventsManager = new \Phalcon\Events\Manager();
        $dispatcher = new \Phalcon\Mvc\Dispatcher();
 
        $eventsManager->attach("dispatch:beforeDispatchLoop", function ($event, $dispatcher) use ($di) {
            new \Eskiz\Plugin\CheckPoint($di->get('request'));
            new \Eskiz\Plugin\Localization($dispatcher);
            new \Eskiz\Plugin\AdminLocalization($di->get('config'));
            new \Eskiz\Plugin\Acl($di->get('acl'), $dispatcher, $di->get('view'));
            new \Eskiz\Plugin\MobileDetect($di->get('session'), $di->get('view'), $di->get('request'));
        });
 
        $eventsManager->attach("dispatch:afterDispatchLoop", function ($event, $dispatcher) use ($di) {
            new \Eskiz\Plugin\Title($di);
        });
 
        // Profiler
        $registry = $di->get('registry');
        if ($registry->cms['PROFILER']) {
            $profiler = new \Phalcon\Db\Profiler();
            $di->set('profiler', $profiler);
 
            $eventsManager->attach('db', function ($event, $db) use ($profiler) {
                if ($event->getType() == 'beforeQuery') {
                    $profiler->startProfile($db->getSQLStatement());
                }
                if ($event->getType() == 'afterQuery') {
                    $profiler->stopProfile();
                }
            });
        }
 
        $db = $di->get('db');
        $db->setEventsManager($eventsManager);
 
        $dispatcher->setEventsManager($eventsManager);
        $di->set('dispatcher', $dispatcher);
    }
 
    private function initView($di)
    {
        $view = new \Phalcon\Mvc\View();
 
        define('MAIN_VIEW_PATH', '../../../views/');
        $view->setMainView(MAIN_VIEW_PATH . 'main');
        $view->setLayoutsDir(MAIN_VIEW_PATH . '/layouts/');
        $view->setLayout('main');
        $view->setPartialsDir(MAIN_VIEW_PATH . '/partials/');
 
        // Volt
        $volt = new \Application\Mvc\View\Engine\Volt($view, $di);
        $volt->setOptions(['compiledPath' => APPLICATION_PATH . '/../data/cache/volt/']);
        $volt->initCompiler();
 
 
        $phtml = new \Phalcon\Mvc\View\Engine\Php($view, $di);
        $viewEngines = [
            ".volt"  => $volt,
            ".phtml" => $phtml,
        ];
 
        $view->registerEngines($viewEngines);
 
        $ajax = $di->get('request')->getQuery('_ajax');
        if ($ajax) {
            $view->setRenderLevel(\Phalcon\Mvc\View::LEVEL_LAYOUT);
        }
 
        $di->set('view', $view);
 
        return $view;
    }
 
    private function initCache($di)
    {
        $config = $di->get('config');
 
        $cacheFrontend = new \Phalcon\Cache\Frontend\Data([
            "lifetime" => 60,
            "prefix"   => HOST_HASH,
        ]);
 
        $cache = null;
        switch ($config->cache) {
            case 'file':
                $cache = new \Phalcon\Cache\Backend\File($cacheFrontend, [
                    "cacheDir" => APPLICATION_PATH . "/../data/cache/backend/"
                ]);
                break;
            case 'memcache':
                $cache = new \Phalcon\Cache\Backend\Memcache(
                    $cacheFrontend, [
                    "host" => $config->memcache->host,
                    "port" => $config->memcache->port,
                ]);
                break;
            case 'memcached':
                $cache = new \Phalcon\Cache\Backend\Libmemcached(
                    $cacheFrontend, [
                    "host" => $config->memcached->host,
                    "port" => $config->memcached->port,
                ]);
                break;
        }
        $di->set('cache', $cache, true);
        $di->set('modelsCache', $cache, true);
 
        \Application\Widget\Proxy::$cache = $cache; // Modules Widget System
 
        $modelsMetadata = new \Phalcon\Mvc\Model\Metadata\Memory();
        $di->set('modelsMetadata', $modelsMetadata);
 
        $di->set('cacheManager', new CacheManager());
    }
 
    private function dispatch($di)
    {
        $router = $di['router'];
        $router->removeExtraSlashes(true);
        $router->handle();
        $view = $di['view'];
        $dispatcher = $di['dispatcher'];
        $response = $di['response'];        
        $dispatcher->setModuleName($router->getModuleName());
        $dispatcher->setControllerName($router->getControllerName());
        $dispatcher->setActionName($router->getActionName());
        $dispatcher->setParams($router->getParams());
        $moduleName = \Application\Utils\ModuleName::camelize($router->getModuleName());
        $params = $router->getParams();
        if($params){
          if(isset($params['slug'])){
            $params = $params['slug'];
            $lang = \Cms\Model\Language::findFirst("iso='{$params}'");        
            if($lang){            
                $dispatcher->setParams(array('lang'=>$lang->getIso(),'slug'=>'index')); 
                $moduleName = \Application\Utils\ModuleName::camelize('index');
            } 
          }  
        }  
 
        $ModuleClassName = $moduleName . '\Module';
        if (class_exists($ModuleClassName)) {
            $module = new $ModuleClassName;
            $module->registerAutoloaders();
            $module->registerServices($di);
        }
 
        $view->start();
 
        $registry = $di['registry'];
        if ($registry->cms['DEBUG_MODE']) {
            $debug = new \Phalcon\Debug();
            $debug->listen();
 
            $dispatcher->dispatch();
        } else {
            try {
                $dispatcher->dispatch();
            } catch (\Phalcon\Exception $e) {
                // Errors catching
                $view->setViewsDir(__DIR__ . '/modules/Index/views/');
                $view->setPartialsDir('');
                $view->e = $e;
                if ($e instanceof \Phalcon\Mvc\Dispatcher\Exception) {
                    $response->setStatusCode(404, 'Not Found');
                    $view->partial('error/error404');
                } else {
                    $response->setStatusCode(503, 'Service Unavailable');
                    $view->partial('error/error503');
                }
                $response->sendHeaders();
                echo $response->getContent();
                return;
            }
        }
 
        $view->render(
            $dispatcher->getControllerName(),
            $dispatcher->getActionName(),
            $dispatcher->getParams()
        );
 
        $view->finish();
        $response = $di['response'];
 
        // AJAX
        $request = $di['request'];
        $_ajax = $request->getQuery('_ajax');
        if ($_ajax) {
            $contents = $view->getContent();
            $return = new \stdClass();
            $return->html = $contents;
            $return->title = $di->get('helper')->title()->get();
            $return->success = true;
            if ($view->bodyClass) {
                $return->bodyClass = $view->bodyClass;
            }
            $headers = $response->getHeaders()->toArray();
            if (isset($headers[404]) || isset($headers[503])) {
                $return->success = false;
            }
            $response->setContentType('application/json', 'UTF-8');
            $response->setContent(json_encode($return));
        } else {
            $response->setContent($view->getContent());
        }
        $response->sendHeaders();
        echo $response->getContent();
    }
}
#9Eskiz\Bootstrap->run()
/home/esk00474/public_html/public/index.php (20)
<?php
 
chdir(dirname(__DIR__));
 
define('ROOT', __DIR__);
define('HOST_HASH', substr(md5($_SERVER['HTTP_HOST']), 0, 12));
 
if (isset($_SERVER['APPLICATION_ENV'])) {
    $applicationEnv = ($_SERVER['APPLICATION_ENV'] ? $_SERVER['APPLICATION_ENV'] : 'production');
} else {
    $applicationEnv = (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production');
}
define('APPLICATION_ENV', $applicationEnv);
 
 
define('APPLICATION_PATH', __DIR__ . '/../app');
 
require_once APPLICATION_PATH . '/Bootstrap.php';
$bootstrap = new Eskiz\Bootstrap();
$bootstrap->run();
KeyValue
_url/press-relizlar/9
KeyValue
CONTEXT_DOCUMENT_ROOT/home/esk00474/public_html
CONTEXT_PREFIX
DOCUMENT_ROOT/home/esk00474/public_html
GATEWAY_INTERFACECGI/1.1
HTTP_ACCEPTtext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_LANGUAGEen-US,en;q=0.5
HTTP_HOSTxdp.uz
HTTP_USER_AGENTCCBot/2.0 (https://commoncrawl.org/faq/)
HTTP_X_FORWARDED_HOSTxdp.uz
HTTP_X_FORWARDED_PORT80
HTTP_X_FORWARDED_PROTOhttp
HTTP_X_FORWARDED_SERVERxdp.uz
HTTP_X_REAL_IP3.227.233.55
PATH/bin:/usr/bin
QUERY_STRING_url=/press-relizlar/9
REDIRECT_QUERY_STRING_url=/press-relizlar/9
REDIRECT_REDIRECT_SCRIPT_URIhttp://xdp.uz/press-relizlar/9
REDIRECT_REDIRECT_SCRIPT_URL/press-relizlar/9
REDIRECT_REDIRECT_STATUS200
REDIRECT_REDIRECT_UNIQUE_IDXYZbSqDTS6WWCHTBa2Dd-wAAANA
REDIRECT_SCRIPT_URIhttp://xdp.uz/press-relizlar/9
REDIRECT_SCRIPT_URL/press-relizlar/9
REDIRECT_STATUS200
REDIRECT_UNIQUE_IDXYZbSqDTS6WWCHTBa2Dd-wAAANA
REDIRECT_URL/public/press-relizlar/9
REMOTE_ADDR3.227.233.55
REMOTE_PORT54324
REQUEST_METHODGET
REQUEST_SCHEMEhttp
REQUEST_URI/press-relizlar/9
SCRIPT_FILENAME/home/esk00474/public_html/public/index.php
SCRIPT_NAME/public/index.php
SCRIPT_URIhttp://xdp.uz/press-relizlar/9
SCRIPT_URL/press-relizlar/9
SERVER_ADDR5.182.26.11
SERVER_ADMINwebmaster@xdp.uz
SERVER_NAMExdp.uz
SERVER_PORT80
SERVER_PROTOCOLHTTP/1.1
SERVER_SIGNATURE
SERVER_SOFTWAREApache
TZAsia/Tashkent
UNIQUE_IDXYZbSqDTS6WWCHTBa2Dd-wAAANA
PHP_SELF/public/index.php
REQUEST_TIME_FLOAT1569086282.8106
REQUEST_TIME1569086282
#Path
0/home/esk00474/public_html/public/index.php
1/home/esk00474/public_html/app/Bootstrap.php
2/home/esk00474/public_html/app/modules/Cms/Config.php
3/home/esk00474/public_html/app/config/environment/production.php
4/home/esk00474/public_html/app/config/global.php
5/home/esk00474/public_html/app/config/modules.php
6/home/esk00474/public_html/app/modules/Application/Loader/Modules.php
7/home/esk00474/public_html/vendor/autoload.php
8/home/esk00474/public_html/vendor/composer/autoload_real.php
9/home/esk00474/public_html/vendor/composer/ClassLoader.php
10/home/esk00474/public_html/vendor/composer/autoload_static.php
11/home/esk00474/public_html/vendor/symfony/polyfill-mbstring/bootstrap.php
12/home/esk00474/public_html/vendor/swiftmailer/swiftmailer/lib/swift_required.php
13/home/esk00474/public_html/vendor/swiftmailer/swiftmailer/lib/classes/Swift.php
14/home/esk00474/public_html/vendor/vanchelo/phalcon-mailer/src/helpers.php
15/home/esk00474/public_html/app/modules/Application/Mvc/View/Engine/Volt.php
16/home/esk00474/public_html/app/modules/Application/Widget/Proxy.php
17/home/esk00474/public_html/app/modules/Application/Cache/Manager.php
18/home/esk00474/public_html/app/modules/Cms/Model/Configuration.php
19/home/esk00474/public_html/app/modules/Application/Acl/DefaultAcl.php
20/home/esk00474/public_html/app/config/acl.php
21/home/esk00474/public_html/app/modules/Application/Assets/Manager.php
22/home/esk00474/public_html/app/modules/Application/Assets/Filter/Less.php
23/home/esk00474/public_html/app/modules/Application/Mvc/Helper.php
24/home/esk00474/public_html/app/modules/Menu/Helper/Menu.php
25/home/esk00474/public_html/app/modules/Application/Mvc/Router/DefaultRouter.php
26/home/esk00474/public_html/app/modules/Index/Routes.php
27/home/esk00474/public_html/app/modules/Application/Mvc/Helper/CmsCache.php
28/home/esk00474/public_html/app/modules/Admin/Routes.php
29/home/esk00474/public_html/app/modules/Page/Routes.php
30/home/esk00474/public_html/app/modules/Publication/Routes.php
31/home/esk00474/public_html/app/modules/Publication/Model/Type.php
32/home/esk00474/public_html/app/modules/Application/Mvc/Model/Model.php
33/home/esk00474/public_html/app/modules/Menu/Init.php
34/home/esk00474/public_html/app/modules/Menu/Helper/Helper.php
35/home/esk00474/public_html/app/modules/Seo/Routes.php
36/home/esk00474/public_html/app/modules/Api/Routes.php
37/home/esk00474/public_html/app/modules/Employee/Routes.php
38/home/esk00474/public_html/app/modules/Webform/Routes.php
39/home/esk00474/public_html/app/modules/Portfolio/Routes.php
40/home/esk00474/public_html/app/modules/Search/Routes.php
41/home/esk00474/public_html/app/modules/Products/Routes.php
42/home/esk00474/public_html/app/modules/Products/Model/Category.php
43/home/esk00474/public_html/app/modules/Faq/Routes.php
44/home/esk00474/public_html/app/modules/Partner/Routes.php
45/home/esk00474/public_html/app/modules/Region/Routes.php
46/home/esk00474/public_html/app/modules/Documentation/Routes.php
47/home/esk00474/public_html/app/modules/Media/Routes.php
48/home/esk00474/public_html/app/modules/Comments/Routes.php
49/home/esk00474/public_html/app/modules/Block/Routes.php
50/home/esk00474/public_html/app/modules/Inquiry/Routes.php
51/home/esk00474/public_html/app/modules/Veteran/Routes.php
52/home/esk00474/public_html/app/modules/Newsletter/Routes.php
53/home/esk00474/public_html/app/modules/Application/Utils/ModuleName.php
54/home/esk00474/public_html/app/modules/Publication/Module.php
55/home/esk00474/public_html/app/plugins/CheckPoint.php
56/home/esk00474/public_html/app/plugins/Localization.php
57/home/esk00474/public_html/app/modules/Cms/Model/Translate.php
58/home/esk00474/public_html/app/plugins/AdminLocalization.php
59/home/esk00474/public_html/data/translations/admin/ru.php
60/home/esk00474/public_html/app/plugins/Acl.php
61/home/esk00474/public_html/app/plugins/MobileDetect.php
62/home/esk00474/public_html/vendor/mobiledetect/mobiledetectlib/Mobile_Detect.php
63/home/esk00474/public_html/app/modules/Publication/Controller/IndexController.php
64/home/esk00474/public_html/app/modules/Application/Mvc/Controller.php
65/home/esk00474/public_html/app/modules/Publication/Model/Publication.php
66/home/esk00474/public_html/app/modules/Publication/Model/Translate/PublicationTranslate.php
67/home/esk00474/public_html/app/modules/Application/Mvc/Model/Translate.php
68/home/esk00474/public_html/app/modules/Cms/Model/Settings.php
69/home/esk00474/public_html/app/modules/Cms/Model/Language.php
70/home/esk00474/public_html/app/modules/Application/Mvc/Helper/Title.php
71/home/esk00474/public_html/app/modules/Application/Mvc/Helper/Meta.php
72/home/esk00474/public_html/app/modules/Application/Cache/Keys.php
73/home/esk00474/public_html/app/plugins/Title.php
74/home/esk00474/public_html/data/cache/volt/%%home%%esk00474%%public_html%%app%%modules%%publication%%views%%index%%publication.volt.php
75/home/esk00474/public_html/app/modules/Breadcrumbs/Widget/BreadcrumbsWidget.php
76/home/esk00474/public_html/app/modules/Application/Widget/AbstractWidget.php
77/home/esk00474/public_html/app/modules/Publication/Model/Translate/TypeTranslate.php
78/home/esk00474/public_html/data/cache/volt/%%home%%esk00474%%public_html%%app%%modules%%breadcrumbs%%views%%breadcrumbs.volt.php
79/home/esk00474/public_html/app/modules/Image/Storage.php
Memory
Usage4194304