1

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

您知道执行此类操作的有效且易读的方法吗?

4

1 回答 1

1

您知道执行此类操作的有效且易读的方法吗?

这样做的唯一可读、可维护的方法是遵守关注点分离。这里的要点是 1) 将 HTML 与 PHP 解耦 2) 实现容器,例如name=>HTML content

你真的应该把它包装到一个类中,以便充分利用DIand 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,因此您的块可以在您的页面之间共享。这减少了代码重复

  • 您可以将 a 的实例注入$blockManager到另一个生成输出的类中。这对 有好处unit-testing,因为它遵循依赖注入

  • 您还遵守单一职责原则

  • 您将 HTML 与 PHP 完全分离,因为您的模板包含基本(或没有)php 逻辑

  • 由于您的模板是完全解耦的,您不必担心它们是长还是小。您只需定义一个路径

  • 最后,两者HTMLPHP code易于维护

于 2013-08-20T19:14:09.553 回答