Skip to content
Code-Schnipsel Gruppen Projekte
Manager.php 12,4 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';
        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
         * @var array
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        protected $_bricks = array();
    
    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
         * @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.blocks.create' );
    
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            QUI::getDataBase()->insert(
                $this->_getTable(),
                array(
                    'project'     => $Project->getName(),
    
                    'lang'        => $Project->getLang(),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    'title'       => $Brick->getAttribute('title'),
                    'description' => $Brick->getAttribute('description'),
                    'type'        => $Brick->getAttribute('type')
    
    Henning Leutz's avatar
    Henning Leutz committed
                )
            );
    
            $lastId = QUI::getPDO()->lastInsertId();
    
            return $lastId;
        }
    
    
        /**
         * CLears the bricks cache
         */
        public function clearCache()
        {
            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.blocks.delete' );
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            // check if brick exist
            $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
         *
         * @param Project $Project
    
         * @param string|bool $siteType - optional, returns only the areas for the specific site type (default = false)
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @return array
         */
    
        public function getAreasByProject(Project $Project, $siteType=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();
    
            // get all vhosts, and the used templates of the project
            $vhosts = QUI::getRewrite()->getVHosts();
    
            foreach ( $vhosts as $vhost )
            {
                if ( !isset( $vhost['template'] ) ) {
                    continue;
                }
    
                if ( $vhost['project'] != $projectName ) {
                    continue;
                }
    
                $templates[] = $vhost['template'];
            }
    
    
    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,
                    Utils::getTemplateAreasFromXML( $brickXML, $siteType )
    
    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 );
    
            } 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' ),
                'description' => array( 'quiqqer/bricks', 'brick.content.description' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                'control'     => 'content'
            );
    
    
            foreach ( $xmlFiles as $bricksXML ) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                $result = array_merge( $result, Utils::getBricksFromXML( $bricksXML ) );
    
    Henning Leutz's avatar
    Henning Leutz committed
            QUI\Cache\Manager::set( $cache, $result );
    
    
            return $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
         * @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(
                'from'  => $this->_getTable(),
                'where' => array(
                    'id' => (int)$id
                ),
                'limit' => 1
            ));
    
            if ( !isset( $data[0] ) ) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                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
    
    
    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
         * @return array
         */
        public function getAvailableBrickSettingsByBrickType($brickType)
        {
            if ( $brickType == 'content' ) {
                return array();
            }
    
            $cache = 'quiqqer/bricks/brickType/'. md5($brickType);
    
            try
            {
                return QUI\Cache\Manager::get( $cache );
    
            } catch ( QUI\Exception $Exception )
            {
    
            }
    
    
            $settings = array();
            $xmlFiles = $this->_getBricksXMLFiles();
    
            foreach ( $xmlFiles as $brickXML )
            {
                $Dom  = QUI\Utils\XML::getDomFromXml( $brickXML );
                $Path = new \DOMXPath( $Dom );
    
                $Settings = $Path->query(
                    "//quiqqer/bricks/brick[@control='{$brickType}']/settings/setting"
                );
    
                if ( !$Settings->length ) {
                    continue;
                }
    
                foreach ( $Settings as $Setting )
                {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    /* @var $Setting \DOMElement */
    
                    $settings[] = array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'name'     => $Setting->getAttribute( 'name' ),
                        'text'     => QUI\Utils\DOM::getTextFromNode( $Setting ),
                        'type'     => $Setting->getAttribute( 'type' ),
                        'class'    => $Setting->getAttribute( 'class' ),
                        'data-qui' => $Setting->getAttribute( 'data-qui' )
    
                    );
                }
    
                break;
            }
    
            QUI\Cache\Manager::set( $cache, $settings );
    
            return $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
         * @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 );
    
            } else
            {
    
    Henning Leutz's avatar
    Henning Leutz committed
                $bricks    = array();
                $brickData = $brickAreas[ $brickArea ];
    
                foreach ( $brickData as $brick ) {
                    $bricks[] = $brick[ 'brickId' ];
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
            foreach ( $bricks as $brickId )
    
    Henning Leutz's avatar
    Henning Leutz committed
                $brickId = (int)$brickId;
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    $result[] = $this->getBrickById( $brickId );
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
                } catch ( QUI\Exception $Exception )
                {
    
    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
         * @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(
                'from'  => $this->_getTable(),
                'where' => array(
    
                    'project' => $Project->getName(),
                    'lang'    => $Project->getLang()
    
    Henning Leutz's avatar
    Henning Leutz committed
                )
            ));
    
            foreach ( $list as $entry )
            {
    
    Henning Leutz's avatar
    Henning Leutz committed
                $Brick = new Brick( $entry );
                $Brick->setAttribute( 'id', $entry['id'] );
    
    Henning Leutz's avatar
    Henning Leutz committed
                $result[] = $Brick;
    
    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.blocks.edit' );
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            $Brick      = $this->getBrickById( $brickId );
    
    Henning Leutz's avatar
    Henning Leutz committed
            $areas      = array();
            $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
            );
    
            $availableAreas = array_map(function($data)
            {
                if ( isset( $data[ 'name' ] ) ) {
                    return $data[ 'name' ];
                }
    
                return '';
            }, $this->getAreasByProject( $Project ));
    
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            if ( isset( $brickData[ 'areas' ] ) )
    
    Henning Leutz's avatar
    Henning Leutz committed
            {
    
    Henning Leutz's avatar
    Henning Leutz committed
                $parts = explode( ',', $brickData[ 'areas' ] );
    
    Henning Leutz's avatar
    Henning Leutz committed
    
                foreach ( $parts as $area )
                {
                    if ( in_array( $area, $availableAreas ) ) {
                        $areas[] = $area;
                    }
                }
            }
    
            if ( !empty( $areas ) ) {
                $areaString = ','. implode( ',', $areas ) .',';
            }
    
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            $Brick->setAttributes( $brickData );
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            if ( isset( $brickData['settings'] ) ) {
                $Brick->setSettings( $brickData['settings'] );
            }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            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' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                'settings'    => json_encode( $Brick->getSettings() ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                'areas'       => $areaString
            ), 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
         * @return String
         */
        protected function _getTable()
        {
            return QUI::getDBTableName( self::TABLE );
        }
    
    
        /**
         * List of available bricks.xml files
         * @return array
         */
        protected function _getBricksXMLFiles()
        {
            $cache = 'quiqqer/bricks/availableBrickFiles';
    
            try
            {
                return QUI\Cache\Manager::get( $cache );
    
            } catch ( QUI\Exception $Exception )
            {
    
            }
    
            $PKM      = QUI::getPackageManager();
            $packages = $PKM->getInstalled();
            $result   = array();
    
            foreach ( $packages as $package )
            {
                $bricksXML = OPT_DIR . $package['name'] .'/bricks.xml';
    
                if ( !file_exists( $bricksXML ) ) {
                    continue;
                }
    
                $result[] = $bricksXML;
            }
    
            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
         * @param Site $Site - Site object
         * @return array
         */
        protected function _getInheritedBricks($brickArea, Site $Site)
        {
    
            // inheritance ( vererbung )
            $Project = $Site->getProject();
            $areas   = $this->getAreasByProject( $Project );
    
            foreach ( $areas as $area )
            {
                if ( $area['name'] != $brickArea ) {
                    continue;
                }
    
                if ( !$area['inheritance'] ) {
                    return array();
                }
    
                break;
            }
    
    
            if ( !isset( $area ) || !isset( $area['name'] ) ) {
                return array();
            }
    
            if ( $area['name'] != $brickArea ) {
                return array();
            }
    
            if ( !Utils::hasInheritance( $Project, $brickArea ) ) {
                return array();
            }
    
    
            $result    = array();
            $parentIds = $Site->getParentIdTree();
            $parentIds = array_reverse( $parentIds );
    
            $projectCacheTable = QUI::getDBProjectTableName( self::TABLE_CACHE, $Project );
    
            foreach ( $parentIds as $parentId )
            {
                $bricks = QUI::getDataBase()->fetch(array(
                    'from'  => $projectCacheTable,
                    'where' => array(
                        'id'   => $parentId,
                        'area' => $brickArea
                    )
                ));
    
                if ( empty( $bricks ) ) {
                    continue;
                }
    
                foreach ( $bricks as $brick ) {
                    $result[] = $brick['brick'];
                }
    
                break;
            }
    
            return $result;
        }