wp_title tag site page get_the_title blog add_filter php templates variables global-variables

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

  1. config.php
  2. index.php

Crear carpeta

  1. template / default / controller / main files aquí home.php, login.php, register.php, contact.php, product.php ...
  1. headet.tpl y footer.tpl incluyen el archivo home.php.
  2. 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"] ); ?>

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

  1. Y el sistema Token viene:
  2. 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.