2009-08-21 13 views
11

bisogno del tuo aiuto con il template PHP. Sono nuovo di PHP (vengo da Perl + Embperl). Ad ogni modo, il mio problema è semplice:Come passare parametri al modello PHP reso con 'include'?

  • Ho un piccolo modello per rendere un elemento, lascia che sia un post sul blog.
  • L'unico modo per utilizzare questo modello è utilizzare la direttiva "include".
  • Voglio chiamare questo modello all'interno di un ciclo che passa attraverso tutti i post del blog pertinenti.
  • Problema: Ho bisogno di passare un parametro (s) a questo modello; in questo caso riferimento a matrice che rappresenta un post sul blog.

codice simile a questa:

$rows = execute("select * from blogs where date='$date' order by date DESC"); 
foreach ($rows as $row){ 
    print render("/templates/blog_entry.php", $row); 
} 

function render($template, $param){ 
    ob_start(); 
    include($template);//How to pass $param to it? It needs that $row to render blog entry! 
    $ret = ob_get_contents(); 
    ob_end_clean(); 
    return $ret; 
} 

Delle idee come ottenere questo risultato? Sono davvero stumped :) C'è un altro modo per rendere un template?

risposta

29

Considerare di includere un file PHP come se si stesse copiando il codice dall'inclusione nella posizione in cui si trova la dichiarazione di inclusione. Ciò significa che si eredita lo scope corrente.

Quindi, nel tuo caso, $ param è già disponibile nel modello specificato.

+0

+1 l'analogia copia-incolla è sempre come la spiego. –

+1

Per differenza aggiunta, prova a restituire un valore ('return 42;') dall'inclusione e catturare quel valore: '$ result = include 'filethatreturns42.php';';) – NSSec

19

$ param dovrebbe essere già disponibile all'interno del modello. Quando includi() un file, dovrebbe avere lo stesso ambito di quello in cui era incluso.

da http://php.net/manual/en/function.include.php

Quando un file viene incluso, il codice è contiene eredita lo scope delle variabili della linea su cui l'inclusione verifica. Qualsiasi variabile disponibile a quella riga nel file chiamante sarà disponibile all'interno del file chiamato, da che punta in avanti. Tuttavia, tutte le funzioni e le classi definite nel file incluso hanno lo scopo globale.

Si potrebbe anche fare qualcosa di simile:

print render("/templates/blog_entry.php", array('row'=>$row)); 

function render($template, $param){ 
    ob_start(); 
    //extract everything in param into the current scope 
    extract($param, EXTR_SKIP); 
    include($template); 
    //etc. 

Poi $ fila sarebbe disponibile, ma ancora chiamato $ row.

+0

Molto bello, grazie! Sì, preferisco usare gli hash come parametri in modo tale che la funzione sia facilmente modificabile in futuro. –

+0

Funzionano così framework come CodeIgniter.Si carica un file modello e si passa ad una matrice di valori che vengono estratti e utilizzati nel modello. –

1

Io uso le seguenti funzioni di assistenza quando lavoro sui siti web semplici:

function function_get_output($fn) 
{ 
    $args = func_get_args();unset($args[0]); 
    ob_start(); 
    call_user_func_array($fn, $args); 
    $output = ob_get_contents(); 
    ob_end_clean(); 
    return $output; 
} 

function display($template, $params = array()) 
{ 
    extract($params); 
    include $template; 
} 

function render($template, $params = array()) 
{ 
    return function_get_output('display', $template, $params); 
} 

uscita display volontà il modello per lo schermo direttamente. render lo restituirà come una stringa. Fa uso di ob_get_contents per restituire l'output stampato di una funzione.

Problemi correlati