работа с большим выводом HTML через код плагина


9

Недавно я написал свой первый плагин WP, который добавляет шорткод для встраивания пользовательской галереи изображений jquery в сообщения. В первую очередь это просто дамп хорошего куска HTML в пост вместе с javascript, необходимым для инициализации.

Тем не менее, мне пришлось процедурно строить вывод HTML, как строку в PHP. Этот вид супа тегов всегда сводит меня с ума, и я привык работать с инфраструктурами MVC, которые предоставляют такие вещи, как вспомогательные функции и частичные шаблоны для генерации HTML.

Каков общий подход для авторов плагинов, которым необходимо управлять большими объемами динамически создаваемого HTML или JS?

Ответы:


12

@Byran M. Я, как правило, использую две конструкции, которые не часто встречают другие разработчики WordPress, что меня удивляет, но они мне очень нравятся.

1.) Heredocs

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

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

Обратите внимание, что переменные могут передаваться в функцию в виде массива, а затем extract()редактироваться, или вы можете назначить их другими способами. Также обратите внимание, что я использую фигурные скобки не потому, что они всегда требуются, но они облегчают чтение кода. (Конечно, такие функции, как the_content()существенное отличие от get_the_content()WordPress, не всегда облегчают этот стиль кодирования.)

Более того, хотя это может не относиться к вам, если я использую имена heredoc, такие как HTML, SQL и т. Д., Тогда моя среда IDE PhpStorm выполняет инъекцию синтаксиса и дает мне автозаполнение и выделение синтаксиса внутри heredoc.

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 для Heredocs, они классные, особенно в этой ситуации.
никто не

У меня действительно не было времени, чтобы оценить это, но, похоже, самый простой подход, учитывая то, что мне нужно.
Брайан М.

+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();

Затем вы можете просто вернуть $ includehtml там, где вам это нужно, и он не даст вашему html-контенту отразить все это в строках php.


4

Я на самом деле не использовал эту платформу, но модель шаблона, которую она предлагает, вероятно, понравится. Возможно, вы захотите взглянуть на то, как автор настроил это.

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

Шаблоны ========= По возможности, мы должны отделять PHP от HTML. В Wordpress вы увидите, как они смешались друг с другом без опасений. Несмотря на то, что это часто «легкий путь», он почти никогда не является «правильным». Вместо этого мы должны разделить два, таким образом, сохраняя нашу логику чистой и наши взгляды тупыми. Для этого у нас есть метод $ this-> render ('my-template'). Несколько примеров:

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