Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Page/View/PageView.php
Строк: 286
<?php
namespace ConcreteCorePageView;

use 
Environment;
use 
Events;
use 
Loader;
use 
PageCache;
use 
PageTemplate;
use 
PageTheme;
use 
Permissions;
use 
URL;
use 
User;
use 
View;
use 
Config;

class 
PageView extends View
{

    protected 
$c; // page
    
protected $cp;
    protected 
$pTemplateID;
    protected 
$customStyleMap;

    public function 
getScopeItems()
    {
        
$items = parent::getScopeItems();
        
$items['c'] = $this->c;
        
$items['theme'] = $this->themeObject;
        return 
$items;
    }

    
/**
     * Called from previewing functions, this lets us override the page's template with one of our own choosing
     */
    
public function setCustomPageTemplate(PageTemplate $pt)
    {
        
$this->pTemplateID = $pt->getPageTemplateID();
    }

    public function 
getPageTemplate() {
        return 
PageTemplate::getByID($this->pTemplateID);
    }

    
/**
     * Called from previewing functions, this lets us override the page's theme with one of our own choosing
     */
    
public function setCustomPageTheme(PageTheme $pt)
    {
        
$this->themeObject = $pt;
        
$this->pkgHandle = $pt->getPackageHandle();
    }

    public function 
renderSinglePageByFilename($cFilename)
    {
        
$env = Environment::get();
        
$cFilename = trim($cFilename, '/');

        
// if we have this exact template in the theme, we use that as the outer wrapper and we don't do an inner content file
        
$exactThemeTemplate = $env->getRecord(DIRNAME_THEMES . '/' . $this->themeHandle . '/' . $cFilename, $this->pkgHandle);
        if (
$exactThemeTemplate->exists()) {
            
$this->setViewTemplate($exactThemeTemplate->file);
        } else {
            
// use a content wrapper from themes/core if specified
            // e.g. $this->render('your/page', 'none') would use themes/core/none.php to print the $innerContent without a wrapper
            
$coreThemeTemplate = $env->getRecord(DIRNAME_THEMES . '/' . DIRNAME_THEMES_CORE . '/' . $this->pkgHandle . '.php');
            if (
$coreThemeTemplate->exists()) {
                
$this->setViewTemplate($coreThemeTemplate->file);
            } else {
                
// check for other themes or in a package if one was specified
                
$themeTemplate = $env->getRecord(DIRNAME_THEMES . '/' . $this->themeHandle . '/' . $this->controller->getThemeViewTemplate(), $this->pkgHandle);
                if (
$themeTemplate->exists()) {
                    
$this->setViewTemplate($themeTemplate->file);
                } else {
                    
// fall back to the active theme wrapper if nothing else was found
                    
$fallbackTheme = PageTheme::getByHandle($this->themeHandle);
                    
$fallbackPkgHandle = ($fallbackTheme instanceof PageTheme) ? $fallbackTheme->getPackageHandle() : $this->pkgHandle;
                    
$fallbackTemplate = $env->getRecord(DIRNAME_THEMES . '/' . $this->themeHandle . '/' . $this->controller->getThemeViewTemplate(), $fallbackPkgHandle);
                    
$this->setViewTemplate($fallbackTemplate->file);
                }
            }

            
// set the inner content for the theme wrapper we found
            
$this->setInnerContentFile(
                
$env->getPath(
                    
DIRNAME_PAGES . '/' . $cFilename,
                    
$this->c->getPackageHandle()
                )
            );
        }
    }
    
    public function 
setupRender()
    {
        
$this->loadViewThemeObject();
        
$env = Environment::get();

        if (isset(
$this->innerContentFile)) {
            
// this has already been rendered (e.g. by calling $this->render()
            // from within a controller. So we don't reset it.
            
return false;
        }


        if (
$this->c->getPageTypeID() == 0 && $this->c->getCollectionFilename()) {
            
$this->renderSinglePageByFilename($this->c->getCollectionFilename());
        } else {
            
$pt = $this->getPageTemplate();
            
$rec = null;
            if (
$pt) {
                
$rec = $env->getRecord(
                    
DIRNAME_THEMES . '/' . $this->themeHandle . '/' . $pt->getPageTemplateHandle() . '.php',
                    
$this->pkgHandle);
            }
            if (
$rec && $rec->exists()) {
                
$this->setViewTemplate(
                    
$env->getPath(
                        
DIRNAME_THEMES . '/' . $this->themeHandle . '/' . $pt->getPageTemplateHandle() . '.php',
                        
$this->pkgHandle));
            } else {
                
$rec = $env->getRecord(
                    
DIRNAME_PAGE_TEMPLATES . '/' . $this->c->getPageTypeHandle() . '.php',
                    
$this->pTemplatePkgHandle);
                if (
$rec->exists()) {
                    
$this->setInnerContentFile(
                        
$env->getPath(
                            
DIRNAME_PAGE_TEMPLATES . '/' . $this->c->getPageTypeHandle() . '.php',
                            
$this->pTemplatePkgHandle));
                    
$this->setViewTemplate(
                        
$env->getPath(
                            
DIRNAME_THEMES . '/' . $this->themeHandle . '/' . $this->controller->getThemeViewTemplate(),
                            
$this->pkgHandle));
                } else {
                    
$this->setViewTemplate(
                        
$env->getPath(
                            
DIRNAME_THEMES . '/' . $this->themeHandle . '/' . FILENAME_THEMES_DEFAULT,
                            
$this->pkgHandle));
                }
            }
        }
    }

    public function 
getStyleSheet($stylesheet)
    {
        if (
$this->themeObject->isThemePreviewRequest()) {
            return 
$this->themeObject->getStylesheet($stylesheet);
        }

        if (
$this->c->hasPageThemeCustomizations()) {
            if (
$this->c->getVersionObject()->isApproved()) {
                return 
URL::to('/ccm/system/css/page', $this->c->getCollectionID(), $stylesheet);
            } else {
                
// this means that we're potentially viewing customizations that haven't been approved yet. So we're going to
                // pipe them all through a handler script, basically uncaching them.
                
return URL::to('/ccm/system/css/page', $this->c->getCollectionID(), $stylesheet, $this->c->getVersionID());
            }
        }

        
$env = Environment::get();
        
$output = Config::get('concrete.cache.directory') . '/pages/' . $this->c->getCollectionID() . '/' . DIRNAME_CSS . '/' . $this->getThemeHandle();
        
$relative = REL_DIR_FILES_CACHE . '/pages/' . $this->c->getCollectionID() . '/' . DIRNAME_CSS . '/' . $this->getThemeHandle();
        
$r = $env->getRecord(
            
DIRNAME_THEMES . '/' . $this->themeObject->getThemeHandle() . '/' . DIRNAME_CSS . '/' . $stylesheet,
            
$this->themeObject->getPackageHandle());
        if (
$r->exists()) {
            
$sheetObject = new ConcreteCoreStyleCustomizerStylesheet(
                
$stylesheet,
                
$r->file,
                
$r->url,
                
$output,
                
$relative);
            if (
$sheetObject->outputFileExists()) {
                return 
$sheetObject->getOutputRelativePath();
            }

            return 
$this->themeObject->getStylesheet($stylesheet);
        }

        
/**
         * deprecated - but this is for backward compatibility. If we don't have a stylesheet in the css/
         * directory we just pass through and return the passed file in the current directory.
         */
        
return $env->getURL(
            
DIRNAME_THEMES . '/' . $this->themeObject->getThemeHandle() . '/' . $stylesheet,
            
$this->themeObject->getPackageHandle()
        );
    }

    public function 
startRender()
    {
        
parent::startRender();
        
$this->c->outputCustomStyleHeaderItems();
        
// do we have any custom menu plugins?
        
$cp = new Permissions($this->c);
        
$this->cp = $cp;
        if (
$cp->canViewToolbar()) {
            
$dh = Loader::helper('concrete/dashboard');
            if (!
$dh->inDashboard()
                && 
$this->c->getCollectionPath() != '/page_not_found'
                
&& $this->c->getCollectionPath() != '/download_file'
                
&& $this->c->isActive() && !$this->c->isMasterCollection()) {
                
$u = new User();
                
$u->markPreviousFrontendPage($this->c);
            }
        }
    }

    public function 
finishRender($contents)
    {
        
$contents = parent::finishRender($contents);

        
$event = new SymfonyComponentEventDispatcherGenericEvent();
        
$event->setArgument('contents', $contents);
        
Events::dispatch('on_page_output', $event);
        
$contents = $event->getArgument('contents');

        
$cache = PageCache::getLibrary();
        
$shouldAddToCache = $cache->shouldAddToCache($this);
        if (
$shouldAddToCache) {
            
$cache->set($this->c, $contents);
        }
        return 
$contents;
    }

    
/**
     * @deprecated
     */
    
public function getCollectionObject()
    {
        return 
$this->getPageObject();
    }

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

    public function 
section($url)
    {
        if (!empty(
$this->viewPath)) {
            
$url = '/' . trim($url, '/');
            if (
strpos($this->viewPath, $url) !== false && strpos($this->viewPath, $url) == 0) {
                return 
true;
            }
        }
    }

    protected function 
constructView($page)
    {
        
$this->c = $page;
        
parent::constructView($page->getCollectionPath());
        if (!isset(
$this->pTemplateID)) {
            
$this->pTemplateID = $this->c->getPageTemplateID();
            
$pto = $this->c->getPageTemplateObject();
            if (
$pto && $pto->getPackageID()) {
                
$this->pTemplatePkgHandle = $this->c->getPageTemplateObject()->getPackageHandle();
            }
        }
        if (!isset(
$this->pThemeID)) {
            
$this->pThemeID = $this->c->getPageTemplateID();
        }
    }

}
Онлайн: 2
Реклама