忍者ブログ

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日目は新しい質問・新しい回答を投稿する機能を付けます。

PR

この記事にコメントする

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字

この記事へのトラックバック

この記事にトラックバックする:

askeet day ten:Alter data with Ajax forms の解説 HOME askeet day eight:AJAX interactions の課題

プロフィール

HN:
flyfront
性別:
非公開
自己紹介:
PHPプログラマ。東京でsymfonyな仕事してます。

Wassr

カレンダー

03 2024/04 05
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 29 30

最新コメント

[01/02 通りすがり]
[10/18 flyfront]

バーコード

アクセス解析

忍者ブログ [PR]
Template by repe