Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Block/View/BlockView.php
Строк: 341
<?php

namespace ConcreteCoreBlockView;

use 
ConcreteCoreViewAbstractView;
use 
Config;
use 
Area;
use 
Environment;
use 
User;
use 
Page;
use 
ConcreteCoreBlockBlock;
use 
BlockType;
use 
URL;
use 
View;

class 
BlockView extends AbstractView
{
    protected 
$block;
    protected 
$area;
    protected 
$blockType;
    protected 
$blockTypePkgHandle;
    protected 
$blockViewHeaderFile;
    protected 
$blockViewFooterFile;
    protected 
$outputContent false;
    protected 
$viewToRender false;
    protected 
$viewPerformed false;
    protected 
$showControls true;
    protected 
$didPullFromOutputCache false;

    protected function 
constructView($mixed)
    {
        if (
$mixed instanceof Block) {
            
$this->blockType $mixed->getBlockTypeObject();
            
$this->block $mixed;
            
$this->area $mixed->getBlockAreaObject();
        } else {
            
$this->blockType $mixed;
            if (
$this->blockType->controller) {
                
$this->controller $this->blockType->controller;
            }
        }
        
$this->blockTypePkgHandle $this->blockType->getPackageHandle();
        if (!isset(
$this->controller)) {
            if (isset(
$this->block)) {
                
$this->controller $this->block->getInstance();
                
$this->controller->setBlockObject($this->block);
            } else {
                
$this->controller $this->blockType->getController();
            }
        }
    }

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

    public function 
disableControls()
    {
        
$this->showControls false;
    }

    public function 
setAreaObject(Area $area)
    {
        
$this->area $area;
    }

    public function 
getAreaObject()
    {
        return 
$this->area;
    }

    public function 
start($state)
    {
        if (
is_object($this->area)) {
            
$this->controller->setAreaObject($this->area);
        }
        
/*
         * Legacy shit
         */
        
if ($state instanceof Block) {
            
$this->block $state;
            
$this->viewToRender 'view';
        } else {
            
$this->viewToRender $state;
        }
    }

    
/**
     * Creates a URL that can be posted or navigated to that, when done so, will automatically run the corresponding method inside the block's controller.
     * <code>
     *     <a href="<?=$this->action('get_results')?>">Get the results</a>
     * </code>
     *
     * @param string $task
     *
     * @return string $url
     */
    
public function action($task)
    {
        try {
            if (
$this->viewToRender == 'add') {

                
$c $this->area->getAreaCollectionObject();
                
$arguments = array('/ccm/system/block/action/add',
                    
$c->getCollectionID(),
                    
urlencode($this->area->getAreaHandle()),
                    
$this->blockType->getBlockTypeID(),
                    
$task
                
);
                return 
call_user_func_array(array('URL''to'), $arguments);

            } else if (
is_object($this->block)) {
                if (
is_object($this->block->getProxyBlock())) {
                    
$b $this->block->getProxyBlock();
                } else {
                    
$b $this->block;
                }

                if (
$this->viewToRender == 'edit') {
                    
$c $this->area->getAreaCollectionObject();
                    
$arguments = array('/ccm/system/block/action/edit',
                        
$c->getCollectionID(),
                        
urlencode($this->area->getAreaHandle()),
                        
$b->getBlockID(),
                        
$task
                    
);
                    return 
call_user_func_array(array('URL''to'), $arguments);
                } else {
                    
$c Page::getCurrentPage();
                    if (
is_object($b) && is_object($c)) {
                        
$arguments func_get_args();
                        
$arguments[] = $b->getBlockID();
                        
array_unshift($arguments$c);
                        return 
call_user_func_array(array('URL''page'), $arguments);
                    }
                }
            }
        } catch (
Exception $e) {
        }
    }

    public function 
startRender()
    {
    }

    public function 
setupRender()
    {
        
$this->runControllerTask();

        
$view $this->viewToRender;

        
$env Environment::get();
        if (
$this->viewToRender == 'scrapbook') {
            
$scrapbookTemplate $this->getBlockPath(
                    
FILENAME_BLOCK_VIEW_SCRAPBOOK
                
) . '/' FILENAME_BLOCK_VIEW_SCRAPBOOK;
            if (
file_exists($scrapbookTemplate)) {
                
$view 'scrapbook';
            } else {
                
$view 'view';
            }
        }
        
$customFilenameToRender null;
        if (!
in_array($this->viewToRender, array('view''add''edit''scrapbook'))) {
            
// then we're trying to render a custom view file, which we'll pass to the bottom functions as $_filename
            
$customFilenameToRender $view '.php';
            
$view 'view';
        }
        switch (
$view) {
            case 
'view':
                if (
is_object($this->block) && is_object($this->area)) {
                    
$this->setBlockViewHeaderFile(DIR_FILES_ELEMENTS_CORE '/block_header_view.php');
                    
$this->setBlockViewFooterFile(DIR_FILES_ELEMENTS_CORE '/block_footer_view.php');
                }
                if (
$this->controller->blockViewRenderOverride) {
                    
$template DIRNAME_BLOCKS '/' $this->blockType->getBlockTypeHandle(
                        ) . 
'/' $this->controller->blockViewRenderOverride '.php';
                    
$this->setViewTemplate($env->getPath($template$this->blockTypePkgHandle));
                } else {
                    
$bFilename false;
                    if (
$this->block) {
                        
$bFilename $this->block->getBlockFilename();
                        
$bvt = new BlockViewTemplate($this->block);
                        if (!
$bFilename && is_object($this->area)) {
                            
$templates $this->area->getAreaCustomTemplates();
                            if (isset(
$templates[$this->block->getBlockTypeHandle()])) {
                                
$bFilename $templates[$this->block->getBlockTypeHandle()];
                            }
                        }
                    } else {
                        
$bvt = new BlockViewTemplate($this->blockType);
                    }
                    if (
$bFilename) {
                        
$bvt->setBlockCustomTemplate(
                            
$bFilename
                        
); // this is PROBABLY already set by the method above, but in the case that it's passed by area we have to set it here
                    
} else {
                        if (
$customFilenameToRender) {
                            
$bvt->setBlockCustomRender($customFilenameToRender);
                        }
                    }

                    
$this->setViewTemplate($bvt->getTemplate());
                }
                break;
            case 
'add':
                if (
$this->controller->blockViewRenderOverride) {
                    
$template DIRNAME_BLOCKS '/' $this->blockType->getBlockTypeHandle(
                        ) . 
'/' $this->controller->blockViewRenderOverride '.php';
                } else {
                    
$template DIRNAME_BLOCKS '/' $this->blockType->getBlockTypeHandle(
                        ) . 
'/' FILENAME_BLOCK_ADD;
                }
                
$this->setViewTemplate($env->getPath($template$this->blockTypePkgHandle));
                break;
            case 
'scrapbook':
                
$this->setViewTemplate(
                    
$env->getPath(
                        
DIRNAME_BLOCKS '/' $this->blockType->getBlockTypeHandle(
                        ) . 
'/' FILENAME_BLOCK_VIEW_SCRAPBOOK,
                        
$this->blockTypePkgHandle
                    
)
                );
                break;
            case 
'edit':
                if (
$this->controller->blockViewRenderOverride) {
                    
$template DIRNAME_BLOCKS '/' $this->blockType->getBlockTypeHandle(
                        ) . 
'/' $this->controller->blockViewRenderOverride '.php';
                } else {
                    
$template DIRNAME_BLOCKS '/' $this->blockType->getBlockTypeHandle(
                        ) . 
'/' FILENAME_BLOCK_EDIT;
                }
                
$this->setBlockViewHeaderFile(DIR_FILES_ELEMENTS_CORE '/block_header_edit.php');
                
$this->setBlockViewFooterFile(DIR_FILES_ELEMENTS_CORE '/block_footer_edit.php');
                
$this->setViewTemplate($env->getPath($template$this->blockTypePkgHandle));
                break;
        }

        
$this->viewPerformed $view;
    }

    protected function 
onBeforeGetContents()
    {
        if (
in_array($this->viewPerformed, array('scrapbook''view'))) {
            
$this->controller->runAction('on_page_view', array($this));
            
$this->controller->outputAutoHeaderItems();
        }
    }

    public function 
renderViewContents($scopeItems)
    {
        
extract($scopeItems);
        if (!
$this->outputContent) {
            
ob_start();
            include 
$this->template;
            
$this->outputContent ob_get_contents();
            
ob_end_clean();
        }

        if (
$this->blockViewHeaderFile) {
            include 
$this->blockViewHeaderFile;
        }

        
$this->controller->registerViewAssets($this->outputContent);

        
$this->onBeforeGetContents();
        print 
$this->outputContent;
        
$this->onAfterGetContents();

        if (
$this->blockViewFooterFile) {
            include 
$this->blockViewFooterFile;
        }
    }

    protected function 
setBlockViewHeaderFile($file)
    {
        
$this->blockViewHeaderFile $file;
    }

    protected function 
setBlockViewFooterFile($file)
    {
        
$this->blockViewFooterFile $file;
    }

    public function 
postProcessViewContents($contents)
    {
        return 
$contents;
    }

    
/**
     * Returns the path to the current block's directory.
     *
     * @access private
     *
     * @deprecated
     *
     * @return string
     */
    
public function getBlockPath($filename null)
    {
        
$obj $this->blockType;
        if (
file_exists(DIR_FILES_BLOCK_TYPES '/' $obj->getBlockTypeHandle() . '/' $filename)) {
            
$base DIR_FILES_BLOCK_TYPES '/' $obj->getBlockTypeHandle();
        } else {
            if (
$obj->getPackageID() > 0) {
                if (
is_dir(DIR_PACKAGES '/' $obj->getPackageHandle())) {
                    
$base DIR_PACKAGES '/' $obj->getPackageHandle(
                        ) . 
'/' DIRNAME_BLOCKS '/' $obj->getBlockTypeHandle();
                } else {
                    
$base DIR_PACKAGES_CORE '/' $obj->getPackageHandle(
                        ) . 
'/' DIRNAME_BLOCKS '/' $obj->getBlockTypeHandle();
                }
            } else {
                
$base DIR_FILES_BLOCK_TYPES_CORE '/' $obj->getBlockTypeHandle();
            }
        }

        return 
$base;
    }

    
/**
     * Returns a relative path to the current block's directory. If a filename is specified it will be appended and searched for as well.
     *
     * @return string
     */
    
public function getBlockURL($filename null)
    {
        
$obj $this->blockType;
        if (
$obj->getPackageID() > 0) {
            if (
is_dir(DIR_PACKAGES_CORE '/' $obj->getPackageHandle())) {
                
$base ASSETS_URL '/' DIRNAME_PACKAGES '/' $obj->getPackageHandle(
                    ) . 
'/' DIRNAME_BLOCKS '/' $obj->getBlockTypeHandle();
            } else {
                
$base DIR_REL '/' DIRNAME_PACKAGES '/' $obj->getPackageHandle(
                    ) . 
'/' DIRNAME_BLOCKS '/' $obj->getBlockTypeHandle();
            }
        } else {
            if (
file_exists(DIR_FILES_BLOCK_TYPES '/' $obj->getBlockTypeHandle() . '/' $filename)) {
                
$base REL_DIR_APPLICATION '/' DIRNAME_BLOCKS '/' $obj->getBlockTypeHandle();
            } else {
                
$base ASSETS_URL '/' DIRNAME_BLOCKS '/' $obj->getBlockTypeHandle();
            }
        }

        return 
$base;
    }

    public function 
inc($fileToInclude$args = array())
    {
        
extract($args);
        
extract($this->getScopeItems());
        
$env Environment::get();
        include 
$env->getPath(
            
DIRNAME_BLOCKS '/' $this->blockType->getBlockTypeHandle() . '/' $fileToInclude,
            
$this->blockTypePkgHandle
        
);
    }

    public function 
getScopeItems()
    {
        
$items parent::getScopeItems();
        
$items['b'] = $this->block;
        
$items['bt'] = $this->blockType;
        
$items['a'] = $this->area;

        return 
$items;
    }

    protected function 
useBlockCache()
    {
        
$u = new User();
        
$c Page::getCurrentPage();
        if (
$this->viewToRender == 'view' && Config::get('concrete.cache.blocks') && $this->block instanceof Block
            
&& $this->block->cacheBlockOutput() && $c->isPageDraft() === false
        
) {
            if ((!
$u->isRegistered() || ($this->block->cacheBlockOutputForRegisteredUsers())) &&
                ((
$_SERVER['REQUEST_METHOD'] != 'POST' || ($this->block->cacheBlockOutputOnPost() == true)))
            ) {
                return 
true;
            }
        }

        return 
false;
    }

    public function 
field($field)
    {
        return 
$field;
    }

    public function 
usedBlockCacheDuringRender()
    {
        return 
$this->didPullFromOutputCache;
    }

    public function 
finishRender($contents)
    {
        if (
$this->useBlockCache() && !$this->didPullFromOutputCache) {
            
$this->block->setBlockCachedOutput(
                
$this->outputContent,
                
$this->block->getBlockOutputCacheLifetime(),
                
$this->area
            
);
        }

        return 
$contents;
    }

    public function 
runControllerTask()
    {
        
$this->controller->on_start();

        if (
$this->useBlockCache()) {
            
$this->didPullFromOutputCache true;
            
$this->outputContent $this->block->getBlockCachedOutput($this->area);
        }

        if (!
$this->outputContent) {
            
$this->didPullFromOutputCache false;
            if (
in_array($this->viewToRender, array('view''add''edit''composer'))) {
                
$method $this->viewToRender;
            } else {
                
$method 'view';
            }
            
$passthru false;
            if (
$method == 'view' && is_object($this->block)) {
                
$c Page::getCurrentPage();
                if (
is_object($c)) {
                    
$cnt $c->getController();
                    
$controller $cnt->getPassThruBlockController($this->block);
                    if (
is_object($controller)) {
                        
$passthru true;
                        
$this->controller $controller;
                    }
                }
            }

            
$parameters = array();
            if (!
$passthru) {
                
$this->controller->runAction($method$parameters);
            }
            
$this->controller->on_before_render();
        }
    }

    
/**
     * Legacy.
     *
     * @access private
     */
    
public function getThemePath()
    {
        
$v View::getInstance();

        return 
$v->getThemePath();
    }
}
Онлайн: 0
Реклама