lidar com grandes saídas HTML via código do plugin

9

Recentemente, escrevi meu primeiro plug-in WP que adiciona um código curto para incorporar uma galeria de imagens jquery personalizada em postagens. É basicamente apenas despejar uma boa parte do HTML na postagem, juntamente com o javascript necessário para a inicialização.

No entanto, eu tive que criar a saída HTML processualmente, como uma string no PHP. Esse tipo de sopa de tags sempre me deixa louco, e estou acostumado a trabalhar com estruturas MVC que fornecem funções como funções auxiliares e modelos parciais para gerar HTML.

Qual é a abordagem geral para autores de plugins que precisam gerenciar grandes quantidades de HTML ou JS dinamicamente construídos?

Bryan M.
fonte

Respostas:

12

@Byran M. Costumo usar duas construções que nem sempre vejo outros desenvolvedores do WordPress usando, o que me surpreende, mas gosto muito delas.

1.) Heredocs

Você pode armazenar grandes blocos de texto como uma sequência heredocs que pode parecer assim, para que eu possa se preocupar em misturar aspas simples e duplas:

   $html=<<<HTML
<input type="{$type}" size="{$size}" id="{$id}" class="{$class}" value="{$value}" />
HTML;

Observe que as variáveis ​​podem ser passadas para uma função como uma matriz e extract()editadas ou você pode atribuí-las de outras maneiras. Observe também que eu uso os aparelhos não porque eles sempre são necessários, mas tornam o código mais fácil de ler. (É claro que funções como the_content()ser materialmente diferente do get_the_content()WordPress nem sempre facilitam esse estilo de codificação.)

Além do mais, embora possa não ser relevante para você, se eu usar nomes de heredoc como HTML, SQL etc., meu IDE PhpStorm fará a injeção de sintaxe e fornecerá o preenchimento automático e a coloração de sintaxe no heredoc.

2.) Concatenação de strings usando uma matriz

O outro idioma que eu gosto de usar é coletar o conteúdo em uma matriz e depois implode()na matriz. Embora eu nunca tenha comparado isso, poderia ser menos útil do que eu suponho que sei que a concatenação repetida de strings é um assassino à medida que as strings ficam maiores (se alguém souber por que essa abordagem não é melhor ou se você conhece uma abordagem melhor, eu adoraria ouvir feedback):

function my_get_form_and_fields($input_items) {
    $html = array();
    $html[] = '<form name="my_form" method="get">';
    foreach($input_items as $input_item) {
        extract($input_item);
        $html=<<<HTML
<input type="{$type}" size="{$size}" id="{$id}" class="{$class}" value="{$value}" />
HTML;
    $html[] = '</form>';
    return implode("\n",$html);         
}   
MikeSchinkel
fonte
11
+1 para Heredocs, eles são incríveis, especialmente nessa situação.
ninguém
Realmente não tive tempo para avaliar isso, mas parece ser a abordagem mais direta, considerando o que eu preciso.
Bryan M.
+1 para a concatenação de matriz / sequência. Eu faço muito isso. Isso facilita a construção de strings sem novas linhas e espaços estranhos.
s_ha_dum
5

Faça o checkout desta função para PHP:

http://php.net/manual/en/function.ob-start.php

Você pode armazenar em buffer um arquivo incluído, que conteria apenas código html, em uma variável php. Isso tornará a manutenção mais limpa.

Então você acaba com algo assim:

ob_start();
   include('path/to/my/html/file.php');
   $includedhtml = ob_get_contents();
ob_end_clean();

Então você pode simplesmente retornar $ includedhtml onde você precisar e manter seu conteúdo html separado de ter que repetir tudo dentro das strings php.

Todd Perkins
fonte
4

Na verdade, não usei essa estrutura, mas o modelo de modelo que ela oferece provavelmente será atraente. Você pode dar uma olhada em como o autor configurou isso.

https://github.com/Emerson/Sanity-Wordpress-Plugin-Framework

Modelos ========= Sempre que possível, devemos separar o PHP do HTML. No Wordpress, você verá os dois misturados sem apreensão. Embora essa seja frequentemente uma "maneira fácil" de fazer as coisas, quase nunca é a "maneira certa". Em vez disso, devemos separar os dois, mantendo assim nossa lógica pura e nossas visões mudas. Para esse fim, temos o método $ this-> render ('my-template'). Alguns exemplos:

    // From within a method in our controller
    $this->data['message'] = 'Pass this on to the template please';
    $this->render('my-template');

    // Meanwhile, in the /plugin/views/my-template.php file
    <h2>The Separation of Logic and Views</h2>
    <p><?php echo $this->data['message'];?></p>
Marfarma
fonte
É apenas usando buffer de saída, como Todd Perkins descreve em sua resposta.
22712 Ian Dunn
2

Isso depende do tipo de HTML e JS.

Javascript

Antes de tudo, separe as partes dinâmicas das partes estáticas o máximo possível. Em seguida, carregue todas as variáveis ​​dinâmicas necessárias em tempo de execução e enfileire seus scripts estáticos no cabeçalho (ou rodapé, qualquer que seja). Mas dessa forma, a maioria do seu JS é separada do seu PHP.

HTML

É uma questão de criar seu código de maneira limpa no PHP. Se você tiver grandes pedaços de HTML que você vai reutilizar, eu os armazenarei como variáveis ​​separadas. Em seguida, juntar as coisas quando o código de acesso é chamado é tão simples quanto:

echo $firstblock;
echo $shortcodecontent;
echo $lastblock;

Em vez de tentar construí-lo proceduralmente, construa um objeto (sim, o PHP suporta objetos) que contenha todos os seus diferentes blocos HTML, depois instrua-o sobre quais usar e quais dados retornar. Isso economizará uma quantidade enorme de tempo.

EAMann
fonte