2008-11-15 2 views
2

Я пишу простой шаблонный слой в PHP, но я немного застрял. Вот как это работает на данный момент:PHP Templating

Во-первых, я использую fetch_template для загрузки содержимого шаблона из базы данных - это работает (и я собираю все шаблоны при запуске, если вам интересно).

Я использую PHP переменные в моем шаблоне кода и в логике - например .:

// PHP: 
$name = 'Ross'; 

// Tpl: 
<p>Hello, my name is $name.</p> 

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

/** 
* Returns a template after evaluating it 
* @param string $template Template contents 
* @return string Template output 
*/ 
function output_template($template) { 
    eval('return "' . $template . '";'); 
} 

Моя проблема, если вы еще не догадались, является то, что переменные не объявляются внутри функции - поэтому функция не может разобрать их в $template, если я не поставил их в глобальном масштабе - что я Я не уверен, что хочу это сделать. Это или иметь массив переменных в качестве параметра в функции (что звучит еще более утомительно, но возможно).

У кого-нибудь есть какие-либо решения, кроме использования кода из этой функции (это всего лишь однострочный) в моем коде, а не в использовании функции?

Спасибо, Росс

P.S. Я знаю о Smarty и широком спектре шаблонов двигателей там - я не хочу их использовать, поэтому, пожалуйста, не предлагайте их. Благодаря!

ответ

7

Вместо того, чтобы проходить через вашу петлю, вы можете использовать include($template_name).

Или, если вы хотите, чтобы содержание выхода из шаблона, вы можете сделать что-то вроде этого:

$template_name = 'template.php'; 

// import the contents into this template 
ob_start(); 
include($template_name); 
$content = ob_get_clean(); 

// do something with $content now ... 

И помните, в шаблоне, вы можете использовать часто забывает синтаксис PHP:

<?php if ($a == 5): ?> 
A is equal to 5 
<?php endif; ?> 

Альтернативный синтаксис доступен для if, while, for, foreach и switch ... идеально подходит для управления данными в вашем шаблоне. См. «Alternative syntax for control structures» для получения более подробной информации.

6

Я передал ассоциативный массив с заменяемыми переменными, а затем извлечение() их.

Тогда вы также можете передать $ _GLOBALS для достижения того же результата.

function output_template($template, $vars) { 
    extract($vars); 
    eval('return "' . $template . '";'); 
} 

Edit: вы также можете рассмотреть строку subtitution вместо Eval, в зависимости от того, кто позволил писать шаблоны и о том, кто определяет, какой шаблон для загрузки. Тогда может возникнуть проблема с ускорением ...

+0

Я ожидаю, что в этой системе будет только одно касание кода, основная причина, по которой я не использую строковые вары (например, {VARNAME}), потому что это быстрее. Сначала я был настроен скептически, но друг указал мне, насколько медленным был мой оригинальный компилятор шаблонов. – Ross 2008-11-15 10:48:18

3

Также, расширяя комментарий davev, eval немного уродлив.

Если вы можете сделать что-то вроде

function inc_scope($file , $vars) 
{ 
    extract($vars); 
    ob_start(); 
    require($file); 
    return ob_get_clean(); 
} 

Тогда вы получите использовать набившие оскомину-PHP в качестве языка шаблонов, и вы не получаете никакой злой Evals, и «извлечь» + буферизацию просто ограничивает видимую область действия PHP-кода в требовании.

+0

«Злые evals» - они только злые, если вы делаете что-то глупое, как eval ('echo $ _GET [' name '];') ;! – Ross 2008-11-15 10:54:09

0

Создать файл

  1. config.php
  2. index.php

Создать папку

  1. вкл
  2. шаблонов/по умолчанию/контроллер/основные файлы здесь home.php, login.php, register.php, contact.php, product.php ...

  1. headet.tpl и footer.tpl включая файл home.php.
  2. основной реж/шаблон/по умолчанию

config.php код здесь

/* semu design */ 
// HTTP URL 
define('HTTP_SERVER', 'http://localhost/1/'); 

// HTTPS URL DISABLE 
// define('HTTPS_SERVER', 'http://localhost/1/'); 

// DİZİNLER 
define('DIR_INC',  'C:\wamp\www\1/inc/'); 
define('DIR_TEMLATE', 'C:\wamp\www\1/template/default/'); 
define('DIR_MODULES', 'C:\wamp\www\1/template/default/module/'); 
define('DIR_IMAGE',  'C:\wamp\www\1/image/'); 
define('DIR_CACHE',  'cache'); // [php cache system turkish coder][1] 

// DB 
define('DB_HOSTNAME', 'localhost'); 
define('DB_USERNAME', 'root'); 
define('DB_PASSWORD', '123'); 
define('DB_DATABASE', 'default'); 
define('DB_PREFIX',  ''); 

index.php код здесь

<?php 
// Version 
define('VERSION', '1.0'); 

// Config file 
if (file_exists('config.php')) { 
    require_once('config.php'); 
} 

// Moduller 
require_once(DIR_INC . 'startup.php'); // mysql.php db engine, cache.php, functions.php, mail.php ... vs require_once code 

// Cache System 
//$sCache = new sCache(); 

/*$options = array(
    'time' => 120, 
    'buffer' => true, 
    'load' => false, 
    //'external'=>array('nocache.php','nocache2.php'), // no cache file 
); 

$sCache = new sCache($options);*/ 

// page 
$page = isset($_GET['page']) ? trim(strtolower($_GET['page'])) : "home"; 

$allowedPages = array(
    'home'   => DIR_TEMPLATE.'controller/home.php', 
    'login'   => DIR_TEMPLATE.'controller/login.php', 
    'register'  => DIR_TEMPLATE.'controller/register.php', 
    'contact'  => DIR_TEMPLATE.'controller/contact.php' 
); 

include(isset($allowedPages[$page]) ? $allowedPages[$page] : $allowedPages["home"]); 
?> 
  1. Ind ex.php страница = дом
  2. index.php страница = Войти ...

код Активный класс

<ul> 
<li <?php if ($page == 'home') echo 'class="active"'; ?> Home </li> 
<li <?php if ($page == 'login') echo 'class="active"'; ?> Login </li> 
</ul> 
  1. И Токен система подходит:?
  2. index.php? Page = home & token = Co54wEHHdvUt4QzjEUyMRQOc9N1bJaeS

С уважением.