Assegnazione variabili con Smarty

Domanda:

come passo le variabili php a Smarty senza doverle ogni volta assegnare?

Ipotiziamo che ho un template che si chiama header.tpl fatto così:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>{$pagetitle}</title>

<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="EXPIRES" content="0" />
<meta http-equiv="reply-to" content="{$pagereplayto}" />
<meta name="RESOURCE-TYPE" content="DOCUMENT" />
<meta name="DISTRIBUTION" content="GLOBAL" />
<meta name="AUTHOR" content="{$pageauthor}" />
<meta name="COPYRIGHT" content="{$pagecopy}" />
<meta name="KEYWORDS" content="{$pagekey}" />
<meta name="DESCRIPTION" content="{$pagedesc}" />
<meta name="ROBOTS" content="{$pagerobots}" />
[etc.]

le variabili da passare a Smarty sono:

<?php

$pagetitle ='prova';
$pagecopy = "Copyright (c) 2003-200 by";
$pagekey = '';
$pagedesc ='';
$pagerobots = "INDEX, FOLLOW";
$pagerevisit = "7 DAYS";
 [etc]
?>

e sono contenute in un file che si chiama config.inc.

la pagina per visualizzare l'header fa così:

<?php
require("config.inc");

require('Smarty/libs/Smarty.class.php');

$smarty = new Smarty();
$smarty->template_dir = '/var/www/prova/templates';
$smarty->compile_dir = '/var/www/prova/templates_c';
$smarty->cache_dir = '/var/www/prova/cache';
$smarty->config_dir = '/var/www/prova/configs';

$smarty->display('header.tpl');
?>

ovviamente il tutto non mi funziona.

per passare correttamente le variabili a Smarty le devo prima assegnare con la seguente sintassi:

$smarty->assign('pagetitle', $pagetitle);

oppure usare un file di configurazione e dichiarare le variabili in questo modo:

nomevariabile ="valore variabile"

e richiamarle nel template con il comando:

{config_load file="config.inc"}

Ma nel primo caso faccio un lavoro enorme che vorrei risparmiare sia a me che al server.

Nel secondo caso non posso usare le medesime variabili sia in php che in Smarty in quanto hanno una sintassi diversa.

Come fare?

Spero di essere stato chiaro!

inviato 10 anni fa
arjuna
X 0 X

Non è conveniente usare la tecnica del file di configurazione per variabili generiche. Il file di configurazione serve per le variabili non troppo variabili

Rimane quindi solo l'assegnazione che può essere snellita mettndo tutte le variabili in un array e assegnando questo al template.

Questo comportamento è dettato dal fatto che è importante avere un sistema rigoroso per passare i dati al template per evitare il rischio che il template possa maneggiare informazioni che non gli competono. Smarty è rivolto agli sviluppatori che si affdano a terzi per la creazione dei templates.

 :bye:

P.S.: ho aperto una nuova discussione come da regolamento.

risposto 10 anni fa
Gianni Tomasicchio
modificato 10 anni fa
X 0 X

Scusami per non aver postato in una nuova sezione.

Cmq non ho capito come fare...

Avevo pensato di mettere le variabili in un array e poi tramite un ciclo assegnarle in maniera automatica:

Foreach (chiave as valore){

   $smarty->assign('chiave', 'valore');

}

che ne pensi?

risposto 10 anni fa
arjuna
X 0 X

Io parlavo di passare l'intero array al template in un'unica assegnazione, ma la tua idea è altrettanto valida.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

E in che modo?

risposto 10 anni fa
arjuna
X 0 X

Molto banalmente:

$dati = array('chiave1'=>'valore1','chiave2'=>'valore2');

$smarty->assign('dati', $dati);

nel template usare questa sintassi:

{$dati.chiave1}

{$dati.chiave2}

I dettagli li trovi qui:

http://smarty.php.net/manual/en/language.variables.php#language.assigned.variables

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

La funzione {config_load file="config.conf"} serve per caricare delle costanti chiamate erroneamente variabili. Se vuoi cambiarle infatti devi cambiare manualmente il file config.conf

La funzione è utile appunto nel caso di costanti: titolo del sito, indirizzo email ecc

Una risoluzione ancora più veloce del tuo problema è quello di creare il tuo sito con una classe al cui __construct assegni le variabili a Smarty. Così ogni volta che crei l'oggetto hai già le variabili assegnate O0

risposto 10 anni fa
Nix82
X 0 X

Era la prima cosa che avevo fatto... ma non avevo capito bene come Smarty si mangiava le variabili.

Ora ho risolto creando un array $siteVar con dentro tutti i dati sensibili del sito, assegno questo array a Smarty dopo aver incluso il file che lo contiene e in questo modo scrivendo {$siteVar.nomevariabile} nei template ottengo il contenuto della variabile (anche se non credo sia corretto chiamarla variabile).

Tutto bene se non che non è quello che volevo fare.

A me piacerebbe avere un elenco di variabili

$var1;
$var2;
$var3;
etc

che all'inclusione del file che le contiene vengano passate automaticamente in smarty, di modo che posso reinviare le variabili in questione direttamente e agevolmente dallo script che carica il template.

Esempio:

$pagetitle = 'nome della mia pagina';
$smarty->display('template.tpl');

in questo caso non funziona. Dovrei scrivere così;

$pagetitle = 'nome della mia pagina';
$smarty->assign ('siteVar.pagetitle', $pagetitle);
$smarty->display ('template.tpl');

ma è ridondante.

molto più performante una classe del tipo:

$application->addSiteVar ($pagetitle, pagetitle);

dove addSiteVar è un modo della classe application che gestisce anche smarty

function addSiteVar (c, $valVar) {
$smarty->assign ("siteVar.$nameVar", $valVar);
}
risposto 10 anni fa
arjuna
X 0 X

be, mi rendo conto che potrei scrivere anche direttamente:

$smarty->assign ('siteVar.pagetitle', 'nome della mia pagina');

ma la questione resta... non mi piace tutto questo scrivere.

risposto 10 anni fa
arjuna
X 0 X

Come ti ho già detto nel mio primo messaggio, "tutto questo scrivere" non è un problema di Smarty ma semplicemente rispecchia la filosofia di questo template engine.

Immagina di realizzare un programma e di permettere a sviluppatori esterni di poter realizzare delle "skin" ovvero dei template in modo che tutti possano personalizzare con facilità l'aspetto dell'applicazione (pensa ai CMS, ai forum, ecc.)

Immagina adesso che qualcuno realizzi un template che, potendo accedere direttamente alle variabili dello script, invii via mail le password degli utenti. La cosa sarebbe fattibile, se non ci fosse il "filtro" della funzione "ASSIGN" ...

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda