A super easy PHP Framework for web development!
				https://github.com/exacti/phacil-framework
			
			
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							169 lines
						
					
					
						
							4.2 KiB
						
					
					
				
			
		
		
	
	
							169 lines
						
					
					
						
							4.2 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
/**
 | 
						|
 * Runtime Extension Capture
 | 
						|
 *
 | 
						|
 * @package    Smarty
 | 
						|
 * @subpackage PluginsInternal
 | 
						|
 * @author     Uwe Tews
 | 
						|
 */
 | 
						|
class Smarty_Internal_Runtime_Capture
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Flag that this instance  will not be cached
 | 
						|
     *
 | 
						|
     * @var bool
 | 
						|
     */
 | 
						|
    public $isPrivateExtension = true;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Stack of capture parameter
 | 
						|
     *
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    private $captureStack = array();
 | 
						|
 | 
						|
    /**
 | 
						|
     * Current open capture sections
 | 
						|
     *
 | 
						|
     * @var int
 | 
						|
     */
 | 
						|
    private $captureCount = 0;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Count stack
 | 
						|
     *
 | 
						|
     * @var int[]
 | 
						|
     */
 | 
						|
    private $countStack = array();
 | 
						|
 | 
						|
    /**
 | 
						|
     * Named buffer
 | 
						|
     *
 | 
						|
     * @var string[]
 | 
						|
     */
 | 
						|
    private $namedBuffer = array();
 | 
						|
 | 
						|
    /**
 | 
						|
     * Flag if callbacks are registered
 | 
						|
     *
 | 
						|
     * @var bool
 | 
						|
     */
 | 
						|
    private $isRegistered = false;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Open capture section
 | 
						|
     *
 | 
						|
     * @param \Smarty_Internal_Template $_template
 | 
						|
     * @param string                    $buffer capture name
 | 
						|
     * @param string                    $assign variable name
 | 
						|
     * @param string                    $append variable name
 | 
						|
     */
 | 
						|
    public function open(Smarty_Internal_Template $_template, $buffer, $assign, $append)
 | 
						|
    {
 | 
						|
        if (!$this->isRegistered) {
 | 
						|
            $this->register($_template);
 | 
						|
        }
 | 
						|
        $this->captureStack[] = array($buffer,
 | 
						|
                                      $assign,
 | 
						|
                                      $append);
 | 
						|
        $this->captureCount ++;
 | 
						|
        ob_start();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Register callbacks in template class
 | 
						|
     *
 | 
						|
     * @param \Smarty_Internal_Template $_template
 | 
						|
     */
 | 
						|
    private function register(Smarty_Internal_Template $_template)
 | 
						|
    {
 | 
						|
        $_template->startRenderCallbacks[] = array($this,
 | 
						|
                                                   'startRender');
 | 
						|
        $_template->endRenderCallbacks[] = array($this,
 | 
						|
                                                 'endRender');
 | 
						|
        $this->startRender($_template);
 | 
						|
        $this->isRegistered = true;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Start render callback
 | 
						|
     *
 | 
						|
     * @param \Smarty_Internal_Template $_template
 | 
						|
     */
 | 
						|
    public function startRender(Smarty_Internal_Template $_template)
 | 
						|
    {
 | 
						|
        $this->countStack[] = $this->captureCount;
 | 
						|
        $this->captureCount = 0;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Close capture section
 | 
						|
     *
 | 
						|
     * @param \Smarty_Internal_Template $_template
 | 
						|
     *
 | 
						|
     * @throws \SmartyException
 | 
						|
     */
 | 
						|
    public function close(Smarty_Internal_Template $_template)
 | 
						|
    {
 | 
						|
        if ($this->captureCount) {
 | 
						|
            list($buffer, $assign, $append) = array_pop($this->captureStack);
 | 
						|
            $this->captureCount --;
 | 
						|
            if (isset($assign)) {
 | 
						|
                $_template->assign($assign, ob_get_contents());
 | 
						|
            }
 | 
						|
            if (isset($append)) {
 | 
						|
                $_template->append($append, ob_get_contents());
 | 
						|
            }
 | 
						|
            $this->namedBuffer[ $buffer ] = ob_get_clean();
 | 
						|
        } else {
 | 
						|
            $this->error($_template);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Error exception on not matching {capture}{/capture}
 | 
						|
     *
 | 
						|
     * @param \Smarty_Internal_Template $_template
 | 
						|
     *
 | 
						|
     * @throws \SmartyException
 | 
						|
     */
 | 
						|
    public function error(Smarty_Internal_Template $_template)
 | 
						|
    {
 | 
						|
        throw new SmartyException("Not matching {capture}{/capture} in '{$_template->template_resource}'");
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Return content of named capture buffer by key or as array
 | 
						|
     *
 | 
						|
     * @param \Smarty_Internal_Template $_template
 | 
						|
     * @param   string|null             $name
 | 
						|
     *
 | 
						|
     * @return string|string[]|null
 | 
						|
     */
 | 
						|
    public function getBuffer(Smarty_Internal_Template $_template, $name = null)
 | 
						|
    {
 | 
						|
        if (isset($name)) {
 | 
						|
            return isset($this->namedBuffer[ $name ]) ? $this->namedBuffer[ $name ] : null;
 | 
						|
        } else {
 | 
						|
            return $this->namedBuffer;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * End render callback
 | 
						|
     *
 | 
						|
     * @param \Smarty_Internal_Template $_template
 | 
						|
     *
 | 
						|
     * @throws \SmartyException
 | 
						|
     */
 | 
						|
    public function endRender(Smarty_Internal_Template $_template)
 | 
						|
    {
 | 
						|
        if ($this->captureCount) {
 | 
						|
            $this->error($_template);
 | 
						|
        } else {
 | 
						|
            $this->captureCount = array_pop($this->countStack);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
} |