it-swarm.xyz

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

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

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

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

9
Bryan M.

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

1.) Heredocs

Вы можете хранить большие блоки текста как 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);         
}   
12
MikeSchinkel

Оформить заказ этой функции для 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.

5
Todd Perkins

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

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>
4
marfarma

Это зависит от типа HTML и JS.

JavaScript

Прежде всего, максимально отделяйте динамические части от статических. Затем загрузите все динамические переменные, которые вам нужны, во время выполнения и поставьте в очередь ваши статические сценарии в верхнем колонтитуле (или в любом нижнем колонтитуле). Но таким образом, большая часть вашего JS отделена от вашего PHP.

HTML

Это вопрос правильного построения кода в PHP. Если у вас есть огромные фрагменты HTML, которые вы собираетесь использовать повторно, я бы сохранил их как отдельные переменные. Затем сложить все вместе, когда вызывается шорткод, так же просто, как:

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

Вместо того, чтобы пытаться создать его процедурно, создайте объект (да, PHP поддерживает объекты), который содержит все ваши различные HTML-блоки, а затем укажите, какие из них использовать и какие данные передавать обратно. Это сэкономит вам огромное количество времени.

2
EAMann