it-swarm.dev

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

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?

9
Bryan M.

@Byran M. Ich benutze normalerweise zwei Konstrukte, 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 string speichern, die möglicherweise so aussehen, damit ich mich nicht um das Mischen von einfachen und doppelten Anführungszeichen kümmern muss:

   $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()ed oder auf andere Weise zugewiesen werden. Beachte auch, dass ich die Klammern nicht benutze, weil sie immer benötigt werden, sondern weil sie den Code leichter lesbar machen. (Natürlich ist diese Art der Codierung mit Funktionen wie the_content(), die sich wesentlich von get_the_content() unterscheiden, nicht immer einfach.)

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

2.) String-Verkettung mit einem Array

Das andere Idiom, das ich gerne benutze, ist, den Inhalt in einem Array zu sammeln und dann implode() das Array. Obwohl ich dies noch nie als Benchmark bewertet habe, könnte es weniger hilfreich sein, als ich vermute, 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);         
}   
12
MikeSchinkel

Kasse diese Funktion für PHP:

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

Sie können eine enthaltene Datei, die nur HTML-Code enthält, in eine PHP-Variable puffern. Dadurch wird die Wartung sauberer.

Am Ende haben Sie also Folgendes:

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

Dann können Sie $ includedhtml einfach dorthin zurückgeben, wo Sie es benötigen, und Ihr HTML-Inhalt muss nicht mehr in PHP-Strings ausgegeben werden.

5
Todd Perkins

Ich habe dieses Framework nicht wirklich verwendet, aber das Vorlagenmodell, das es bietet, 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

Templates ========= Wenn immer möglich, sollten wir PHP von HTML trennen. In Wordpress werden Sie sehen, wie sich die beiden ohne Bedenken vermischen. Während dies oft eine "einfache Art" ist, Dinge zu tun, ist es fast nie die "richtige Art". Stattdessen sollten wir die beiden trennen, um unsere Logik rein und unsere Ansichten dumm zu 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>
4
marfarma

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. 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 Teile von HTML haben, die Sie wiederverwenden werden, würde ich diese als separate Variablen speichern. Dann ist es ganz einfach, Dinge zusammenzusetzen, wenn der Shortcode aufgerufen wird:

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

Erstellen Sie ein Objekt (yes,PHP unterstützt Objekte), das alle Ihre verschiedenen HTML-Blöcke enthält, anstatt es prozedural aufzubauen, und weisen Sie es dann an, welche zu verwenden und welche Daten zurückzugeben sind. So sparen Sie viel Zeit.

2
EAMann