2 Stimmen

PHP-Schablonenbildung

Ich schreibe eine einfache Templating-Schicht in PHP, aber ich habe mich ein wenig stecken. Hier ist, wie es im Moment funktioniert:

Erstens verwende ich fetch_template um den Inhalt der Vorlagen aus der Datenbank zu laden - das funktioniert (und ich sammle alle Vorlagen beim Start, falls Sie daran interessiert sind).

Ich verwende PHP-Variablen in meinem Vorlagencode und in der Logik - z.B.:

// PHP:
$name = 'Ross';

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

Ich verwende dann output_template (siehe unten), um die Variablen in der Vorlage zu analysieren und sie zu ersetzen. Zuvor verwendete ich Template-Tags mit einer glorifizierten str_replace Vorlagenklasse, aber das war zu ineffizient.

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

Mein Problem, falls Sie es nicht schon erraten haben, ist, dass die Variablen nicht innerhalb der Funktion deklariert sind - daher kann die Funktion sie nicht in $template es sei denn, ich setze sie in den globalen Geltungsbereich - was ich nicht unbedingt tun möchte. Das oder haben ein Array von Variablen als Parameter in der Funktion (das klingt noch mehr mühsam, aber möglich).

Hat jemand eine andere Lösung als die Verwendung des Codes aus der Funktion (es ist nur ein Einzeiler) in meinem Code, anstatt die Funktion zu verwenden?

Danke! Ross

P.s. Ich weiß, über Smarty und die große Auswahl an Templating-Engines gibt - ich bin nicht auf der Suche, um sie zu verwenden, so bitte nicht vorschlagen, sie. Danke!

8voto

Howard Sandford Punkte 1600

Anstatt Ihre Schleife zu durchlaufen, können Sie auch include($template_name) .

Oder, wenn Sie den Inhalt der Ausgabe aus der Vorlage haben wollen, können Sie so vorgehen:

$template_name = 'template.php';

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

// do something with $content now ...

Und denken Sie daran, dass Sie in Ihrer Vorlage die oft übersehene PHP-Syntax verwenden können:

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

Eine alternative Syntax ist für if, while, for, foreach und switch verfügbar ... perfekt für die Manipulation der Daten in Ihrer Vorlage. Siehe " Alternative Syntax für Kontrollstrukturen " für weitere Informationen.

6voto

Dave Vogt Punkte 16300

Ich würde ein assoziatives Array mit den zu ersetzenden Variablen übergeben und diese dann extrahieren().

Dann könnten Sie auch $_GLOBALS übergeben, um das gleiche Ergebnis zu erzielen.

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

Bearbeiten: Sie könnten auch eine Stringsubstitution anstelle von eval in Betracht ziehen, je nachdem, wer Ihre Vorlagen schreiben darf und wer festlegt, welche Vorlage geladen werden soll. Dann könnte es auch ein Problem mit Escaping geben...

3voto

Kent Fredric Punkte 55042

Auch die Erweiterung auf davev Das Kommentar-Evalu ist ein bisschen hässlich.

Wenn Sie etwas tun können wie

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

Dann können Sie plain-old-php als Ihre Templating-Sprache verwenden, und Sie erhalten keine evil-evals, und "extract" + Pufferung begrenzt lediglich den sichtbaren Umfang des php-Codes in der erfordern.

-1voto

Semu Punkte 44

Datei erstellen

  1. config.php
  2. index.php

Ordner erstellen

  1. inkl.
  2. template/default/controller/ Hauptdateien hier home.php, login.php, register.php, contact.php, product.php ...

  1. headet.tpl und footer.tpl enthalten die Datei home.php.
  2. Hauptverzeichnis /template/default

config.php Code hier

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

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

// DIZINLER
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 Code hier

<?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?page=home
  2. index.php?page=login ...

Aktiver Klassencode

<ul>
<li <?php if ( $page == 'home' ) echo 'class="active"'; ?> Home </li>
<li <?php if ( $page == 'login' ) echo 'class="active"'; ?> Login </li>
</ul>
  1. Und das Token-System kommt:
  2. index.php?page=home&token=Co54wEHHdvUt4QzjEUyMRQOc9N1bJaeS

Herzliche Grüße.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X