dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

kohanaのテスト12-16・・・写真の削除機能を追加する

 kohana の WordPress 化計画も先が見えてきたような感じがします。今日は写真の削除機能を追加します。成果物のコードは随時 github のリポジトリを更新していますので、そちらを参照して下さい。

 

写真の削除機能を追加する

 このあたりのロジックはもう出来て当たり前なので、あまり説明することがありませんね。ユーザーは HTML を書き換えて他人の写真を削除するようにリクエストすることも可能なので、セキュリティー面をしっかり作るあたりがツボでしょうか。

 もうひとつ、表示しているページの写真を全部一括削除するとページ数が減るので、これに対処するロジックでしょうか。

 

モデル

・kohana/application/classes/model/test12/posts.php に追加

    public function deleteimage($id) {
        $delete = DB::delete('wp332_post_images')
                ->where('id', '=', $id);
        return $delete->execute();
    }

  写真の ID を指定して削除するだけですから簡単です。

 

ビュー

kohana/application/views/test12/upload/media.php

 ビューは長くなるので github の方を見て下さい。一括削除の場合は4行目の

 <input type="hidden" name="_wp_http_referer" value="/kohana/test12/upload" />

の部分で javascript にリクエスト先の URL を渡しています。 単にリクエストしているだけなのに、何で javascript に頼っているのか、理解できません。

 単独削除の場合は111行目で onclick='return showNotice.warn();' と書いて javascript に制御を渡しています。この場合は本当ですか? みたいなダイアログが現れます。

 

コントローラー

 削除のリクエストに対応するロジックを追加しています。

・kohana/application/classes/controller/test12/upload.php に追加

        $action = isset($_GET['action']) ? $_GET['action'] : FALSE;
        if ($action) {
            if ($action == 'delete') {
                $model = model::factory('test12_posts');
                foreach ($_GET['media'] as $id) {
                    if ($model->getimage($id, 'post_author') == $user_ID) {
                        $model->deleteimage($id);
                    } else {
                        die('Invalid!');
                    }
                }
            }
        }

  削除する前にその写真がログインユーザーの持ち物であるかチェックして、異常を検出したらプロセスを強制終了します。FirefoxFirebug なんかを使えば HTML は簡単に書き換えられるので、如何様なリクエストでも送れるわけですから、ユーザーの要求に対しては厳重なチェックが必要です。

 

動作試験

 気持よく動いています。Firebug を使って他人の写真を削除するようにリクエストするとちゃんと不正です!って反応してくれます。当たり前か・・・(^^;;;