smarty: проблемы с кешированием при многоязычности

дедушка АУ

Новичок
smarty: проблемы с кешированием при многоязычности

всем привет.

сайт на en и на ru
соответственно шаблоны пришлось раскидать по папкам
tpl/ru & tpl/en

проблема вот в чем
если заходишь на сайт допустим с параметром en то кэшируются шаблоны все как положено - по-английски
а когда после этого заходишь с параметром ru шаблоны почему-то остаются английскими
и теперь под каким параметром не заходи все равно буду английские шаблоны

в templates_c находятся три файла
один со скомпиленным хедиром второй собственно телом и третий с футером они с английскими текстами

т.е. как я понял получая запрос на страницу которая еще не кэшировалась смарти смотрит что шаблон тот же (есть общий шаблон для всех страниц для некоторых он другой) берет скомпиленные куски шаблона (а т.к. шаблоны с одинаковыми именами различаются только папки он естественно думает что это тот же самый) и формирует из них новый кэш для этой страницы

force_compile конечно решает проблему, но как вы знаете это только для отладки и тп)

cachekey используетяс и формируется из к примеру ru+id страницы
естественно не помогает т.к. берутся скомпиленные ранее куски

вопрос: как решается проблема?
есть ли возможность задать префиксы для скомпилированных кусков чтобы различить их? (ведь про force_compile они перезаписываются, имена то у шаблонов одинаковые)
или остается только для каждого шаблона делать префиксы типа en_default.tpl?
 

magic

lancer
А как насчет варианта - дать разным языковым версиям разный templates_c? Например templates_c/ru & templates_c/en
 

si

Administrator
$compile_id

Persistant compile identifier. As an alternative to passing the same $compile_id to each and every function call, you can set this $compile_id and it will be used implicitly thereafter.

With a $compile_id you can work around the limitation that you cannot use the same $compile_dir for different $template_dirs. If you set a distinct $compile_id for each $template_dir then Smarty can tell the compiled templates apart by their $compile_id.

If you have for example a prefilter that localizes your templates (that is: translates language dependend parts) at compile time, then you should use the current language as $compile_id and you will get a set of compiled templates for each language you use.

Another example would be to use the same compile directory across multiple domains / multiple virtual hosts.
 

дедушка АУ

Новичок
лоханулся я)) надо было мануал лучше читать

magic, si
мужики спасибо, выручили :) респект

-~{}~ 13.03.06 11:21:

и еще один вопросик. как только я раскидал шаблоны по папкам
tpl/ru & tpl/en

Смарти стал выводить ошибку при {debug}

Warning: Smarty error: unable to read resource: "file:../engine/libs/smarty/debug.tpl" in d:\wwwroot\engine\libs\smarty\Smarty.class.php on line 1095

спасибо
 

дедушка АУ

Новичок
это я понимаю, вот только почему? ему какой-то другой путь прописывать давать что-ли?
изменилась ведь только глубина шаблонов, template_dir


а дебаг.тпл он же ж берет из своей папки
по идее то template_dir и SMARTY_DIR не связаны
шаблоны ведь могут быть где угодно расположены а дебаг.тпл по-любому останется там где был т.е. в папке SMARTY_DIR
 

kvf77

Red Devil
дедушка АУ
Smarty использует для поиска шаблонов исключительно template_dir. Даю подсказку, почему-то многие считают, что эта переменна - string, однако это не так - это массив, то есть вы можете указать сразу несколько путей для поиска шаблонов:
template_dir[] = 'one patch';
template_dir[] = 'two patch';
 

дедушка АУ

Новичок
kvf77
интересно каким же образом раньше он замечательно находил debug.tpl а сейчас когда путь template_dir поменялся с /tpl/ на /tpl/ru/ он почему-то его найти не может?
 

kvf77

Red Devil
дедушка АУ

что интересного-то? путь изменился и он найти не может - забавный ты какой-то
 

дедушка АУ

Новичок
kvf77
какой путь? до папки смарти?? да он какой был такой и остался
изменилась тока template_dir
debug.tpl ведь лежит в папке смарти значит он и будет ее там искать. причем тут template_dir?

-~{}~ 13.03.06 17:25:

выдержка из руководства Смарти:
"Установите опцию Smarty $debugging в true и, если необходимо, укажите $debug_tpl путь к шаблону debug.tpl (по умолчанию это SMARTY_DIR)"

"по умолчанию это SMARTY_DIR" (!!!) а он не менялся
 

kost

Новичок
Значит скоре всего ошибка проста и не имеет отношения к делу. Упростите пример до нимагу и поймете где кроется подводный камень. Если вы приведете все к игрушечному виду типа

PHP:
$smarty = new Smarty;
$smarty->compile_dir = SMARTY_DIR.'/templates_c/';
$smarty->cache_dir = SMARTY_DIR.'/cache/';
$smarty->config_dir = ROOT_DIR.'/configs/';
$smarty->template_dir = ROOT_DIR.'/templates/en/';
$smarty->display('index.tpl');
и он все еще не будет работать - тогда поговорим...
 

дедушка АУ

Новичок
фишка была в том что если SMARTY_DIR не объявлять то смарти сам прекрасно путь находит
а вот если его объявлять
define('ENGINE_ROOT_DIR', '../engine/');
define('SMARTY_DIR',ENGINE_ROOT_DIR.'libs/smarty/');
то шаблон смарти найти не может

проблема решилась добавлением к относительному пути $_SERVER['DOCUMENT_ROOT']:

define('ENGINE_ROOT_DIR', $_SERVER['DOCUMENT_ROOT'].'../engine/');
 
Сверху