forked from SimplesIP/pabx-app
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.
174 lines
4.1 KiB
174 lines
4.1 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); |
|
} |
|
} |
|
}
|
|
|