378 Zeilen
		
	
	
	
		
			9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			378 Zeilen
		
	
	
	
		
			9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?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_View
 | 
						|
 * @subpackage Helper
 | 
						|
 * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 | 
						|
 * @version    $Id$
 | 
						|
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * Abstract class representing container for placeholder values
 | 
						|
 *
 | 
						|
 * @package    Zend_View
 | 
						|
 * @subpackage Helper
 | 
						|
 * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 | 
						|
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 | 
						|
 */
 | 
						|
abstract class Zend_View_Helper_Placeholder_Container_Abstract extends ArrayObject
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Whether or not to override all contents of placeholder
 | 
						|
     * @const string
 | 
						|
     */
 | 
						|
    const SET    = 'SET';
 | 
						|
 | 
						|
    /**
 | 
						|
     * Whether or not to append contents to placeholder
 | 
						|
     * @const string
 | 
						|
     */
 | 
						|
    const APPEND = 'APPEND';
 | 
						|
 | 
						|
    /**
 | 
						|
     * Whether or not to prepend contents to placeholder
 | 
						|
     * @const string
 | 
						|
     */
 | 
						|
    const PREPEND = 'PREPEND';
 | 
						|
 | 
						|
    /**
 | 
						|
     * What text to prefix the placeholder with when rendering
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $_prefix    = '';
 | 
						|
 | 
						|
    /**
 | 
						|
     * What text to append the placeholder with when rendering
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $_postfix   = '';
 | 
						|
 | 
						|
    /**
 | 
						|
     * What string to use between individual items in the placeholder when rendering
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $_separator = '';
 | 
						|
 | 
						|
    /**
 | 
						|
     * What string to use as the indentation of output, this will typically be spaces. Eg: '    '
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $_indent = '';
 | 
						|
 | 
						|
    /**
 | 
						|
     * Whether or not we're already capturing for this given container
 | 
						|
     * @var bool
 | 
						|
     */
 | 
						|
    protected $_captureLock = false;
 | 
						|
 | 
						|
    /**
 | 
						|
     * What type of capture (overwrite (set), append, prepend) to use
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $_captureType;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Key to which to capture content
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $_captureKey;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Constructor - This is needed so that we can attach a class member as the ArrayObject container
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function __construct()
 | 
						|
    {
 | 
						|
        parent::__construct(array(), parent::ARRAY_AS_PROPS);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Set a single value
 | 
						|
     *
 | 
						|
     * @param  mixed $value
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function set($value)
 | 
						|
    {
 | 
						|
        $this->exchangeArray(array($value));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Prepend a value to the top of the container
 | 
						|
     *
 | 
						|
     * @param  mixed $value
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function prepend($value)
 | 
						|
    {
 | 
						|
        $values = $this->getArrayCopy();
 | 
						|
        array_unshift($values, $value);
 | 
						|
        $this->exchangeArray($values);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Retrieve container value
 | 
						|
     *
 | 
						|
     * If single element registered, returns that element; otherwise,
 | 
						|
     * serializes to array.
 | 
						|
     *
 | 
						|
     * @return mixed
 | 
						|
     */
 | 
						|
    public function getValue()
 | 
						|
    {
 | 
						|
        if (1 == count($this)) {
 | 
						|
            $keys = $this->getKeys();
 | 
						|
            $key  = array_shift($keys);
 | 
						|
            return $this[$key];
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->getArrayCopy();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Set prefix for __toString() serialization
 | 
						|
     *
 | 
						|
     * @param  string $prefix
 | 
						|
     * @return Zend_View_Helper_Placeholder_Container
 | 
						|
     */
 | 
						|
    public function setPrefix($prefix)
 | 
						|
    {
 | 
						|
        $this->_prefix = (string) $prefix;
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Retrieve prefix
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function getPrefix()
 | 
						|
    {
 | 
						|
        return $this->_prefix;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Set postfix for __toString() serialization
 | 
						|
     *
 | 
						|
     * @param  string $postfix
 | 
						|
     * @return Zend_View_Helper_Placeholder_Container
 | 
						|
     */
 | 
						|
    public function setPostfix($postfix)
 | 
						|
    {
 | 
						|
        $this->_postfix = (string) $postfix;
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Retrieve postfix
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function getPostfix()
 | 
						|
    {
 | 
						|
        return $this->_postfix;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Set separator for __toString() serialization
 | 
						|
     *
 | 
						|
     * Used to implode elements in container
 | 
						|
     *
 | 
						|
     * @param  string $separator
 | 
						|
     * @return Zend_View_Helper_Placeholder_Container
 | 
						|
     */
 | 
						|
    public function setSeparator($separator)
 | 
						|
    {
 | 
						|
        $this->_separator = (string) $separator;
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Retrieve separator
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function getSeparator()
 | 
						|
    {
 | 
						|
        return $this->_separator;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Set the indentation string for __toString() serialization,
 | 
						|
     * optionally, if a number is passed, it will be the number of spaces
 | 
						|
     *
 | 
						|
     * @param  string|int $indent
 | 
						|
     * @return Zend_View_Helper_Placeholder_Container_Abstract
 | 
						|
     */
 | 
						|
    public function setIndent($indent)
 | 
						|
    {
 | 
						|
        $this->_indent = $this->getWhitespace($indent);
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Retrieve indentation
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function getIndent()
 | 
						|
    {
 | 
						|
        return $this->_indent;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Retrieve whitespace representation of $indent
 | 
						|
     *
 | 
						|
     * @param  int|string $indent
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function getWhitespace($indent)
 | 
						|
    {
 | 
						|
        if (is_int($indent)) {
 | 
						|
            $indent = str_repeat(' ', $indent);
 | 
						|
        }
 | 
						|
 | 
						|
        return (string) $indent;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Start capturing content to push into placeholder
 | 
						|
     *
 | 
						|
     * @param  int $type How to capture content into placeholder; append, prepend, or set
 | 
						|
     * @return void
 | 
						|
     * @throws Zend_View_Helper_Placeholder_Exception if nested captures detected
 | 
						|
     */
 | 
						|
    public function captureStart($type = Zend_View_Helper_Placeholder_Container_Abstract::APPEND, $key = null)
 | 
						|
    {
 | 
						|
        if ($this->_captureLock) {
 | 
						|
            require_once 'Zend/View/Helper/Placeholder/Container/Exception.php';
 | 
						|
            $e = new Zend_View_Helper_Placeholder_Container_Exception('Cannot nest placeholder captures for the same placeholder');
 | 
						|
            $e->setView($this->view);
 | 
						|
            throw $e;
 | 
						|
        }
 | 
						|
 | 
						|
        $this->_captureLock = true;
 | 
						|
        $this->_captureType = $type;
 | 
						|
        if ((null !== $key) && is_scalar($key)) {
 | 
						|
            $this->_captureKey = (string) $key;
 | 
						|
        }
 | 
						|
        ob_start();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * End content capture
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function captureEnd()
 | 
						|
    {
 | 
						|
        $data               = ob_get_clean();
 | 
						|
        $key                = null;
 | 
						|
        $this->_captureLock = false;
 | 
						|
        if (null !== $this->_captureKey) {
 | 
						|
            $key = $this->_captureKey;
 | 
						|
        }
 | 
						|
        switch ($this->_captureType) {
 | 
						|
            case self::SET:
 | 
						|
                if (null !== $key) {
 | 
						|
                    $this[$key] = $data;
 | 
						|
                } else {
 | 
						|
                    $this->exchangeArray(array($data));
 | 
						|
                }
 | 
						|
                break;
 | 
						|
            case self::PREPEND:
 | 
						|
                if (null !== $key) {
 | 
						|
                    $array  = array($key => $data);
 | 
						|
                    $values = $this->getArrayCopy();
 | 
						|
                    $final  = $array + $values;
 | 
						|
                    $this->exchangeArray($final);
 | 
						|
                } else {
 | 
						|
                    $this->prepend($data);
 | 
						|
                }
 | 
						|
                break;
 | 
						|
            case self::APPEND:
 | 
						|
            default:
 | 
						|
                if (null !== $key) {
 | 
						|
                    if (empty($this[$key])) {
 | 
						|
                        $this[$key] = $data;
 | 
						|
                    } else {
 | 
						|
                        $this[$key] .= $data;
 | 
						|
                    }
 | 
						|
                } else {
 | 
						|
                    $this[$this->nextIndex()] = $data;
 | 
						|
                }
 | 
						|
                break;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get keys
 | 
						|
     *
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public function getKeys()
 | 
						|
    {
 | 
						|
        $array = $this->getArrayCopy();
 | 
						|
        return array_keys($array);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Next Index
 | 
						|
     *
 | 
						|
     * as defined by the PHP manual
 | 
						|
     * @return int
 | 
						|
     */
 | 
						|
    public function nextIndex()
 | 
						|
    {
 | 
						|
        $keys = $this->getKeys();
 | 
						|
        if (0 == count($keys)) {
 | 
						|
            return 0;
 | 
						|
        }
 | 
						|
 | 
						|
        return $nextIndex = max($keys) + 1;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Render the placeholder
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function toString($indent = null)
 | 
						|
    {
 | 
						|
        $indent = ($indent !== null)
 | 
						|
                ? $this->getWhitespace($indent)
 | 
						|
                : $this->getIndent();
 | 
						|
 | 
						|
        $items  = $this->getArrayCopy();
 | 
						|
        $return = $indent
 | 
						|
                . $this->getPrefix()
 | 
						|
                . implode($this->getSeparator(), $items)
 | 
						|
                . $this->getPostfix();
 | 
						|
        $return = preg_replace("/(\r\n?|\n)/", '$1' . $indent, $return);
 | 
						|
        return $return;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Serialize object to string
 | 
						|
     *
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    public function __toString()
 | 
						|
    {
 | 
						|
        return $this->toString();
 | 
						|
    }
 | 
						|
}
 |