原文: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()函数。这样由于所有的