tag - PHP Templating
wordpress php get post title by id (4)
Estoy escribiendo una capa de plantillas simple en PHP, pero me tengo un poco atascado. Así es como funciona en este momento:
En primer lugar, uso fetch_template
para cargar los contenidos de la plantilla de la base de datos, esto funciona (y recopilo todas las plantillas al inicio si está interesado).
Utilizo variables de PHP en mi código de plantilla y en la lógica, por ejemplo:
// PHP:
$name = ''Ross'';
// Tpl:
<p>Hello, my name is $name.</p>
Luego uso output_template
(abajo) para analizar las variables en la plantilla y reemplazarlas. Anteriormente, estaba usando etiquetas de plantilla con una clase de plantilla str_replace
glorificada, pero era demasiado ineficiente.
/**
* Returns a template after evaluating it
* @param string $template Template contents
* @return string Template output
*/
function output_template($template) {
eval(''return "'' . $template . ''";'');
}
Mi problema, si aún no lo has adivinado, es que las variables no están declaradas dentro de la función, por lo tanto, la función no puede analizarlas en $template
menos que las coloque en el ámbito global, lo que no estoy seguro de querer que hacer. Eso o tiene un conjunto de variables como un parámetro en la función (que suena aún más tedioso pero posible).
¿Alguien tiene alguna solución que no sea usar el código de la función (es solo una línea) en mi código, en lugar de usar la función?
Gracias, Ross
Ps. Sé sobre Smarty y la amplia gama de motores de plantillas que existen. No estoy buscando usarlos, así que no los sugiera. ¡Gracias!
Pasaba una matriz asociativa con variables para reemplazar, luego las extraía ().
Entonces también podría pasar $ _GLOBALS para lograr el mismo resultado.
function output_template($template, $vars) {
extract($vars);
eval(''return "'' . $template . ''";'');
}
Editar: es posible que también desee considerar la subtitución de cadenas en lugar de eval, en función de quién puede escribir sus plantillas y de quién especifica qué plantilla cargar. Entonces también podría haber un problema con el escape ...
En lugar de ejecutarlo, puede usar include($template_name)
.
O bien, si desea el contenido de la salida de la plantilla, puede hacer algo como esto:
$template_name = ''template.php'';
// import the contents into this template
ob_start();
include($template_name);
$content = ob_get_clean();
// do something with $content now ...
Y recuerde, en su plantilla, puede utilizar la sintaxis PHP a menudo pasada por alto:
<?php if ($a == 5): ?>
A is equal to 5
<?php endif; ?>
La sintaxis alternativa está disponible para if, while, for, foreach e switch ... perfecto para manipular los datos en su plantilla. Consulte " Sintaxis alternativa para estructuras de control " para más detalles.
Crea un archivo
- config.php
- index.php
Crear carpeta
- Cª
- template / default / controller / main files aquí home.php, login.php, register.php, contact.php, product.php ...
- headet.tpl y footer.tpl incluyen el archivo home.php.
- principal dir / plantilla / predeterminado
código config.php aquí
/* 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'', '''');
código index.php aquí
<?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"] );
?>
- index.php? page = home
- index.php? page = inicio de sesión ...
Código de clase activo
<ul>
<li <?php if ( $page == ''home'' ) echo ''class="active"''; ?> Home </li>
<li <?php if ( $page == ''login'' ) echo ''class="active"''; ?> Login </li>
</ul>
- Y el sistema Token viene:
- index.php? page = home & token = Co54wEHHdvUt4QzjEUyMRQOc9N1bJaeS
Saludos.
Además, ampliar la evaluación de los comentarios de davev es un poco desagradable.
Si puedes hacer algo como
function inc_scope( $file , $vars )
{
extract($vars);
ob_start();
require($file);
return ob_get_clean();
}
Luego puedes usar plain-old-php como tu lenguaje de plantillas, y no obtienes ningún evil-evals, y "extract" + buffering simplemente limita el alcance visible del código php en el requerimiento.