Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Page/Controller/PageController.php
Строк: 252
<?php

namespace ConcreteCorePageController;

use 
ConcreteCoreBlockBlock;
use 
ConcreteCoreBlockBlockController;
use 
ConcreteCoreFoundationEnvironment;
use 
ConcreteCoreRoutingRedirect;
use 
Page;
use 
Request;
use 
Controller;
use 
Core;
use 
ConcreteCorePageViewPageView;
use 
SymfonyComponentHttpFoundationResponse;

class 
PageController extends Controller
{
    protected 
$supportsPageCache false;
    protected 
$action;
    protected 
$passThruBlocks = array();
    protected 
$parameters = array();

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

    public function 
__construct(ConcreteCorePagePage $c)
    {
        
parent::__construct();
        
$this->$c;
        
$this->view = new PageView($this->c);
        
$this->set('html'Core::make('ConcreteCoreHtmlServiceHtml'));
    }

    
/**
     * Given either a path or a Page object, this is a shortcut to
     * 1. Grab the controller of THAT page.
     * 2. Grab the view of THAT controller
     * 3. Render that view.
     * 4. Exit – so we immediately stop all other output in the controller that
     * called render().
     *
     * @param @string|ConcreteCorePagePage $var
     */
    
public function replace($var)
    {
        if (!(
$var instanceof ConcreteCorePagePage)) {
            
$var Page::getByPath($var);
        }

        
$request Request::getInstance();
        
$request->setCurrentPage($var);
        
$controller $var->getPageController();
        
$controller->on_start();
        
$controller->runAction('view');
        
$controller->on_before_render();
        
$view $controller->getViewObject();
        print 
$view->render();
        exit;
    }

    public function 
getSets()
    {
        
$sets parent::getSets();
        
$session Core::make('session');
        if (
$session->getFlashBag()->has('page_message')) {
            
$value $session->getFlashBag()->get('page_message');
            foreach(
$value as $message) {
                
$sets[$message[0]] = $message[1];
            }
        }
        return 
$sets;
    }



    
/**
     * Given a path to a single page, this command uses the CURRENT controller and renders
     * the contents of the single page within this request. The current controller is not
     * replaced, and has already fired (since it is meant to be called from within a view() or
     * similar method).
     *
     * @param @string
     */
    
public function render($path$pkgHandle null)
    {
        
$view $this->getViewObject();

        
$env Environment::get();
        
$path trim($path'/');
        
$a $path '/' FILENAME_COLLECTION_VIEW;
        
$b $path '.php';

        
$r $env->getRecord(DIRNAME_PAGES '/' $a);
        if (
$pkgHandle) {
            
$view->setPackageHandle($pkgHandle);
        }
        if (
$r->exists()) {
            
$view->renderSinglePageByFilename($a);
        } else {
            
$view->renderSinglePageByFilename($b);
        }
    }

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

    public function 
flash($key$value)
    {
        
$session Core::make('session');
        
$session->getFlashBag()->add('page_message', array($key$value));
    }

    public function 
getTheme()
    {
        if (
$this->theme === null) {
            
$theme parent::getTheme();
            if (!
$theme) {
                
$theme $this->c->getCollectionThemeObject();
                if (
is_object($theme)) {
                    
$this->theme $theme->getThemeHandle();
                }
            } else {
                
$this->theme $theme;
            }
        }

        return 
$this->theme;
    }

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

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

    public function 
getControllerActionPath()
    {
        if (isset(
$this->controllerActionPath)) {
            return 
$this->controllerActionPath;
        }

        if (
is_object($this->view)) {
            return 
$this->view->getViewPath();
        }
    }

    public function 
setupRequestActionAndParameters(Request $request)
    {
        
$task substr($request->getPath(), strlen($this->c->getCollectionPath()) + 1);
        
$task str_replace('-/'''$task);
        
$taskparts explode('/'$task);
        if (isset(
$taskparts[0]) && $taskparts[0] !== '') {
            
$method $taskparts[0];
        } elseif (
is_object($this->c) && is_callable(array($this$this->c->getCollectionHandle()))) {
            
$method $this->c->getCollectionHandle();
        } else {
            
$method 'view';
        }

        
$foundTask false;
        try {
            
$r = new ReflectionMethod(get_class($this), $method);
            
$cl $r->getDeclaringClass();
            if (
is_object($cl)) {
                if (
$cl->getName() != 'ConcreteCoreControllerController' && strpos($method'on_') !== && strpos($method'__') !== && $r->isPublic()) {
                    
$foundTask true;
                }
            }
        } catch (
Exception $e) {
        }

        if (
$foundTask) {
            
$this->action $method;
            if (isset(
$taskparts[1])) {
                
array_shift($taskparts);
                
$this->parameters $taskparts;
            }
        } else {
            
$this->action 'view';
            if (
$taskparts[0] !== '') {
                
$this->parameters $taskparts;
            }
        }
    }

    public function 
isValidControllerTask($action$parameters = array())
    {
        
$valid true;
        if (!
is_callable(array($this$this->action)) && count($this->parameters) > 0) {
            
$valid false;
        }

        if (
is_callable(array($this$this->action))  && (get_class($this) != 'ConcreteControllerPageForbidden')) {
            
// we use reflection to see if the task itself, which now much exist, takes fewer arguments than
            // what is specified
            
$r = new ReflectionMethod(get_class($this), $this->action);
            if (
$r->getNumberOfParameters() < count($this->parameters)) {
                
$valid false;
            }
        }

        return 
$valid;
    }

    
/**
     * @access private
     *
     * @param Block $b
     * @param BlockController $controller
     */
    
public function setPassThruBlockController(Block $bBlockController $controller)
    {
        
$this->passThruBlocks[$b->getBlockID()] = $controller;
    }

    public function 
getPassThruBlockController(Block $b)
    {
        
$bID $b->getBlockID();

        return isset(
$this->passThruBlocks[$bID]) ? $this->passThruBlocks[$bID] : null;
    }

    public function 
validateRequest()
    {
        
$valid true;

        if (!
$this->isValidControllerTask($this->action$this->parameters)) {
            
$valid false;
            
// we check the blocks on the page.
            
$blocks array_merge($this->getPageObject()->getBlocks(), $this->getPageObject()->getGlobalBlocks());

            foreach (
$blocks as $b) {
                
$controller $b->getController();
                list(
$method$parameters) = $controller->getPassThruActionAndParameters($this->parameters);
                if (
$controller->isValidControllerTask($method$parameters)) {
                    
$controller->on_start();
                    
$response $controller->runAction($method$parameters);
                    if (
$response instanceof Response) {
                        return 
$response;
                    }
                    
// old school blocks have already terminated at this point. They are redirecting
                    // or exiting. But new blocks like topics, etc... can actually rely on their $set
                    // data persisting and being passed into the view.

                    // so if we make it down here we have to return true –so that we don't fire a 404.
                    
$valid true;

                    
// then, we need to save the persisted data that may have been set.
                    
$controller->setPassThruBlockController($this);
                }
            }

            if (!
$valid) {
                
// finally, we check additional page paths.
                
$paths $this->getPageObject()->getAdditionalPagePaths();
                foreach (
$paths as $path) {
                    if (
$path->getPagePath() == $this->request->getPath()) {
                        
// This is an additional page path to a page. We 301 redirect.
                        
return Redirect::page($this->getPageObject(), 301);
                    }
                }
            }
        }

        return 
$valid;
    }
}
Онлайн: 1
Реклама