Estou usando o JSON e degradando normalmente, então como evitar códigos duplicados?

5

Há um monte de perguntas no Stack Overflow sobre se o AJAX deve retornar JSON ou HTML, e a maioria parece concordar que é ideal retornar JSON por causa da velocidade. No entanto, isso significa que, se eu degradar de forma elegante, terei algum código duplicado porque estou gerando a mesma marcação no PHP e no Javascript.

Um exemplo hipotético: Um site tem uma lista de links para histórias curtas. Se o usuário tiver Javascript, clicar em um desses links carregará a história sem uma atualização de página. Isso é feito com uma solicitação AJAX que retornou um JSON com as informações da história. Javascript gera a marcação para a história. Se o usuário não tiver o Javascript, clicar no mesmo link recarregará a página com a história agora carregada. O PHP gera a marcação para a história.

Existe uma solução para usar JSON e degradar normalmente sem duplicar o código?

    
por juicy lucy 16.05.2011 / 04:02
fonte

2 respostas

6

Claro.

Você está usando json_encode , certo? Então comece com a mesma estrutura de dados. Para simplificar aqui, vou usar um array.

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

Agora você tem uma pausa rápida. Se a solicitação for uma solicitação AJAX, basta echo json_encode($stories); . Caso contrário, as solicitações padrão processarão a visualização com a mesma estrutura de dados.

Vou expandir isso um pouco. Assumindo que você não está usando algum paradigma MVC e fazendo um trabalho PHP "direto".

Para gerar a página, você desejará encapsular a lógica dessa tabela em um arquivo PHP separado chamado com include() . Vamos chamar esse arquivo storyList.php e ele está na mesma pasta acessível pela web que todo o 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
    }
}
    
por 16.05.2011 / 04:33
fonte
2

Em uma recente apresentação do Google IO , este assunto foi discutido com algum detalhe.

Para resolver esse problema, eles usaram o Bigode para criar modelos. Usando a implementação do Mustache.js no lado do cliente e compartilhando os mesmos modelos no lado do servidor - no seu caso, talvez Mustache.php - a duplicação pode ser removida.

    
por 27.05.2011 / 14:38
fonte