PHP шаблоны - PullRequest
       26

PHP шаблоны

2 голосов
/ 15 ноября 2008

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

Сначала я использую 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 и огромном количестве шаблонизаторов - я не собираюсь их использовать, поэтому, пожалуйста, не предлагайте их. Спасибо!

Ответы [ 4 ]

7 голосов
/ 15 ноября 2008

Вместо того, чтобы проходить через ваш цикл, вы можете использовать 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 ... идеально подходит для манипулирования данными в вашем шаблоне. См. " Альтернативный синтаксис для структур управления " для получения более подробной информации.

6 голосов
/ 15 ноября 2008

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

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

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

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

3 голосов
/ 15 ноября 2008

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

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

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

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

0 голосов
/ 12 апреля 2016

Создать файл

  1. config.php
  2. index.php

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

  1. вкл
  2. шаблон / default / controller / main файлы здесь 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. index.php? Страница = дом
  2. index.php? Page = логин ...

Код активного класса

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

Привет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...