uthorofotus iruc
プログラムを組むために考えたり憶えたりした、いろいろなことを記録していきます。タイトルの読みは「ウソロフォトス イルーク」
[24] [23] [22] [21] [20] [19] [18] [17] [16] [15] [14]
[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
askeet day nine:local improvements の解説
askeetチュートリアルの9日目『部分的な改良』です。
4日目チュートリアルの日本語版はこちらです。本家英語版はこちらです。
■これまでのsymfony(Previously on symfony)
質問の本文に装飾を付けられるように(リッチテキスト)します。日本語訳がありますので、楽に進めるかと思います。
■質問と回答にリッチテキストを使えるようにする(Allow rich text formatting on questions and answers)
▽Markdown(固有名詞なので和訳不可)
リッチテキストの仕組みを実装するために、Markdownというライブラリを使用します。
▽Markdownライブラリ(Markdown library)
tar.gz版は無いようです、もしサーバ上でzipが解凍出来ないなら他の環境で解凍しないといけません。解凍したらmarkdown.phpだけサーバに持ってきます。この1ファイルだけで動きます。残ったファイルは使用しません。
wget http://www.michelf.com/docs/projets/php-markdown-1.0.1f.zip
unzip php-markdown-1.0.1f.zip
mv PHP\ Markdown\ 1.0.1f/markdown.php lib/
rm -rf PHP\ Markdown\ 1.0.1f/
▽modelの拡張(Extend the model)
schema.ymlのQuestionに以下を追加します。bodyにはユーザが入力したそのままのデータが、html_bodyにはPHP Markdownで修飾されたHTMLデータが入ります。
html_body: longvarchar
▽setBodyメソッドのオーバーライド(Override the setBody method)
bodyをモデルに登録する際に、PHP Markdownで変換したhtmlデータをhtml_bodyに入れるようにメソッドオーバーライドします。
▽テストデータの更新(Update the test data)
テストデータを読み込む際に以下のエラーメッセージが出るかもしれません。PHP MarkdownはPHP4でも使えるライブラリのようなので、E_STRICTエラーが出てしまったようです。ソースを見るとクラスプロパティの宣言時にvarを使っているのが原因でしょう。エラーは出てもちゃんと動作はしていますのでこのまま進めます。
Strict Standards: var: Deprecated. Please use the public/private/protected modifiers in /home/ffws/sfprojects/askeet/lib/markdown.php on line ????
※2007/3/6追記
このエラーどうしても出したくない場合は、本家英語版チュートリアル10日目のコメントにある方法があります。markdown.php にある var をすべて public に置き換えればエラーが出なくなるとのことです。
▽テンプレートを修正する(Modify the templates)
question_bodyのdivタグ内を修正します。投稿者や投稿時間の書式はそのままに、本文の所だけ指定されたコードに置き換えます。具体的には、以下の部分を置き換えます、
<?php echo truncate_text($question->getBody(), 200) ?>
回答にも同じ作業をします。まず、schema.ymlのAnswerに以下の内容を追加します。
html_body: longvarchar
次に、lib/model/Answer.phpにてsetBodyメソッドをオーバーライドします。メソッドの内容はQuestionモデルとまったく同じ処理です。終わったら"symfony propel-build-all"でデータベースとモデルを再構築してください。
最後に、apps/frontend/modules/answer/templates/_list.phpにあるgetBodyをgetHtmlBodyに変更します。
<?php echo $answer->getHtmlBody() ?>
■すべてのidを隠す(Hide all ids)
プライマリキーはユーザから見ると意味の分からない数字であり、セキュリティ的にはシステムからデータを引き出す際の重要なキーになります。できることなら隠しておきましょう。質問についてはもうURLにプライマリキーを入れていませんので、ユーザ情報の対処をします。ニックネームをキーとしてデータを呼び出すように修正します。
▽アクションを変更する(Change the action)
今まではプライマリキーであるidでデータを取得していましたが、ニックネームを使って呼び出すように修正します。
▽モデルを変更する(Change the model)
先ほどのアクションで使用していたニックネームでユーザ情報を呼び出すメソッドを設定します。データベースに接続するメソッドなので、UserPeerにメソッドを追加します。
▽テンプレートを変更する(Change the template)
question/templates/_list.phpにユーザプロフィールへのリンクがありますので、早速修正します。なお、question/templates/showSuccess.phpも修正すると指示があります。いつの間にかquestion/showの質問者情報も表示するよう(Subversion版)になっているようです。ここは以下のように修正します。
<div class="question_body">
<div>
asked by <?php echo link_to($question->getUser(), 'user/show?nickname='.$question->getUser()->getNickname()) ?>
on <?php echo format_date($question->getCreatedAt(), 'f') ?>
</div>
<?php echo $question->getHtmlBody() ?>
</div>
answer/templates/_answer.phpは以下のように修正します。
posted by <?php echo link_to($answer->getUser(), 'user/show?nickname='.$answer->getUser()->getNickname()) ?>
▽ルーティングルールの追加(Add the routing rule)
ニックネームをURLパラメータに使えるようにします。
■ルーティング(Routing)
add_question recent_answers logout は今まで使っていませんでした。もし入っていなかった今のうちに設定しておきます。それぞれの設定は以下のように使用しています。AJAXで呼び出されるアクションは特に定義していないようです。
@question
→app/frontend/question/templates/_list.php
→app/frontend/question/templates/showSuccess.php
→app/frontend/user/templates/showSuccess.php
@popular_questions
→app/frontend/question/templates/_list.php
→app/frontend/sidebar/templates/_default.php
@recent_questions
→app/frontend/sidebar/templates/_default.php
@add_question
→app/frontend/sidebar/templates/_default.php
@recent_answers
→app/frontend/sidebar/templates/_default.php
@login
→app/frontend/templates/layout.php
@logout
→app/frontend/templates/layout.php
@user_profile:
→app/frontend/answer/templates/_list.php
→app/frontend/question/templates/showSuccess.php
@homepage
→app/frontend/templates/layout.php
ここでルーティングを修正している際、@popular_questionsのルーティング判定でエラーが出るようになってしました。以下のように修正したところエラーが出なくなりました。
popular_questions:
url: /index/:page
param: { module: question, action: list, page: 1 }
■また明日(See you Tomorrow)
10日目は新しい質問・新しい回答を投稿する機能を付けます。
この記事にコメントする
← askeet day ten:Alter data with Ajax forms の解説 HOME askeet day eight:AJAX interactions の課題 →
プロフィール
Wassr
カレンダー
01 | 2025/02 | 03 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
最新記事
アクセス解析