Skip to content
Code-Schnipsel Gruppen Projekte
Manager.php 7,68 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
        /**
    
    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
        {
            QUI::getDataBase()->insert(
                $this->_getTable(),
                array(
                    'project'     => $Project->getName(),
    
    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;
        }
    
    
    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
            // 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 )
            {
    
            }
    
            $PKM      = QUI::getPackageManager();
            $packages = $PKM->getInstalled();
            $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'
            );
    
    
    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';
    
    Henning Leutz's avatar
    Henning Leutz committed
                if ( !file_exists( $bricksXML ) ) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    continue;
                }
    
    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
        }
    
    
    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 ] ) ) {
    
    Henning Leutz's avatar
    Henning Leutz committed
            $bricks = $brickAreas[ $brickArea ];
    
    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()
                )
            ));
    
            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
            $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
    
            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->getAttribute( 'settings' ) ),
    
    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 );
        }