| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798 |
- <?php
- /**
- * Zend Framework
- *
- * LICENSE
- *
- * This source file is subject to the new BSD license that is bundled
- * with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://framework.zend.com/license/new-bsd
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@zend.com so we can send you a copy immediately.
- *
- * @category Zend
- * @package Zend_Layout
- * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license http://framework.zend.com/license/new-bsd New BSD License
- * @version $Id$
- */
- /**
- * Provide Layout support for MVC applications
- *
- * @category Zend
- * @package Zend_Layout
- * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
- * @license http://framework.zend.com/license/new-bsd New BSD License
- */
- class Zend_Layout
- {
- /**
- * Placeholder container for layout variables
- * @var Zend_View_Helper_Placeholder_Container
- */
- protected $_container;
- /**
- * Key used to store content from 'default' named response segment
- * @var string
- */
- protected $_contentKey = 'content';
- /**
- * Are layouts enabled?
- * @var bool
- */
- protected $_enabled = true;
- /**
- * Helper class
- * @var string
- */
- protected $_helperClass = 'Zend_Layout_Controller_Action_Helper_Layout';
- /**
- * Inflector used to resolve layout script
- * @var Zend_Filter_Inflector
- */
- protected $_inflector;
- /**
- * Flag: is inflector enabled?
- * @var bool
- */
- protected $_inflectorEnabled = true;
- /**
- * Inflector target
- * @var string
- */
- protected $_inflectorTarget = ':script.:suffix';
- /**
- * Layout view
- * @var string
- */
- protected $_layout = 'layout';
- /**
- * Layout view script path
- * @var string
- */
- protected $_viewScriptPath = null;
- protected $_viewBasePath = null;
- protected $_viewBasePrefix = 'Layout_View';
- /**
- * Flag: is MVC integration enabled?
- * @var bool
- */
- protected $_mvcEnabled = true;
- /**
- * Instance registered with MVC, if any
- * @var Zend_Layout
- */
- protected static $_mvcInstance;
- /**
- * Flag: is MVC successful action only flag set?
- * @var bool
- */
- protected $_mvcSuccessfulActionOnly = true;
- /**
- * Plugin class
- * @var string
- */
- protected $_pluginClass = 'Zend_Layout_Controller_Plugin_Layout';
- /**
- * @var Zend_View_Interface
- */
- protected $_view;
- /**
- * View script suffix for layout script
- * @var string
- */
- protected $_viewSuffix = 'phtml';
- /**
- * Constructor
- *
- * Accepts either:
- * - A string path to layouts
- * - An array of options
- * - A Zend_Config object with options
- *
- * Layout script path, either as argument or as key in options, is
- * required.
- *
- * If mvcEnabled flag is false from options, simply sets layout script path.
- * Otherwise, also instantiates and registers action helper and controller
- * plugin.
- *
- * @param string|array|Zend_Config $options
- * @return void
- */
- public function __construct($options = null, $initMvc = false)
- {
- if (null !== $options) {
- if (is_string($options)) {
- $this->setLayoutPath($options);
- } elseif (is_array($options)) {
- $this->setOptions($options);
- } elseif ($options instanceof Zend_Config) {
- $this->setConfig($options);
- } else {
- require_once 'Zend/Layout/Exception.php';
- throw new Zend_Layout_Exception('Invalid option provided to constructor');
- }
- }
- $this->_initVarContainer();
- if ($initMvc) {
- $this->_setMvcEnabled(true);
- $this->_initMvc();
- } else {
- $this->_setMvcEnabled(false);
- }
- }
- /**
- * Static method for initialization with MVC support
- *
- * @param string|array|Zend_Config $options
- * @return Zend_Layout
- */
- public static function startMvc($options = null)
- {
- if (null === self::$_mvcInstance) {
- self::$_mvcInstance = new self($options, true);
- } else {
- if (is_string($options)) {
- self::$_mvcInstance->setLayoutPath($options);
- } elseif (is_array($options) || $options instanceof Zend_Config) {
- self::$_mvcInstance->setOptions($options);
- }
- }
- return self::$_mvcInstance;
- }
- /**
- * Retrieve MVC instance of Zend_Layout object
- *
- * @return Zend_Layout|null
- */
- public static function getMvcInstance()
- {
- return self::$_mvcInstance;
- }
- /**
- * Reset MVC instance
- *
- * Unregisters plugins and helpers, and destroys MVC layout instance.
- *
- * @return void
- */
- public static function resetMvcInstance()
- {
- if (null !== self::$_mvcInstance) {
- $layout = self::$_mvcInstance;
- $pluginClass = $layout->getPluginClass();
- $front = Zend_Controller_Front::getInstance();
- if ($front->hasPlugin($pluginClass)) {
- $front->unregisterPlugin($pluginClass);
- }
- if (Zend_Controller_Action_HelperBroker::hasHelper('layout')) {
- Zend_Controller_Action_HelperBroker::removeHelper('layout');
- }
- unset($layout);
- self::$_mvcInstance = null;
- }
- }
- /**
- * Set options en masse
- *
- * @param array|Zend_Config $options
- * @return void
- */
- public function setOptions($options)
- {
- if ($options instanceof Zend_Config) {
- $options = $options->toArray();
- } elseif (!is_array($options)) {
- require_once 'Zend/Layout/Exception.php';
- throw new Zend_Layout_Exception('setOptions() expects either an array or a Zend_Config object');
- }
- foreach ($options as $key => $value) {
- $method = 'set' . ucfirst($key);
- if (method_exists($this, $method)) {
- $this->$method($value);
- }
- }
- }
- /**
- * Initialize MVC integration
- *
- * @return void
- */
- protected function _initMvc()
- {
- $this->_initPlugin();
- $this->_initHelper();
- }
- /**
- * Initialize front controller plugin
- *
- * @return void
- */
- protected function _initPlugin()
- {
- $pluginClass = $this->getPluginClass();
- require_once 'Zend/Controller/Front.php';
- $front = Zend_Controller_Front::getInstance();
- if (!$front->hasPlugin($pluginClass)) {
- if (!class_exists($pluginClass)) {
- require_once 'Zend/Loader.php';
- Zend_Loader::loadClass($pluginClass);
- }
- $front->registerPlugin(
- // register to run last | BUT before the ErrorHandler (if its available)
- new $pluginClass($this),
- 99
- );
- }
- }
- /**
- * Initialize action helper
- *
- * @return void
- */
- protected function _initHelper()
- {
- $helperClass = $this->getHelperClass();
- require_once 'Zend/Controller/Action/HelperBroker.php';
- if (!Zend_Controller_Action_HelperBroker::hasHelper('layout')) {
- if (!class_exists($helperClass)) {
- require_once 'Zend/Loader.php';
- Zend_Loader::loadClass($helperClass);
- }
- Zend_Controller_Action_HelperBroker::getStack()->offsetSet(-90, new $helperClass($this));
- }
- }
- /**
- * Set options from a config object
- *
- * @param Zend_Config $config
- * @return Zend_Layout
- */
- public function setConfig(Zend_Config $config)
- {
- $this->setOptions($config->toArray());
- return $this;
- }
- /**
- * Initialize placeholder container for layout vars
- *
- * @return Zend_View_Helper_Placeholder_Container
- */
- protected function _initVarContainer()
- {
- if (null === $this->_container) {
- require_once 'Zend/View/Helper/Placeholder/Registry.php';
- $this->_container = Zend_View_Helper_Placeholder_Registry::getRegistry()->getContainer(__CLASS__);
- }
- return $this->_container;
- }
- /**
- * Set layout script to use
- *
- * Note: enables layout by default, can be disabled
- *
- * @param string $name
- * @param boolean $enabled
- * @return Zend_Layout
- */
- public function setLayout($name, $enabled = true)
- {
- $this->_layout = (string) $name;
- if ($enabled) {
- $this->enableLayout();
- }
- return $this;
- }
- /**
- * Get current layout script
- *
- * @return string
- */
- public function getLayout()
- {
- return $this->_layout;
- }
- /**
- * Disable layout
- *
- * @return Zend_Layout
- */
- public function disableLayout()
- {
- $this->_enabled = false;
- return $this;
- }
- /**
- * Enable layout
- *
- * @return Zend_Layout
- */
- public function enableLayout()
- {
- $this->_enabled = true;
- return $this;
- }
- /**
- * Is layout enabled?
- *
- * @return bool
- */
- public function isEnabled()
- {
- return $this->_enabled;
- }
- public function setViewBasePath($path, $prefix = 'Layout_View')
- {
- $this->_viewBasePath = $path;
- $this->_viewBasePrefix = $prefix;
- return $this;
- }
- public function getViewBasePath()
- {
- return $this->_viewBasePath;
- }
- public function setViewScriptPath($path)
- {
- $this->_viewScriptPath = $path;
- return $this;
- }
- public function getViewScriptPath()
- {
- return $this->_viewScriptPath;
- }
- /**
- * Set layout script path
- *
- * @param string $path
- * @return Zend_Layout
- */
- public function setLayoutPath($path)
- {
- return $this->setViewScriptPath($path);
- }
- /**
- * Get current layout script path
- *
- * @return string
- */
- public function getLayoutPath()
- {
- return $this->getViewScriptPath();
- }
- /**
- * Set content key
- *
- * Key in namespace container denoting default content
- *
- * @param string $contentKey
- * @return Zend_Layout
- */
- public function setContentKey($contentKey)
- {
- $this->_contentKey = (string) $contentKey;
- return $this;
- }
- /**
- * Retrieve content key
- *
- * @return string
- */
- public function getContentKey()
- {
- return $this->_contentKey;
- }
- /**
- * Set MVC enabled flag
- *
- * @param bool $mvcEnabled
- * @return Zend_Layout
- */
- protected function _setMvcEnabled($mvcEnabled)
- {
- $this->_mvcEnabled = ($mvcEnabled) ? true : false;
- return $this;
- }
- /**
- * Retrieve MVC enabled flag
- *
- * @return bool
- */
- public function getMvcEnabled()
- {
- return $this->_mvcEnabled;
- }
- /**
- * Set MVC Successful Action Only flag
- *
- * @param bool $successfulActionOnly
- * @return Zend_Layout
- */
- public function setMvcSuccessfulActionOnly($successfulActionOnly)
- {
- $this->_mvcSuccessfulActionOnly = ($successfulActionOnly) ? true : false;
- return $this;
- }
- /**
- * Get MVC Successful Action Only Flag
- *
- * @return bool
- */
- public function getMvcSuccessfulActionOnly()
- {
- return $this->_mvcSuccessfulActionOnly;
- }
- /**
- * Set view object
- *
- * @param Zend_View_Interface $view
- * @return Zend_Layout
- */
- public function setView(Zend_View_Interface $view)
- {
- $this->_view = $view;
- return $this;
- }
- /**
- * Retrieve helper class
- *
- * @return string
- */
- public function getHelperClass()
- {
- return $this->_helperClass;
- }
- /**
- * Set helper class
- *
- * @param string $helperClass
- * @return Zend_Layout
- */
- public function setHelperClass($helperClass)
- {
- $this->_helperClass = (string) $helperClass;
- return $this;
- }
- /**
- * Retrieve plugin class
- *
- * @return string
- */
- public function getPluginClass()
- {
- return $this->_pluginClass;
- }
- /**
- * Set plugin class
- *
- * @param string $pluginClass
- * @return Zend_Layout
- */
- public function setPluginClass($pluginClass)
- {
- $this->_pluginClass = (string) $pluginClass;
- return $this;
- }
- /**
- * Get current view object
- *
- * If no view object currently set, retrieves it from the ViewRenderer.
- *
- * @todo Set inflector from view renderer at same time
- * @return Zend_View_Interface
- */
- public function getView()
- {
- if (null === $this->_view) {
- require_once 'Zend/Controller/Action/HelperBroker.php';
- $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
- if (null === $viewRenderer->view) {
- $viewRenderer->initView();
- }
- $this->setView($viewRenderer->view);
- }
- return $this->_view;
- }
- /**
- * Set layout view script suffix
- *
- * @param string $viewSuffix
- * @return Zend_Layout
- */
- public function setViewSuffix($viewSuffix)
- {
- $this->_viewSuffix = (string) $viewSuffix;
- return $this;
- }
- /**
- * Retrieve layout view script suffix
- *
- * @return string
- */
- public function getViewSuffix()
- {
- return $this->_viewSuffix;
- }
- /**
- * Retrieve inflector target
- *
- * @return string
- */
- public function getInflectorTarget()
- {
- return $this->_inflectorTarget;
- }
- /**
- * Set inflector target
- *
- * @param string $inflectorTarget
- * @return Zend_Layout
- */
- public function setInflectorTarget($inflectorTarget)
- {
- $this->_inflectorTarget = (string) $inflectorTarget;
- return $this;
- }
- /**
- * Set inflector to use when resolving layout names
- *
- * @param Zend_Filter_Inflector $inflector
- * @return Zend_Layout
- */
- public function setInflector(Zend_Filter_Inflector $inflector)
- {
- $this->_inflector = $inflector;
- return $this;
- }
- /**
- * Retrieve inflector
- *
- * @return Zend_Filter_Inflector
- */
- public function getInflector()
- {
- if (null === $this->_inflector) {
- require_once 'Zend/Filter/Inflector.php';
- $inflector = new Zend_Filter_Inflector();
- $inflector->setTargetReference($this->_inflectorTarget)
- ->addRules(array(':script' => array('Word_CamelCaseToDash', 'StringToLower')))
- ->setStaticRuleReference('suffix', $this->_viewSuffix);
- $this->setInflector($inflector);
- }
- return $this->_inflector;
- }
- /**
- * Enable inflector
- *
- * @return Zend_Layout
- */
- public function enableInflector()
- {
- $this->_inflectorEnabled = true;
- return $this;
- }
- /**
- * Disable inflector
- *
- * @return Zend_Layout
- */
- public function disableInflector()
- {
- $this->_inflectorEnabled = false;
- return $this;
- }
- /**
- * Return status of inflector enabled flag
- *
- * @return bool
- */
- public function inflectorEnabled()
- {
- return $this->_inflectorEnabled;
- }
- /**
- * Set layout variable
- *
- * @param string $key
- * @param mixed $value
- * @return void
- */
- public function __set($key, $value)
- {
- $this->_container[$key] = $value;
- }
- /**
- * Get layout variable
- *
- * @param string $key
- * @return mixed
- */
- public function __get($key)
- {
- if (isset($this->_container[$key])) {
- return $this->_container[$key];
- }
- return null;
- }
- /**
- * Is a layout variable set?
- *
- * @param string $key
- * @return bool
- */
- public function __isset($key)
- {
- return (isset($this->_container[$key]));
- }
- /**
- * Unset a layout variable?
- *
- * @param string $key
- * @return void
- */
- public function __unset($key)
- {
- if (isset($this->_container[$key])) {
- unset($this->_container[$key]);
- }
- }
- /**
- * Assign one or more layout variables
- *
- * @param mixed $spec Assoc array or string key; if assoc array, sets each
- * key as a layout variable
- * @param mixed $value Value if $spec is a key
- * @return Zend_Layout
- * @throws Zend_Layout_Exception if non-array/string value passed to $spec
- */
- public function assign($spec, $value = null)
- {
- if (is_array($spec)) {
- $orig = $this->_container->getArrayCopy();
- $merged = array_merge($orig, $spec);
- $this->_container->exchangeArray($merged);
- return $this;
- }
- if (is_string($spec)) {
- $this->_container[$spec] = $value;
- return $this;
- }
- require_once 'Zend/Layout/Exception.php';
- throw new Zend_Layout_Exception('Invalid values passed to assign()');
- }
- /**
- * Render layout
- *
- * Sets internal script path as last path on script path stack, assigns
- * layout variables to view, determines layout name using inflector, and
- * renders layout view script.
- *
- * $name will be passed to the inflector as the key 'script'.
- *
- * @param mixed $name
- * @return mixed
- */
- public function render($name = null)
- {
- if (null === $name) {
- $name = $this->getLayout();
- }
- if ($this->inflectorEnabled() && (null !== ($inflector = $this->getInflector())))
- {
- $name = $this->_inflector->filter(array('script' => $name));
- }
- $view = $this->getView();
- if (null !== ($path = $this->getViewScriptPath())) {
- if (method_exists($view, 'addScriptPath')) {
- $view->addScriptPath($path);
- } else {
- $view->setScriptPath($path);
- }
- } elseif (null !== ($path = $this->getViewBasePath())) {
- $view->addBasePath($path, $this->_viewBasePrefix);
- }
- return $view->render($name);
- }
- }
|