我正在制作几个始终遵循已定义模板的HTML弹出窗口。
由于有模板(标题,内容,示例表,更多按钮), 我以为我可以通过将数据传递给包装器函数来保存大量重复的html:
$device_popup_data = array(
'header' => 'Header text',
'content' => 'some text<span style ="bold"> Some more text</span>',
'example' => '<table><tbody><tr><td> A lot of text here, multi lined and messy',
'more' => '',
);
echo theme_uxt_expanded_popup($device_popup_data);
function theme_uxt_expanded_popup($data){
$head = isset($data['head'])?$data['head']:'';
$content = isset($data['content'])?$data['content']:'';
$example = isset($data['example'])?$data['example']:'';
$more_html = isset($data['more'])?$data['more']:'';
$output= '<div class = "expandedTooltip">';
$output.= '<h1>'.$head.'</h1>';
$output.= '<p>'.$content.'</p>';
if(!empty($more)){
$output.= '<a class = "popupShowMore"><p>'.$more.'</p></a>';
}
$output .= '</div>';
return $output;
}
这似乎是一个好主意,直到我看到其中一些字段(如example
字段)可能包含大约100行HTML。
将这些长字符串推入示例变量似乎使得代码非常难以理解。像这样:
$device_popup_data = array(
'header' => 'Header text',
'content' => 'some text<span style ="bold"> Some more text</span>',
'example' => '<table><tbody><tr><td> A lot of text here</td>,<td> multi lined and
messy, and if any one</td>
<td>wants to change this string it will be very hard</td>
Real string is much longer ... </table>',
'more' => '',
);
你知道吗有效且可读这样做的方法吗?
答案 0 :(得分:1)
你知道一种有效且可读的方法吗? 此?
唯一可读且可维护的方法是遵守Separation of Concerns。这里的要点是1)将PHP与PHP分离2)实现容器,如name
=&gt; HTML content
你应该把它包装成一个类,以便充分利用DI
和SRP
(见下文)。所以,一个类本身看起来像:
class TemplateBlockManager
{
private $blocks = array();
public function define($name, $file, array $vars = array())
{
ob_start();
if (!empty($vars)) {
extract($vars);
}
require($file);
$content = ob_get_clean();
$this->blocks[$name] = $content;
}
public function getBlock($name)
{
return $this->blocks[$name];
}
}
档案:test.phtml
<p>
<b>Welcome to <?php echo $foo; ?></b>
</p>
用法:
<?php
$blockManager = new TemplateBlockManager();
$blockManager->define('header', '/path/to/test.phtml', array('foo' => 'bar'));
// Should output "Welcome to bar"
echo $blockManager->getBlock('header');
这种方法有许多优点:
您可以在bootstrap
阶段准备几个块,从而可以共享您的块
在您的网页上。 这减少了代码重复
您可以将$blockManager
的实例注入到生成输出的其他类中。这对unit-testing
有好处,因为它遵循依赖注入
您还遵守单一责任原则
你完全将HTML与PHP分离,因为你的模板包含基本(或没有)php逻辑
由于您的模板完全解耦,因此您无需担心它们是长还是小。您只需定义一个
最后,HTML
和PHP code
都很容易维护