bryanm.
  • 0
Новичок

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

  • 0

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

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

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

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

    1.) Гередокс

    Вы можете хранить большие блоки текста в виде строки 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);         
    }   
    
    • 0
  2. Проверьте эту функцию для 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.

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

    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>
    
    • 0
  4. Это зависит от типа HTML и JS.

    JavaScript

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

    HTML

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

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

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

    • 0

Оставить ответ

You must login to add an answer.