在SMARTY 3中使用包含模板的文件名默认值

时间:2011-02-04 22:11:59

标签: php templates smarty

虽然我认为这个问题并不尽如人意,但让我试着在这里解释一下。

我有一个使用SMARTY 3作为模板系统的网站。我有一个类似于下面的模板结构:

/templates/place1/inner_a.tpl
/templates/place1/inner_b.tpl

/templates/place2/inner_b.tpl
/templates/place2/inner_c.tpl

/templates/default/inner_a.tpl
/templates/default/inner_b.tpl
/templates/default/inner_c.tpl

使用

将它们包含在父模板中
{include file="{$temp_folder}/{$inner_template}"}

到目前为止很棒。我想要做的是设置默认值,如果文件{$temp_folder}/{$inner_template}不存在,则使用default/{$inner_template}处的等效文件。

即。如果我{include file="place1/inner_c.tpl"},由于该文件不存在,它实际上包含“default / inner_c.tpl”

有可能吗?

1 个答案:

答案 0 :(得分:0)

你必须在php中完成它,smarty没有办法检查文件是否存在。

您也可以编写自己的模板处理程序。

<?php
// put this function somewhere in your application

function make_template ($resource_type, $resource_name, &$template_source, &$template_timestamp,
&$smarty_obj)
{
    if( $resource_type == 'file' ) {
        if ( ! is_readable ( $resource_name )) {
            // create the template file, return contents.
            $template_source = "This is a new template.";
            require_once SMARTY_CORE_DIR . 'core.write_file.php';
            smarty_core_write_file( array( 'filename'=>$smarty_obj->template_dir . DIRECTORY_SEPARATOR . $resource_name, 'contents'=>$template_source ), $smarty_obj ); 
            return true;
        }
    } else {
        // not a file
        return false;
    }
}

// set the default handler
$smarty->default_template_handler_func = 'make_template';
?>