为什么我的HTML在查看源代码时格式太差?
使用:
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>
答案 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>