2012-01-15 4 views
0

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

Но, чтобы генерировать 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-код будет огромным. Интересно, есть ли способ минимизировать, например, путем установки множественного доступа ребрами сразу? Какие-либо предложения?

+0

В чем проблема с внедрением фрагментов PHP в ваш HTML-код? Я предполагаю, что это будет МНОГО более читаемым впоследствии. – TimWolla

+1

Ничего себе, это смешно! – greut

+2

, кроме написания собственных вспомогательных функций или выделенных классов для создания отдельных элементов, нет. DOM - подробный API. – Gordon

ответ

0

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

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

аккуратные вряд ли подходит для программно авторинга (X) HTML. его больше похоже на постпроцессор.

+0

tidy должен быть включен iirc. dom включен по умолчанию. Кроме того, tidy вряд ли подходит для программного создания (x) html. его больше похоже на постпроцессор. – Gordon

+0

Да, это хороший момент. Тем не менее, я нахожу, что в средах, которые ПОЛЬЗУЮТСЯ ПРИБОРОМ, удобнее использовать аккуратно. Да, это постпроцессор. Я также предлагаю использовать его как один. –

+0

его действительная альтернатива. нет причин для понижения ответа imo. – Gordon

0

В чем причина использования DOM для генерации вывода html? Невозможно сделать DOM terse!

Обычно вы просто используете 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); 

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

0

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

Не вдаваясь в сторонние решения, которые вы могли бы:

  1. Load markup from a separate file into a DOM object для дальнейших манипуляций.

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

  3. Назначить разметку переменной с использованием heredoc syntax. Хотя это не лучший выбор, его гораздо проще читать, чем просто основанный на 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; 

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

+0

Вы смущены (2) и (3) описаниями.В то время как встроенный PHP позволяет отделить бизнес-логику от логики представления на основе всего сайта, поддерживая шаблоны любого размера и структуры, в то время как heredoc действительно предназначен для «малых доз», поддерживает логику NO и вообще разделение. Не сказать, что вы теряете подсветку кода с помощью heredoc. –

+0

@Col: in (2) Я имел в виду «небольшие дозы» PHP по всему HTML-шаблону - в отличие от больших разделов обоих, которые я предполагал, что OP пытался избежать. Полагаю, я не был ясен по этому вопросу, поэтому я попытаюсь исправить это. Я абсолютно согласен, однако, что любое использование heredoc должно выполняться в «малых дозах». Даже без преимущества выделения кода мой пример, безусловно, более ясен, чем подход, основанный на DOM. Они представлены только как возможные альтернативы, поскольку ОП никогда не указывал намерения. – Herbert

0

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

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

Код, который вы дали в качестве примера можно было бы выразить вдоль этих линий с 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.

Смежные вопросы