Могу ли я заставить Smarty выбирать шаблон из каталога на основе приоритета?

Я создаю вики-движок PHP, который использует один и тот же шаблон для всех веб-сайтов, которые на него указывают. Однако некоторые веб-сайты имеют собственный шаблон. Могу ли я заставить Smarty использовать этот пользовательский шаблон, если он существует?

Вот моя структура каталогов:

/web/wiki/templates                 <--  all templates here
/web/wiki/templates/wiki.domain.com <-- individual template

Как сделать так, чтобы шаблоны в /web/wiki/templates/wiki.domain.com использовались сначала для wiki.domain.com, а если шаблона в этом каталоге нет, то использовать шаблон в /web/wiki/templates?

Могу ли я определить несколько каталогов шаблонов для Smarty, и он сначала попытается выбрать шаблон из верхнего каталога? Если бы я мог это сделать, я мог бы просто изменить порядок каталогов шаблонов:

/web/wiki/templates/wiki.domain.com
/web/wiki/templates                

person bodacydo    schedule 16.06.2012    source источник


Ответы (4)


default_template_handler — это обратный вызов, который вызывается, если шаблон не найден. Некоторые «примеры» можно найти в модульный тест

person rodneyrehm    schedule 17.06.2012
comment
+1 - Не знал об этом методе, кажется, это было бы хорошим решением вместо проверки массива с именами шаблонов с помощью template_exists - person Cyclonecode; 22.06.2012

Из Smarty Docs попробуйте:

// set multiple directoríes where templates are stored
$smarty->setTemplateDir(array(
    'one'   => './templates',
    'two'   => './templates_2',
    'three' => './templates_3',
));
person Marcio Mazzucato    schedule 30.01.2014
comment
Что касается приоритета, «./templates» получит самый высокий приоритет, если шаблон не найден, он будет искать в «./templates_2», а затем в «./templates_3». - person adi rohan; 10.08.2014

Чтобы расширить код Кристера, если у вас много возможных шаблонов:

$possibleTemplates = array(
    // ...
);

do {
    $template = array_shift($possibleTemplates);
} while($template && !$smarty->template_exists($template));

if(!$template) {
    // Handle error
}

$smarty->display($template);
person Cameron Martin    schedule 16.06.2012

Я не думаю, что вы можете установить приоритет для разных шаблонов, но я не уверен. Что вы можете сделать, так это проверить, существует ли конкретный шаблон:

// check for if a special template exists
$template = 'default.tpl.php';
if ($smarty->template_exists('example.tpl.php')) {
   $template = 'example.tpl.php';
}
// render the template
$smarty->display($template);
person Cyclonecode    schedule 16.06.2012
comment
Хороший подход, попробую. Я думаю, что я также попробую свой подход и посмотрю, смогу ли я установить несколько каталогов шаблонов, а затем я увижу, какой из них имеет приоритет, если смогу. (Сам еще не пробовал.) - person bodacydo; 17.06.2012
comment
@bodacydo - Дайте мне знать, если вы узнаете, как это сделать. - person Cyclonecode; 17.06.2012