原文:http://www.symfony-project.com/askeet/9
======局部改进======
**回顾:**
在[[askeet_8|第八天里]],我们毫不麻烦地为askeet添加了AJAX互动功能。应用程序现在很有用,但是还可以做一些小的改进。富文本应该可以在问题内容中得到使用,并且主键不应该在URI地址中出现。在symfony中实现这些功能并不是困难的事情: 今天将是一个很好的场合去实践我们已经学到的东西,并且去检查你所知道的怎样操作MVC架构中所有的层。
=====在问题和答案中允许富文本格式=====
====Markdown====
问题和答案的内容现在只能接受纯文本。为了允许基本的格式——bold, italic, hyperlinks, images,等等。——我们将使用一个外部库而不是重复发明轮子。
如果你已经看过文本格式的symfony文档,你可能已经了解我们是[[http://daringfireball.net/projects/markdown/|Markdown]]的粉丝。Markdown是一个文本到HTML的转换工具,并且是一种文本格式的语法。Markdown的巨大好处是纯文本的Markdown文件依然具有很强的可读性(例如维基或是论坛语法):
Test Markdown text
------------------
This is a **very simple** example of [Markdown][1].
The best thing about markdown is its _auto-escape_ feature for code chunks:
link to symfony
>The `<` and `>` are properly escaped as `<` and `>`,
>and are not interpreted by any browser
[1]: http://daringfireball.net/projects/markdown/ "Markdown"
这段文本被解释成如下:
{{symfony:askeet:9:markdown_sample.gif|}}
====Markdown库====
尽管Markdown最初是用Perl写成的,但是在[[http://www.michelf.com/projects/php-markdown/|PHP Markdown]]里仍然有它的PHP库可以使用。这个也就是我们将要使用的。下载markdown.php文件并放入askeet项目(askeet/lib/)的lib文件夹。一切就绪。现在Markdown对askeet应用程序的所有类都是可用的。请首先声明你的需求:
require_once('markdown.php');
每当我们显示消息内容的时候,我们就可以调用Markdown转换器。但是这样对我们的服务器会有很高的负载需求。我们最好在问题被建立的时候把文本内容转化成HTML内容,并且把HTML版的内容存入Question表内。你可能已经习惯了这种方式,因此模型扩展不会让你感到惊讶。
====扩展模型====
首先,在schema.xml中给Question表添加一列如下:
接下来,生成模型和跟新数据库:
$ symfony propel-build-model $ symfony propel-build-sql $ symfony propel-insert-sql====重载setBody方法==== 当Question类的->setBody()被调用时,html_body列同样也必须被进行了Markdown转换的文本内容更新。打开askeet/lib/model/Question.php模型文件,并创建:
public function setBody($v)
{
parent::setBody($v);
require_once('markdown.php');
// strip all HTML tags
$v = htmlentities($v, ENT_QUOTES, 'UTF-8');
$this->setHtmlBody(markdown($v));
}
在设置HTML内容之前应用htmlentities()函数。这样由于所有的