为什么我的HTML在使用Smarty渲染时格式太差?

时间:2015-05-05 18:24:42

标签: php wamp smarty slim smarty3

为什么我的HTML在查看源代码时格式太差?

使用:

  1. WAMPSERVER (64 BITS & PHP 5.5) 2.5

  2. Slim Framework v2

  3. RedBeanPHP 4.2

  4. Smarty 3.1.21

  5. index.php:

    <?php
    
    // load required files
    require 'class/Slim/Slim.php';
    require 'class/RedBean/rb.php';
    
    // register slim auto-loader
    \Slim\Slim::registerAutoloader();
    
    // set up database connection
    R::setup('mysql:host=localhost;dbname=slimcms','root','');
    R::freeze(true);
    
    
    // initialize app
    $app = new \Slim\Slim(array(
        'mode' => 'development'
        ,'debug' => true
        ,'view' => new \Slim\Views\Smarty()
        ,'templates.path' => './templates'
    ));
    
    
    $view = $app->view();
    
    $view->parserDirectory = dirname(__FILE__) . '/class/Smarty/';
    $view->parserCompileDirectory = dirname(__FILE__) . '/compiled';
    $view->parserCacheDirectory = dirname(__FILE__) . '/cache';
    
    
    
    // handle GET request for index
    $app->get('/', function() use ($app){
        $books = R::findAll('book');
    //print_r($books);
        $app->render('home.tpl',array('books'=>$books));
    
    });
    
    
    $app->run();
    

    模板/ home.tpl:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>Home</title>
    </head>
    <body>    
        <div id="content">
            {foreach name=aussen item=book from=$books}
                {foreach key=key item=value from=$book}
                    {if $key == 'id' }
                        <a href="{$key}/{$value}">{$key}</a>
                    {else}{$key}{/if}
                {/foreach}
                <hr />
            {/foreach}
        </div>    
    </body>
    </html>
    

    当我通过chrome 查看源代码时:

        <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>Home</title>
    </head>
    <body>
        <div id="content">
                                                            <a href="id/1">id</a>
                                                rating                            price                            title                        <hr />
                                                            <a href="id/2">id</a>
                                                rating                            price                            title                        <hr />
                </div>
    </body>
    </html>
    

    我会预期:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>Home</title>
    </head>
    <body>
        <div id="content">
            <a href="id/1">id</a> rating price title
            <hr>
            <a href="id/2">id</a> rating price title
            <hr>
        </div>
    </body>
    </html>
    

3 个答案:

答案 0 :(得分:1)

由于问题是&#34;为什么代码不漂亮?&#34;不是&#34;我怎么做到漂亮?&#34;,我会给出简单的答案:

Smarty(和PHP)正好通过你放入模板的空白;它不了解您正在创建的HTML结构。唯一可以消除的是Smarty标签本身。

例如,如果你这样写:

  [ 
  {if $foo}
        foo
  {else}
        bar
  {/if}
  ]

所有这些空格都将成为输出的一部分,它将是:

  [

        foo

  ]

或:

  [

        bar

  ]

因此,如果您不想在输出中添加空格,请不要在输入中包含空格。

一个诀窍就是将其评论出来:

  [{* 
  *}{if $foo}{*
        *}foo{*
  *}{else}{*
        *}bar{*
  *}{/if}{*
  *}]

这将导致:

  [foo]

或:

  [bar]

答案 1 :(得分:1)

这是&#34;为什么&#34;部分问题。关于未说出口的&#34;如何解决&#34;另外,你最好试着找出如何制作更小的HTML,而不是更漂亮。

在编译时,Smarty{}所包含的片段替换为<?php?>中包含的PHP代码块。

以下Smarty模板片段:

<div id="content">
    {foreach name=aussen item=book from=$books}
        {foreach key=key item=value from=$book}
            {if $key == 'id' }
                <a href="{$key}/{$value}">{$key}</a>
            {else}{$key}{/if}
        {/foreach}
        <hr />
    {/foreach}
</div>

变得像:

<div id="content">
    <?php foreach ($books as $book): ?>
        <?php foreach ($book as $key => $value) : ?>
            <?php if ($key == 'id'): ?>
                <a href="<?php echo $key; ?>/<?php echo $value; ?>">{$key}</a>
            <?php else ?><?php echo $key; ?><?php endif; ?>
        <?php endforeach; ?>
        <hr />
    <?php endforeach; ?>
</div>

请注意,上面的PHP代码不是Smarty生成的代码。 Smarty生成的代码更复杂,因为它存储分配给模板的变量的方式,处理内置函数属性的方式,变量修饰符以及它提供的其他功能。 但是为了讨论的目的,这个过于简化的代码版本已经足够了。这里重要的是Smarty不会更改{ ... }块之外的任何内容。

Smarty不会破坏模板/ HTML代码的格式。 PHP就是那个人。

PHP解释代码块(包含在<?php?>中)并用它们生成的输出替换它们(如果有的话)。但是如果它紧跟在PHP结束标记?>之后,它也会删除一个新的行字符。

  

块的结束标记将包括紧接着的新行(如果有的话)。

(来源:http://php.net/manual/en/language.basic-syntax.instruction-separation.php

但是,用于缩进Smarty标记的空格既不会被Smarty也不会被PHP删除(因为它们不在标记内)。他们将其转换为最终的HTML,并且由于删除了换行符,它们会破坏格式。

答案 2 :(得分:0)

到目前为止我找到的解决方案。

=&GT; ~1.1 Dindent

=&GT; ~0.11 tidy

启用php.ini extension = php_tidy.dll

index.php:~1.1使用:

<?php

// load required files
require 'class/Slim/Slim.php';
require 'class/RedBean/rb.php';
require 'class/Dindent/Indenter.php';                      //<= added

// register slim auto-loader
\Slim\Slim::registerAutoloader();

// set up database connection
R::setup('mysql:host=localhost;dbname=slimcms','root','');
R::freeze(true);


// initialize app
$app = new \Slim\Slim(array(
    'mode' => 'development'
    ,'debug' => true
    ,'view' => new \Slim\Views\Smarty()
    ,'templates.path' => './templates'
));


$view = $app->view();


$view->parserDirectory = dirname(__FILE__) . '/class/Smarty/';
$view->parserCompileDirectory = dirname(__FILE__) . '/compiled';
$view->parserCacheDirectory = dirname(__FILE__) . '/cache';



// handle GET request for index
$app->get('/', function() use ($app){
    $books = R::findAll('book');
//print_r($books);

    //$app->render('home.tpl',array('books'=>$books));
    $indenter = new \Gajus\Dindent\Indenter();             // <= start added
    ob_start();                                            //
    echo $app->render('home.tpl',array('books'=>$books));  //
    $content = ob_get_contents();                          //
    ob_end_clean();                                        //
    echo $indenter->indent($content);                      // <= end added


});


$app->run();

~0.11使用此:

ob_start();
    $app->render('home.tpl',array('books'=>$books));
    $buffer = ob_get_clean();
    $tidy = new tidy();
    $clean = $tidy->repairString($buffer,
        array(
            'indent' => true
            ,'indent-attributes' => true
    ));
    echo $clean;

输出预期:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>Home</title>
    </head>
    <body>
        <div id="content">
            <a href="id/1">id</a> rating price title 
            <hr />
            <a href="id/2">id</a> rating price title 
            <hr />
        </div>
    </body>
</html>