0

我正在使用 symfony 1.4、smarty 和 LAMP 我想知道在我的情况下什么是最好的优化方式。

我的电子邮件模板分为三个部分:

  1. 标题(静态)
  2. 正文(可以是静态的或可变的)
  3. 页脚(非静态,因为它有一个取消订阅链接,我知道要传递一个唯一的 ID)

邮件模板代码

~$commonheader
~$body
~footer

我为页眉页脚和正文使用了部分,这意味着永远邮件程序所有这些都将被解析。

我应该怎么做那个静态部分不应该一次又一次地解析

4

1 回答 1

2

您应该启用 smarty 缓存(参见http://www.smarty.net/docsv2/en/caching)并使用 insert 而不是 include。正如 smarty 文档所说:

模板的某些部分可能未缓存。如果您启用了缓存,则不会缓存 {insert} 标签。每次创建页面时,它们都会动态运行,即使在缓存页面中也是如此。这适用于横幅、民意调查、实时天气、搜索结果、用户反馈区域等。

因此,示例代码将是:

测试.php

<?
require_once("lib/smarty/Smarty.class.php");
$smarty = new Smarty();
$smarty->setTemplateDir( 'templates' );
$smarty->setCompileDir( 'templates_c' );
$smarty->setCacheDir( 'templates_cache' );
$smarty->setConfigDir( 'templates_config' );
$smarty->caching = 1;
$smarty->compile_check = true;

function insert_Body() 
{
    global $smarty;
    ob_start();
    $smarty->display("search.tpl");
    $ret =  ob_get_contents();
    ob_end_clean();
    return $ret;
}

$smarty->display("test.tpl");

测试.tpl

<h1>Smarty test</h1>
{insert name="body"}
<hr>

插入标记将在 php 文件中查找名为“insert_”的函数,后跟传递的名称。在这个例子中它是 insert_Body();

您还可以将变量传递给函数,例如要包含的文件名。来自 Smarty 文档(http://www.smarty.net/docsv2/en/language.function.insert.tpl

{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}

Smarty 会调用这个函数: insert_getBanner(array("lid" => "12345","sid" => "67890")); 并显示返回的结果来代替 {insert} 标记。

请注意,该值应由函数返回,但没有回显。这就是为什么我使用 ob_start() & ob_end_clean() 和 ob_get_contents()

于 2013-07-03T09:38:42.817 回答