Umgang mit großer HTML-Ausgabe über Plugin-Code


9

Ich habe kürzlich mein erstes WP-Plugin geschrieben, das einen Shortcode zum Einbetten einer benutzerdefinierten jquery-Bildergalerie in Posts hinzufügt. In erster Linie wird nur ein guter Teil des HTML-Codes zusammen mit dem für die Initialisierung erforderlichen Javascript in den Beitrag geschrieben.

Allerdings musste ich die HTML-Ausgabe prozedural als String in PHP erstellen. Diese Art von Tag-Suppe macht mich immer verrückt und ich bin es gewohnt, mit MVC-Frameworks zu arbeiten, die Dinge wie Hilfsfunktionen und Teilvorlagen zum Generieren von HTML bereitstellen.

Was ist der allgemeine Ansatz für Plugin-Autoren, die große Mengen von dynamisch erstelltem HTML oder JS verwalten müssen?

Antworten:


12

@Byran M. Ich neige dazu, zwei Konstrukte zu verwenden, die andere WordPress-Entwickler nicht oft verwenden, was mich überrascht, aber ich mag sie sehr.

1.) Heredocs

Sie können große Textblöcke als Heredocs- Zeichenfolge speichern , die möglicherweise so aussieht, damit ich mir Gedanken über das Mischen von einfachen und doppelten Anführungszeichen machen kann:

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

Beachten Sie, dass die Variablen möglicherweise als Array an eine Funktion übergeben und dann extract()bearbeitet werden oder dass Sie sie auf andere Weise zuweisen können. Beachten Sie auch, dass ich die geschweiften Klammern nicht benutze, weil sie immer benötigt werden, sondern weil sie den Code leichter lesbar machen. (Natürlich macht es diese Art der Codierung nicht einfach, the_content()wenn Funktionen wie get_the_content()WordPress wesentlich anders sind als WordPress.)

Was mehr ist, obwohl es für Sie möglicherweise nicht relevant ist, wenn ich Heredoc-Namen wie HTML, SQL usw. verwende, führt mein IDE PhpStorm eine Syntaxinjektion durch und gibt mir Autocomplete und Syntaxfärbung innerhalb des Heredoc.

2.) String-Verkettung mit einem Array

Die andere Redewendung, die ich gerne verwende, ist das Sammeln des Inhalts in einem Array und dann implode()im Array. Obwohl ich dies noch nie verglichen habe, könnte es weniger hilfreich sein, als ich annehme, dass ich weiß, dass wiederholte Verkettung von Zeichenfolgen ein Killer ist, wenn Zeichenfolgen größer werden (wenn jemand weiß, warum dieser Ansatz nicht besser ist oder wenn Sie einen besseren Ansatz kennen, den ich würde gerne Feedback hören):

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);         
}   

1
+1 für Heredocs, sie sind großartig, besonders in dieser Situation.
niemand

Ich hatte nicht wirklich die Zeit, dies zu bewerten, aber es scheint der einfachste Ansatz zu sein, wenn man bedenkt, was ich brauche.
Bryan M.

+1 für die Array / String-Verkettung. Ich mache das oft. Es macht es einfach, Zeichenfolgen ohne überflüssige Zeilenumbrüche und Leerzeichen zu erstellen.
s_ha_dum

5

Testen Sie diese Funktion für PHP:

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

Sie können eine enthaltene Datei, die nur HTML-Code enthalten würde, in eine PHP-Variable puffern. Dadurch wird die Wartung sauberer.

Am Ende haben Sie also so etwas:

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

Dann können Sie $ includehtml einfach dort zurückgeben, wo Sie es benötigen, und es verhindert, dass Ihr HTML-Inhalt separat in PHP-Strings wiedergegeben werden muss.


4

Ich habe dieses Framework noch nicht verwendet, aber das angebotene Vorlagenmodell wird wahrscheinlich ansprechen. Vielleicht möchten Sie einen Blick darauf werfen, wie der Autor das eingerichtet hat.

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

Vorlagen ========= Wann immer möglich, sollten wir PHP von HTML trennen. In Wordpress werden Sie die beiden ohne Besorgnis miteinander vermischt sehen. Während dies oft ein "einfacher Weg" ist, Dinge zu tun, ist es fast nie der "richtige Weg". Stattdessen sollten wir die beiden trennen und so unsere Logik rein und unsere Ansichten dumm halten. Zu diesem Zweck haben wir die Methode $ this-> render ('my-template'). Einige Beispiele:

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

Es wird nur die Ausgabepufferung verwendet, wie Todd Perkins in seiner Antwort beschreibt.
Ian Dunn

2

Das hängt von der Art von HTML und JS ab.

JavaScript

Trennen Sie zunächst die dynamischen Teile so weit wie möglich von den statischen Teilen. Laden Sie dann alle dynamischen Variablen, die Sie zur Laufzeit benötigen, und stellen Sie Ihre statischen Skripte in die Kopf- (oder Fußzeile, was auch immer). Auf diese Weise ist der Großteil Ihres JS von Ihrem PHP getrennt.

HTML

Dies ist eine Frage der sauberen Erstellung Ihres Codes in PHP. Wenn Sie große HTML-Teile haben, die Sie wiederverwenden möchten, würde ich diese als separate Variablen speichern. Das Zusammensetzen von Dingen beim Aufrufen des Shortcodes ist dann so einfach wie:

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

Anstatt zu versuchen, es prozedural aufzubauen, erstellen Sie ein Objekt (ja, PHP unterstützt Objekte), das alle Ihre verschiedenen HTML-Blöcke enthält, und weisen Sie es an, welche zu verwenden und welche Daten zurückzugeben sind. Dies spart Ihnen viel Zeit.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.