Smarty caching

DIMAD

Новичок
Smarty caching

Возникла проблема с кешированием смарти.
Есть 2 функции. Как предотвратить кеширование того, что между тегами {dynamic} {/dynamic} в шаблоне. В приведенном варианте сервер сбрасывает соединение без вывода каких либо ошибок! В справке к смарти функция $GLOBALS['smarty']->register_block() и $GLOBALS['smarty']->display() вызывается за областью функции. Но ведь в моем случае в одном файле может быть много функций и вызываться разные шаблоны, поэтому нужно заставить работать все это именно в определенной функции – в моем случае в функции mainenter.

function mainenter() {
mt_srand ((double)microtime()*1000000);
$max = 1000000;
$num = mt_rand(0, $max);
//$GLOBALS['smarty']->clear_cache(null,$GLOBALS['my_cache_id']);
$GLOBALS['smarty']->assign("language",$GLOBALS['language']);
if (extension_loaded("gd") and ($GLOBALS['enter_check'] == "yes"))
{
$GLOBALS['smarty']->assign("enter_check",$num);
$GLOBALS['smarty']->assign("num",$num);
}
else
{
$GLOBALS['smarty']->assign("enter_check","no");
}
$GLOBALS['smarty']->assign("site_charset",$GLOBALS['site_charset']);
$GLOBALS['smarty']->assign("site_name",$GLOBALS['site_name']);
$GLOBALS['smarty']->assign("site_keywords",$GLOBALS['site_keywords']);
$GLOBALS['smarty']->assign("site_description",$GLOBALS['site_description']);
$GLOBALS['smarty']->register_block('dynamic', 'mainenter', false);
$GLOBALS['smarty']->display("systemadmin/enter.html",$GLOBALS['my_cache_id']);
}




И есть шаблон enter.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset={$site_charset}">
<META NAME="KEYWORDS" CONTENT="{$site_keywords}">
<META NAME="DESCRIPTION" CONTENT="{$site_description}">
<TITLE>{$site_name}</TITLE>
<LINK REL="SHORTCUT ICON" HREF="../themes/system/images/favicon.ico" TYPE="image/x-icon">
<LINK REL="StyleSheet" HREF="../themes/system/css/style.css" TYPE="text/css">
</head>
<body>
{config_load file="../languages/$language/systemadmin/enter.conf"}
<table border="0" cellspacing="0" cellpadding="0" align="center">
<tr>
<td>
<form action="index.php" method="post">
<center>{#_ADMINLOGIN#}:<br> <input type="text" name="admin_login" size="25" maxlength="25"></center>
<center>{#_ADMINPASSWORD#}:<br> <input type="password" name="admin_password" size="25" maxlength="25"></center>
{if $enter_check ne "no"}
{dynamic}
<img src='index.php?func=check_enter&amp;num={$num}' width='65' border='1' alt="">
<br><input type="text" name="check_code" size="11" maxlength="6"><br><br>
<input type="hidden" name="num" value="{$num}">
{/dynamic}
{/if}
<input type="hidden" name="func" value="mainadmin">
<center><input type="submit" value="{#_ENTER#}"></center>
</form>
</td>
</tr>
</table>
</body>
</html>

-~{}~ 23.07.06 17:38:

вот что в справке:
Пример 14-11. Предотвращение кэширования части страницы

index.php:

<?php
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;

function smarty_block_dynamic($param, $content, &$smarty) {
return $content;
}
$smarty->register_block('dynamic', 'smarty_block_dynamic', false);

$smarty->display('index.tpl');
?>

Шаблон index.tpl:

Страница кэширована: {"0"|date_format:"%D %H:%M:%S"}

{dynamic}

Текущее время: {"0"|date_format:"%D %H:%M:%S"}

... выполняем разные действия ...

{/dynamic}



Во время обновления страницы вы заметите, что даты отличаются. Одна является "динамической", другая - "статической". Вы можете поместить в конструкцию {dynamic}...{/dynamic} любой код и быть уверенным, что он не будет помещён в кэш вместе с остальной частью страницы.


А мне нужно чтоб $smarty->register_block('dynamic', 'smarty_block_dynamic', false); $smarty->display('index.tpl'); работали в определенной функции:
 

zerkms

TDD infected
Команда форума
в этой определённой функции сделай регистер, потом унрегистер
 

DIMAD

Новичок
Fatal error: Smarty error: [in systemadmin/enter.html line 20]: syntax error: unrecognized tag 'dynamic' (Smarty_Compiler.class.php, line 583) in D:\Server\home\test.com\htdocs\smarty\Smarty.class.php on line 1095

Вот что получилось.
Функция получилась такая
function mainenter() {
mt_srand ((double)microtime()*1000000);
$max = 1000000;
$num = mt_rand(0, $max);
//$GLOBALS['smarty']->clear_cache(null,$GLOBALS['my_cache_id']);
$GLOBALS['smarty']->assign("language",$GLOBALS['language']);
if (extension_loaded("gd") and ($GLOBALS['enter_check'] == "yes"))
{
$GLOBALS['smarty']->assign("enter_check",$num);
$GLOBALS['smarty']->assign("num",$num);
}
else
{
$GLOBALS['smarty']->assign("enter_check","no");
}
$GLOBALS['smarty']->assign("site_charset",$GLOBALS['site_charset']);
$GLOBALS['smarty']->assign("site_name",$GLOBALS['site_name']);
$GLOBALS['smarty']->assign("site_keywords",$GLOBALS['site_keywords']);
$GLOBALS['smarty']->assign("site_description",$GLOBALS['site_description']);
$GLOBALS['smarty']->register_block('dynamic', 'mainenter', false);
$GLOBALS['smarty']->display("systemadmin/enter.html",$GLOBALS['my_cache_id']);
$GLOBALS['smarty']->unregister_block('dynamic', 'mainenter', false);
}

Что еще посоветуете. Ну или как еще можно избежать кешированря определенного участка. Не делать же каждый раз //$GLOBALS['smarty']->clear_cache(null,$GLOBALS['my_cache_id']);
 

DIMAD

Новичок
в данный момент хочу разобраться в чем причина того что мой(в первом посте) код не работает и вызывает "Соединение с сервером сброшено".

Necromant
Это же вроде тоже самое что и display тоько оно перехватывает вывод. Мне нужно избежать кеширования определенной части странички и у меня это почему-то не получается. Помоги, если можешь, разобраться почему не работает register_block в функции mainenter.

-~{}~ 24.07.06 14:04:

Спасибо всем за внимание, проблема решилась. Все что нужно было - так это добавить строки
function smarty_block_dynamic($param, $content, &$smarty) {
return $content;
}

$smarty->register_block('dynamic', 'smarty_block_dynamic', false);

перед всеми функциями.
 
Сверху