робота з великим вихідним кодом HTML за допомогою плагіна


9

Нещодавно я написав свій перший плагін WP, який додає шорткод для вбудовування користувацької галереї зображень jquery в повідомлення. Це в першу чергу просто скидає в пост хороший фрагмент HTML, а також JavaScript, необхідний для ініціалізації.

Однак мені довелося побудувати вихід HTML-код процедурно, як рядок у PHP. Цей вид супу тегів завжди приводить мене в оману, і я звик працювати з рамками MVC, які надають такі речі, як допоміжні функції та часткові шаблони для генерування HTML.

Який загальний підхід для авторів плагінів, яким потрібно керувати великою кількістю динамічно складеного HTML або JS?

Відповіді:


12

@Byran M. Я схильний використовувати дві конструкції, які я часто не бачу, як інші розробники WordPress використовують часто, що мене дивує, але мені вони дуже подобаються.

1.) Гередоки

Ви можете зберігати великі блоки тексту у вигляді рядка heredocs, який може виглядати так, щоб я міг зберігати занепокоєння щодо змішування одинарних та подвійних лапок:

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

Зауважте, що змінні можуть бути передані функції як масив, а потім extract()ed або ви можете призначити їх іншими способами. Також зауважте, що я використовую дужки не тому, що вони завжди потрібні, але вони полегшують читання коду. (Звичайно, такі функції, як the_content()істотно відмінні від get_the_content()WordPress, не завжди полегшують цей стиль кодування.)

Більше того, хоча це може не стосуватися вас, якщо я використовую імена heredoc, такі як HTML, SQL і т.д., то мій IDE PhpStorm робить ін’єкцію синтаксису і дасть мені автозаповнення та синтаксичне забарвлення в гередоку.

2.) Об'єднання рядків за допомогою масиву

Інша ідіома, яку я люблю використовувати, - це збирати вміст у масив, а потім implode()у масив. Хоча я ніколи не орієнтувався на це, щоб це могло бути менш корисним, ніж я вважаю, я знаю, що повторне об'єднання рядків є вбивцею, оскільки струни збільшуються (якщо хтось знає, чому такий підхід не кращий або якщо ви знаєте кращий підхід, я я хотів би почути відгуки):

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 для Гередока, вони приголомшливі, особливо в цій ситуації.
ніхто

Насправді не встигли це оцінити, але, здається, це найпростіший підхід з огляду на те, що мені потрібно.
Брайан М.

+1 для об'єднання масивів / рядків Я роблю це багато. Це спрощує побудову рядків без сторонніх ліній і пробілів.
s_ha_dum

5

Оформити цю функцію для PHP:

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

Ви можете буферувати включений файл, який би просто містив HTML-код у ньому, у змінну php. Це зробить його більш чистим у догляді.

Отже, ви закінчите щось подібне:

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

Тоді ви можете просто повернути $ enablehtml там, де вам це потрібно, і це захищає ваш html-вміст окремо від необхідності повторювати це всередині рядків php.


4

Я фактично не використовував цю рамку, але шаблонна модель, яку вона пропонує, напевно, сподобається. Ви можете поглянути, як автор це налаштував.

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

Шаблони ========= Коли це можливо, ми повинні відокремлювати PHP від ​​HTML. У Wordpress ви побачите, як вони змішалися разом без побоювань. Хоча це часто "простий спосіб" робити речі, це майже ніколи не "правильний шлях". Натомість ми повинні розділити ці два, тим самим зберігаючи свою логіку та чисті погляди. Для цього у нас є метод $ this-> render ("мій шаблон"). Кілька прикладів:

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

Це просто використання вихідного буферизації, як описує Тод Перкінс у своїй відповіді.
Ян Данн

2

Це залежить від типу HTML та JS.

JavaScript

Перш за все, максимально відокремте динамічні частини від статичних частин. Потім завантажте будь-які динамічні змінні, які вам потрібні під час виконання, і поставте в чергу свої статичні сценарії в заголовку (або колонтитулі, як би там не було). Але таким чином, більшість вашого JS є окремим від вашого PHP.

HTML

Це питання чистоти побудови коду в PHP. Якщо у вас є величезні фрагменти HTML, які ви збираєтеся повторно використовувати, я б зберігав їх як окремі змінні. Потім складання речей разом, коли викликається короткий код, настільки ж просто, як:

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

Замість того, щоб намагатися його скласти процедурно, побудуйте об’єкт (так, PHP підтримує об’єкти), який містить усі ваші різні HTML-блоки, а потім проінструктуйте його, які використовувати та які дані передавати назад. Це заощадить вам величезну кількість часу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.