работа с большим выводом HTML с помощью кода плагина


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

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

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

Author: Bryan M., 2010-08-12

4 answers

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

1.) Наследственность

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

   $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);         
}   
 12
Author: MikeSchinkel, 2010-08-12 22:40:19

Проверьте эту функцию для 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();

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

 5
Author: Todd Perkins, 2010-08-12 22:34:02

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

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>
 4
Author: marfarma, 2011-09-29 23:28:58

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

JavaScript

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

HTML

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

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

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

 2
Author: EAMann, 2020-06-15 08:21:38