it-swarm-es.com

tratar con gran salida HTML a través de código plugin

Recientemente escribí mi primer WP plugin que agrega un shortcode para incrustar una galería de imágenes jquery personalizada en las publicaciones. Principalmente, solo se descarga una buena parte de HTML en la publicación, junto con el javascript necesario para la inicialización.

Sin embargo, tuve que compilar la salida HTML de manera procesal, como una cadena en PHP. Este tipo de sopa de etiquetas siempre me vuelve loco, y estoy acostumbrado a trabajar con marcos MVC que proporcionan funciones como funciones de ayuda y plantillas parciales para generar HTML.

¿Cuál es el enfoque general para los autores de complementos que necesitan administrar grandes cantidades de HTML o JS creados dinámicamente?

9
Bryan M.

@Byran M. Tiendo a usar dos construcciones que no veo a menudo que otros desarrolladores de WordPress usan a menudo, lo que me sorprende, pero me gustan mucho.

1.) Heredocs

Puede almacenar grandes bloques de texto como heredocs cadena que podría tener este aspecto, por lo que puedo almacenar la preocupación de mezclar comillas simples y dobles:

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

Tenga en cuenta que las variables pueden pasarse a una función como una matriz y luego extract()ed o puede asignarlas de otras maneras. También tenga en cuenta que utilizo las llaves no porque siempre son necesarias sino que hacen que el código sea más fácil de leer. (Por supuesto, las funciones como the_content() son sustancialmente diferentes de get_the_content() WordPress no siempre hace que este estilo de codificación sea fácil.)

Es más, aunque puede que no sea relevante para usted si utilizo nombres heredoc como HTML, SQL, etc., entonces mi IDE PhpStorm hace inyección de sintaxis y me da autocompletado y coloreado de sintaxis dentro el heredoc.

2.) Cadena de concatenación utilizando una matriz

El otro idioma que me gusta usar es recopilar el contenido en una matriz y luego implode() la matriz. Aunque nunca lo he evaluado, podría ser menos útil de lo que supongo. Sé que la concatenación de cadenas repetida es un factor de muerte, ya que las cadenas se vuelven más grandes (si alguien sabe por qué este enfoque no es mejor o si conoce un método mejor) me encantaría escuchar comentarios):

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

Echa un vistazo a esta función para PHP:

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

Puede almacenar en un búfer un archivo incluido que solo contendría el código html en una variable php. Esto lo hará más limpio de mantener.

Entonces terminas con algo como esto:

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

Luego, simplemente puede devolver $ includedhtml donde lo necesite y mantendrá su contenido html separado de tener que hacer eco de todo dentro de las cadenas de PHP.

5
Todd Perkins

Realmente no he usado este marco, pero el modelo de plantilla que ofrece probablemente resultará atractivo. Es posible que desee echar un vistazo a cómo el autor configuró eso.

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

Plantillas ========= Siempre que sea posible, debemos separar PHP de HTML. Dentro de Wordpress, verás a los dos mezclados sin aprehensión. Si bien esta es a menudo una "manera fácil" de hacer las cosas, casi nunca es la "manera correcta". En su lugar, deberíamos segregar los dos, manteniendo nuestra lógica pura y nuestras opiniones tontas. Para este propósito tenemos el método $ this-> render ('my-template'). Algunos ejemplos:

    // 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

Eso depende del tipo de HTML y JS.

JavaScript

En primer lugar, separe las partes dinámicas de las partes estáticas tanto como sea posible. Luego, cargue las variables dinámicas que necesite en tiempo de ejecución y ponga en cola sus scripts estáticos en el encabezado (o pie de página, lo que sea). Pero de esta manera, la mayoría de su JS está separada de su PHP.

HTML

Esto es una cuestión de construir su código limpiamente en el PHP. Si tiene enormes trozos de HTML que va a reutilizar, los almacenaría como variables separadas. Luego juntar las cosas cuando se llama el shortcode es tan simple como:

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

En lugar de tratar de construirlo de manera procesal, genere un objeto (sí, PHP admite objetos) que contiene todos sus diferentes bloques de HTML, luego indíqueles cuáles usar y qué datos devolver. Esto te ahorrará enormes cantidades de tiempo.

2
EAMann