ECShop设置模板的原理以及一些模板设置函数说明(个人观点)
ECShop设置模板的原理以及一些模板设置函数说明(个人观点)
admin/includes/lib_template.php 一些函数及变量说明
$template_files 可以设置内容的模板。
$page_libs 每个模板允许设置的库项目。
get_template_region() 获得模版文件中的编辑区域及其内容,即TemplateBeginEditable和此标签里面的内容件数组。第三个
参数$lib=true时,同时也获取该编辑区域内所有库项目。
get_editable_libs() 从相应模板xml文件中获得指定模板文件中的可编辑区信息,返回可编辑的库文件数组。此XML文件在模板
目录下,名为libs.xml。
设置模板的页面:admin/template.php
模板语言包:languages/语言/admin/template.php
设置模板的原理:
如果某个模板文件存在region(区域),选择region提交后,库项目会自动移至所选择的区域。
处理代码:
/* 修改模板文件 */
$template_file = '../themes/' . $curr_template . '/' . $_POST['template_file'] . '.dwt';
$template_content = file_get_contents($template_file);
$template_content = str_replace("\xEF\xBB\xBF", '', $template_content);
$org_regions = get_template_region($curr_template, $_POST['template_file'].'.dwt', false);
$region_content = '';
$pattern = '/(<!--\\s*TemplateBeginEditable\\sname="%s"\\s*-->)(.*?)(<!--\\s*TemplateEndEditable\\s*--
>)/s';
$replacement = "\\1\n%s\\3";
$lib_template = "<!-- #BeginLibraryItem \"%s\" -->\n%s\n <!-- #EndLibraryItem -->\n";
foreach ($org_regions AS $region)
{
$region_content = ''; // 获取当前区域内容
foreach ($post_regions AS $lib)
{
if ($lib['region'] == $region)
{
if (!file_exists('../themes/' . $curr_template . $lib['library']))
{
continue;
}
$lib_content = file_get_contents('../themes/' . $curr_template . $lib['library']);
$lib_content = preg_replace('/<meta\\shttp-equiv=["|\']Content-Type["|\']\\scontent=["|\']
text\/html;\\scharset=.*["|\']>/i', '', $lib_content);
$lib_content = str_replace("\xEF\xBB\xBF", '', $lib_content);
$region_content .= sprintf($lib_template, $lib['library'], $lib_content);
}
}
/* 替换原来区域内容 */
$template_content = preg_replace(sprintf($pattern, $region), sprintf($replacement , $region_content),
$template_content);
}