it-swarm-pt.tech

lidando com grande saída HTML via código do plugin

Recentemente escrevi meu primeiro plugin WP que adiciona um shortcode para incorporar uma galeria de imagens jquery customizada em posts. É basicamente apenas despeja um bom pedaço de HTML no post, junto com o javascript necessário para a inicialização.

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

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

9
Bryan M.

@Byran M. Eu costumo usar duas construções que muitas vezes não vejo outros desenvolvedores do WordPress usando, o que me surpreende, mas eu gosto muito deles.

1.) Heredocs

Você pode armazenar grandes blocos de texto como heredocs string que pode se parecer com isso para que eu possa armazenar a preocupação de 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, em seguida, extract()ed ou você poderia atribuí-las de outras maneiras. Observe também que eu uso as chaves não porque elas são sempre necessárias, mas facilitam a leitura do código. (É claro que com funções como the_content() sendo materialmente diferentes de get_the_content(), o WordPress nem sempre facilita esse estilo de codificação.)

Além do mais, embora possa não ser relevante para você é se eu usar heredoc nomes como HTML, SQL, etc, então meu IDE PhpStorm faz a sintaxe de injeção e me dará autocomplete e sintaxe colorir dentro o heredoc.

2.) Concatenação de String usando uma Matriz

O outro idioma que eu gosto de usar é coletar o conteúdo em uma matriz e, em seguida, implode() a matriz. Embora eu nunca tenha avaliado isso, então pode ser menos útil do que eu supor que eu saiba que a concatenação repetida de cordas é um assassino à medida que as cordas aumentam (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);         
}   
12
MikeSchinkel

Finalize essa função para o PHP:

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

Você pode armazenar em buffer um arquivo incluído que apenas conteria código html, em uma variável php. Isso tornará mais limpo para manter.

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 apenas retornar $ includedhtml onde você precisa e ele mantém o seu conteúdo html separado de ter que ecoar tudo dentro de strings php.

5
Todd Perkins

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

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

Templates ========= Sempre que possível, devemos separar PHP do HTML. Dentro do Wordpress, você verá os dois misturados sem apreensão. Embora isso geralmente seja uma "maneira fácil" de fazer as coisas, quase nunca é o "caminho certo". Em vez disso, devemos separar os dois, mantendo assim nossa lógica pura e nossos pontos de vista mudos. Para este propósito, 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>
4
marfarma

Isso depende do tipo de HTML e JS.

JavaScript

Antes de mais nada, separe as partes dinâmicas das partes estáticas tanto quanto possível. Em seguida, carregue as variáveis ​​dinâmicas de que você precisa em tempo de execução e enfileire seus scripts estáticos no cabeçalho (ou rodapé, qualquer que seja). Mas desta forma, a maioria do seu JS é separado do seu PHP.

HTML

Esta é uma questão de construir seu código de forma limpa no PHP. Se você tiver grandes blocos de HTML que você vai reutilizar, eu os armazenaria como variáveis ​​separadas. Em seguida, juntando as coisas quando o shortcode é chamado é tão simples quanto:

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

Em vez de tentar construí-lo proceduralmente, construa um objeto (sim, PHP suporta objetos) que contenha todos os seus diferentes blocos de HTML e, em seguida, instrua quais objetos usar e quais dados serão transmitidos. Isso vai economizar muito tempo.

2
EAMann