我有一个程序,其中一个函数使用一系列点等号连接分配返回一个相当大的HTML表:
function callme() {
$return = '';
$return .= '<table>';
foreach ($foo as $bar => $bar){
$return .= '<tr><td style="css">bla bla bla'.$bar.'</td>';
$return .= '<td>more stuff, modal buttons</td></tr>';
$return .= 'etc etc etc...';
}
$return .= '</table>';
return $return
}
我希望找到一个不太容易出错的WET方法来处理这个并且不确定它是否应该使用array
我将每个项目添加到implode/join
,也许使用对象会有意义的。
我已经google了一下,没有太多的运气,并且非常喜欢来自SO社区的一些意见。
编辑:
不确定是否有任何方法可以将此帖发布为On-Topic,因为我现在可以看到,实际上没有办法选择正确的解决方案,所以因为删除它已经太晚了(也许发布到Date.prototype.getFullYear()
本来更合适),我至少会尝试使其更有用。
花了30分钟调试一个脚本,其中使用“dot equals”方法连接table
,HTML
和text
组件生成的variable
,以及错误导致每个文本元素都呈现为锚点(<a>some text</a>
)。删除所有的javascript后,我预计会以某种方式在DOM元素中生成锚标记,跟踪下面一行中的错误:
$return .= '<br/><div id="visitMBO" class="btn visitMBO" style="display:none"><a href="'.$eventLinkURL.'" target="_blank">Manage on MindBody Site<a/></div>';
错误位于该行的末尾:<a/>
。糟糕。
这是一个相当长的表格,包括javascript使用的大量CSS
classes
和id
以及许多变量,所以有大量的单引号,双引号和点遍布这个地方。现在我希望能够根据用户输入呈现不同的变体,并将其中的多个版本用test
子句分隔,或者在整个过程中进行测试可能会更糟。
询问php mailing list会更合适,但也会偏离主题。那里的选项包括相当轻量级的HTML table generator class,更健壮的htmlgen和DynaWeb的Cellbrush,据我所知,它的重量也相当轻。
如下面的一个答案所述,如果表格不太复杂,.=
是一种合理的方法,如果我只是将每一行保持在较短的长度,那么问题会更明显。实际上,锚点的开始标记几乎从页面边缘掉落。
在下面的答案(带链接)中注明,用于分离逻辑,标记和数据的其他选项将使用模板引擎或使用php的DOM类(Table Class)。 Heredoc还会清理一些冗余和多个引号。
答案 0 :(得分:1)
如果您想要有条理的方法,请查看DomDocument http://www.php.net/manual/en/class.domdocument.php
您可以使用它以非常结构化的方式构建HTML。但是,在这个例子中,我并不认为他们一定是解决问题的正确方法。你应该找到一种你感觉舒适的风格,并对你和你的团队有意义;这是帮助避免错误代码的最佳方法。
对我来说,我通常只是使用。=编写代码,只要代码相当小就完全如此。这是一种非常容易阅读的方法。如果我可以浏览一段代码并理解它而不用考虑其正常代码。
答案 1 :(得分:1)
一种选择是使用模板引擎,而不是将HTML代码直接放在PHP函数中。一个例子是mustache。
这将允许您在单独的文件中构建HTML并将数据传递给它。
您的模板文件可能如下所示:
<table>
{{# foo }}
<tr>
<td>{{ bar }}</td>
</tr>
{{/ foo }}
</table>
然后您将从中获取HTML字符串:
$m = new Mustache_Engine(array(
'loader' => new Mustache_Loader_FilesystemLoader(dirname(__FILE__) . '/templates'),
));
$m->render('table_template', array('foo' => $foo));
答案 2 :(得分:1)
在PHP中使用字符串的方法有很多种。值得注意的是,如果你想要用字符串连接一个大的连续的HTML块,那么在没有引号的情况下这样做的一种有用方法是使用Heredoc。例如
function callme(&$rows) {
$return = '<table>' . PHP_EOL;
foreach ($rows as $row){
// Start a heredoc-delimited string
$return .= <<<EOD
<tr>
<td>Movie name: "$row[0]"</td>
<td>Review: $row[1]</td>
<td>IMDB rating: $row[2]</td>
<td>Summary: "$row[0]" was $row[1] with a rating of $row[2]</td>
</tr>
EOD;
// End a heredoc-delimited string (must be on its own line)
}
return $return . PHP_EOL . '</table>';
}
$arr = array(array("Fast 7", "awesome", "7.6"), array("Glitter", "horrible", "2.1"));
echo callme($arr);
<强>结果:强>
<table>
<tr>
<td>Movie name: "Fast 7"</td>
<td>Review: awesome</td>
<td>IMDB rating: 7.6</td>
<td>Summary: "Fast 7" was awesome with a rating of 7.6</td>
</tr> <tr>
<td>Movie name: "Glitter"</td>
<td>Review: horrible</td>
<td>IMDB rating: 2.1</td>
<td>Summary: "Glitter" was horrible with a rating of 2.1</td>
</tr>
</table>