Манипулирование HTML-разметкой в ​​PHP - PullRequest
0 голосов
/ 15 января 2012

Работа с PHP DOM - манипулирование html. Это действительно очень эффективный способ вывода разметки HTML (по крайней мере, предотвращает путаницу логики и разметки в коде).

Но, чтобы сгенерировать 50 строк HTML-разметки, нужно написать около 200 строк в PHP :(.

Пример кода:

...

$signup_form = $document->createElement('form');
$signup_form->setAttribute('id', 'signup_form');
$signup_form->setAttribute('action', 'registration/signup.php');
$signup_form->setAttribute('method', 'post');
$su_fname_label = $document->createElement('label');
$su_fname_label->setAttribute('for', 'fname');
$su_fname_label_content = $document->createTextNode('Name');
$su_fname_label->appendChild($su_fname_label_content);
$su_fname_textbox = $document->createElement('input');
$su_fname_textbox->setAttribute('name', 'fname');
$su_fname_textbox->setAttribute('class', 'valid');
$su_fname_textbox->setAttribute('placeholder', 'Please enter your name');
$su_fname_textbox->setAttribute('type', 'text');

...

Как видите, это всего лишь 1 элемент формы. Представьте себе, если в HTML-форме 5 элементов, код php будет огромным. Интересно, есть ли способ минимизировать для экс. путем установки нескольких атрибутов одновременно? Есть предложения?

Ответы [ 4 ]

0 голосов
/ 16 января 2012

В зависимости от вашей потребности в скорости, и если вы можете использовать кэширование и т.п., может быть полезна библиотека, такая как phpQuery .

Это «порт»от jQuery до PHP и обладает той же универсальностью и простотой, что и jQuery.Однако, по моему опыту, это не так быстро, как мне хотелось бы при генерации кода (у меня нет , однако я провел какие-то тщательные тесты, это просто ощущение).

код, который вы привели в качестве примера, может быть выражен в следующих строчках с помощью phpQuery ( непроверенный ):

$form = pq ('<form />')
          ->attr (array (
                    'id' => 'signup_form',
                    'action' => 'registration/signup.php',
                    'method' => 'POST',
                  ));
$label = pq ('<label />')
          ->html ('Name')
          ->attr ('for', 'fname')
          ->appendTo ($form);
$text = pq ('<input />')
          ->attr (array (
                    'name' => 'fname',
                    'data-placeholder' => 'Please enter your name',
                    'type' => 'text',
                  ))
          ->addClass ('valid')
          ->appendTo ($label);

Я написал его в том формате, который мне нравитсянемного больше строк, чем в коде, который вы предоставили;но это может быть легко уменьшено до 5-10 строк с сохраняемой читаемостью, если вы предпочитаете более компактное кодирование.Во всяком случае, я нахожу, что это намного легче читать, и вам не нужно писать так много DOM кода, чтобы генерировать довольно много HTML-кода.

Кроме того, учитывая, что phpQuery использует ту же концепцию обтекания, что и jQuery, развернутый узел, например $form в приведенном выше коде, является обычным DOMNode, если не заключен в pq().Это дает вам большую гибкость либо в использовании удобных подпрограмм phpQuery, либо в более «фундаментальной» функциональности PHP DOM.

0 голосов
/ 15 января 2012

Какова ваша причина использования DOM для генерации HTML-вывода? Там нет никакого способа сделать DOM кратко !

Обычно вы просто используете PHP для шаблонов. Создайте отдельный файл, например, так:

<?php // template.php
echo '<!DOCTYPE html>',"\n";
?>
<html>
    <head>
    <meta charset="utf-8">
    <title><?=htmlspecialchars($title, ENT_NOQUOTES, 'utf-8')?></title>
    </head>
    <body>
       <form id="signup_form" action="registration/signup.php" method="post">
           <label for="fname">Name</label>
           <input id="fname" name="fname" class="valid" placeholder="Please enter your name" type="text">
       </form>
    </body>
</html>

Затем с помощью функции шаблона:

function render($__filename, $__data) {
    extract($__data, EXTR_SKIP);
    ob_start();
    include $__filename;
    return ob_get_clean();
}

Визуализируйте ваш шаблон из кода следующим образом:

do_something();
$templatedata = array('title'=>'The Title');
$html = render('template.php', $templatedata);

Если вы хотите что-то с поддержкой узлов (что является отличной идеей для обеспечения правильной формы и правильного экранирования!), Вы можете использовать XSLT или сторонний шаблонизатор, такой как PHPTAL .

0 голосов
/ 15 января 2012

Раньше я делал то, что ты делаешь, пока не понял, что это не очень читабельно.Вы должны проанализировать код, чтобы определить, какая разметка создается.Это также сложнее поддерживать.Как вы сказали, добавление одного поля в форму требует совсем немного кода, а внесение изменений требует копаться во всем этом коде.Я согласен с желанием отделить вашу логику PHP от разметки;однако, есть лучшие способы сохранить ваш код в чистоте в зависимости от того, что вы пытаетесь сделать.

Не входя в сторонние решения, вы можете:

  1. Загрузка разметки из отдельного файла в объект DOM для дальнейших манипуляций.

  2. Использование PHP в качестве механизма шаблонов, для которого оно было разработано, путем встраивания PHP в разметку.Как красноречиво объясняет полковник Шрапнель: «[E] mbedded PHP позволяет вам отделить бизнес-логику от логики представления на уровне всего сайта, поддерживая шаблоны любого размера и структуры…».

  3. Назначьте разметку для переменной, используя heredoc синтаксис .Хотя это и не лучший выбор, его гораздо легче читать, чем чисто основанный на DOM подход.

$signup_form = <<<EndHTMLForm
<form id="signup_form" action="registration/signup.php" method="post">
    <label for="fname">Name</label>
    <input name="fname" class="valid" placeholder="Please enter your name" type="text">
</form>
EndHTMLForm;

Моя цель здесь не состоит в том, чтобы увести вас прочь от сторонних решений, но для иллюстрации альтернативных подходов в обычном PHP.DOM многословен.Конечно, у него есть замечательные преимущества, но создание разметки с нуля не входит в их число.

0 голосов
/ 15 января 2012

Почему бы вам просто не вывести HTML и не включить буферизацию вывода. Затем вы можете отфильтровать вывод с помощью расширения tidy и убедиться, что ваш выходной HTML верен, но при этом все равно идет так же быстро, как и написание чистого HTML.

Несмотря на вышесказанное, @Gordon предлагает:

tidy вряд ли подходит для программной авторизации (x) html. это больше похоже на почтовый процессор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...