Domanda

Ho una funzione che scorre attraverso diversi tipi di elenchi estratti da MySQL e li visualizza come un "feed" di Facebook. Ogni tipo di elenco ha un aspetto diverso e pertanto richiede un modello diverso.

Ecco l'esempio di funzione che segue potrebbe essere chiamato 100 volte (se ci sono 100 elenchi):

function display_listing($id,$type) {
    global $abs_path;

    switch($type) {

        case 'photo':
            include($abs_path . '/templates/photo.php');
            break;

        case 'video':
            include($abs_path . '/templates/video.php');
            break;

    }

}

Esiste un modo migliore per farlo, dove potenzialmente non riesco a finire con 100 inclusioni, il che può rallentare il mio processo? Posso in qualche modo salvare l'inclusione una volta sulla pagina e consultarla tutte le volte che è necessario?

... o è questa la migliore pratica?

Inoltre, voglio sapere come fare da solo, senza un motore modello ...

EDIT: il problema non è risolto solo da include_once (non credo) ... Devo essere in grado di riutilizzare il file incluso più volte, sostituendo le variabili ogni volta.

È stato utile?

Soluzione

Sebbene uno switch non sia il modo più scalabile per scrivere questo codice, temo che include sia l'unico modo per mantenere i tuoi modelli in file separati, qui.

È possibile, presumibilmente, incapsulare il codice di ciascun modello in una funzione, tuttavia:

/*
photoTemplate.php
*/

<?php
function loadPhotoTemplate($id) {
?>
  <div id="photo">
...
  </div>
<?php
}
?>


/*
listing.php
*/

function display_listing($id,$type) {
    global $abs_path;

    switch($type) {

        case 'photo':
            include_once($abs_path . '/templates/photo.php');
            loadPhotoTemplate($id);
            break;

        case 'video':
            include_once($abs_path . '/templates/video.php');
            loadVideoTemplate($id);
            break;
    }

}

Questo caricherà ogni file modello al massimo una volta, quindi chiamerà semplicemente la funzione ogni volta che si desidera visualizzare il modello con i dati specifici per quell'elemento.

Modifica

Probabilmente sarebbe ancora meglio includere tutti i file modello all'inizio, quindi chiamare semplicemente la funzione appropriata nello switch. Le funzioni * _once () di PHP sono lente, poiché devono consultare l'elenco dei file precedentemente inclusi / richiesti ogni volta che vengono chiamati.

Altri suggerimenti

crea una matrice di modelli consentiti. hai la funzione cerca di vedere se il modello richiesto è nella matrice. se lo è, quindi utilizzare la variabile $ type per includere il file. sì, in generale non dovresti usare i dati forniti dall'utente in un nome file include, ma dal momento che li hai convalidati rispetto a una matrice di valori noti, è sicuro.

Se la tua preoccupazione è la prestazione, personalmente non entrerei affatto in questo ciclo.

Supponendo che gli elementi nell'elenco vengano visualizzati più frequentemente di quanto non vengano creati, genererei l'HTML man mano che vengono creati gli elementi e memorizzeremo l'output insieme ai dati nel database. (O in memcache o file o altrove, ma generalo e memorizzalo.)

In tal modo, ritorni questa logica nel processo di creazione degli elementi, quindi esegui la stessa istruzione switch , ma solo per un elemento alla volta: stai tagliando fuori dal giro.

Quindi al momento della visualizzazione, invece di chiamare display_listing () , fai semplicemente eco al codice HTML che hai già memorizzato.

Penso che dovresti guardare alcune cose. In primo luogo, c'è anche la possibilità che tu includa lo stesso "modello" 100 volte? Sembra una grande quantità di contenuti da inserire in una pagina.

Se sto usando minuscoli "snippet" - diciamo, una riga della tabella che si ripete molte volte - Tendo a usare una funzione che restituisce una stringa, come questa:

/* snippets.php */
function tableRow( $row )
{
    return
        '<tr><td>' . $row['var1'] . '</td>' .
        '<td>' . $row['var2'] . '</td></tr>';
}

/* main page/view */
foreach ( $data as $row )
    echo tableRow( $row );

Il vantaggio principale qui è che puoi avere loop e tutti i tipi nella funzione.

Se stai cercando una sostituzione di variabile diretta, puoi creare i tuoi mini-template in un file HTML; qualcosa come:

<p>{name}<br />
  Posted {date} by {author}</p>

Quindi leggi nel modello, passa l'intera stringa alla tua funzione display_listing , che esegue str_replace su tutte le {variabili}. Non penso che ci sarebbe un grande successo in termini di prestazioni, ma dovresti provarlo per essere sicuro.

Vuoi usare include_once anziché include .

  

L'istruzione include_once () include   e valuta il file specificato   durante l'esecuzione della sceneggiatura.   Questo è un comportamento simile al   istruzione include (), con l'unico   la differenza è che se il codice da   è già stato incluso un file   non sarà più incluso. Come il   il nome suggerisce, sarà incluso   solo una volta.

Se includerai modelli usando un interruttore per parole chiave diverse, allora dovresti impostare una variabile, ad esempio $ template_filename, nello switch e poi una volta uscito dallo switch, esegui l'inclusione in questo modo:

include_once("/templates/{$filename}.php");

Se non vuoi usare incluso, puoi anche usare un motore di template ...

Questo metodo mi sembra ragionevole comunque.

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