radzenie sobie z dużymi wyjściami HTML za pomocą kodu wtyczki

9

Niedawno napisałem moją pierwszą wtyczkę WP, która dodaje krótki kod do osadzania niestandardowej galerii obrazów jquery we wpisach. To przede wszystkim zrzuca dużą część kodu HTML do posta wraz z javascript niezbędnym do inicjalizacji.

Musiałem jednak zbudować wyjście HTML proceduralnie, jako ciąg znaków w PHP. Tego rodzaju zupa tagów zawsze doprowadza mnie do szału i jestem przyzwyczajony do pracy ze strukturami MVC, które zapewniają takie funkcje, jak funkcje pomocnicze i częściowe szablony do generowania HTML.

Jakie jest ogólne podejście dla autorów wtyczek, którzy muszą zarządzać dużą ilością dynamicznie budowanego HTML lub JS?

Bryan M.
źródło

Odpowiedzi:

12

@Byran M. Często używam dwóch konstruktów, z których często nie korzystają inni programiści WordPress, co mnie zaskakuje, ale bardzo je lubię.

1.) Heredocs

Możesz przechowywać duże bloki tekstu jako ciąg znaków heredocs, które mogą wyglądać tak, aby zapisać zmartwienie mieszania pojedynczych i podwójnych cudzysłowów:

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

Zauważ, że zmienne mogą być przekazywane do funkcji jako tablica, a następnie extract()edytowane lub możesz przypisać je na inne sposoby. Zauważ też, że nie używam nawiasów klamrowych, ponieważ są one zawsze wymagane, ale ułatwiają czytanie kodu. (Oczywiście z funkcjami takimi jak the_content()bycie istotnie innym niż get_the_content()WordPress nie zawsze ułatwia ten styl kodowania.)

Co więcej, chociaż może to nie mieć znaczenia, jeśli użyję nazw heredoc, takich jak HTML, SQL itp., To mój IDE PhpStorm wykonuje wstrzykiwanie składni i daje mi autouzupełnianie i kolorowanie składni w heredoc.

2.) Łączenie łańcuchów za pomocą macierzy

Innym idiomem, którego lubię używać, jest zbieranie treści do tablicy, a następnie implode()do tablicy. Chociaż nigdy tego nie analizowałem, więc może to być mniej pomocne niż zakładam, że wiem, że powtarzanie konkatenacji ciągów jest zabójcze, ponieważ ciągi stają się większe (jeśli ktoś wie, dlaczego to podejście nie jest lepsze lub jeśli znasz lepsze podejście I chciałbym usłyszeć opinie):

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);         
}   
MikeSchinkel
źródło
1
+1 dla Heredoców, są niesamowite, szczególnie w tej sytuacji.
nikt
Naprawdę nie miałem czasu, aby to ocenić, ale wydaje się, że jest to najprostsze podejście, biorąc pod uwagę to, czego potrzebuję.
Bryan M.,
+1 za konkatenację tablicy / łańcucha. Często to robię. Ułatwia konstruowanie ciągów bez obcych znaków i spacji.
s_ha_dum,
5

Sprawdź tę funkcję dla PHP:

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

Możesz buforować dołączony plik, który po prostu zawierałby w nim kod HTML, do zmiennej php. Ułatwi to utrzymanie.

W efekcie powstaje coś takiego:

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

Następnie możesz po prostu zwrócić $ includedhtml tam, gdzie jest to potrzebne, dzięki czemu zawartość HTML nie będzie musiała być wyświetlana w ciągach php.

Todd Perkins
źródło
4

Tak naprawdę nie korzystałem z tego frameworka, ale oferowany przez niego model szablonów prawdopodobnie spodoba się. Możesz rzucić okiem na to, jak autor to skonfigurował.

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

Szablony ========= Gdy tylko jest to możliwe, powinniśmy oddzielić PHP od HTML. W Wordpress zobaczysz, że mieszają się ze sobą bez obaw. Chociaż jest to często „łatwy sposób” robienia rzeczy, prawie nigdy nie jest to „właściwy sposób”. Zamiast tego powinniśmy segregować te dwa elementy, utrzymując w ten sposób czystą logikę, a nasze poglądy głupie. W tym celu mamy metodę $ this-> render ('my-template'). Kilka przykładów:

    // 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>
marfarma
źródło
Po prostu używa buforowania wyjściowego, jak opisuje Todd Perkins w swojej odpowiedzi.
Ian Dunn
2

To zależy od typu HTML i JS.

JavaScript

Przede wszystkim oddzielić części dynamiczne od części statycznych tak bardzo, jak to możliwe. Następnie załaduj dowolne zmienne dynamiczne, których potrzebujesz w czasie wykonywania, i ustaw kolejkę skryptów statycznych w nagłówku (lub stopce, cokolwiek). Ale w ten sposób większość JS jest oddzielna od PHP.

HTML

Jest to kwestia czystego budowania kodu w PHP. Jeśli masz ogromne fragmenty kodu HTML, których zamierzasz użyć ponownie, zapisałbym je jako osobne zmienne. Następnie łączenie rzeczy, gdy wywoływany jest shortcode, jest tak proste, jak:

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

Zamiast próbować budować go proceduralnie, zbuduj obiekt (tak, PHP obsługuje obiekty), który zawiera wszystkie twoje różne bloki HTML, a następnie poinstruuj go, których użyć i które dane przekazać. Zaoszczędzi ci to mnóstwo czasu.

EAMann
źródło