<?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); } } }