代码之家  ›  专栏  ›  技术社区  ›  Alix Axel

MVC世界中的HTML缩进[重复]

  •  6
  • Alix Axel  · 技术社区  · 16 年前

    这个问题已经有了答案:

    有个问题一直困扰着我, 现在 缩进HTML代码被认为是一个很好的实践,但是我有一些保留,在MVC模式下缩进代码,下面是一个(愚蠢的)示例:

    HTML代码:

    <!DOCTYPE html>
    <html>
    <head>
    <title>Testing MVC Indentation</title>
    </head>
    
    <body>
    
    <?php View('h1', 'I am a Level 1 Header'); ?>
    
        <table>
            <tr>
                <td>
                    <?php View('h1', 'I am a Level 1 Header Inside a Table'); ?>
                </td>
            </tr>
        </table>
    
    </body>
    </html>
    

    为了正确缩进,第一次调用 h1 视图(或) 部分 )应返回:

    \t<h1>I am a Level 1 Header</h1>
    

    当第二个电话打给 H1 视图应返回:

    \t\t\t\t<h1>I am a Level 1 Header Inside a Table</h1>
    

    这个 H1 然而,视图不知道它所处的缩进范围,那么它到底如何返回正确缩进的数据呢?也, 忽略缩进 在视图中 可以公开部分应用程序逻辑 ( 之后检查此页的HTML源代码 <div id="content"> 以现实世界为例 ):

    <body>
    
    <h1>I am a Level 1 Header</h1>
    
        <table>
            <tr>
                <td>
    <h1>I am a Level 1 Header Inside a Table</h1>
                </td>
            </tr>
        </table>
    
    </body>
    

    完全不缩进可以解决所有问题,但也会使阅读和维护变得更加困难:

    <body>
    
    <h1>I am a Level 1 Header</h1>
    
    <table>
    <tr>
    <td>
    <h1>I am a Level 1 Header Inside a Table</h1>
    </td>
    </tr>
    </table>
    
    </body>
    

    我对这个问题唯一可行的解决办法是 Tidy output buffering 但是我想知道是否值得这样做,因为它将进行处理和加载 不必要的(?) 慢。此外,这不会使维护HTML代码变得更容易,因为它只缩进输出,而不是源代码。

    对于这个“基本”的问题,我很抱歉,但过去几年我一直在关注业务逻辑,而且我与演示世界有点脱节——在过去的好日子里,我的HTML代码都是未被插入的,但后来我又用表来设计布局——只是想赶上现在。

    有关于这个主题的解决方案/见解吗?


    相关问题:

    5 回复  |  直到 15 年前
        1
  •  4
  •   molf    16 年前

    如前所述,源代码缩进和输出缩进之间存在差异。源代码的缩进可以不同于输出的缩进,因为输出是动态构造的。在编写模板时,源代码的可读性是最重要的。你应该先集中精力!通常,输出的HTML缩进是没有问题的。

    已经说过,有两种实用的方法可以消除输出中的缩进不匹配:

    使用可正确缩进输出的模板语言

    第一个例子是 Haml 是Ruby的模板语言。需要这样的模板:

    %body
      %h1 I am a Level 1 Header
      %table
        %tr
          %td
            %h1 I am a Level 1 Header Inside a Table
    

    输出将被整齐地格式化为HTML,类似于您的示例,所有的缩进都是正确的。

    这种方法的一个明显的缺点是,您没有真正在模板中编写HTML,而是用一种不同的语言编写,使用类似HTML的语义。这可能是一个问题,取决于谁将维护视图。

    从输出中去掉所有多余的空白,完全不缩进

    有些模板语言可以选择删除所有多余的空白。smarty for php有一个 whitespace trimming plugin 比如说,这项工作做得很好。它完全解决了输出美化问题,有目的地使所有输出均无缩进。它还节省了非常少量的带宽。

    一个只使用PHP的解决方案是 ob_start() 用它 $output_callback 处理程序(即 documented here )您可以编写一个简单的回调,去掉多余的空白,类似于smarty插件。与在输出回调中使用整洁相反,这仍然允许您在页面结束之前刷新缓冲区,以加速长/慢页面。

        2
  •  5
  •   Daff    16 年前

    我想说,两者之间有区别 HTML 源代码 压痕。在典型的MVC视图中,您使用源代码,我认为应该以可读的方式缩进源代码。

    但是实际的HTML输出是另一回事。当然,朝气缩进的源看起来有点不专业(这就是为什么我有时倾向于删除任何缩进,但这通常涉及到一些HTML后处理),但对于浏览器本身,如果根本不重要,如果我真的需要查看源代码,我将使用格式化程序或firebug来显示所有的dom elem格式很好。

        3
  •  3
  •   Rolf    15 年前

    很抱歉添加了第三个答案!已经有一段时间了,我想补充一个答案,请不要投我一票。我只是觉得应该这样说:

    这似乎可行,aka有两个不同的“线程”缩进,一个用于php,另一个用于html:

    <table>
    <?foreach($list->sections as $sKey => $section) { ?>
        <tr><td><h4><?= $section->label ?></h4></td></tr>
    <?  foreach($section->items as $iKey =>  $item) { ?>
        <tr><td><?= $item->label ?></td></tr>
    <?  } ?>
    <?} ?>
    </table>
    

    通过始终让php标记从行的开头开始,并在php块代码中缩进,得到的代码将保持干净:

    <table>
        <tr><td><h4>Books 1</h4></td></tr>
        <tr><td>Some Book</td></tr>
        <tr><td>Some Other Book</td></tr>
        <tr><td><h4>Books 2</h4></td></tr>
        <tr><td>Some Book in List 2</td></tr>
    </table>
    

    PHP和HTML的缩进逻辑保存在源文件中,尽管每个都是自己的。

        4
  •  1
  •   Rolf    16 年前

    我想这里可以发明一些东西来跟踪缩进。

    我相信,可以同时正确地缩进PHP和正确地缩进HTML,但是需要编写代码来处理这一点,无论是作为PHP扩展还是作为库(这样做的优雅性和效率要低得多)。

    我的第一个猜测是PHP跟踪HTML的缩进,当打印一行新行时,恢复到前一级的缩进,这类似于大多数IDE在输入时所做的。 PHP程序员可以通过这些函数来控制这一点(我现在只是在编这些东西):

    • 制表符($N):向右移动缩进级别$N制表符(添加$N制表符)
    • detab($n):从缩进级别中删除$n个制表符
    • stop():停止缩进。不会向输出添加选项卡。这对HTML预标记很有用。
    • resume():停止()后恢复上一级别的缩进。
        5
  •  1
  •   Rolf    16 年前

    我有时会在双引号字符串中使用\t作为HTML的一些基本缩进。它帮助我调试东西。此外,我尽可能将HTML保存在模板中,即使这意味着用foreach循环来清除模板。在模板(在MVC中称为“视图”)中,PHP代码缩进通常遵循HTML代码。

    我还可以向生成HTML的函数添加一个参数,以使它们具有“缩进感知”示例:

    buildSomeHtmlList($data, $indent=0)
    

    结果是 主要地 缩进的HTML,这很适合我。

    顺便说一句,在您的示例中,这不是应该发生的事情,afaik,表中的h1应该适当缩进,通常情况下,因为php输出从“<?”开始。,此时选项卡已打印。