第6回 読み書き削除の実装例 - OOP講座
がる先生のOOP講座
Lecutures on PHP
第6回 読み書き削除の実装例 (その1)
読み書き削除の実装例
先日の話に従ってソースコードの整理をしていると、やってきました。 定番の出だし「上司からの命令下りmail」です。
<<メール>>
mailでの削除がいい加減しんどいから削除機能が欲しい。
そうなんです。
今まで、掲示板の投稿文の削除は
- mailを貰って
- こちら側で手で削除
という、いわゆる「SE対応」でやっていたのですが、確かに量が増えるとある程度面倒ではあります。
せっかくですし、ソースコードの整理と合わせて、削除機能も付け足してみましょう。
まずreadとwriteを、前回のMVCに従って実装し直してみます。
より正確には、readとwriteを「実処理してくれる君」用に書き直します。
では早速、まずはwriteから。
一つ目はwrite_print。
このプログラムは「テンプレートを表示する」程度の軽微な処理を行っています。
list 1
write_print.class.php より
1
public function 実行() {
2 $this->set_template_filename(入力用テンプレートファイル名);
3 return ;
4 }
二つ目はwrite_fin。
このプログラムは
- 入力を受け取って
- validationに失敗したら入力画面に戻って
- validationが成功したら書き込んで、その後、readクラスに出力を依頼する
という流れになります。
list 2
write_fin.class.php より
1
public function 実行() {
2 // 掲示板名を取得
3 $sysconfig_obj = $this->get_sysconfig();
4 $bbs_name = $sysconfig_obj->find('bbs_title');
5
6 // bbs_dataクラスを使う準備
7 $bbs_obj = new bbs_data();
8
9 // 新しく追加したメソッドです。保存先のファイル名などをここから取得できるようにしておきます
10 $bbs_obj->set_sysconfig($sysconfig_obj);
11
12 // 「掲示板の1メッセージの情報」をクラスの中に入れる
13 $bbs_obj->set_from_cgiform();
14
15 // データのチェック(validate)
16 if (false === $bbs_obj->is_validate()) {
17 // エラー表示処理をして「振り分け君」に戻す
18 // XXX ここの詳細は第五回のlist 4などを参照してください
19 $this->set_次に呼びたいメインクラスのクラス名('write_print');
20 return ;
21 }
22
23 // 「1メッセージの情報」をファイルに書き込む
24 $bbs_obj->write();
25
26 // readにリダイレクト
27 $this->set_次に呼びたいメインクラスのクラス名('read');
28 }
最後にread。
このプログラムは「掲示板の内容を表示する」プログラムになります。
list 3
read.class.php より
1
public function 実行() {
2 <?php
3
4 // 掲示板名を取得
5 $sysconfig_obj = $this->get_sysconfig();
6 $bbs_name = $sysconfig_obj->find('bbs_title');
7
8 // ページ数を取得
9 $now_page_num = $cgi_request->get_param('page');
10
11 // ループして、出力データを作成
12 $ppn = 10; // 1Pageに出力するメッセージ件数
13 $data = array(); // データ格納用配列
14 for($i = 0; $i < $ppn; $i ++) {
15 // 指定された番号の掲示板情報を取ってくる
16 // XXX 削除した掲示板メッセージを想定していないので、そのあたりは各自工夫してみてください
17
18 // bbs_dataクラスを使う準備
19 $bbs_obj = new bbs_data(); // インスタンスを作る
20 $bbs_obj->set_filename_from_config($sysconfig_obj);
21
22 // 指定した番号の掲示板メッセージをハッシュ配列化して取得
23 $wk = $bbs_obj->get_data_to_hash_by_no( $now_page_num * $ppn + $i );
24
25 // データを保存領域に格納する
26 $data[] = $wk;
27 }
28 // Smartyを作ってassign
29 $this->get_smarty()->assign('bbe_messages', $data);
30
31 // 出力依頼
32 $this->set_template_filename(入力用テンプレートファイル名);
33 return ;
34 }
さて、ほぼ一気にここまで書いてきました。
この勢いに任せて、削除についても書く……前に仕様を決めておきましょう。
「ボタン一つで削除」は便利なのですが、どちらかというと「クラッカーフレンドリー」な仕様になってしまいます。
とりあえず、さほどクリティカルでもセンシティブでもない掲示板ですので「書き込み時のパスワードと同じパスワードが入力されつつ、ボタンがおされたら削除」としておきましょう。
「書き込み情報にパスワードを追加する」ための方法は、第二回を思い出してみてください。
bbs_data classのget_target_arrayメソッドのreturn内容に「pass」を追加するだけですね。
- 1
- 2





ページのトップへ


kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。