symfony advent calendar day nine: local improvements
====================================================
지난 줄거리
-----------
[8일째](8.txt) 에는 askeet 에 AJAX 인터렉션들을 별 어려움 없이 추가해보았습니다. 이제 어플리케이션이 상당히 쓸만해지긴 했지만, 몇군데 더 개선을 하는 것도 좋을 것입니다. 질문의 `본문` (body) 에는 리치 텍스트를 입력할 수 있도록 해야 할 것이고, URI 에는 프라이머리 키가 보여서는 안 될 것입니다. 이것들을 추가하는 것이 symfony 에서는 어려운 것이 아닙니다. 오늘 우리는 여러분이 지금껏 배운것들을 연습하고 MVC 구조의 모든 계층구조들을 조작하는 방식을 점검할 수 있도록 할 것입니다.
질문과 대답들에 리치 텍스트 입력하기
------------------------------------
### Markdown
질문과 대답들에는 아직 일반 텍스트만을 입력할 수 있습니다. 기본적인 텍스트 포맷팅 - 굵은글씨, 이탤릭, 하이퍼링크, 이미지, 기타등등 - 을 지원하기 위해서 우리는 외부 라이브러리를 사용할 것입니다.
만약 텍스트 형식의 심포니 문서들을 보신적이 있다면, 우리가 [Markdown](http://daringfireball.net/projects/markdown/) 의 광팬이라는 것을 눈치채셨을 것입니다. Markdown 은 텍스트를 HTML 형식으로 변환해 주는 툴이며, 텍스트 포맷팅을 위한 문법이기도 합니다. 위키 또는 포럼의 문법으로써 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"
위의 마크다운은 아래와 같이 표시될 것입니다.
>Test Markdown text
>------------------
>
>This is a **very simple** example of [Markdown](http://daringfireball.net/projects/markdown/).
>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
### Markdown 라이브러리
Markdown 은 원래 [Perl](http://www.perl.com/) 로 작성되었지만, PHP 버전의 라이브러리도 [PHP Markdown](http://www.michelf.com/projects/php-markdown/) 에서 얻을 수 있습니다. 해당 웹사이트로 가셔서 `markdown.php` 파일을 다운로드 받아 askeet 프로젝트의 `lib` 폴더에 넣어두십시오. 이게 다입니다. 이제 아래와 같이 선언함으로써, 이 라이브러리는 askeet 어플리케이션의 다른 모든 클래스들에서 사용이 가능합니다.
[php]
require_once('markdown.php');
우리는 텍스트를 출력할 때마다 Markdown 을 통해 텍스트를 HTML 로 변환하는 대신에 질문이 생성될 때에 텍스트를 HTML 로 변환하고 이를 `Question` 테이블에 저장하는 방식을 사용할 것입니다. 여러분들은 이제 이런 모델 확장같은 것이 전혀 낯설지 않을 것입니다.
### 모델 확장하기
먼저 `schema.xml` 파일을 열어 `Question` 테이블에 컬럼을 추가합니다.
[php]
그리고 모델을 다시 생성하고 데이터베이스를 업데이트 합니다.
$ symfony propel-build-model
$ symfony propel-build-sql
$ symfony propel-insert-sql
### `setBody` 메쏘드를 재정의하기
`Question` 클래스의 `->setBody()` 메쏘드가 호출될때, `html_body` 컬럼 역시, Markdown 을 통해 본문의 일반 텍스트를 변환하여, 업데이트가 되어야 합니다. `askeet/lib/model/Question.php` 모델 파일을 먼저 열고, 다음을 입력합니다.
[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()` 함수를 호출함으로써 `