web-dev-qa-db-fra.com

traiter avec une sortie HTML volumineuse via le code du plugin

J'ai récemment écrit mon premier plug-in WP qui ajoute un shortcode pour incorporer une galerie d'images jQuery personnalisée dans des publications. Il s'agit principalement de déposer une bonne partie du code HTML dans le message, ainsi que du javascript nécessaire à l'initialisation.

Cependant, j'ai dû construire la sortie HTML de manière procédurale, sous forme de chaîne en PHP. Ce type de balises me rend toujours fou et je suis habitué à travailler avec des frameworks MVC qui fournissent des fonctions telles que des fonctions d'assistance et des modèles partiels pour la génération de HTML.

Quelle est l’approche générale pour les auteurs de plug-in qui doivent gérer de grandes quantités de HTML ou de JS construits de manière dynamique?

9
Bryan M.

@Byran M. J'ai tendance à utiliser deux concepts que je ne vois pas souvent utiliser d'autres développeurs WordPress, ce qui me surprend, mais je les aime beaucoup.

1.) Heredocs

Vous pouvez stocker de gros blocs de texte sous la forme heredocs , ce qui pourrait ressembler à une chaîne, afin que je puisse stocker les informations sur le mélange entre guillemets simples et doubles:

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

Notez que les variables peuvent être transmises à une fonction sous forme de tableau, puis à extract()ed ou vous pouvez les affecter de différentes manières. Notez également que j’utilise les accolades non pas parce qu’elles sont toujours obligatoires, mais elles facilitent la lecture du code. (Bien entendu, les fonctions telles que the_content() étant matériellement différente de get_the_content(), WordPress ne facilite pas toujours ce style de codage.)

De plus, bien que cela puisse ne pas vous intéresser, c’est que si j’utilise des noms heredoc tels que HTML, SQL, etc., alors mon IDE PhpStorm effectue l’injection de syntaxe et me donne la coloration automatique et la syntaxe dans l'hérédoc.

2.) Concaténation de chaînes à l'aide d'un tableau

L'autre langage que j'aime utiliser consiste à collecter le contenu dans un tableau, puis à implode() le tableau. Bien que je n’aie jamais évalué cela, cela pourrait être moins utile que je suppose, mais je sais que la concaténation répétée de chaînes est une tuerie à mesure que les chaînes grossissent (si quelqu'un sait pourquoi cette approche n’est pas meilleure ou si vous connaissez une meilleure approche) 'aimerais entendre les commentaires):

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

Commander cette fonction pour PHP:

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

Vous pouvez mettre en tampon un fichier inclus qui ne contiendrait que du code HTML, dans une variable php. Cela le rendra plus propre à maintenir.

Donc, vous vous retrouvez avec quelque chose comme ça:

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

Ensuite, vous pouvez simplement renvoyer $ includedhtml où vous en avez besoin et votre contenu html sera préservé de l’écho de tout écho à l’intérieur des chaînes php.

5
Todd Perkins

Je n'ai pas réellement utilisé ce cadre, mais le modèle de modèle qu'il propose plaira probablement. Vous voudrez peut-être jeter un coup d'œil à la façon dont l'auteur a organisé cette tâche.

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

Modèles ========= Dans la mesure du possible, nous devrions séparer PHP de HTML. Dans Wordpress, vous verrez les deux mélangés sans appréhension. Bien que ce soit souvent un "moyen facile" de faire les choses, ce n'est presque jamais la "bonne façon". Au lieu de cela, nous devrions séparer les deux, gardant ainsi notre logique pure et notre vue muette. Pour cela, nous avons la méthode $ this-> render ('my-template'). Quelques exemples:

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

Cela dépend du type de HTML et de JS.

JavaScript

Tout d’abord, séparez autant que possible les parties dynamiques des parties statiques. Puis chargez les variables dynamiques dont vous avez besoin au moment de l’exécution et mettez vos scripts statiques dans l’en-tête (ou le pied de page, peu importe). Mais de cette façon, la majorité de votre JS est séparée de votre PHP.

HTML

Il s’agit de construire votre code proprement en PHP. Si vous devez réutiliser de gros morceaux de HTML, je les stocke sous forme de variables séparées. Ensuite, assembler les éléments lorsque le shortcode est appelé est aussi simple que:

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

Plutôt que d'essayer de le construire de manière procédurale, construisez un objet (oui, PHP supporte les objets) qui contient tous vos différents blocs HTML, puis indiquez-lui lesquels utiliser et quelles données renvoyer. Cela vous fera économiser énormément de temps.

2
EAMann