Skip to content
Code-Schnipsel Gruppen Projekte
Manager.php 17,6 KiB
Newer Older
  • Learn to ignore specific revisions
  • Henning Leutz's avatar
    Henning Leutz committed
     * This file contains \QUI\Bricks\Manager
    
    Henning Leutz's avatar
    Henning Leutz committed
    namespace QUI\Bricks;
    
    Henning Leutz's avatar
    Henning Leutz committed
    use QUI\Projects\Project;
    use QUI\Projects\Site;
    
    Henning Leutz's avatar
    Henning Leutz committed
     * Brick Manager
    
    Henning Leutz's avatar
    Henning Leutz committed
     * @package quiqqer/bricks
    
     */
    class Manager
    {
    
    Henning Leutz's avatar
    Henning Leutz committed
        /**
    
    Henning Leutz's avatar
    Henning Leutz committed
         * Bricks table name
    
    Henning Leutz's avatar
    Henning Leutz committed
        const TABLE = 'bricks';
    
    Henning Leutz's avatar
    Henning Leutz committed
        const TABLE_CACHE = 'bricksCache';
    
    Henning Leutz's avatar
    Henning Leutz committed
        /**
    
    Henning Leutz's avatar
    Henning Leutz committed
         * Brick temp collector
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @var array
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        protected $_bricks = array();
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
         * Initialized brick manager
    
         *
         * @var null
         */
        static $_BrickManager = null;
    
        /**
    
         * Return the global QUI\Bricks\Manager
         *
    
         * @return Manager
         */
        static function init()
        {
            if (is_null(self::$_BrickManager)) {
                self::$_BrickManager = new QUI\Bricks\Manager(true);
            }
    
            return self::$_BrickManager;
        }
    
        /**
         * Constructor
         * Please use \QUI\Bricks\Manager::init()
         *
    
         * @param boolean $init - please use \QUI\Bricks\Manager::init()
    
        public function __construct($init = false)
    
        {
            if ($init === false) {
                QUI\System\Log::addWarning('Please use \QUI\Bricks\Manager::init()');
            }
        }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
        /**
    
    Henning Leutz's avatar
    Henning Leutz committed
         * Creates a new brick for the project
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
         * @param Project $Project
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @param Brick $Brick
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @return integer - Brick-ID
    
    Henning Leutz's avatar
    Henning Leutz committed
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        public function createBrickForProject(Project $Project, Brick $Brick)
    
    Henning Leutz's avatar
    Henning Leutz committed
        {
    
    Henning Leutz's avatar
    Henning Leutz committed
            QUI\Rights\Permission::checkPermission('quiqqer.bricks.create');
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            QUI::getDataBase()->insert(
    
                $this->getTable(),
    
    Henning Leutz's avatar
    Henning Leutz committed
                array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                    'project'     => $Project->getName(),
                    'lang'        => $Project->getLang(),
                    'title'       => $Brick->getAttribute('title'),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    'description' => $Brick->getAttribute('description'),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    'type'        => $Brick->getAttribute('type')
    
    Henning Leutz's avatar
    Henning Leutz committed
                )
            );
    
            $lastId = QUI::getPDO()->lastInsertId();
    
            return $lastId;
        }
    
    
        /**
         * CLears the bricks cache
         */
        public function clearCache()
        {
    
    Henning Leutz's avatar
    Henning Leutz committed
            QUI\Cache\Manager::clear('quiqqer/bricks');
    
    Henning Leutz's avatar
    Henning Leutz committed
        /**
    
    Henning Leutz's avatar
    Henning Leutz committed
         * Delete the brick
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @param Integer $brickId - Brick-ID
    
    Henning Leutz's avatar
    Henning Leutz committed
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        public function deleteBrick($brickId)
    
    Henning Leutz's avatar
    Henning Leutz committed
        {
    
    Henning Leutz's avatar
    Henning Leutz committed
            QUI\Rights\Permission::checkPermission('quiqqer.bricks.delete');
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            // check if brick exist
    
    Henning Leutz's avatar
    Henning Leutz committed
            $this->getBrickById($brickId);
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
            QUI::getDataBase()->delete($this->getTable(), array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                'id' => $brickId
    
    Henning Leutz's avatar
    Henning Leutz committed
            ));
        }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
        /**
         * Return the areas which are available in the project
         *
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @param Project $Project
    
         * @param string|boolean $layoutType - optional, returns only the areas
         *                                     for the specific layout type
         *                                     (default = false)
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @return array
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        public function getAreasByProject(Project $Project, $layoutType = false)
    
    Henning Leutz's avatar
    Henning Leutz committed
        {
            $templates = array();
    
    Henning Leutz's avatar
    Henning Leutz committed
            $bricks    = array();
    
    Henning Leutz's avatar
    Henning Leutz committed
    
            $projectName = $Project->getName();
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            if ($Project->getAttribute('template')) {
                $templates[] = $Project->getAttribute('template');
    
    Henning Leutz's avatar
    Henning Leutz committed
            // get all vhosts, and the used templates of the project
            $vhosts = QUI::getRewrite()->getVHosts();
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            foreach ($vhosts as $vhost) {
                if (!isset($vhost['template'])) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    continue;
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if ($vhost['project'] != $projectName) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    continue;
                }
    
                $templates[] = $vhost['template'];
            }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            $templates = array_unique($templates);
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            // get bricks
    
    Henning Leutz's avatar
    Henning Leutz committed
            foreach ($templates as $template) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                $brickXML = realpath(OPT_DIR . $template . '/bricks.xml');
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (!$brickXML) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    continue;
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                $bricks = array_merge(
                    $bricks,
    
    Henning Leutz's avatar
    Henning Leutz committed
                    Utils::getTemplateAreasFromXML($brickXML, $layoutType)
    
    Henning Leutz's avatar
    Henning Leutz committed
            }
    
    
            // unque values
            $cleaned = array();
            foreach ($bricks as $val) {
                if (!isset($cleaned[$val['name']])) {
                    $cleaned[$val['name']] = $val;
                }
            }
    
            $bricks = array_values($cleaned);
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            usort($bricks, function ($a, $b) {
    
    
                $transA = QUI::getLocale()->get(
                    $a['title']['group'],
                    $a['title']['var']
                );
    
                $transB = QUI::getLocale()->get(
                    $b['title']['group'],
                    $b['title']['var']
                );
    
                return $transA > $transB ? 1 : -1;
            });
    
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            QUI::getEvents()->fireEvent(
                'onBricksGetAreaByProject',
    
    Henning Leutz's avatar
    Henning Leutz committed
                array($this, $Project, &$bricks)
    
    Henning Leutz's avatar
    Henning Leutz committed
            );
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            return $bricks;
    
    Henning Leutz's avatar
    Henning Leutz committed
        }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
        /**
    
    Henning Leutz's avatar
    Henning Leutz committed
         * Returns the available bricks
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
         * @return array
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        public function getAvailableBricks()
    
    Henning Leutz's avatar
    Henning Leutz committed
            $cache = 'quiqqer/bricks/availableBricks';
    
    Henning Leutz's avatar
    Henning Leutz committed
            try {
                return QUI\Cache\Manager::get($cache);
    
    Henning Leutz's avatar
    Henning Leutz committed
            } catch (QUI\Exception $Exception) {
    
            $xmlFiles = $this->getBricksXMLFiles();
    
    Henning Leutz's avatar
    Henning Leutz committed
            $result   = array();
    
    Henning Leutz's avatar
    Henning Leutz committed
            $result[] = array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                'title'       => array('quiqqer/bricks', 'brick.content.title'),
    
    Henning Leutz's avatar
    Henning Leutz committed
                'description' => array(
                    'quiqqer/bricks',
                    'brick.content.description'
                ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                'control'     => 'content'
    
    Henning Leutz's avatar
    Henning Leutz committed
            );
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            foreach ($xmlFiles as $bricksXML) {
                $result = array_merge($result, Utils::getBricksFromXML($bricksXML));
    
    Henning Leutz's avatar
    Henning Leutz committed
            QUI\Cache\Manager::set($cache, $result);
    
    Henning Leutz's avatar
    Henning Leutz committed
        /**
    
    Henning Leutz's avatar
    Henning Leutz committed
         * Get a Brick by its Brick-ID
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
         * @param Integer $id
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @return Brick
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @throws QUI\Exception
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        public function getBrickById($id)
    
    Henning Leutz's avatar
    Henning Leutz committed
        {
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (isset($this->_bricks[$id])) {
                return $this->_bricks[$id];
    
    Henning Leutz's avatar
    Henning Leutz committed
            }
    
            $data = QUI::getDataBase()->fetch(array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                'from'  => $this->getTable(),
    
    Henning Leutz's avatar
    Henning Leutz committed
                'where' => array(
                    'id' => (int)$id
                ),
                'limit' => 1
            ));
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (!isset($data[0])) {
                throw new QUI\Exception('Brick not found');
    
    Henning Leutz's avatar
    Henning Leutz committed
            }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            $this->_bricks[$id] = new Brick($data[0]);
    
    Henning Leutz's avatar
    Henning Leutz committed
            $this->_bricks[$id]->setAttribute('id', $id);
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            return $this->_bricks[$id];
    
    Henning Leutz's avatar
    Henning Leutz committed
        }
    
    
        /**
         * Return the available brick settings by the brick type
         *
         * @param $brickType
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
    
         * @return array
         */
        public function getAvailableBrickSettingsByBrickType($brickType)
        {
    
    Henning Leutz's avatar
    Henning Leutz committed
            if ($brickType == 'content') {
    
                return array();
            }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            $cache = 'quiqqer/bricks/brickType/' . md5($brickType);
    
    Henning Leutz's avatar
    Henning Leutz committed
            try {
                return QUI\Cache\Manager::get($cache);
    
    Henning Leutz's avatar
    Henning Leutz committed
            } catch (QUI\Exception $Exception) {
    
            }
    
    
            $settings = array();
    
            $xmlFiles = $this->getBricksXMLFiles();
    
    Henning Leutz's avatar
    Henning Leutz committed
            foreach ($xmlFiles as $brickXML) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                $Dom  = QUI\Utils\XML::getDomFromXml($brickXML);
    
    Henning Leutz's avatar
    Henning Leutz committed
                $Path = new \DOMXPath($Dom);
    
    
                $Settings = $Path->query(
                    "//quiqqer/bricks/brick[@control='{$brickType}']/settings/setting"
                );
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (!$Settings->length) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                foreach ($Settings as $Setting) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    /* @var $Setting \DOMElement */
    
                    /* @var $Option \DOMElement */
    
                    $options = false;
    
                    if ($Setting->getAttribute('type') == 'select') {
                        $optionElements = $Setting->getElementsByTagName('option');
    
                        foreach ($optionElements as $Option) {
                            $options[] = array(
                                'value' => $Option->getAttribute('value'),
    
    Henning Leutz's avatar
    Henning Leutz committed
                                'text'  => QUI\Utils\DOM::getTextFromNode($Option, false)
    
                    $settings[] = array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'name'     => $Setting->getAttribute('name'),
                        'text'     => QUI\Utils\DOM::getTextFromNode($Setting, false),
                        'type'     => $Setting->getAttribute('type'),
                        'class'    => $Setting->getAttribute('class'),
    
                        'data-qui' => $Setting->getAttribute('data-qui'),
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'options'  => $options
    
    Henning Leutz's avatar
    Henning Leutz committed
            QUI\Cache\Manager::set($cache, $settings);
    
    Henning Leutz's avatar
    Henning Leutz committed
        /**
    
    Henning Leutz's avatar
    Henning Leutz committed
         * Return the bricks from the area
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @param string $brickArea - Name of the area
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @param Site $Site
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @return array
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        public function getBricksByArea($brickArea, Site $Site)
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (empty($brickArea)) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                return array();
            }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            $brickAreas = $Site->getAttribute('quiqqer.bricks.areas');
            $brickAreas = json_decode($brickAreas, true);
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (!isset($brickAreas[$brickArea]) || empty($brickAreas[$brickArea])) {
    
                $bricks = $this->getInheritedBricks($brickArea, $Site);
    
    Henning Leutz's avatar
    Henning Leutz committed
            } else {
    
    Henning Leutz's avatar
    Henning Leutz committed
                $bricks    = array();
    
    Henning Leutz's avatar
    Henning Leutz committed
                $brickData = $brickAreas[$brickArea];
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                foreach ($brickData as $brick) {
                    if (isset($brick['deactivate'])) {
    
                    $bricks[] = $brick;
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
            foreach ($bricks as $brickData) {
                $brickId = (int)$brickData['brickId'];
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                try {
    
                    $Brick = $this->getBrickById($brickId);
    
                    if (isset($brickData['customfields'])
                        && !empty($brickData['customfields'])
                    ) {
                        $custom = json_decode($brickData['customfields'], true);
    
                        if ($custom) {
                            $Brick->setSettings($custom);
                        }
                    }
    
                    $result[] = $Brick->check();
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                } catch (QUI\Exception $Exception) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    QUI\System\Log::addWarning(
    
    Henning Leutz's avatar
    Henning Leutz committed
                        $Exception->getMessage() . ' Brick-ID:' . $brickId
    
    Henning Leutz's avatar
    Henning Leutz committed
                    );
    
    Henning Leutz's avatar
    Henning Leutz committed
        /**
    
    Henning Leutz's avatar
    Henning Leutz committed
         * Return a list with \QUI\Bricks\Brick which are assigned to a project
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
         * @param Project $Project
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @return array
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        public function getBricksFromProject(Project $Project)
    
    Henning Leutz's avatar
    Henning Leutz committed
        {
            $result = array();
    
            $list = QUI::getDataBase()->fetch(array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                'from'  => $this->getTable(),
    
    Henning Leutz's avatar
    Henning Leutz committed
                'where' => array(
    
                    'project' => $Project->getName(),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    'lang'    => $Project->getLang()
    
    Henning Leutz's avatar
    Henning Leutz committed
            foreach ($list as $entry) {
    
                $result[] = $this->getBrickById($entry['id']);
    
    Henning Leutz's avatar
    Henning Leutz committed
        /**
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @param string|integer $brickId - Brick-ID
         * @param array $brickData - Brick data
    
    Henning Leutz's avatar
    Henning Leutz committed
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        public function saveBrick($brickId, array $brickData)
    
    Henning Leutz's avatar
    Henning Leutz committed
        {
    
    Henning Leutz's avatar
    Henning Leutz committed
            QUI\Rights\Permission::checkPermission('quiqqer.bricks.edit');
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            $Brick      = $this->getBrickById($brickId);
            $areas      = array();
    
    Henning Leutz's avatar
    Henning Leutz committed
            $areaString = '';
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (isset($brickData['id'])) {
                unset($brickData['id']);
    
    Henning Leutz's avatar
    Henning Leutz committed
            }
    
            // check areas
            $Project = QUI::getProjectManager()->getProject(
    
    Henning Leutz's avatar
    Henning Leutz committed
                $Brick->getAttribute('project')
    
    Henning Leutz's avatar
    Henning Leutz committed
            );
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            $availableAreas = array_map(function ($data) {
                if (isset($data['name'])) {
                    return $data['name'];
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
                return '';
    
    Henning Leutz's avatar
    Henning Leutz committed
            }, $this->getAreasByProject($Project));
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
            if (isset($brickData['attributes'])
                && isset($brickData['attributes']['areas'])
            ) {
                $brickData['areas'] = $brickData['attributes']['areas'];
            }
    
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (isset($brickData['areas'])) {
                $parts = explode(',', $brickData['areas']);
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                foreach ($parts as $area) {
                    if (in_array($area, $availableAreas)) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        $areas[] = $area;
                    }
                }
            }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (!empty($areas)) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                $areaString = ',' . implode(',', $areas) . ',';
    
    Henning Leutz's avatar
    Henning Leutz committed
            }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            $Brick->setAttributes($brickData);
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
            // fields
            if (isset($brickData['attributes'])) {
                foreach ($brickData['attributes'] as $key => $value) {
                    if ($key == 'areas') {
                        continue;
                    }
    
                    $Brick->setAttribute($key, $value);
                }
            }
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (isset($brickData['settings'])) {
                $Brick->setSettings($brickData['settings']);
    
    Henning Leutz's avatar
    Henning Leutz committed
            }
    
    
    
            // custom fields
            $customfields = array();
    
            if (isset($brickData['customfields'])) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                $availableSettings           = $Brick->getSettings();
                $availableSettings['width']  = true;
    
                $availableSettings['height'] = true;
    
                foreach ($brickData['customfields'] as $customfield) {
                    $customfield = str_replace('flexible-', '', $customfield);
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    if ($customfield == 'classes') {
                        $customfields[] = $customfield;
                        continue;
                    }
    
    
                    if (isset($availableSettings[$customfield])) {
                        $customfields[] = $customfield;
                    }
                }
            }
    
    
            // update
    
            QUI::getDataBase()->update($this->getTable(), array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                'title'        => $Brick->getAttribute('title'),
                'description'  => $Brick->getAttribute('description'),
                'content'      => $Brick->getAttribute('content'),
                'type'         => $Brick->getAttribute('type'),
                'settings'     => json_encode($Brick->getSettings()),
    
                'customfields' => json_encode($customfields),
    
    Henning Leutz's avatar
    Henning Leutz committed
                'areas'        => $areaString,
                'height'       => $Brick->getAttribute('height'),
                'width'        => $Brick->getAttribute('width'),
                'classes'      => $Brick->getAttribute('classes')
    
    Henning Leutz's avatar
    Henning Leutz committed
            ), array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                'id' => (int)$brickId
    
    Henning Leutz's avatar
    Henning Leutz committed
            ));
        }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
        /**
    
    Henning Leutz's avatar
    Henning Leutz committed
         * Returns the bricks table name
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @return String
         */
    
        protected function getTable()
    
    Henning Leutz's avatar
    Henning Leutz committed
            return QUI::getDBTableName(self::TABLE);
    
    
        /**
         * List of available bricks.xml files
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
    
         * @return array
         */
    
        protected function getBricksXMLFiles()
    
        {
            $cache = 'quiqqer/bricks/availableBrickFiles';
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            try {
                return QUI\Cache\Manager::get($cache);
    
    Henning Leutz's avatar
    Henning Leutz committed
            } catch (QUI\Exception $Exception) {
    
    Henning Leutz's avatar
    Henning Leutz committed
            $PKM      = QUI::getPackageManager();
    
            $Projects = QUI::getProjectManager();
    
            $packages = $PKM->getInstalled();
    
    Henning Leutz's avatar
    Henning Leutz committed
            $result   = array();
    
            // package bricks
    
    Henning Leutz's avatar
    Henning Leutz committed
            foreach ($packages as $package) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                $bricksXML = OPT_DIR . $package['name'] . '/bricks.xml';
    
                if (file_exists($bricksXML)) {
                    $result[] = $bricksXML;
    
            }
    
            // project bricks
            $projects = $Projects->getProjects();
    
            foreach ($projects as $project) {
                $bricksXML = USR_DIR . $project . '/bricks.xml';
    
                if (file_exists($bricksXML)) {
                    $result[] = $bricksXML;
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            QUI\Cache\Manager::set($cache, $result);
    
    
            return $result;
        }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
        /**
         * Return the bricks from an area which are inherited from its parents
         *
         * @param String $brickArea - Name of the area
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @param Site $Site - Site object
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @return array
         */
    
        protected function getInheritedBricks($brickArea, Site $Site)
    
    Henning Leutz's avatar
    Henning Leutz committed
        {
            // inheritance ( vererbung )
            $Project = $Site->getProject();
    
    Henning Leutz's avatar
    Henning Leutz committed
            $areas   = $this->getAreasByProject($Project);
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            foreach ($areas as $area) {
                if ($area['name'] != $brickArea) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    continue;
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (!$area['inheritance']) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    return array();
                }
    
                break;
            }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (!isset($area) || !isset($area['name'])) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                return array();
            }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            if ($area['name'] != $brickArea) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                return array();
            }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (!Utils::hasInheritance($Project, $brickArea)) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                return array();
            }
    
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            $result    = array();
    
    Henning Leutz's avatar
    Henning Leutz committed
            $parentIds = $Site->getParentIdTree();
    
    Henning Leutz's avatar
    Henning Leutz committed
            $parentIds = array_reverse($parentIds);
    
    Henning Leutz's avatar
    Henning Leutz committed
            $projectCacheTable = QUI::getDBProjectTableName(
                self::TABLE_CACHE,
                $Project
            );
    
    Henning Leutz's avatar
    Henning Leutz committed
            foreach ($parentIds as $parentId) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                $bricks = QUI::getDataBase()->fetch(array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                    'from'  => $projectCacheTable,
    
    Henning Leutz's avatar
    Henning Leutz committed
                    'where' => array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'id'   => $parentId,
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'area' => $brickArea
                    )
                ));
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (empty($bricks) || !is_array($bricks)) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    continue;
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                try {
                    $Parent = $Project->get($parentId);
    
    Henning Leutz's avatar
    Henning Leutz committed
                } catch (QUI\Exception $Exception) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                $parentAreas = $Parent->getAttribute('quiqqer.bricks.areas');
                $parentAreas = json_decode($parentAreas, true);
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (!isset($parentAreas[$brickArea])) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    continue;
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
                $brickIds = array();
    
    Henning Leutz's avatar
    Henning Leutz committed
                $area     = $parentAreas[$brickArea];
    
    Henning Leutz's avatar
    Henning Leutz committed
                foreach ($bricks as $brick) {
                    $brickIds[$brick['brick']] = true;
    
    Henning Leutz's avatar
    Henning Leutz committed
                foreach ($area as $brick) {
                    if (isset($brickIds[$brick['brickId']])) {
    
                        $result[] = $brick;
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (empty($result)) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    continue;
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                break;
            }
    
            return $result;
        }