cakePHPを使った掲示板作成メモの続き   no comments

Posted at 6:26 pm in computer,サイト

前回に引き続きcakePHPを使った掲示板作成をしています。
今回はよりそれっぽい感じに仕上げます。
書いてるといろいろ疑問点が出てきて、知識の棚卸しになったりしていい感じですが意外と時間がかかってしまったのが痛いです。

さて、前回データの追加ができるようになった掲示板ですが、
掲示板の書き込みを修正したり削除したりするようにするところから始めていこうと思います。

○削除と修正

データの削除と修正ですが、さすがにトップページで直接いじれるようにするのはまずいということで、別にページを作成することにしました。このへんは仕様の問題ですのでいくらでも変更可能だと思います。

とりあえずここでは

admin.thtml

ということにしておきました。

http://localhost/cakephp/memo/admin

からアクセスできるようになります。

前回作ったコントローラ
C:\wamp\www\cakephp\app\controllers\memos_controller.phpに


function admin() {
$this->set("memos", $this->Memo->findAll(null, null, "Memo.id DESC"));
}

を追加します。
そして、

C:\wamp\www\cakephp\app\views\memos
にadmin.thtml

を作成し、
中身は


<?php
foreach ($memos as $memo) {
echo "<a href=\"".
$memo["Memo"]["url"].
"\">".$memo["Memo"]["title"]."</a><br>".
$memo["Memo"]["memo"].
$memo["Memo"]["created"].
$html->link("削除","/memos/del/".$memo["Memo"]["id"], null, "削除するよ?").
$html->link("編集","/memos/edit/".$memo["Memo"]["id"], null, "").
"<br><br>";
}

みたいなかんじにします。
index.thtmlに削除と編集のリンクを付けただけです。

そして、データの削除と修正についてもまたまた先ほど作ったコントローラ
C:\wamp\www\cakephp\app\controllers\memos_controller.phpに

del()とedit()を追加します。

データの削除ですが、1件削除は該当のIDをdelすればいいみたいですので、


function del($id) {
$this->Memo->del($id);
$this->redirect("/memos/admin");
}

みたいなかんじです。

そして、編集は


function edit($id) {
$memo = $this->Memo->findById($id);
if (!$memo) {
$this->redirect("/memos");
return;
}
if (!empty($this->data)) {
$memo["Memo"]["title"] = $this->data["Memo"]["title"];//名前
$memo["Memo"]["url"] = $this->data["Memo"]["url"];
$memo["Memo"]["memo"] = $this->data["Memo"]["memo"];
$this->Memo->save($memo);
$this->redirect("/memos/admin");
}
$this->set("memo", $memo);
}

みたいなかんじ基本的にaddとはデータがあるかどうかの違いです。
変更したデータを保存してadminに戻ります。

一般ユーザーと管理用のページを分離するにはAdminルーティングという手法があるようですが、ここでは知りませんw

これでひととおり掲示板としての機能は整ったと思います。

○ページングの設定

最後に表示をちょっと変更しようと思います。ページングです。
現在は$this->Memo->findAllということでデータを最初から最後まで表示することになっていますので、データが増えたときに非常に面倒です。
これを普通の掲示板のように最新の10件のみ表示して、残りはリンクをたどって見るようにします。

これにはPaginatorHelperというものを使えばいいようです。
まず、コントローラに


var $paginate = array("order" => "Memo.id DESC","limit" => 10, "page" => 1);

という変数を追加します。

そして、
index()を


function index() {
$this->set("memos", $this->paginate());
}

のように変更します。
同様にadmin()も


function admin() {
$this->set("memos", $this->paginate());
}

次にindex.thtmlとadmin.thmlに各ページへのリンクを追加します。


echo $paginator->counter(array("format" => "全 %pages% ページ中の %page% ページを表示しています。<br>")).$paginator->prev()." ".$paginator->numbers()." ".$paginator->next();

のようなコードを追加すればいいでしょう。
コードの量はこんなに少ないというのに、これでページごとの表示ができるようになりました。
フレームワークって便利ですね。すごいです。

レイアウト設定を変更したところ

ここからはまあちょっとした改造です。やってみたい人はどうぞ。

○表示の変更

今のところCakePHPのデフォルトなので、ちょっとCakePHPのロゴとかSQLのクエリとか出てあまりかっこよくないので、これを何とかしようと思います。

変更するには
C:\wamp\www\cakephp\app\views\layouts\に

memolayout.ctp

のような自分好みの*.ctpファイルを作ってやればいいです。

そして、コントローラに


public $layout = "memolayout";

と対応する名称で追加しておきます。

また、CSSをいじるには

ctpファイルの


echo $html->css('cake.generic');

を変更し、

C:\wamp\www\cakephp\app\webroot\css\
に対応するcssファイルを置くか

C:\wamp\www\cakephp\app\webroot\css\cake.generic.css

を直接書き換えるかしてください。

あと、それでも下にSQLの実行結果が表示されると思いますので、それがイヤなら

C:\wamp\www\cakephp\app\config\core.php
を開き、


Configure::write('debug', 2);


Configure::write('debug', 1);

にします。

○bookmarkletに対応させる

ブックマークをクリックするだけでそのページについてコメントできるようにします。

add.thtmlを変更します。
普段phpで$_GETに入っているデータは


$this->params["url"][パラメータ]

に入ってますのでこれを使います。
場合分けしてるのはCakePHPの場合何も入ってないとエラーを返してきてみっともないからです。


if(!empty($this->params["url"]["title"])&&!empty($this->params["url"]["addr"])){
echo $form->create("Memo", array("action" => "add" )).
"タイトル:".
$form->text("Memo.title",
array("value" =>$this->params["url"]["title"],"size"=>"15",
"error" => array("required" => "必ず入力"))).
"URL:".
$form->text("Memo.url",
array("value" =>$this->params["url"]["addr"],"size"=>"15",
"error" => array("required" => "必ず入力"))).
"<br>メモ:<br>".
$form->textarea("Memo.memo",
array("cols" => "60", "rows" => "3")).
"<br>".
$form->button("保存",array("type"=>"submit"));
}else{
echo $form->create("Memo", array("action" => "add" )).
"タイトル:".
$form->text("Memo.title",
array("size"=>"15",
"error" => array("required" => "必ず入力してください。"))).
"URL:".
$form->text("Memo.url",
array("size"=>"15",
"error" => array("required" => "必ず入力してください。"))).
"<br>メモ:<br>".
$form->textarea("Memo.memo",
array("cols" => "60", "rows" => "3")).
"<br>".
$form->button("保存",array("type"=>"submit"));
}

ちなみにブックマークレットはこんなかんじ。


javascript:if(navigator.userAgent.indexOf('Safari')%20>=%200){Q=getSelection();}else{Q=document.selection?document.selection.createRange().text:document.getSelection();}location.href='http://localhost/cakephp/memos/add?addr='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title);
ブックマークレットで簡単更新

ブックマークレットで簡単更新

グダグダですが今日のところはこんなかんじで。

Written by bogus on 10月 3rd, 2008

Tagged with