Sto usando JSON e degrado con grazia, quindi come posso evitare il codice duplicato?

5

Ci sono un sacco di domande su Stack Overflow sul fatto che AJAX debba restituire JSON o HTML, e la maggior parte sembra concordare sul fatto che sia ideale restituire JSON per motivi di velocità. Tuttavia, questo significa che se mi degrado con grazia, avrò un codice duplicato perché sto generando lo stesso markup sia in PHP che in Javascript.

Un esempio ipotetico: Un sito web ha una lista di collegamenti a racconti. Se l'utente ha Javascript, fare clic su uno di questi link carica la storia senza un aggiornamento della pagina. Questo viene fatto con una richiesta AJAX che restituisce un JSON con le informazioni sulla storia. Javascript genera il markup per la storia. Se l'utente non ha Javascript, quindi cliccando sullo stesso link ricarica la pagina con la storia ora caricata. PHP genera il markup per la storia.

Esiste una soluzione per utilizzare JSON e degradare con garbo senza duplicare il codice?

    
posta juicy lucy 16.05.2011 - 04:02
fonte

2 risposte

6

Certo.

Stai utilizzando json_encode giusto? Quindi inizia con la stessa struttura dati. Per semplicità qui userò un array.

$stories = array( '[id]' => [details] );

Ora fai una pausa veloce. Se la richiesta è una richiesta AJAX, quindi semplicemente echo json_encode($stories); . Altrimenti le richieste standard elaboreranno la vista con la stessa struttura dati.

Ho intenzione di espanderlo un po '. Supponendo che tu non stia usando un paradigma MVC e facendo un lavoro PHP "diretto".

Per generare la pagina, vorrai incapsulare la logica per questa tabella in un file PHP separato chiamato con include() . Chiamiamo questo file storyList.php ed è nella stessa cartella accessibile dal Web come tutto il resto.

// File: storyList.php
// First connect to the database and pull the story list
// based on any parameters passed.
$story = new StoryList($_REQUEST);
$list = $story->fetch_list();

// Now do a quick conditional based on the headers.
// See http://php.net/manual/en/function.get-headers.php and
// define your own function for testing if a request is made
// with AJAX or not. Several libraries include their own.
if (is_xhr())
{
    echo json_encode($list);
}
else
{
    foreach ($list as $title => $story)
    {
        // Format as a table
    }
}
    
risposta data 16.05.2011 - 04:33
fonte
2

In una recente presentazione IO di Google questo argomento è stato discusso in dettaglio.

Per risolvere questo problema, hanno utilizzato Moustache per i template. Utilizzando l'implementazione di Mustache.js sul lato client e condividendo gli stessi modelli sul lato server - nel tuo caso forse Mustache.php - la duplicazione può essere rimossa.

    
risposta data 27.05.2011 - 14:38
fonte

Leggi altre domande sui tag