mirror of
				https://github.com/smarty-php/smarty.git
				synced 2025-10-31 04:11:37 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			169 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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);
 | |
|         }
 | |
|     }
 | |
| 
 | |
| } |