使用PHP DOM - html操作。这是输出HTML标记的非常有效的方法(至少可以防止代码中的逻辑和标记混乱)。
但是,要生成50行html标记,必须在PHP中编写大约200行:(。
示例代码:
...
$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');
...
如你所见,它只是形式的一个元素。想象一下,如果HTML表单中有5个元素,那么php代码将是巨大的。我想知道,有没有办法缩小前任。通过一次设置多个属性?有什么建议吗?
答案 0 :(得分:0)
为什么不输出HTML并启用输出缓冲。然后,您可以使用tidy
扩展名过滤掉输出,并确保输出HTML有效,同时仍然与编写纯HTML一样快。
尽管如此,正如@Gordon建议的那样:
tidy几乎不适合以编程方式创作(x)html。它更像是一个后处理器。
答案 1 :(得分:0)
使用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。
答案 2 :(得分:0)
我曾经做过你正在做的事情,直到我意识到它不是很易读。您必须分析代码以确定正在构建的标记。维护起来也比较困难。正如您所说,向表单添加单个字段需要相当多的代码,并且进行更改需要挖掘所有代码。我同意希望将PHP逻辑与标记分开;但是,有更好的方法可以保持代码清洁,具体取决于您要做的事情。
无需进入第三方解决方案,您可以:
使用PHP作为模板引擎,通过在您的标记中嵌入PHP来实现它。正如Col. Shrapnel非常雄辩地解释道:“[E] mbedded PHP允许您在站点范围内将业务逻辑与表示逻辑分开,支持任何大小和结构的模板......”。
使用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;
我的目的不是引导你离开第三方解决方案,而是用普通的PHP来说明替代方法。 DOM很冗长。它当然有很多优点,但从头开始创建标记并不是其中之一。
答案 3 :(得分:0)
根据您对速度的需求以及是否能够使用缓存等,可以使用phpQuery等库。
它是PHP的jQuery
类型的“端口”,具有与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
的更“基本”功能。