Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 有效地为长串动态html设置主题_Php_Html_Coding Style - Fatal编程技术网

Php 有效地为长串动态html设置主题

Php 有效地为长串动态html设置主题,php,html,coding-style,Php,Html,Coding Style,我制作了几个HTML弹出窗口,总是遵循一个定义的模板 因为有一个模板(标题、内容、示例表、更多按钮), 我认为通过将数据传递给包装器函数,可以节省大量重复出现的html,如下所示: $device_popup_data = array( 'header' => 'Header text', 'content' => 'some text<span style ="bold"> Some more text</span>', 'examp

我制作了几个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;
}
您知道这样做的有效且可读的方法吗

你知道一种高效且可读的方法来做类似的事情吗 这个

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

为了充分利用
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');

你知道一种高效且可读的方法来做类似的事情吗
这个

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

为了充分利用
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');

既然你不读那些字符串,你也不必在意它们是长还是小。通过变量名,它们的可读性始终相同。如果您关心最终的HTML输出,您可以通过一个美化器运行它,比如tidy。@hakre,编辑了我的问题,试图更清楚一些。我担心这些长字符串会使代码流变得不合理,这看起来确实有点麻烦。我现在最好看看你到底想问什么。那么长,甚至更长?你可以通过抽象模板逻辑和使用
OB
技巧来做到这一点,比如包括一个模板并注入一些其他变量。请参阅此处了解更多匿名信息,并将其与输出缓冲相结合,例如此处概述的:。由于您不读取这些字符串,因此不必关心它们是长还是小。通过变量名,它们的可读性始终相同。如果您关心最终的HTML输出,您可以通过一个美化器运行它,比如tidy。@hakre,编辑了我的问题,试图更清楚一些。我担心这些长字符串会使代码流变得不合理,这看起来确实有点麻烦。我现在最好看看你到底想问什么。那么长,甚至更长?你可以通过抽象模板逻辑和使用
OB
技巧来做到这一点,比如包括一个模板并注入一些其他变量。请参阅此处了解更多匿名信息,并将其与输出缓冲相结合,例如此处概述的:。我认为应该可以在定义中定义默认变量,并且当使用getBlock返回块时,您还应该能够指定变量。感谢您的出色回答,我肯定会使用这个而不是我的程序版本,但我仍然有相同的问题:在哪里编写数组('foo'=>'bar');我仍然需要输入一个巨大的html表而不是“bar”。不,不,你搞错了。第三个可选参数
array('foo'=>bar')
仅用于模板变量。正如您所看到的,它有默认的空值,所以您可以忽略它。对于巨型表,这将是:
$blockManager->define('maging_table','/path/to/maging/table.phtml');echo$blockManager->getBlock(‘巨大的_表’)我认为应该可以在define中定义默认变量,并且当使用getBlock返回块时,您还应该能够指定变量。感谢您的出色回答,我肯定会使用它而不是我的过程版本,但仍然存在相同的问题:在何处编写数组('foo'=>'bar');我仍然需要输入一个巨大的html表而不是“bar”。不,不,你搞错了。第三个可选参数
array('foo'=>bar')
仅用于模板变量。正如您所看到的,它有默认的空值,所以您可以忽略它。对于巨型表,这将是:
$blockManager->define('maging_table','/path/to/maging/table.phtml');echo$blockManager->getBlock(‘巨大的_表’)