<?php
class
JTemplate{
private
$templateVar
=
array
();
private
$templateDir
= '';
private
$templateCompileDir
= '';
private
$fileName
= '';
public
function
__construct(
$templateDir
,
$templateComplieDir
){
$this
->templateDir =
$templateDir
;
$this
->templateCompileDir =
$templateComplieDir
;
}
public
function
display(
$fileName
){
$this
->fileName =
$fileName
;
if
(
file_exists
(
$this
->templateDir.'/'.
$this
->fileName)){
$compileFileName
=
$this
->templateCompileDir.'/'.
$this
->file_safe_name().'.php';
if
(!
file_exists
(
$compileFileName
) ||
filemtime
(
$compileFileName
)<
filemtime
(
$this
->templateDir.'/'.
$this
->fileName)){
$this
->del_old_file();
$this
->compile();
}
extract(
$this
->templateVar);
include
$compileFileName
;
}
else
{
$this
->error('Sorry,the template file '.
$this
->fileName.' does not exist!!');
}
}
private
function
get_compile_file(){
$compileFile
=
explode
('.',
$this
->fileName);
unset(
$compileFile
[
count
(
$compileFile
)-1]);
return
implode('.',
$compileFile
);
}
private
function
compile(){
$fileHandle
= @
fopen
(
$this
->templateDir.'/'.
$this
->fileName, 'r');
while
(!
feof
(
$fileHandle
)){
$fileContent
=
fread
(
$fileHandle
,1024);
}
fclose(
$fileHandle
);
$fileContent
=
$this
->template_replace(
$fileContent
);
$fileHandle
= @
fopen
(
$this
->templateCompileDir.'/'.
$this
->file_safe_name().'.php','w');
if
(
$fileHandle
){
fwrite(
$fileHandle
,
$fileContent
);
fclose(
$fileHandle
);
}
else
{
$this
->error('Sorry,Compile dir can not write!');
}
}
public
function
assign(
$valueName
,
$value
){
$this
->templateVar[
$valueName
] =
$value
;
}
private
function
template_replace(
$content
){
$orginArray
=
array
(
'/<!--loop\s+\$(\w+)\s+\$(\w+)-->/s',
'/<!--loop\s+\$(\w+)\s+\$(\w+)\s+\$(\w+)-->/s',
'/<!--elseloop-->(.+?)<!--endloop-->/s',
'/<!--endloop-->/s',
'/<!--
if
\s+\((.+?)\)-->/s',
'/<!--
endif
-->/s',
'/<!--
elseif
\s+\((.+?)\)-->/s',
'/<!--
else
-->/s',
'/\{P:(.+?)\:}/s',
'/\{C:(\w+)\}/s',
'/\{I:(.+?)\}/s',
'/\{F:(.+?)\}/s',
'/\{EF:(.+?)\}/s',
'/\{([a-zA-Z0-9_\[\]\'\"\$\.\x7f-\xff]+)\}/s',
);
$changeArray
=
array
(
'<?php
if
(!
empty
($
$1
)&&
is_array
($
$1
)){
$countLoop
= 1;
foreach
($
$1
as
$
$2
){
$countLoop
++;?>',
'<?php
if
(!
empty
($
$1
)&&
is_array
($
$1
)){
$countLoop
= 1;
foreach
($
$1
as
$
$2
=>$
$3
){
$countLoop
++;?>',
'<?php }
if
(!
empty
(
$countLoop
))
$countLoop
--;}
else
{?>
$1
<?php }?>',
'<?php }
if
(!
empty
(
$countLoop
))
$countLoop
--;}?>',
'<?php
if
(
$1
){?>',
'<?php }?>',
'<?php }
elseif
(
$1
){?>',
'<?php }
else
{?>',
'<?php
$1
?>',
'<?php
echo
$1
;?>',
'<?php
include_once
"'.$this->templateDir.'/$1"
;?>',
'<?php
$1
;?>',
'<?php
echo
$1
;?>',
'<?php
echo
$
$1
;?>',
);
return
$repContent
=preg_replace(
$orginArray
,
$changeArray
,
$content
);
}
private
function
del_old_file(){
$compileFile
=
$this
->get_compile_file(
$this
->fileName);
$files
=
glob
(
$this
->templateCompileDir.'/'.
$compileFile
.'*.php');
if
(
$files
){
@unlink(
$files
[0]);
}
}
private
function
file_safe_name(){
$compileFile
=
$this
->get_compile_file(
$this
->fileName);
return
$compileFile
.
filemtime
(
$this
->templateDir.'/'.
$this
->fileName);
}
private
function
error(
$content
){
$stringHtml
= '<div style=
"width:780px;height:auto;padding:10px;border:1px solid #CCC;margin:0 auto;"
>';
$stringHtml
.= 'Error information:<br />';
$stringHtml
.= '<font color=
"red"
>';
$stringHtml
.=
$content
;
$stringHtml
.= '</font>';
$stringHtml
.= '</div>';
exit
(
$stringHtml
);
}
}
?>