I have seen the source code of phpcms and discuz, so there may be a lack of innovation. However, the principles are mostly the same, but the details may be slightly different.
Let’s get to the point, let’s start talking about the specific implementation process.
1. First, decide where to place the template file? Where to put the converted php files? And how to name it? Directly upload the source code:
Copy the code The code is as follows:
function template($tpl = 'index',$dir = ' hello')
{
if(!file_exists($pd = TPL_PATH.$dir.'/'))@mkdir($pd,0777) or die("$pd directory creation failed");// Such as cache/tpl/hello/
if(!file_exists($td = TPL.$dir.'/'))@mkdir($td,0777) or die("$td directory creation failed");// Such as data/tpl/hello/
$t2p = $pd.$tpl.'.php';//The php file formed after regular conversion of the template file, such as cache/tpl/hello/index.php
$t2h = $td.$tpl.'.html';//html template file, such as data/tpl/hello/index.html
2. When is regular conversion needed? It can be that the php file after regularization does not exist, or the html file before regularization has changed. The filemtime(string $path) function is used here, which returns the latest modification time of the file.
Copy code The code is as follows:
if(!file_exists($t2p) || @filemtime($t2p) < @filemtime($t2h) )//After the template file is changed, the regular php file is updated accordingly
{
template_go($t2p,$t2h);//Template conversion starts
}
return $ t2p;//Return the regularized php file, which can be called like this: include template('header','hello');
}
3. Start template conversion, first start with html Read it from the file, then replace it with regular expressions, and finally write it to the php file.
Copy code The code is as follows:
function template_go($t2p,$t2h)
{
$str = @file_get_contents($t2h);//Read out
if($str === false) exit("The template file is missing, please check!");
$str = template_do($str);/ /Regular replacement
@chmod($t2p,0777);
return $str = file_put_contents($t2p, $str);//Write
}
4. Regular rules, several relatively simple regular replacement syntax.
Copy code The code is as follows:
function template_do($str)
{
$str = preg_replace( '/([nr+])t+/s', '\1', $str);//Remove TAB tab character. The modifier /s does not ignore line breaks
$str = preg_replace('/{$(.*)}/Us', '', $str);/* Replace {$xx} with Note that the modifier /U must be added and can only match once. You can also use lazy matching */
$str = preg_replace('/{php (.+)}/', '', $str);/*{php xxxx} replaced by Note that you cannot add the modifier /s. You must consider the problem of line breaks when performing this regular rule multiple times*/
$str = preg_replace('/{template(.*)}/Us ', '', $str);
/*{template(xx,yy)} replaced with $str = preg_replace('/{include (.*)}/Us', '', $str);/*{include xx. php} replaced with */
$str = "".$str ;
//$str = preg_replace('/s+/', ' ', $str);//Check the web page source code to see
return $str;
}
Of course, this function is still relatively crude now, and we look forward to improving it.
ps: This is my first time writing a blog. I originally thought I would write a technical blog when I had time, talk about my experiences, and sum up my experiences and lessons, while also learning from the experts.
Also, the blog is relatively easy to save, which is convenient and saves trouble, haha.
http://www.bkjia.com/PHPjc/326214.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/326214.htmlTechArticleI have seen the source code of phpcms and discuz, so there may be a lack of innovation, but the principles are mostly the same, just the details. Might be slightly different. Let’s get to the point, let’s talk about the specific implementation process...