commit changes

This commit is contained in:
mohrt
2000-11-15 17:08:52 +00:00
parent 506e38f76b
commit 64697f0c55
3 changed files with 271 additions and 35 deletions

126
README
View File

@@ -79,6 +79,8 @@ CLASS VARIABLES: (default value in parenthesis)
the scripts are initially compiled.
(true)
$template_dir Name of directory containing templates
$compile_dir_ext Extention to give the name of the compile
directory. For example, if your templates
are stored in a directory named
@@ -86,7 +88,9 @@ CLASS VARIABLES: (default value in parenthesis)
files will be kept in "templates_c" in the
same directory. (_c)
$tpl_file_ext the extention used on template files. (.tpl)
$tpl_file_ext The extention used on template files. (.tpl)
All other files in the template directory
without this extention are ignored.
$max_recursion_depth The maximum recursion depth for template
files includes. This is to help catch an
@@ -104,9 +108,10 @@ CLASS VARIABLES: (default value in parenthesis)
$right_delimiter The right delimiter of the template syntax. (})
$registered_functions Names of the custom template functions.
To add your own, add them to the array
here, and add the actual functions to the
$registered_functions Names of the custom template functions
that Smarty will recognize.
To add your own, add them to this array
and add the actual functions to the
smarty.functions.php file.
(array( "htmlesc","urlesc","default","config" );)
@@ -189,6 +194,17 @@ Hello, my name is {htmlesc $Name}
{include footer.tpl}
INCLUDE LOGIC:
Smarty supports including other template files.
* you must supply the relative path to the
included template file from the template
in use. Example: in index.tpl, the file
header.tpl is included from the same directory:
{include header.tpl}
IF/ELSE LOGIC:
Smarty supports if/else logic like so:
@@ -245,6 +261,100 @@ Sections can be nested, like so:
{/section}
{/section}
SPECIAL FUNCTIONALITY:
There are some special functions that determine the
current loop iteration of a section. These are
rownum: current row, first row starting with 1
index: current row, first row starting with 0
odd: true if value is odd
even: true if value is even
mod: true if value is divisible by X
Examples:
{section name=month $var}
{if $month.rownum eq 4}
{* in 4th row of section loop *}
{/if}
{if $month.rownum.even}
{* current rownum is even *}
{/if}
{if $month.rownum.odd}
{* current rownum is odd *}
{/if}
{if $month.rownum.even.3}
{* each even row, grouped by 3.
so rows 1,2,3 are true (even),
4,5,6 are odd (false), etc *}
{/if}
{if $month.rownum.odd.3}
{* each odd row, grouped by 3.
so rows 1,2,3 are true (odd),
4,5,6 are even (false), etc *}
{/if}
{if $month.rownum.mod.4}
{* true if current row is divisible by 4 *}
{/if}
{/section}
THE {strip} TAG:
A special tag called {strip} can be used to strip out
extra space, tabs or newlines at the beginning and end
of each template row within {strip} and {/strip}.
For example:
<TR>
<TD>
<TT>
{section name=row $weekday}
{$row.weekday}&nbsp;
{/section}
</TT>
</TD>
</TR>
This will return unwanted results because of
the extra tabs and newlines contained within the <TT></TT>
tags. Normally to remedy this, you must run all
the lines together in the template like so:
<TR>
<TD>
<TT>{section name=row $weekday}{$row.weekday}&nbsp;{/section}</TT>
</TD>
</TR>
As you can see, this quickly makes the template unreadable.
An alternate solution is to use the {strip} tag like so:
<TR>
<TD>
{strip}
<TT>
{section name=row $weekday}
{$row.weekday}&nbsp;
{/section}
</TT>
{/strip}
</TD>
</TR>
What this will do is strip out tabs, spaces and newlines
at the beginning and end of each line before outputting
the results. This helps keep the template file readable
without affecting the output. Only text between {strip}
and {/strip} is affected.
{ldelim} AND {rdelim} TAGS:
These are used in the template to output the literal
left and right delimiters. Normally these are
"{" and "}" if you are using the default delimiters.
CUSTOM FUNCTIONS:
@@ -258,8 +368,7 @@ functions that come bundled with Smarty, which are the following:
{config "file.conf","var"} prints the value of a variable
from a config file.
For this config function, config files are kept in a "config" directory.
Config files also must be in the following syntax:
For this "config" function, config files must be in the following syntax:
var = "value"
@@ -274,7 +383,7 @@ index.conf
----------
title = "My Homepage"
Name = "Gomer Pyle"
Name = "Gomer"
creating your own:
@@ -282,8 +391,7 @@ creating your own:
To create your own custom functions, do the following:
* edit the smarty.functions.php file, add your custom function. Be sure
the function name is prepended with "smarty_". The template engine
will print anything that is returned from this function.
the function name is prepended with "smarty_".
* edit the smarty.class.php file, add your custom function name to the
array (leave off the smarty_ prefix.)
* make a mention of your custom function in a template, like so:

View File

@@ -17,6 +17,8 @@ class Smarty
// application is entered into production and
// initially compiled. Leave set to true
// during development.
var $template_dir = "templates"; // name of directory for templates
var $compile_dir_ext = "_c"; // the directory extention where
// compiled templates are placed
@@ -35,7 +37,14 @@ class Smarty
// registered template functions
// NOTE: leave off the "smarty_" prefix on the actual PHP function name
var $registered_functions = array( "htmlesc","urlesc","default","config" );
var $registered_functions = array( "htmlesc",
"urlesc",
"default",
"configload",
"configclear",
"configprint",
"configset"
);
// internal vars
var $errorMsg = false; // error messages
@@ -266,11 +275,11 @@ class Smarty
if(!($template_contents = $this->_read_file($filepath)))
return false;
if(preg_match("/^(.+)\/([^\/]+)$/",$compilepath,$match))
/* if(preg_match("/^(.+)\/([^\/]+)$/",$compilepath,$match))
{
$ctpl_file_dir = $match[1];
$ctpl_file_name = $match[2];
}
} */
if(!$this->allow_php)
{
@@ -290,9 +299,33 @@ class Smarty
$ld = preg_quote($this->left_delimiter,"/");
$rd = preg_quote($this->right_delimiter,"/");
$search[] = "/^".$ld."\*[^\}]+\*".$rd."$/U"; // remove template comments
$search[] = "/^".$ld."\*.*\*".$rd."$/U"; // remove template comments
$replace[] = "";
$search[] = "/(\\\$[\w\d]+)\.([\w\d]+)/"; // replace section vars with php vars
$search[] = "/(\\\$[\w\d\_]+)\.rownum\.even\.([\d]+)/"; // replace section rownum.even.digit
$replace[] = "((\\1_secvar / \\2) % 2)";
$search[] = "/(\\\$[\w\d\_]+)\.rownum\.odd\.([\d]+)/"; // replace section rownum.even.digit
$replace[] = "!((\\1_secvar / \\2) % 2)";
$search[] = "/(\\\$[\w\d\_]+)\.index\.even\.([\d]+)/"; // replace section index.even.digit
$replace[] = "!((\\1_secvar) % \\2)";
$search[] = "/(\\\$[\w\d\_]+)\.index\.odd\.([\d]+)/"; // replace section index.even.digit
$replace[] = "((\\1_secvar) % \\2)";
$search[] = "/(\\\$[\w\d\_]+)\.rownum\.mod\.([\d]+)/"; // replace section rownum.even.digit
$replace[] = "!((\\1_secvar+1) % \\2)";
$search[] = "/(\\\$[\w\d\_]+)\.index\.mod\.([\d]+)/"; // replace section rownum.even.digit
$replace[] = "!((\\1_secvar) % \\2)";
$search[] = "/(\\\$[\w\d\_]+)\.rownum\.even/"; // replace section rownum.even
$replace[] = "!((\\1_secvar+1) % 2)";
$search[] = "/(\\\$[\w\d\_]+)\.rownum\.odd/"; // replace section rownum.odd
$replace[] = "((\\1_secvar+1) % 2)";
$search[] = "/(\\\$[\w\d\_]+)\.index\.even/"; // replace section index.even
$replace[] = "!((\\1_secvar) % 2)";
$search[] = "/(\\\$[\w\d\_]+)\.index\.odd/"; // replace section index.odd
$replace[] = "((\\1_secvar) % 2)";
$search[] = "/(\\\$[\w\d\_]+)\.rownum/"; // replace section rownum
$replace[] = "\\1_secvar+1";
$search[] = "/(\\\$[\w\d\_]+)\.index/"; // replace section index
$replace[] = "\\1_secvar";
$search[] = "/(\\\$[\w\d\_]+)\.([\w\d\_]+)/"; // replace section vars
$replace[] = "\$\\2[\\1_secvar]";
$search[] = "/\beq\b/i"; // replace eq with ==
$replace[] = "==";
@@ -306,15 +339,24 @@ class Smarty
$replace[] = ">=";
$search[] = "/\bne(q)?\b/i"; // replace ne or neq with !=
$replace[] = "!=";
$search[] = "/^".$ld."if ([^\}]+)".$rd."$/i"; // replace if tags
$search[] = "/\band\b/i"; // replace and with &&
$replace[] = "&&";
$search[] = "/\bmod\b/i"; // replace mod with %
$replace[] = "%";
$search[] = "/\bor\b/i"; // replace or with ||
$replace[] = "||";
$search[] = "/\bnot\b/i"; // replace not with !
$replace[] = "!";
$search[] = "/^".$ld."if (.*)".$rd."$/Ui"; // replace if tags
$replace[] = "<?php if(\\1): ?>";
$search[] = "/^".$ld."\s*else\s*".$rd."$/i"; // replace else tags
$replace[] = "<?php else: ?>";
$search[] = "/^".$ld."\s*\/if\s*".$rd."$/i"; // replace /if tags
$replace[] = "<?php endif; ?>";
$search[] = "/^".$ld."\s*include\s*\"?([^\s\}]+)\"?".$rd."$/i"; // replace include tags
$replace[] = "<?php include(\"".$ctpl_file_dir."/\\1\"); ?>";
$search[] = "/^".$ld."\s*section\s+name\s*=\s*\"?([\w\d]+)\"?\s+\\\$([^\}\s]+)\s*".$rd."$/i"; // replace section tags
$search[] = "/^".$ld."\s*include\s*\"?([^\s]+)\"?".$rd."$/i"; // replace include tags
/* $replace[] = "<?php include(\"".$ctpl_file_dir."/\\1\"); ?>"; */
$replace[] = "<?php include(\"./".$this->template_dir.$this->compile_dir_ext."/\\1\"); ?>";
$search[] = "/^".$ld."\s*section\s+name\s*=\s*\"?([\w\d\_]+)\"?\s+\\\$([^\s]+)\s*".$rd."$/i"; // replace section tags
$replace[] = "<?php for(\$\\1_secvar=0; \$\\1_secvar<count(\$\\2); \$\\1_secvar++): ?>";
$search[] = "/^".$ld."\s*\/section\s*".$rd."$/i"; // replace /section tags
$replace[] = "<?php endfor; ?>";
@@ -322,14 +364,19 @@ class Smarty
if(count($this->registered_functions) > 0)
{
$funcs = implode("|",$this->registered_functions);
$search[] = "/^".$ld."\s*(".$funcs.")\s*([^\}]*)".$rd."$/i";
// user functions without args
$search[] = "/^".$ld."\s*(".$funcs.")\s*".$rd."$/i";
$replace[] = "<?php smarty_\\1(); ?>";
// user functions with args
$search[] = "/^".$ld."\s*(".$funcs.")\s+(.*)".$rd."$/i";
$replace[] = "<?php smarty_\\1(\\2); ?>";
}
$search[] = "/^".$ld."\s*(\\\$[^\}\s\.]+)\s*".$rd."$/"; // replace vars
$search[] = "/^".$ld."\s*(\\\$[^\s]+)\s*".$rd."$/"; // replace vars
$replace[] = "<?php print \\1; ?>";
// collect all the tags in the template
preg_match_all("/".$ld."[^\}]+".$rd."/U",$template_contents,$match);
preg_match_all("/".$ld.".*".$rd."/U",$template_contents,$match);
$template_tags = $match[0];
$template_tags_modified = preg_replace($search,$replace,$template_tags);
@@ -338,9 +385,26 @@ class Smarty
for($tagloop=0; $tagloop<count($template_tags); $tagloop++)
$template_contents = preg_replace("/".preg_quote($template_tags[$tagloop],"/")."/",$template_tags_modified[$tagloop],$template_contents);
// reformat data within {strip}{/strip} tags, removing spaces, tabs and newlines
preg_match_all("/\{strip\}.*\{\/strip\}/Usi",$template_contents,$match);
$strip_tags = $match[0];
$search = array( "/\{\/?strip\}/i","/[\t ]+$/m","/^[\t ]+/m","/[\r\n]+/" );
$replace = array ("","",""," ");
$strip_tags_modified = preg_replace($search,$replace,$strip_tags);
// replace the tags in the template
for($tagloop=0; $tagloop<count($strip_tags); $tagloop++)
$template_contents = preg_replace("/".preg_quote($strip_tags[$tagloop],"/")."/",$strip_tags_modified[$tagloop],$template_contents);
// replace literal delimiter tags
$template_contents = preg_replace("/{ldelim}/",$this->left_delimiter,$template_contents);
$template_contents = preg_replace("/{rdelim}/",$this->right_delimiter,$template_contents);
if(!($this->_write_file($compilepath,$template_contents)))
return false;
return true;
}

View File

@@ -17,6 +17,8 @@ class Smarty
// application is entered into production and
// initially compiled. Leave set to true
// during development.
var $template_dir = "templates"; // name of directory for templates
var $compile_dir_ext = "_c"; // the directory extention where
// compiled templates are placed
@@ -35,7 +37,14 @@ class Smarty
// registered template functions
// NOTE: leave off the "smarty_" prefix on the actual PHP function name
var $registered_functions = array( "htmlesc","urlesc","default","config" );
var $registered_functions = array( "htmlesc",
"urlesc",
"default",
"configload",
"configclear",
"configprint",
"configset"
);
// internal vars
var $errorMsg = false; // error messages
@@ -266,11 +275,11 @@ class Smarty
if(!($template_contents = $this->_read_file($filepath)))
return false;
if(preg_match("/^(.+)\/([^\/]+)$/",$compilepath,$match))
/* if(preg_match("/^(.+)\/([^\/]+)$/",$compilepath,$match))
{
$ctpl_file_dir = $match[1];
$ctpl_file_name = $match[2];
}
} */
if(!$this->allow_php)
{
@@ -290,9 +299,33 @@ class Smarty
$ld = preg_quote($this->left_delimiter,"/");
$rd = preg_quote($this->right_delimiter,"/");
$search[] = "/^".$ld."\*[^\}]+\*".$rd."$/U"; // remove template comments
$search[] = "/^".$ld."\*.*\*".$rd."$/U"; // remove template comments
$replace[] = "";
$search[] = "/(\\\$[\w\d]+)\.([\w\d]+)/"; // replace section vars with php vars
$search[] = "/(\\\$[\w\d\_]+)\.rownum\.even\.([\d]+)/"; // replace section rownum.even.digit
$replace[] = "((\\1_secvar / \\2) % 2)";
$search[] = "/(\\\$[\w\d\_]+)\.rownum\.odd\.([\d]+)/"; // replace section rownum.even.digit
$replace[] = "!((\\1_secvar / \\2) % 2)";
$search[] = "/(\\\$[\w\d\_]+)\.index\.even\.([\d]+)/"; // replace section index.even.digit
$replace[] = "!((\\1_secvar) % \\2)";
$search[] = "/(\\\$[\w\d\_]+)\.index\.odd\.([\d]+)/"; // replace section index.even.digit
$replace[] = "((\\1_secvar) % \\2)";
$search[] = "/(\\\$[\w\d\_]+)\.rownum\.mod\.([\d]+)/"; // replace section rownum.even.digit
$replace[] = "!((\\1_secvar+1) % \\2)";
$search[] = "/(\\\$[\w\d\_]+)\.index\.mod\.([\d]+)/"; // replace section rownum.even.digit
$replace[] = "!((\\1_secvar) % \\2)";
$search[] = "/(\\\$[\w\d\_]+)\.rownum\.even/"; // replace section rownum.even
$replace[] = "!((\\1_secvar+1) % 2)";
$search[] = "/(\\\$[\w\d\_]+)\.rownum\.odd/"; // replace section rownum.odd
$replace[] = "((\\1_secvar+1) % 2)";
$search[] = "/(\\\$[\w\d\_]+)\.index\.even/"; // replace section index.even
$replace[] = "!((\\1_secvar) % 2)";
$search[] = "/(\\\$[\w\d\_]+)\.index\.odd/"; // replace section index.odd
$replace[] = "((\\1_secvar) % 2)";
$search[] = "/(\\\$[\w\d\_]+)\.rownum/"; // replace section rownum
$replace[] = "\\1_secvar+1";
$search[] = "/(\\\$[\w\d\_]+)\.index/"; // replace section index
$replace[] = "\\1_secvar";
$search[] = "/(\\\$[\w\d\_]+)\.([\w\d\_]+)/"; // replace section vars
$replace[] = "\$\\2[\\1_secvar]";
$search[] = "/\beq\b/i"; // replace eq with ==
$replace[] = "==";
@@ -306,15 +339,24 @@ class Smarty
$replace[] = ">=";
$search[] = "/\bne(q)?\b/i"; // replace ne or neq with !=
$replace[] = "!=";
$search[] = "/^".$ld."if ([^\}]+)".$rd."$/i"; // replace if tags
$search[] = "/\band\b/i"; // replace and with &&
$replace[] = "&&";
$search[] = "/\bmod\b/i"; // replace mod with %
$replace[] = "%";
$search[] = "/\bor\b/i"; // replace or with ||
$replace[] = "||";
$search[] = "/\bnot\b/i"; // replace not with !
$replace[] = "!";
$search[] = "/^".$ld."if (.*)".$rd."$/Ui"; // replace if tags
$replace[] = "<?php if(\\1): ?>";
$search[] = "/^".$ld."\s*else\s*".$rd."$/i"; // replace else tags
$replace[] = "<?php else: ?>";
$search[] = "/^".$ld."\s*\/if\s*".$rd."$/i"; // replace /if tags
$replace[] = "<?php endif; ?>";
$search[] = "/^".$ld."\s*include\s*\"?([^\s\}]+)\"?".$rd."$/i"; // replace include tags
$replace[] = "<?php include(\"".$ctpl_file_dir."/\\1\"); ?>";
$search[] = "/^".$ld."\s*section\s+name\s*=\s*\"?([\w\d]+)\"?\s+\\\$([^\}\s]+)\s*".$rd."$/i"; // replace section tags
$search[] = "/^".$ld."\s*include\s*\"?([^\s]+)\"?".$rd."$/i"; // replace include tags
/* $replace[] = "<?php include(\"".$ctpl_file_dir."/\\1\"); ?>"; */
$replace[] = "<?php include(\"./".$this->template_dir.$this->compile_dir_ext."/\\1\"); ?>";
$search[] = "/^".$ld."\s*section\s+name\s*=\s*\"?([\w\d\_]+)\"?\s+\\\$([^\s]+)\s*".$rd."$/i"; // replace section tags
$replace[] = "<?php for(\$\\1_secvar=0; \$\\1_secvar<count(\$\\2); \$\\1_secvar++): ?>";
$search[] = "/^".$ld."\s*\/section\s*".$rd."$/i"; // replace /section tags
$replace[] = "<?php endfor; ?>";
@@ -322,14 +364,19 @@ class Smarty
if(count($this->registered_functions) > 0)
{
$funcs = implode("|",$this->registered_functions);
$search[] = "/^".$ld."\s*(".$funcs.")\s*([^\}]*)".$rd."$/i";
// user functions without args
$search[] = "/^".$ld."\s*(".$funcs.")\s*".$rd."$/i";
$replace[] = "<?php smarty_\\1(); ?>";
// user functions with args
$search[] = "/^".$ld."\s*(".$funcs.")\s+(.*)".$rd."$/i";
$replace[] = "<?php smarty_\\1(\\2); ?>";
}
$search[] = "/^".$ld."\s*(\\\$[^\}\s\.]+)\s*".$rd."$/"; // replace vars
$search[] = "/^".$ld."\s*(\\\$[^\s]+)\s*".$rd."$/"; // replace vars
$replace[] = "<?php print \\1; ?>";
// collect all the tags in the template
preg_match_all("/".$ld."[^\}]+".$rd."/U",$template_contents,$match);
preg_match_all("/".$ld.".*".$rd."/U",$template_contents,$match);
$template_tags = $match[0];
$template_tags_modified = preg_replace($search,$replace,$template_tags);
@@ -338,9 +385,26 @@ class Smarty
for($tagloop=0; $tagloop<count($template_tags); $tagloop++)
$template_contents = preg_replace("/".preg_quote($template_tags[$tagloop],"/")."/",$template_tags_modified[$tagloop],$template_contents);
// reformat data within {strip}{/strip} tags, removing spaces, tabs and newlines
preg_match_all("/\{strip\}.*\{\/strip\}/Usi",$template_contents,$match);
$strip_tags = $match[0];
$search = array( "/\{\/?strip\}/i","/[\t ]+$/m","/^[\t ]+/m","/[\r\n]+/" );
$replace = array ("","",""," ");
$strip_tags_modified = preg_replace($search,$replace,$strip_tags);
// replace the tags in the template
for($tagloop=0; $tagloop<count($strip_tags); $tagloop++)
$template_contents = preg_replace("/".preg_quote($strip_tags[$tagloop],"/")."/",$strip_tags_modified[$tagloop],$template_contents);
// replace literal delimiter tags
$template_contents = preg_replace("/{ldelim}/",$this->left_delimiter,$template_contents);
$template_contents = preg_replace("/{rdelim}/",$this->right_delimiter,$template_contents);
if(!($this->_write_file($compilepath,$template_contents)))
return false;
return true;
}