Pregunta

Estoy a punto de echarse a llorar. He leído la página del manual de php.net, intentado una docena de búsquedas de Google con varias frases, y escaneado cientos de hilos stackoverflow. He visto a este método en uso, pero simplemente no funciona para mí. Parece tan básico. Tengo un par de preguntas relacionadas con problemas o no sé cómo encontrar respuestas a.

La parte importante del archivo PHP se ve así:

switch() {
…other cases…
default:
  $tpl['title'] = "Newsletter Signup";
  $tpl['description'] = "Newsletter description";
  $tpl['page-content'] = file_get_contents('signup.html');
}

$tpl_src = addslashes(file_get_contents('index.tpl'));
eval("\$html = \"$tpl_src\";");
echo $html;

Mi archivo index.tpl incluye líneas como las siguientes:

<title>{$tpl['title']}</title>
<meta name="description" content="{$tpl['description']}" />
nav, etc…
<div id="main-content"> {$tpl['page-content']} </div>

Me gusta la forma ordenada y limpia el código es, sin un montón de <?=…?> de extra.

En primer lugar, cuando entre llaves {} aparecen en una cadena, lo que se llama que? Puede ser que sea capaz de mirar hacia arriba y aprender cómo usarlos si lo supiera.

A continuación, este simplemente no funciona en absoluto. Si quito las comillas simples de las variables claves, es bueno, pero php.net dice que nunca debe hacer en caso de que mi nombre se convierte en una constante en algún momento el lenguaje. Lo suficientemente justo. Pero ¿cómo puedo solucionar esto? Me gusta usar una matriz para los VARs en caso de que quiera construir una subrutina evalTemplate y apenas puede pasar $ tpl a él.

Por último, $ tpl [ 'page-content'] no se imprima. La variable se establece bien; Puedo usar echo $tpl['page-content'] para probar, pero aparece como una sola línea en blanco del final de HTML.

Estoy seguro de que hay sólo algunos aspectos de la lengua que no sé todavía. Cualquier ayuda es muy apreciada !!

¿Fue útil?

Solución

Como se señaló Volker, addslashes parece ser un problema. Trate addcslashes lugar. Además, me gustaría recomendar encarecidamente hacer esta función, para simplificar la higienización / análisis:

function render ($file, $vars)
{
    // .. extra sanitisation, validation, et al.
    $_html = '';
    $_raw_file = addcslashes (file_get_contents ($file), '"\\');
    extract ($vars, EXTR_SKIP);
    eval ('$_html = "'.$_raw_file.'"');

    return $_html;
}

Y se llama así:

switch() {
// …other cases…
default:
  $tpl['title'] = "Newsletter Signup";
  $tpl['description'] = "Newsletter description";
  $tpl['page-content'] = render ('signup.html');
}

echo render ('index.tpl', $tpl);

PS: El uso de extract anterior significa que simplemente se $title sus VARs, no $tpl['title'], etc.

Otros consejos

Por lo general, no utiliza los '' delimitadores de cadena en cadena de la expansión de variables. Es decir. "$tpl[content]" en lugar de "$tpl['content']".

En cuanto a como las llaves, que delimitan la variable de caracteres cuando identificador puede venir directamente antes o después del nombre. Por ejemplo:

$item = "Cup";
$text = "I smashed four $items"; // won't work
$text = "I smashed four {$item}s"; // will work.

// 2nd output: "I smashed four Cups"

addslashes () añade barras antes de una y dos comillas dobles dentro de la cadena. El código generado por su ejemplo sería

$html = "<title>{$tpl[\'title\']}</title>
<meta name=\"description\" content=\"{$tpl[\'description\']}\" />
nav, etc…¦
<div id=\"main-content\"> {$tpl[\'page-content\']} </div>";

Y {$ tpl [ \ 'título \ ']} no analiza también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top