From f3c1f5b5fb754140075c20e12159e9d6ec483c5d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 8 Apr 2016 07:50:15 +0000 Subject: [PATCH] move old Template class to Api\Framework\Template, as it is still used to render header and login page --- api/src/Framework/Login.php | 3 - api/src/Framework/Template.php | 560 ++++++++++++++++++++++++++++ doc/fix_api.php | 1 + phpgwapi/inc/class.Template.inc.php | 513 ++----------------------- 4 files changed, 584 insertions(+), 493 deletions(-) create mode 100644 api/src/Framework/Template.php diff --git a/api/src/Framework/Login.php b/api/src/Framework/Login.php index 1196aee71e..d89c82b21e 100644 --- a/api/src/Framework/Login.php +++ b/api/src/Framework/Login.php @@ -16,9 +16,6 @@ namespace EGroupware\Api\Framework; use EGroupware\Api; -// explicitly import old, not yet ported api classes -use Template; - /** * Render (deny-)login screen */ diff --git a/api/src/Framework/Template.php b/api/src/Framework/Template.php new file mode 100644 index 0000000000..1b02e6ca0d --- /dev/null +++ b/api/src/Framework/Template.php @@ -0,0 +1,560 @@ + remove undefined variables + * 'comment' => replace undefined variables with comments + * 'keep' => keep undefined variables + * + * @var string + */ + var $unknowns = 'remove'; + + /** + * 'yes' => halt, 'report' => report error, continue, 'no' => ignore error quietly + * + * @var string + */ + var $halt_on_error = 'yes'; + + /** + * last error message is retained here + * + * @var string + */ + var $last_error = ''; + + // if true change all phpGroupWare into eGroupWare in set_var + var $egroupware_hack = False; + + /** + * Constructor. + * + * @param string $root ='.' template directory. + * @param string $unknowns ='remove' how to handle unknown variables. + */ + function __construct($root = '.', $unknowns = 'remove') + { + $this->set_root($root); + $this->set_unknowns($unknowns); + } + + /** + * Set template directory + * + * @param string $root new template directory. + */ + function set_root($root) + { + if ($this->debug && $this->check_debug('set_root')) + { + echo "

Template::set_root('$root')

\n"; + } + if (!is_dir($root)) + { + $this->halt("set_root: $root is not a directory."); + return false; + } + $this->root = $root; + return true; + } + + /** + * How to deal with undefined placeholders + * + * @param string $unknowns 'remove', 'comment', 'keep' + */ + function set_unknowns($unknowns = 'keep') + { + if ($this->debug && $this->check_debug('set_unknows')) + { + echo "

Template::set_unknows('$unknowns')

\n"; + } + $this->unknowns = $unknowns; + } + + /** + * Set template/file to process + * + * @param string $handle handle for a filename, + * @param string $filename ='' name of template file + */ + function set_file($handle, $filename = '') + { + if ($this->debug && $this->check_debug('set_file',$handle,$filename)) + { + echo "

Template::set_file('".print_r($handle,true)."','$filename')

\n"; + } + if (!is_array($handle)) + { + if ($filename == '') + { + $this->halt("set_file: For handle $handle filename is empty."); + return false; + } + $this->file[$handle] = $this->filename($filename); + } + else + { + foreach($handle as $h => $f) + { + $this->file[$h] = $this->filename($f); + } + } + } + + /** + * Extract the template $handle from $parent and place variable {$name} instead + * + * @param string $parent name of tempalte containing $handle + * @param string $handle name of part + * @param string $name name of variable/placeholder + * @return boolean + */ + function set_block($parent, $handle, $name = '') + { + if ($this->debug && $this->check_debug('set_block',$parent,$handle,$name)) + { + echo "

Template::set_block('$parent','$handle','$name')

\n"; + } + if (!$this->loadfile($parent)) + { + $this->halt("set_block: unable to load '$parent'."); + return false; + } + if ($name == '') + { + $name = $handle; + } + $str = $this->get_var($parent); + $qhandle = preg_quote($handle); + $reg = "/(.*)\n\\s*/s"; + $match = null; + if (!preg_match($reg,$str,$match)) + { + // unfortunaly some apps set non-existing blocks, therefor I have to disable this diagnostics again for now + $this->halt("set_block: unable to find block '$handle' in '$parent'=
".htmlspecialchars($str)."
this->root=$this->root"); + // return False; + } + $this->set_var($handle,$match[1]); + $this->set_var($parent,preg_replace($reg, '{' . "$name}",$str)); + } + + /* public: set_var(array $values) + * values: array of variable name, value pairs. + * + * @param string|array $varname name of a variable to be defined or array with varname => value pairs + * @param string $value ='' value of that variable, if it's not an array + */ + function set_var($varname, $value = '') + { + if (!is_array($varname)) + { + if (empty($varname)) + { + return; + } + $varname = array( + $varname => $value + ); + } + foreach($varname as $k => $v) + { + if (!empty($k)) + { + if ($this->debug && $this->check_debug('set_var',$k)) + { + echo "

Template::set_var('$k','$v')

\n"; + } + $this->varkeys[$k] = $this->varname($k); + $this->varvals[$k] = $this->egroupware_hack ? str_replace( + array('phpGroupWare','www.phpgroupware.org'), + array('eGroupWare','www.eGroupWare.org'),$v + ) : $v; + } + } + } + + /** + * Substitue variables/placeholders and return result + * + * @param string $handle handle of template where variables are to be substituted + * @return string + */ + function subst($handle) + { + if ($this->debug && $this->check_debug('subst',$handle)) + { + echo "

Template::subst('$handle')

\n"; + } + if (!$this->loadfile($handle)) + { + $this->halt("subst: unable to load $handle."); + return false; + } + + $str = $this->get_var($handle); + foreach($this->varkeys as $k => $v) + { + $str = str_replace($v, $this->varvals[$k], $str); + } + return $str; + } + + /** + * Substitue variables/placeholders and print result + * + * @param string $handle handle of template where variables are to be substituted + * @return boolean false + */ + function psubst($handle) + { + print $this->subst($handle); + + return false; + } + + /** + * Substitue variables/placeholders, insert result into variable and return it + * + * @param string $target handle of variable to generate + * @param string $handle handle of template where variables are to be substituted + * @param boolean $append =false true: append to target handle + * @return string + */ + function parse($target, $handle, $append = false) + { + if (!is_array($handle)) + { + $str = $this->subst($handle); + if ($append) + { + $this->set_var($target, $this->get_var($target) . $str); + } + else + { + $this->set_var($target, $str); + } + } + else + { + foreach($handle as $h) + { + $str = $this->subst($h); + $this->set_var($target, $str); + } + } + return $str; + } + + /** + * Substitue variables/placeholders, insert result into variable and print it + * + * @param string $target handle of variable to generate + * @param string $handle handle of template where variables are to be substituted + * @param boolean $append =false true: append to target handle + * @return boolean false + */ + function pparse($target, $handle, $append = false) + { + print $this->parse($target, $handle, $append); + + return false; + } + + /** + * This is short for finish parse + */ + function fp($target, $handle, $append = False) + { + return $this->finish($this->parse($target, $handle, $append)); + } + + /** + * This is a short cut for print finish parse + */ + function pfp($target, $handle, $append = False) + { + echo $this->finish($this->parse($target, $handle, $append)); + } + + /** + * Return all variables as array + * + * @return array + */ + function get_vars() + { + foreach(array_keys($this->varkeys) as $k) + { + $result[$k] = $this->varvals[$k]; + } + return $result; + } + + /** + * Return a single or multiple variable + * + * @param string|array $varname variable name or array of names as key! + * @return string|array value or array of values + */ + function get_var($varname) + { + if (!is_array($varname)) + { + return $this->varvals[$varname]; + } + else + { + foreach(array_keys($varname) as $k) + { + $result[$k] = $this->varvals[$k]; + } + return $result; + } + } + + /** + * Return undefined variables/placeholders of a handle + * + * @param string handle handle of a template + * @return array|boolean array with undefined variables as key and value, or false if none + */ + function get_undefined($handle) + { + if (!$this->loadfile($handle)) + { + $this->halt("get_undefined: unable to load $handle."); + return false; + } + + $matches = null; + preg_match_all("/\{([^}]+)\}/", $this->get_var($handle), $matches); + $m = $matches[1]; + if (!is_array($m)) + { + return false; + } + foreach($m as $v) + { + if (!isset($this->varkeys[$v])) + { + $result[$v] = $v; + } + } + + if (count($result)) + { + return $result; + } + else + { + return false; + } + } + + /** + * Finish: remove or keep unknown variables/placeholders + * + * @param string $str string to finish + */ + function finish($str) + { + switch ($this->unknowns) + { + case 'keep': + break; + case 'remove': + $str = preg_replace('/{[a-z0-9_-]+}/i', '', $str); + break; + case 'comment': + $str = preg_replace('/{([a-z0-9_-]+)}/i', "", $str); + break; + } + + return $str; + } + + /** + * Finish and print a given variable + * + * @param string $varname name of variable to print. + */ + function p($varname) + { + print $this->finish($this->get_var($varname)); + } + + /** + * Finish and return a given variable + * + * @param string $varname name of variable to print. + */ + function get($varname) + { + return $this->finish($this->get_var($varname)); + } + + /** + /* + * @param string $filename name to be completed + * @param string $root ='' default $this->root + * @param int $time =1 + */ + protected function filename($filename,$root='',$time=1) + { + if($root == '') + { + $root = $this->root; + } + if(substr($filename, 0, 1) != '/') + { + $new_filename = $root . '/' . $filename; + } + else + { + $new_filename = $filename; + } + + if (!file_exists($new_filename)) + { + if($time==2) + { + $this->halt("filename: file $new_filename does not exist."); + } + else + { + $new_root = dirname($root) . DIRECTORY_SEPARATOR . 'default'; + $new_filename = $this->filename(str_replace($root.'/','',$new_filename),$new_root,2); + } + } + return $new_filename; + } + + /** + * @param string $varname name of a replacement variable to be protected + */ + protected function varname($varname) + { + return '{'.$varname.'}'; + } + + /** + * @param string $handle load file defined by handle, if it is not loaded yet + */ + function loadfile($handle) + { + if ($this->debug && $this->check_debug('loadfile',$handle)) + { + echo "

Template::loadfile('$handle') file=

\n".print_r($this->file,True)."
\n"; + echo "

backtrace: ".function_backtrace()."

\n"; + } + if (isset($this->varkeys[$handle]) && !empty($this->varvals[$handle])) + { + return true; + } + if (!isset($this->file[$handle])) + { + if ($this->debug && $this->check_debug('loadfile',$handle)) + { + echo "varkeys =
".print_r($this->varkeys,True)."
varvals =
".print_r($this->varvals,True)."
\n"; + } + $this->halt("loadfile: $handle is not a valid handle."); + return false; + } + $filename = $this->file[$handle]; + + $str = file_get_contents($filename); + if (empty($str)) + { + $this->halt("loadfile: While loading $handle, $filename does not exist or is empty."); + return false; + } + + $this->set_var($handle, $str); + return true; + } + + /** + * Giving a error message and halt the execution (if $this->halt_on_error == 'yes') + * + * @param string $msg error message to show + */ + function halt($msg) + { + $this->last_error = $msg; + + switch ($this->halt_on_error) + { + case 'no': + // ignore error quitely + break; + case 'report': + printf("Template Error: %s
\n", $msg); + echo "Backtrace: ".function_backtrace(2)."
\n"; + break; + case 'yes': + throw new egw_exception_wrong_parameter('Template Error: '.$msg); + } + } + + function check_debug() + { + if (!$this->debug) return False; + + foreach(func_get_args() as $arg) + { + if (!is_array($this->debug) && $this->debug === $arg || + (is_array($this->debug) && (@$this->debug[$arg] || in_array($arg,$this->debug,True)))) + { + return True; + } + } + return False; + } +} diff --git a/doc/fix_api.php b/doc/fix_api.php index 1d8af33980..2dc3976d62 100755 --- a/doc/fix_api.php +++ b/doc/fix_api.php @@ -123,6 +123,7 @@ foreach(array( 'solink' => 'Api\\Link\\Storage', 'sqlfs_stream_wrapper' => 'Api\\Vfs\\Sqlfs\\StreamWrapper', 'sqlfs_utils' => 'Api\\Vfs\\Sqlfs\\Utils', + 'Template' => 'Api\\Framework\\Template', 'translation::decodeMailHeader' => 'Api\\Mail\\Html::decodeMailHeader', 'translation::replaceEmailAdresses' => 'Api\\Mail\\Html::replaceEmailAdresses', 'translation::replaceTagsCompletley' => 'Api\\Mail\\Html::replaceTagsCompletley', diff --git a/phpgwapi/inc/class.Template.inc.php b/phpgwapi/inc/class.Template.inc.php index c09681d9a7..4aa2713f7d 100644 --- a/phpgwapi/inc/class.Template.inc.php +++ b/phpgwapi/inc/class.Template.inc.php @@ -1,493 +1,26 @@ remove undefined variables - * 'comment' => replace undefined variables with comments - * 'keep' => keep undefined variables - */ - var $unknowns = 'remove'; - - /* 'yes' => halt, 'report' => report error, continue, 'no' => ignore error quietly */ - var $halt_on_error = 'yes'; - - /* last error message is retained here */ - var $last_error = ''; - - // if true change all phpGroupWare into eGroupWare in set_var - var $egroupware_hack = False; - - /***************************************************************************/ - /* public: Constructor. - * root: template directory. - * unknowns: how to handle unknown variables. - */ - function __construct($root = '.', $unknowns = 'remove') - { - $this->set_root($root); - $this->set_unknowns($unknowns); - } - - /* public: setroot(pathname $root) - * root: new template directory. - */ - function set_root($root) - { - if ($this->debug && $this->check_debug('set_root')) - { - echo "

Template::set_root('$root')

\n"; - } - if (!is_dir($root)) - { - $this->halt("set_root: $root is not a directory."); - return false; - } - $this->root = $root; - return true; - } - - /* public: set_unknowns(enum $unknowns) - * unknowns: 'remove', 'comment', 'keep' - * - */ - function set_unknowns($unknowns = 'keep') - { - if ($this->debug && $this->check_debug('set_unknows')) - { - echo "

Template::set_unknows('$unknowns')

\n"; - } - $this->unknowns = $unknowns; - } - - /* public: set_file(array $filelist) - * filelist: array of handle, filename pairs. - * - * public: set_file(string $handle, string $filename) - * handle: handle for a filename, - * filename: name of template file - */ - function set_file($handle, $filename = '') - { - if ($this->debug && $this->check_debug('set_file',$handle,$filename)) - { - echo "

Template::set_file('".print_r($handle,true)."','$filename')

\n"; - } - if (!is_array($handle)) - { - if ($filename == '') - { - $this->halt("set_file: For handle $handle filename is empty."); - return false; - } - $this->file[$handle] = $this->filename($filename); - } - else - { - foreach($handle as $h => $f) - { - $this->file[$h] = $this->filename($f); - } - } - } - - /* public: set_block(string $parent, string $handle, string $name = '') - * extract the template $handle from $parent, - * place variable {$name} instead. - */ - function set_block($parent, $handle, $name = '') - { - if ($this->debug && $this->check_debug('set_block',$parent,$handle,$name)) - { - echo "

Template::set_block('$parent','$handle','$name')

\n"; - } - if (!$this->loadfile($parent)) - { - $this->halt("set_block: unable to load '$parent'."); - return false; - } - if ($name == '') - { - $name = $handle; - } - $str = $this->get_var($parent); - $qhandle = preg_quote($handle); - $reg = "/(.*)\n\\s*/s"; - if (!preg_match($reg,$str,$match)) - { - // unfortunaly some apps set non-existing blocks, therefor I have to disable this diagnostics again for now - $this->halt("set_block: unable to find block '$handle' in '$parent'=
".htmlspecialchars($str)."
this->root=$this->root"); - // return False; - } - $this->set_var($handle,$match[1]); - $this->set_var($parent,preg_replace($reg, '{' . "$name}",$str)); - } - - /* public: set_var(array $values) - * values: array of variable name, value pairs. - * - * public: set_var(string $varname, string $value) - * varname: name of a variable that is to be defined - * value: value of that variable - */ - function set_var($varname, $value = '') - { - if (!is_array($varname)) - { - if (empty($varname)) - { - return; - } - $varname = array( - $varname => $value - ); - } - foreach($varname as $k => $v) - { - if (!empty($k)) - { - if ($this->debug && $this->check_debug('set_var',$k)) - { - echo "

Template::set_var('$k','$v')

\n"; - } - $this->varkeys[$k] = $this->varname($k); - $this->varvals[$k] = $this->egroupware_hack ? str_replace( - array('phpGroupWare','www.phpgroupware.org'), - array('eGroupWare','www.eGroupWare.org'),$v - ) : $v; - } - } - } - - /* public: subst(string $handle) - * handle: handle of template where variables are to be substituted. - */ - function subst($handle) - { - if ($this->debug && $this->check_debug('subst',$handle)) - { - echo "

Template::subst('$handle')

\n"; - } - if (!$this->loadfile($handle)) - { - $this->halt("subst: unable to load $handle."); - return false; - } - - $str = $this->get_var($handle); - foreach($this->varkeys as $k => $v) - { - $str = str_replace($v, $this->varvals[$k], $str); - } - return $str; - } - - /* public: psubst(string $handle) - * handle: handle of template where variables are to be substituted. - */ - function psubst($handle) - { - print $this->subst($handle); - return false; - } - - /* public: parse(string $target, string $handle, boolean append) - * target: handle of variable to generate - * handle: handle of template to substitute - * append: append to target handle - */ - function parse($target, $handle, $append = false) - { - if (!is_array($handle)) - { - $str = $this->subst($handle); - if ($append) - { - $this->set_var($target, $this->get_var($target) . $str); - } - else - { - $this->set_var($target, $str); - } - } - else - { - foreach($handle as $i => $h) - { - $str = $this->subst($h); - $this->set_var($target, $str); - } - } - return $str; - } - - function pparse($target, $handle, $append = false) - { - print $this->parse($target, $handle, $append); - return false; - } - - /* This is short for finish parse */ - function fp($target, $handle, $append = False) - { - return $this->finish($this->parse($target, $handle, $append)); - } - - /* This is a short cut for print finish parse */ - function pfp($target, $handle, $append = False) - { - echo $this->finish($this->parse($target, $handle, $append)); - } - - /* public: get_vars() - */ - function get_vars() - { - foreach($this->varkeys as $k => $v) - { - $result[$k] = $this->varvals[$k]; - } - return $result; - } - - /* public: get_var(string varname) - * varname: name of variable. - * - * public: get_var(array varname) - * varname: array of variable names - */ - function get_var($varname) - { - if (!is_array($varname)) - { - return $this->varvals[$varname]; - } - else - { - foreach($varname as $k => $v) - { - $result[$k] = $this->varvals[$k]; - } - return $result; - } - } - - /* public: get_undefined($handle) - * handle: handle of a template. - */ - function get_undefined($handle) - { - if (!$this->loadfile($handle)) - { - $this->halt("get_undefined: unable to load $handle."); - return false; - } - - preg_match_all("/\{([^}]+)\}/", $this->get_var($handle), $m); - $m = $m[1]; - if (!is_array($m)) - { - return false; - } - foreach($m as $k => $v) - { - if (!isset($this->varkeys[$v])) - { - $result[$v] = $v; - } - } - - if (count($result)) - { - return $result; - } - else - { - return false; - } - } - - /* public: finish(string $str) - * str: string to finish. - */ - function finish($str) - { - switch ($this->unknowns) - { - case 'keep': - break; - case 'remove': - $str = preg_replace('/{[a-z0-9_-]+}/i', '', $str); - break; - case 'comment': - $str = preg_replace('/{([a-z0-9_-]+)}/i', "", $str); - break; - } - - return $str; - } - - /* public: p(string $varname) - * varname: name of variable to print. - */ - function p($varname) - { - print $this->finish($this->get_var($varname)); - } - - function get($varname) - { - return $this->finish($this->get_var($varname)); - } - - /***************************************************************************/ - /* private: filename($filename) - * filename: name to be completed. - */ - function filename($filename,$root='',$time=1) - { - if($root == '') - { - $root = $this->root; - } - if(substr($filename, 0, 1) != '/') - { - $new_filename = $root . '/' . $filename; - } - else - { - $new_filename = $filename; - } - - if (!file_exists($new_filename)) - { - if($time==2) - { - $this->halt("filename: file $new_filename does not exist."); - } - else - { -// $new_root = str_replace($GLOBALS['phpgw_info']['server']['template_set'],'default',$root); -// $new_root = substr($root, 0, strrpos($root, $GLOBALS['phpgw_info']['server']['template_set'])).'default'; -// $new_root = substr($root, 0, strlen($root) - strlen($GLOBALS['phpgw_info']['server']['template_set'])) . 'default'; - $new_root = dirname($root) . DIRECTORY_SEPARATOR . 'default'; - $new_filename = $this->filename(str_replace($root.'/','',$new_filename),$new_root,2); - } - } - return $new_filename; - } - - /* private: varname($varname) - * varname: name of a replacement variable to be protected. - */ - function varname($varname) - { - return '{'.$varname.'}'; - } - - /* private: loadfile(string $handle) - * handle: load file defined by handle, if it is not loaded yet. - */ - function loadfile($handle) - { - if ($this->debug && $this->check_debug('loadfile',$handle)) - { - echo "

Template::loadfile('$handle') file=

\n".print_r($this->file,True)."
\n"; - echo "

backtrace: ".function_backtrace()."

\n"; - } - if (isset($this->varkeys[$handle]) && !empty($this->varvals[$handle])) - { - return true; - } - if (!isset($this->file[$handle])) - { - if ($this->debug && $this->check_debug('loadfile',$handle)) - { - echo "varkeys =
".print_r($this->varkeys,True)."
varvals =
".print_r($this->varvals,True)."
\n"; - } - $this->halt("loadfile: $handle is not a valid handle."); - return false; - } - $filename = $this->file[$handle]; - - $str = file_get_contents($filename); - if (empty($str)) - { - $this->halt("loadfile: While loading $handle, $filename does not exist or is empty."); - return false; - } - - $this->set_var($handle, $str); - return true; - } - - /** - * Giving a error message and halt the execution (if $this->halt_on_error == 'yes') - * - * @param string $msg error message to show - */ - function halt($msg) - { - $this->last_error = $msg; - - switch ($this->halt_on_error) - { - case 'no': - // ignore error quitely - break; - case 'report': - printf("Template Error: %s
\n", $msg); - echo "Backtrace: ".function_backtrace(2)."
\n"; - break; - case 'yes': - throw new egw_exception_wrong_parameter('Template Error: '.$msg); - } - } - - function check_debug($str) - { - if (!$this->debug) return False; - - foreach(func_get_args() as $arg) - { - if (!is_array($this->debug) && $this->debug === $arg || - (is_array($this->debug) && (@$this->debug[$arg] || in_array($arg,$this->debug,True)))) - { - return True; - } - } - return False; - } - } +/** + * Old phplib templates: DO NOT USE FOR ANY NEW DEVELOPMENT, use eTemplate2! + * + * @deprecated use Api\Framework\Template if you must, or better eTemplate2 + */ +class Template extends Framework\Template {}