PHP, Smarty: Farklı klasörlerde şablon için kontrol edin

4 Cevap php

Bizim en son projesi için biz bir adla, diyelim ki, bir şablon için aranır klasör listesini belirtebilirsiniz Django, kullanılan example.html. Şimdi, biz geri Smarty (PHP) geçti ve benzeri bir şey varsa, merak ediyor.

Smarty sürüm:-kenar kesim olabilir.

Davranış:

  1. Klasörleri bir dizi Smarty besleyin.
  2. $smarty->display() veya {include} ile ya bir şablon diyoruz.
  3. Smarty klasörler üzerinden arar ve adını eşleşen ilk şablonu alır.

I Smarty resources baktı, ama onlar bu görev için overkill gibi bakmak ve belgeler bu konuda biraz seyrek. Herhangi bir fikir, bu nasıl yapılabilir?

An additional problem klasörlerin listesi istenen URL bağlı olarak değişebilir olmasıdır. Herhangi bir fikir nasıl kullanılacağı şablon derlenmiş Smarty, anlatacak?

Alkış,

4 Cevap

Smarty.class.php olarak, yöntemde Smarty::_parse_resource_name(),

foreach ((array)$params['resource_base_path'] as $_curr_path) {
    $_fullpath = $_curr_path . DIRECTORY_SEPARATOR . $params['resource_name'];
    if (file_exists($_fullpath) && is_file($_fullpath)) {
        $params['resource_name'] = $_fullpath;
        return true;
    }
    // didn't find the file, try include_path
    $_params = array('file_path' => $_fullpath);
    require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
    if(smarty_core_get_include_path($_params, $this)) {
        $params['resource_name'] = $_params['new_file_path'];
        return true;
    }
}

$params['resource_base_path'] $this->template_dir 'de varsayılan bir Smarty::_fetch_resource_info().

Eğer $smarty->template_dir Bu özyinelemeli olmayacağını Not içeri bakmak için dizin bir dizi ayarlayabilirsiniz gibi Öyle görünüyor. Bu belgelenmemiş bir özellik olmalıdır.

Bu soru soruldu beri onun bir süre oldu biliyorum, ama kayıt için ben OP soran ne yapar düşünüyorum Smarty bir özelliği işaret etmek istedim. Aşağıda benim app kod kısmıdır.

Temelde ne yapar /ext/templates şablon için ilk bakmak. Orada bulmak değilse, o /base/templates den birini kullanacağız. Benim kod tek bir geri dönüşlü gerektirir, ancak daha kolay eklenebilir.

class View extends Smarty {
    function __construct() {
        parent::Smarty();

        $this->template_dir = LOCAL_APP_ROOT.'/ext/templates';
        $this->compile_dir = LOCAL_APP_ROOT.'/cache/compile';

        $this->default_template_handler_func = '__default_template_handler';
    }
}


function __default_template_handler($resource_type, $resource_name, &$template_source, &$template_timestamp, &$smarty_obj) {
    if ($resource_type == 'file') {
        if (!is_readable($resource_name)) {
            $defaultPath = LOCAL_APP_ROOT."/base/templates/$resource_name";
            if (file_exists($defaultPath)) {
                $template_source = file_get_contents($defaultPath);
                $template_timestamp = filemtime($defaultPath);
                return true;
            }
        }
    }
    return false;
}

Ne yazık ki, Smarty tek bir şablon dizinine (Smarty nesnenin template_dir özelliği) ile çalışacak şekilde tasarlanmıştır. Eğer olsa, zamanında bu değiştirebilirsiniz, böylece size aradığınız bazı etkilere alabilirsiniz.

Smarty template_dir değeri dizinleri bir dizi olabilir. Eşleşen şablon bulunana kadar Smarty sırayla dizinleri hareket edecek.