有效地主题长弦动态html

时间:2013-08-20 17:24:11

标签: php html coding-style

我正在制作几个始终遵循已定义模板的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' => '',
);

你知道吗有效且可读这样做的方法吗?

1 个答案:

答案 0 :(得分:1)

  

你知道一种有效且可读的方法吗?   此?

唯一可读且可维护的方法是遵守Separation of Concerns。这里的要点是1)将PHP与PHP分离2)实现容器,如name =&gt; HTML content

你应该把它包装成一个类,以便充分利用DISRP (见下文)。所以,一个类本身看起来像:

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逻辑

  • 由于您的模板完全解耦,因此您无需担心它们是长还是小。您只需定义一个

  • 的路径即可
  • 最后,HTMLPHP code都很容易维护