Domanda

Recentemente ho scritto il mio primo plugin WP che aggiunge uno shortcode per l'incorporamento di una galleria di immagini jquery personalizzato in posti. E 'in primo luogo proprio discariche un buon pezzo di HTML nel post, insieme con javascript necessari per l'inizializzazione.

Tuttavia, ho dovuto costruire l'output HTML procedurale, come una stringa in PHP. Questo tipo di zuppa di tag spinge sempre mi noci, e io sono abituato a lavorare con i framework MVC che forniscono le cose come le funzioni di supporto e modelli parziali per la generazione di codice HTML.

Qual è l'approccio generale per gli autori di plugin che devono gestire grandi quantità di costruito dinamicamente HTML o JS?

È stato utile?

Soluzione

@Byran M. Io tendo ad usare due costrutti Non mi capita spesso di vedere altri sviluppatori di WordPress utilizza spesso, il che mi sorprende, ma mi piacciono molto.

1.) Heredocs

È possibile memorizzare grandi blocchi di testo come < strong> heredocs stringa che potrebbe assomigliare a questo in modo da poter memorizzare preoccuparsi di miscelazione virgolette singole e doppie:

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

Si noti che le variabili possono essere passate a una funzione come una matrice e poi extract()ed o si potrebbe assegnare in altri modi. Si noti inoltre che io uso le parentesi graffe non perché sono sempre necessari, ma rendere il codice più facile da leggere. (Naturalmente con funzioni come the_content() essere materialmente diversi da get_the_content() WordPress non sempre fare questo stile di codifica facile.)

Cosa c'è di più, anche se può non essere relativo al sistema è che se io uso i nomi heredoc come HTML, SQL, ecc poi il mio IDE PhpStorm fa iniezione sintassi e darà me completamento automatico e la colorazione della sintassi all'interno del heredoc.

2.) Concatenazione di stringhe utilizzando una matrice

L'altro linguaggio mi piace usare è quello di raccogliere il contenuto in una matrice e quindi implode() matrice. Anche se non ho mai benchmark questo in modo che possa essere meno utile di quanto presumo so che ripetuto concatenazione di stringhe è un killer come stringhe diventano più grandi (se qualcuno conosce il motivo per cui questo approccio non è affatto migliore o se conoscete un approccio migliore I 'd amore al feedback sentire):

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

Altri suggerimenti

Acquista questa funzione per PHP:

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

È possibile tamponare un file incluso, che sarebbe solo contenere codice HTML in esso, in una variabile php. In questo modo sarà più pulita da mantenere.

Così si finisce con qualcosa di simile:

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

Poi si può solo tornare $ includedhtml dove serve e mantiene il vostro contenuto separato html da dover fare eco tutto dentro di stringhe php.

Non ho effettivamente utilizzato questo quadro, ma il modello modello IT offerte sarà probabilmente appello. Si potrebbe voler dare un'occhiata a come l'autore impostare che fino.

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

Modelli ========= Quando possibile, dovremmo separare PHP da HTML. Entro Wordpress, vedrete i due insieme mista senza apprensione. Anche se questo è spesso un "modo semplice" di fare le cose, non è quasi mai il modo giusto." Invece, dovremmo separare i due, in modo da mantenere la nostra logica pura e le nostre opinioni muto. A questo scopo abbiamo la $ This-> render ( 'my-modello') metodo. Alcuni esempi:

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

Questo dipende dal tipo di HTML e JS.

JavaScript

Innanzitutto, separare le parti dinamiche delle parti statiche, per quanto possibile. Poi carico qualunque variabili dinamiche è necessario in fase di esecuzione e di una coda vostri script statici nell'intestazione (o piè di pagina, a prescindere). Ma in questo modo, la maggior parte del vostro JS è separato dal PHP.

HTML

Questa è una questione di costruire il proprio codice in modo pulito in PHP. Se si dispone di enormi pezzi di HTML che si sta andando a ri-uso, mi piacerebbe conservare quelli come variabili indipendenti. Poi mettendo insieme le cose quando lo shortcode si chiama è semplice come:

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

Piuttosto che cercare di costruire fuori procedurale, costruire un oggetto (sì, oggetti supporta PHP) che contiene tutti i diversi blocchi HTML, poi darle istruzioni quali usare e quali dati da restituire. Questo vi farà risparmiare enormi quantità di tempo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a wordpress.stackexchange
scroll top