/library/Zend/Controller/Action/Helper/ContextSwitch.php
PHP | 1394 lines | 739 code | 147 blank | 508 comment | 113 complexity | aa70dddba420c3e73c478c5af2d1ad5c MD5 | raw file
Possible License(s): BSD-3-Clause
- <?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_Controller
- * @subpackage Zend_Controller_Action_Helper
- * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
- * @license http://framework.zend.com/license/new-bsd New BSD License
- * @version $Id: ContextSwitch.php 12811 2008-11-24 20:44:26Z matthew $
- */
- /**
- * @see Zend_Controller_Action_Helper_Abstract
- */
- require_once 'Zend/Controller/Action/Helper/Abstract.php';
- /**
- * Simplify context switching based on requested format
- *
- * @uses Zend_Controller_Action_Helper_Abstract
- * @category Zend
- * @package Zend_Controller
- * @subpackage Zend_Controller_Action_Helper
- * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
- * @license http://framework.zend.com/license/new-bsd New BSD License
- */
- class Zend_Controller_Action_Helper_ContextSwitch extends Zend_Controller_Action_Helper_Abstract
- {
- /**
- * Trigger type constants
- */
- const TRIGGER_INIT = 'TRIGGER_INIT';
- const TRIGGER_POST = 'TRIGGER_POST';
- /**
- * Supported contexts
- * @var array
- */
- protected $_contexts = array();
- /**
- * JSON auto-serialization flag
- * @var boolean
- */
- protected $_autoJsonSerialization = true;
- /**
- * Controller property key to utilize for context switching
- * @var string
- */
- protected $_contextKey = 'contexts';
- /**
- * Request parameter containing requested context
- * @var string
- */
- protected $_contextParam = 'format';
- /**
- * Current context
- * @var string
- */
- protected $_currentContext;
- /**
- * Default context (xml)
- * @var string
- */
- protected $_defaultContext = 'xml';
- /**
- * Whether or not to disable layouts when switching contexts
- * @var boolean
- */
- protected $_disableLayout = true;
- /**
- * Methods that require special configuration
- * @var array
- */
- protected $_specialConfig = array(
- 'setSuffix',
- 'setHeaders',
- 'setCallbacks',
- );
- /**
- * Methods that are not configurable via setOptions and setConfig
- * @var array
- */
- protected $_unconfigurable = array(
- 'setOptions',
- 'setConfig',
- 'setHeader',
- 'setCallback',
- 'setContext',
- 'setActionContext',
- 'setActionContexts',
- );
- /**
- * @var Zend_Controller_Action_Helper_ViewRenderer
- */
- protected $_viewRenderer;
- /**
- * Original view suffix prior to detecting context switch
- * @var string
- */
- protected $_viewSuffixOrig;
- /**
- * Constructor
- *
- * @param array|Zend_Config $options
- * @return void
- */
- public function __construct($options = null)
- {
- if ($options instanceof Zend_Config) {
- $this->setConfig($options);
- } elseif (is_array($options)) {
- $this->setOptions($options);
- }
- if (empty($this->_contexts)) {
- $this->addContexts(array(
- 'json' => array(
- 'suffix' => 'json',
- 'headers' => array('Content-Type' => 'application/json'),
- 'callbacks' => array(
- 'init' => 'initJsonContext',
- 'post' => 'postJsonContext'
- )
- ),
- 'xml' => array(
- 'suffix' => 'xml',
- 'headers' => array('Content-Type' => 'application/xml'),
- )
- ));
- }
- $this->init();
- }
- /**
- * Initialize at start of action controller
- *
- * Reset the view script suffix to the original state, or store the
- * original state.
- *
- * @return void
- */
- public function init()
- {
- if (null === $this->_viewSuffixOrig) {
- $this->_viewSuffixOrig = $this->_getViewRenderer()->getViewSuffix();
- } else {
- $this->_getViewRenderer()->setViewSuffix($this->_viewSuffixOrig);
- }
- }
- /**
- * Configure object from array of options
- *
- * @param array $options
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setOptions(array $options)
- {
- if (isset($options['contexts'])) {
- $this->setContexts($options['contexts']);
- unset($options['contexts']);
- }
- foreach ($options as $key => $value) {
- $method = 'set' . ucfirst($key);
- if (in_array($method, $this->_unconfigurable)) {
- continue;
- }
- if (in_array($method, $this->_specialConfig)) {
- $method = '_' . $method;
- }
- if (method_exists($this, $method)) {
- $this->$method($value);
- }
- }
- return $this;
- }
- /**
- * Set object state from config object
- *
- * @param Zend_Config $config
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setConfig(Zend_Config $config)
- {
- return $this->setOptions($config->toArray());
- }
- /**
- * Strategy pattern: return object
- *
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function direct()
- {
- return $this;
- }
- /**
- * Initialize context detection and switching
- *
- * @param mixed $format
- * @throws Zend_Controller_Action_Exception
- * @return void
- */
- public function initContext($format = null)
- {
- $this->_currentContext = null;
- $controller = $this->getActionController();
- $request = $this->getRequest();
- $action = $request->getActionName();
- // Return if no context switching enabled, or no context switching
- // enabled for this action
- $contexts = $this->getActionContexts($action);
- if (empty($contexts)) {
- return;
- }
- // Return if no context parameter provided
- if (!$context = $request->getParam($this->getContextParam())) {
- if ($format === null) {
- return;
- }
- $context = $format;
- $format = null;
- }
- // Check if context allowed by action controller
- if (!$this->hasActionContext($action, $context)) {
- return;
- }
- // Return if invalid context parameter provided and no format or invalid
- // format provided
- if (!$this->hasContext($context)) {
- if (empty($format) || !$this->hasContext($format)) {
- return;
- }
- }
- // Use provided format if passed
- if (!empty($format) && $this->hasContext($format)) {
- $context = $format;
- }
- $suffix = $this->getSuffix($context);
- $this->_getViewRenderer()->setViewSuffix($suffix);
- $headers = $this->getHeaders($context);
- if (!empty($headers)) {
- $response = $this->getResponse();
- foreach ($headers as $header => $content) {
- $response->setHeader($header, $content);
- }
- }
- if ($this->getAutoDisableLayout()) {
- /**
- * @see Zend_Layout
- */
- require_once 'Zend/Layout.php';
- $layout = Zend_Layout::getMvcInstance();
- if (null !== $layout) {
- $layout->disableLayout();
- }
- }
- if (null !== ($callback = $this->getCallback($context, self::TRIGGER_INIT))) {
- if (is_string($callback) && method_exists($this, $callback)) {
- $this->$callback();
- } elseif (is_string($callback) && function_exists($callback)) {
- $callback();
- } elseif (is_array($callback)) {
- call_user_func($callback);
- } else {
- /**
- * @see Zend_Controller_Action_Exception
- */
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception(sprintf('Invalid context callback registered for context "%s"', $context));
- }
- }
- $this->_currentContext = $context;
- }
- /**
- * JSON context extra initialization
- *
- * Turns off viewRenderer auto-rendering
- *
- * @return void
- */
- public function initJsonContext()
- {
- if (!$this->getAutoJsonSerialization()) {
- return;
- }
- $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
- $view = $viewRenderer->view;
- if ($view instanceof Zend_View_Interface) {
- $viewRenderer->setNoRender(true);
- }
- }
- /**
- * Should JSON contexts auto-serialize?
- *
- * @param boolean $flag
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setAutoJsonSerialization($flag)
- {
- $this->_autoJsonSerialization = (bool) $flag;
- return $this;
- }
- /**
- * Get JSON context auto-serialization flag
- *
- * @return boolean
- */
- public function getAutoJsonSerialization()
- {
- return $this->_autoJsonSerialization;
- }
- /**
- * Set suffix from array
- *
- * @param array $spec
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- protected function _setSuffix(array $spec)
- {
- foreach ($spec as $context => $suffixInfo) {
- if (!is_string($context)) {
- $context = null;
- }
- if (is_string($suffixInfo)) {
- $this->setSuffix($context, $suffixInfo);
- continue;
- } elseif (is_array($suffixInfo)) {
- if (isset($suffixInfo['suffix'])) {
- $suffix = $suffixInfo['suffix'];
- $prependViewRendererSuffix = true;
- if ((null === $context) && isset($suffixInfo['context'])) {
- $context = $suffixInfo['context'];
- }
- if (isset($suffixInfo['prependViewRendererSuffix'])) {
- $prependViewRendererSuffix = $suffixInfo['prependViewRendererSuffix'];
- }
- $this->setSuffix($context, $suffix, $prependViewRendererSuffix);
- continue;
- }
- $count = count($suffixInfo);
- switch (true) {
- case (($count < 2) && (null === $context)):
- /**
- * @see Zend_Controller_Action_Exception
- */
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception('Invalid suffix information provided in config');
- case ($count < 2):
- $suffix = array_shift($suffixInfo);
- $this->setSuffix($context, $suffix);
- break;
- case (($count < 3) && (null === $context)):
- $context = array_shift($suffixInfo);
- $suffix = array_shift($suffixInfo);
- $this->setSuffix($context, $suffix);
- break;
- case (($count == 3) && (null === $context)):
- $context = array_shift($suffixInfo);
- $suffix = array_shift($suffixInfo);
- $prependViewRendererSuffix = array_shift($suffixInfo);
- $this->setSuffix($context, $suffix, $prependViewRendererSuffix);
- break;
- case ($count >= 2):
- $suffix = array_shift($suffixInfo);
- $prependViewRendererSuffix = array_shift($suffixInfo);
- $this->setSuffix($context, $suffix, $prependViewRendererSuffix);
- break;
- }
- }
- }
- return $this;
- }
- /**
- * Customize view script suffix to use when switching context.
- *
- * Passing an empty suffix value to the setters disables the view script
- * suffix change.
- *
- * @param string $context Context type for which to set suffix
- * @param string $suffix Suffix to use
- * @param boolean $prependViewRendererSuffix Whether or not to prepend the new suffix to the viewrenderer suffix
- * @throws Zend_Controller_Action_Exception
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setSuffix($context, $suffix, $prependViewRendererSuffix = true)
- {
- if (!isset($this->_contexts[$context])) {
- /**
- * @see Zend_Controller_Action_Exception
- */
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception(sprintf('Cannot set suffix; invalid context type "%s"', $context));
- }
- if (empty($suffix)) {
- $suffix = '';
- }
- if (is_array($suffix)) {
- if (isset($suffix['prependViewRendererSuffix'])) {
- $prependViewRendererSuffix = $suffix['prependViewRendererSuffix'];
- }
- if (isset($suffix['suffix'])) {
- $suffix = $suffix['suffix'];
- } else {
- $suffix = '';
- }
- }
- $suffix = (string) $suffix;
- if ($prependViewRendererSuffix) {
- if (empty($suffix)) {
- $suffix = $this->_getViewRenderer()->getViewSuffix();
- } else {
- $suffix .= '.' . $this->_getViewRenderer()->getViewSuffix();
- }
- }
- $this->_contexts[$context]['suffix'] = $suffix;
- return $this;
- }
- /**
- * Retrieve suffix for given context type
- *
- * @param string $type Context type
- * @throws Zend_Controller_Action_Exception
- * @return string
- */
- public function getSuffix($type)
- {
- if (!isset($this->_contexts[$type])) {
- /**
- * @see Zend_Controller_Action_Exception
- */
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception(sprintf('Cannot retrieve suffix; invalid context type "%s"', $type));
- }
- return $this->_contexts[$type]['suffix'];
- }
- /**
- * Does the given context exist?
- *
- * @param string $context
- * @param boolean $throwException
- * @throws Zend_Controller_Action_Exception if context does not exist and throwException is true
- * @return bool
- */
- public function hasContext($context, $throwException = false)
- {
- if (is_string($context)) {
- if (isset($this->_contexts[$context])) {
- return true;
- }
- } elseif (is_array($context)) {
- $error = false;
- foreach ($context as $test) {
- if (!isset($this->_contexts[$test])) {
- $error = (string) $test;
- break;
- }
- }
- if (false === $error) {
- return true;
- }
- $context = $error;
- } elseif (true === $context) {
- return true;
- }
- if ($throwException) {
- /**
- * @see Zend_Controller_Action_Exception
- */
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception(sprintf('Context "%s" does not exist', $context));
- }
- return false;
- }
- /**
- * Add header to context
- *
- * @param string $context
- * @param string $header
- * @param string $content
- * @throws Zend_Controller_Action_Exception
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function addHeader($context, $header, $content)
- {
- $context = (string) $context;
- $this->hasContext($context, true);
- $header = (string) $header;
- $content = (string) $content;
- if (isset($this->_contexts[$context]['headers'][$header])) {
- /**
- * @see Zend_Controller_Action_Exception
- */
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception(sprintf('Cannot add "%s" header to context "%s": already exists', $header, $context));
- }
- $this->_contexts[$context]['headers'][$header] = $content;
- return $this;
- }
- /**
- * Customize response header to use when switching context
- *
- * Passing an empty header value to the setters disables the response
- * header.
- *
- * @param string $type Context type for which to set suffix
- * @param string $header Header to set
- * @param string $content Header content
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setHeader($context, $header, $content)
- {
- $this->hasContext($context, true);
- $context = (string) $context;
- $header = (string) $header;
- $content = (string) $content;
- $this->_contexts[$context]['headers'][$header] = $content;
- return $this;
- }
- /**
- * Add multiple headers at once for a given context
- *
- * @param string $context
- * @param array $headers
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function addHeaders($context, array $headers)
- {
- foreach ($headers as $header => $content) {
- $this->addHeader($context, $header, $content);
- }
- return $this;
- }
- /**
- * Set headers from context => headers pairs
- *
- * @param array $options
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- protected function _setHeaders(array $options)
- {
- foreach ($options as $context => $headers) {
- if (!is_array($headers)) {
- continue;
- }
- $this->setHeaders($context, $headers);
- }
- return $this;
- }
- /**
- * Set multiple headers at once for a given context
- *
- * @param string $context
- * @param array $headers
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setHeaders($context, array $headers)
- {
- $this->clearHeaders($context);
- foreach ($headers as $header => $content) {
- $this->setHeader($context, $header, $content);
- }
- return $this;
- }
- /**
- * Retrieve context header
- *
- * Returns the value of a given header for a given context type
- *
- * @param string $context
- * @param string $header
- * @return string|null
- */
- public function getHeader($context, $header)
- {
- $this->hasContext($context, true);
- $context = (string) $context;
- $header = (string) $header;
- if (isset($this->_contexts[$context]['headers'][$header])) {
- return $this->_contexts[$context]['headers'][$header];
- }
- return null;
- }
- /**
- * Retrieve context headers
- *
- * Returns all headers for a context as key/value pairs
- *
- * @param string $context
- * @return array
- */
- public function getHeaders($context)
- {
- $this->hasContext($context, true);
- $context = (string) $context;
- return $this->_contexts[$context]['headers'];
- }
- /**
- * Remove a single header from a context
- *
- * @param string $context
- * @param string $header
- * @return boolean
- */
- public function removeHeader($context, $header)
- {
- $this->hasContext($context, true);
- $context = (string) $context;
- $header = (string) $header;
- if (isset($this->_contexts[$context]['headers'][$header])) {
- unset($this->_contexts[$context]['headers'][$header]);
- return true;
- }
- return false;
- }
- /**
- * Clear all headers for a given context
- *
- * @param string $context
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function clearHeaders($context)
- {
- $this->hasContext($context, true);
- $context = (string) $context;
- $this->_contexts[$context]['headers'] = array();
- return $this;
- }
- /**
- * Validate trigger and return in normalized form
- *
- * @param string $trigger
- * @throws Zend_Controller_Action_Exception
- * @return string
- */
- protected function _validateTrigger($trigger)
- {
- $trigger = strtoupper($trigger);
- if ('TRIGGER_' !== substr($trigger, 0, 8)) {
- $trigger = 'TRIGGER_' . $trigger;
- }
- if (!in_array($trigger, array(self::TRIGGER_INIT, self::TRIGGER_POST))) {
- /**
- * @see Zend_Controller_Action_Exception
- */
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception(sprintf('Invalid trigger "%s"', $trigger));
- }
- return $trigger;
- }
- /**
- * Set a callback for a given context and trigger
- *
- * @param string $context
- * @param string $trigger
- * @param string|array $callback
- * @throws Zend_Controller_Action_Exception
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setCallback($context, $trigger, $callback)
- {
- $this->hasContext($context, true);
- $trigger = $this->_validateTrigger($trigger);
- if (!is_string($callback)) {
- if (!is_array($callback) || (2 != count($callback))) {
- /**
- * @see Zend_Controller_Action_Exception
- */
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception('Invalid callback specified');
- }
- }
- $this->_contexts[$context]['callbacks'][$trigger] = $callback;
- return $this;
- }
- /**
- * Set callbacks from array of context => callbacks pairs
- *
- * @param array $options
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- protected function _setCallbacks(array $options)
- {
- foreach ($options as $context => $callbacks) {
- if (!is_array($callbacks)) {
- continue;
- }
- $this->setCallbacks($context, $callbacks);
- }
- return $this;
- }
- /**
- * Set callbacks for a given context
- *
- * Callbacks should be in trigger/callback pairs.
- *
- * @param string $context
- * @param array $callbacks
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setCallbacks($context, array $callbacks)
- {
- $this->hasContext($context, true);
- $context = (string) $context;
- if (!isset($this->_contexts[$context]['callbacks'])) {
- $this->_contexts[$context]['callbacks'] = array();
- }
- foreach ($callbacks as $trigger => $callback) {
- $this->setCallback($context, $trigger, $callback);
- }
- return $this;
- }
- /**
- * Get a single callback for a given context and trigger
- *
- * @param string $context
- * @param string $trigger
- * @return string|array|null
- */
- public function getCallback($context, $trigger)
- {
- $this->hasContext($context, true);
- $trigger = $this->_validateTrigger($trigger);
- if (isset($this->_contexts[$context]['callbacks'][$trigger])) {
- return $this->_contexts[$context]['callbacks'][$trigger];
- }
- return null;
- }
- /**
- * Get all callbacks for a given context
- *
- * @param string $context
- * @return array
- */
- public function getCallbacks($context)
- {
- $this->hasContext($context, true);
- return $this->_contexts[$context]['callbacks'];
- }
- /**
- * Clear a callback for a given context and trigger
- *
- * @param string $context
- * @param string $trigger
- * @return boolean
- */
- public function removeCallback($context, $trigger)
- {
- $this->hasContext($context, true);
- $trigger = $this->_validateTrigger($trigger);
- if (isset($this->_contexts[$context]['callbacks'][$trigger])) {
- unset($this->_contexts[$context]['callbacks'][$trigger]);
- return true;
- }
- return false;
- }
- /**
- * Clear all callbacks for a given context
- *
- * @param string $context
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function clearCallbacks($context)
- {
- $this->hasContext($context, true);
- $this->_contexts[$context]['callbacks'] = array();
- return $this;
- }
- /**
- * Set name of parameter to use when determining context format
- *
- * @param string $name
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setContextParam($name)
- {
- $this->_contextParam = (string) $name;
- return $this;
- }
- /**
- * Return context format request parameter name
- *
- * @return string
- */
- public function getContextParam()
- {
- return $this->_contextParam;
- }
- /**
- * Indicate default context to use when no context format provided
- *
- * @param string $type
- * @throws Zend_Controller_Action_Exception
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setDefaultContext($type)
- {
- if (!isset($this->_contexts[$type])) {
- /**
- * @see Zend_Controller_Action_Exception
- */
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception(sprintf('Cannot set default context; invalid context type "%s"', $type));
- }
- $this->_defaultContext = $type;
- return $this;
- }
- /**
- * Return default context
- *
- * @return string
- */
- public function getDefaultContext()
- {
- return $this->_defaultContext;
- }
- /**
- * Set flag indicating if layout should be disabled
- *
- * @param boolean $flag
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setAutoDisableLayout($flag)
- {
- $this->_disableLayout = ($flag) ? true : false;
- return $this;
- }
- /**
- * Retrieve auto layout disable flag
- *
- * @return boolean
- */
- public function getAutoDisableLayout()
- {
- return $this->_disableLayout;
- }
- /**
- * Add new context
- *
- * @param string $context Context type
- * @param array $spec Context specification
- * @throws Zend_Controller_Action_Exception
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function addContext($context, array $spec)
- {
- if ($this->hasContext($context)) {
- /**
- * @see Zend_Controller_Action_Exception
- */
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception(sprintf('Cannot add context "%s"; already exists', $context));
- }
- $context = (string) $context;
- $this->_contexts[$context] = array();
- $this->setSuffix($context, (isset($spec['suffix']) ? $spec['suffix'] : ''))
- ->setHeaders($context, (isset($spec['headers']) ? $spec['headers'] : array()))
- ->setCallbacks($context, (isset($spec['callbacks']) ? $spec['callbacks'] : array()));
- return $this;
- }
- /**
- * Overwrite existing context
- *
- * @param string $context Context type
- * @param array $spec Context specification
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setContext($context, array $spec)
- {
- $this->removeContext($context);
- return $this->addContext($context, $spec);
- }
- /**
- * Add multiple contexts
- *
- * @param array $contexts
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function addContexts(array $contexts)
- {
- foreach ($contexts as $context => $spec) {
- $this->addContext($context, $spec);
- }
- return $this;
- }
- /**
- * Set multiple contexts, after first removing all
- *
- * @param array $contexts
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setContexts(array $contexts)
- {
- $this->clearContexts();
- foreach ($contexts as $context => $spec) {
- $this->addContext($context, $spec);
- }
- return $this;
- }
- /**
- * Retrieve context specification
- *
- * @param string $context
- * @return array|null
- */
- public function getContext($context)
- {
- if ($this->hasContext($context)) {
- return $this->_contexts[(string) $context];
- }
- return null;
- }
- /**
- * Retrieve context definitions
- *
- * @return array
- */
- public function getContexts()
- {
- return $this->_contexts;
- }
- /**
- * Remove a context
- *
- * @param string $context
- * @return boolean
- */
- public function removeContext($context)
- {
- if ($this->hasContext($context)) {
- unset($this->_contexts[(string) $context]);
- return true;
- }
- return false;
- }
- /**
- * Remove all contexts
- *
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function clearContexts()
- {
- $this->_contexts = array();
- return $this;
- }
- /**
- * Return current context, if any
- *
- * @return null|string
- */
- public function getCurrentContext()
- {
- return $this->_currentContext;
- }
- /**
- * Post dispatch processing
- *
- * Execute postDispatch callback for current context, if available
- *
- * @throws Zend_Controller_Action_Exception
- * @return void
- */
- public function postDispatch()
- {
- $context = $this->getCurrentContext();
- if (null !== $context) {
- if (null !== ($callback = $this->getCallback($context, self::TRIGGER_POST))) {
- if (is_string($callback) && method_exists($this, $callback)) {
- $this->$callback();
- } elseif (is_string($callback) && function_exists($callback)) {
- $callback();
- } elseif (is_array($callback)) {
- call_user_func($callback);
- } else {
- /**
- * @see Zend_Controller_Action_Exception
- */
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception(sprintf('Invalid postDispatch context callback registered for context "%s"', $context));
- }
- }
- }
- }
- /**
- * JSON post processing
- *
- * JSON serialize view variables to response body
- *
- * @return void
- */
- public function postJsonContext()
- {
- if (!$this->getAutoJsonSerialization()) {
- return;
- }
- $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
- $view = $viewRenderer->view;
- if ($view instanceof Zend_View_Interface) {
- /**
- * @see Zend_Json
- */
- if(method_exists($view, 'getVars')) {
- require_once 'Zend/Json.php';
- $vars = Zend_Json::encode($view->getVars());
- $this->getResponse()->setBody($vars);
- } else {
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception('View does not implement the getVars() method needed to encode the view into JSON');
- }
- }
- }
- /**
- * Add one or more contexts to an action
- *
- * @param string $action
- * @param string|array $context
- * @return Zend_Controller_Action_Helper_ContextSwitch|void Provides a fluent interface
- */
- public function addActionContext($action, $context)
- {
- $this->hasContext($context, true);
- $controller = $this->getActionController();
- if (null === $controller) {
- return;
- }
- $action = (string) $action;
- $contextKey = $this->_contextKey;
- if (!isset($controller->$contextKey)) {
- $controller->$contextKey = array();
- }
- if (true === $context) {
- $contexts = $this->getContexts();
- $controller->{$contextKey}[$action] = array_keys($contexts);
- return $this;
- }
- $context = (array) $context;
- if (!isset($controller->{$contextKey}[$action])) {
- $controller->{$contextKey}[$action] = $context;
- } else {
- $controller->{$contextKey}[$action] = array_merge(
- $controller->{$contextKey}[$action],
- $context
- );
- }
- return $this;
- }
- /**
- * Set a context as available for a given controller action
- *
- * @param string $action
- * @param string|array $context
- * @return Zend_Controller_Action_Helper_ContextSwitch|void Provides a fluent interface
- */
- public function setActionContext($action, $context)
- {
- $this->hasContext($context, true);
- $controller = $this->getActionController();
- if (null === $controller) {
- return;
- }
- $action = (string) $action;
- $contextKey = $this->_contextKey;
- if (!isset($controller->$contextKey)) {
- $controller->$contextKey = array();
- }
- if (true === $context) {
- $contexts = $this->getContexts();
- $controller->{$contextKey}[$action] = array_keys($contexts);
- } else {
- $controller->{$contextKey}[$action] = (array) $context;
- }
- return $this;
- }
- /**
- * Add multiple action/context pairs at once
- *
- * @param array $contexts
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function addActionContexts(array $contexts)
- {
- foreach ($contexts as $action => $context) {
- $this->addActionContext($action, $context);
- }
- return $this;
- }
- /**
- * Overwrite and set multiple action contexts at once
- *
- * @param array $contexts
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function setActionContexts(array $contexts)
- {
- foreach ($contexts as $action => $context) {
- $this->setActionContext($action, $context);
- }
- return $this;
- }
- /**
- * Does a particular controller action have the given context(s)?
- *
- * @param string $action
- * @param string|array $context
- * @throws Zend_Controller_Action_Exception
- * @return boolean
- */
- public function hasActionContext($action, $context)
- {
- $this->hasContext($context, true);
- $controller = $this->getActionController();
- if (null === $controller) {
- return false;
- }
- $action = (string) $action;
- $contextKey = $this->_contextKey;
- if (!isset($controller->{$contextKey})) {
- return false;
- }
- $allContexts = $controller->{$contextKey};
- if (!is_array($allContexts)) {
- /**
- * @see Zend_Controller_Action_Exception
- */
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception("Invalid contexts found for controller");
- }
- if (!isset($allContexts[$action])) {
- return false;
- }
- if (true === $allContexts[$action]) {
- return true;
- }
- $contexts = $allContexts[$action];
- if (!is_array($contexts)) {
- /**
- * @see Zend_Controller_Action_Exception
- */
- require_once 'Zend/Controller/Action/Exception.php';
- throw new Zend_Controller_Action_Exception(sprintf("Invalid contexts found for action '%s'", $action));
- }
- if (is_string($context) && in_array($context, $contexts)) {
- return true;
- } elseif (is_array($context)) {
- $found = true;
- foreach ($context as $test) {
- if (!in_array($test, $contexts)) {
- $found = false;
- break;
- }
- }
- return $found;
- }
- return false;
- }
- /**
- * Get contexts for a given action or all actions in the controller
- *
- * @param string $action
- * @return array
- */
- public function getActionContexts($action = null)
- {
- $controller = $this->getActionController();
- if (null === $controller) {
- return array();
- }
- $action = (string) $action;
- $contextKey = $this->_contextKey;
- if (!isset($controller->$contextKey)) {
- return array();
- }
- if (null !== $action) {
- if (isset($controller->{$contextKey}[$action])) {
- return $controller->{$contextKey}[$action];
- } else {
- return array();
- }
- }
- return $controller->$contextKey;
- }
- /**
- * Remove one or more contexts for a given controller action
- *
- * @param string $action
- * @param string|array $context
- * @return boolean
- */
- public function removeActionContext($action, $context)
- {
- if ($this->hasActionContext($action, $context)) {
- $controller = $this->getActionController();
- $contextKey = $this->_contextKey;
- $action = (string) $action;
- $contexts = $controller->$contextKey;
- $actionContexts = $contexts[$action];
- $contexts = (array) $context;
- foreach ($contexts as $context) {
- $index = array_search($context, $actionContexts);
- if (false !== $index) {
- unset($controller->{$contextKey}[$action][$index]);
- }
- }
- return true;
- }
- return false;
- }
- /**
- * Clear all contexts for a given controller action or all actions
- *
- * @param string $action
- * @return Zend_Controller_Action_Helper_ContextSwitch Provides a fluent interface
- */
- public function clearActionContexts($action = null)
- {
- $controller = $this->getActionController();
- $contextKey = $this->_contextKey;
- if (!isset($controller->$contextKey) || empty($controller->$contextKey)) {
- return $this;
- }
- if (null === $action) {
- $controller->$contextKey = array();
- return $this;
- }
- $action = (string) $action;
- if (isset($controller->{$contextKey}[$action])) {
- unset($controller->{$contextKey}[$action]);
- }
- return $this;
- }
- /**
- * Retrieve ViewRenderer
- *
- * @return Zend_Controller_Action_Helper_ViewRenderer Provides a fluent interface
- */
- protected function _getViewRenderer()
- {
- if (null === $this->_viewRenderer) {
- $this->_viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
- }
- return $this->_viewRenderer;
- }
- }