Domanda

Sono quasi pronto a piangere. Ho letto la pagina del manuale php.net, provato una dozzina di ricerche di Google con varie frasi, e scansionato centinaia di fili StackOverflow. Ho visto questo metodo in uso, ma semplicemente non funziona per me. Sembra così semplice. Ho un paio di domande relative o problemi non so come trovare le risposte a.

La parte importante del file PHP è simile al seguente:

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;

Il mio file index.tpl include le linee come questi:

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

Mi piace come ordinato e pulito il codice è, senza un sacco di <?=…?> di più.

In primo luogo, quando parentesi graffe {} vengono visualizzati in una stringa, che cosa è che ha chiamato? Potrei essere in grado di guardare in su e imparare a usarli se conoscevo.

Avanti, questo proprio non funziona affatto. Se rimuovo le singole citazioni dai tasti variabili, è buono, ma php.net dice che si dovrebbe mai farlo nel caso in cui il mio nome diventa un linguaggio costante ad un certo punto. Giusto. Ma come faccio a risolvere questo problema? Mi piace usare un array per le Vars nel caso in cui voglio costruire una subroutine evalTemplate e posso solo passare $ tpl ad esso.

Infine, $ tpl [ 'page-content'] non stampare. La variabile è impostata bene; Posso usare echo $tpl['page-content'] per testare, ma sembra come una singola riga vuota nel codice HTML finale.

Sono sicuro che c'è solo qualche aspetto della lingua che non so ancora. Ogni aiuto è molto apprezzato !!

È stato utile?

Soluzione

Come Volker ha sottolineato, addslashes sembra essere un problema. Prova addcslashes invece. Inoltre, mi piacerebbe vivamente rendendo questa una funzione, per semplificare la sanificazione / analisi:

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;
}

E chiamato così:

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

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

PS: L'uso di extract sopra significa che le Vars saranno semplicemente $title, non $tpl['title'], ecc

Altri suggerimenti

Di solito non si utilizzano le '' delimitatori di stringa nella stringa di espansione variabile. Cioè "$tpl[content]" invece di "$tpl['content']".

Per quanto riguarda le bretelle, delimitano variabile, quando i personaggi identificatore può venire direttamente prima o dopo il nome. Ad esempio:

$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 () aggiunge le barre prima di entrambe le virgolette doppie single o all'interno della stringa. Il codice generato per il vostro esempio potrebbe essere

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

E {$ tpl [ \ 'titolo \ ']} non analizza bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top