ソーシャルサイト『あの人のセリフ』をプレオープン!!!
このブログはWebサイト開発チームが運営していますが、このたび開発サイト第一弾として『あの人のセリフ』というソーシャルサイトをプレオープンしました。
以下、このサイト企画の考え方や特徴などについて書いてみます。
サイト企画の考え方
・Web2.0型のソーシャルサイトとする
・ユーザが無料で利用できる投稿型サイトとする。
・ユーザの参加の敷居を低くするため、投稿テーマは新たに考え出さなくても、すでに知っていることをテーマとする 等々
この基本的な考え方に沿って、投稿テーマを名言・名セリフとした。
旧来の歴史的な名言やマニアックな特定ジャンルの名セリフに限定せず、ユーザの広く自由な好みを尊重して、楽しい活気のあるソーシャルサイトとする。
この方針の象徴として、副題を「ナポレオンからガンダムまで」とした。
また、ジャンルを特定しない自由さが煩雑さに直結することを避けて、むしろ楽しさに転化するようにソーシャルタギング機能を用意することとした。
『あの人のセリフ』サイト概要
サイト名 :『あの人のセリフ』 ~ ナポレオンからガンダムまで
URL :http://anoseri.kotowa.net
だれでも無料で参加できるソーシャルサイトです。
歴史上の人物や映画・コミックなどの登場人物のお気に入りの名言・名セリフを自由に投稿できます。
ソーシャルタギング機能が用意されているので、投稿されたフレーズに関連する人物やカテゴリのタグをみんなで自由に付けられます。
もちろんコメントも書き込めます。
したがって、だれが言ったか知らない名セリフを投稿して、知ってる人に教えてもらったり、知ってるつもりの名言に思いがけないコメントやタグが付けられて、新たな発見をすることもあります。
また、マイページでは自分の投稿・書き込みの履歴がいつでも見られるので、心に残った名言・名セリフのメモ帳としても利用できます。
今後、より充実したソーシャルメディアを目指し、さまざまなマッシュアップサービスの追加やOpenIDへ対応する予定です。
なお、当サイトは最近話題のCakePHPで構築しています。
参考文献
http://www.popxpop.com/archives/2007/02/poppop_6.html
Popularity: 18 %
by harry 












『あの人のセリフ』で実装されているタグ機能を作成したいのですが、どうにもうまくいきません。。。
参考にしたのは、
http://d.hatena.ne.jp/nori0620/20071123/1195801255
http://d.hatena.ne.jp/theworldjp/20080306/1204812552
ブログチュートリアルで作成したブログにタグ機能を追加した場合のコードをご教授願えませんでしょうか?
よろしくお願いいたします。
コメントありがとうございます。
リンク先を確認させて頂きましたが、非常に詳細な説明がかかれているようで、それ以上のコードを示すのは難しいようです。
可能な範囲で、アドバイスをさせて頂きたいと思いますが
どこまで、うまくいっていて、
なにが、うまくいっていないのでしょうか?
(例えば、データ保存はHBTMでうまく保存できているが、表示ができないなど。)
できるだけ、詳細にお知らせ頂ければ、アドバイスできるかもしれませんので、よろしくお願いします。
改めて、再作成してみましたが、cheesecake-photoblogの移植法では、投稿の追加画面でタグの追加はできますが、編集でタグを新たに追加したり、編集もできません。
また、cheesecake-photoblogのタグ機能はアルファベットでないと正常に動作しないように思います。
長くなりますが、codeを載せます。
~app/controllers/posts_controller.php
set(’posts’, $this->Post->findAll());
}
function view($id = null)
{
$this->Post->id = $id;
$this->set(’post’, $this->Post->read());
}
function add()
{
if (!empty($this->data))
{
//追加部
if (!empty ($this->data['Post']['Tags'])){
$this->data['Tag']['Tag'] = $this->Post->Tag->parseTags($this->data['Post']['Tags']);
}
if ($this->Post->save($this->data))
{
$this->flash(’Your post has been saved.’,'/posts’);
}
}
}
function edit($id = null)
{
if (empty($this->data))
{
$this->Post->id = $id;
$this->data = $this->Post->read();
//追加部1
//DBから取得して配列に入っているタグをカンマ区切りの文字列に変換
if (count($this->data['Tag']))
{
$tags = ”;
foreach ($this->data['Tag'] as $tag)
{
$tags .= $tag['tag'] . “,”;
}
$this->data['Post']['Tags'] = substr($tags, 0, -1);
}
}
else
{
//追加部2
if (!empty ($this->data['Post']['Tags'])){
$this->data['Tag']['Tag'] = $this->Post->Tag->parseTags($this->data['Post']['Tags']);
}
if ($this->Post->save($this->data['Post']))
{
$this->flash(’投稿を更新しました。’,'/posts’);
}
}
}
function delete($id)
{
$this->Post->del($id);
$this->flash(’ id: ‘.$id.’ の投稿は削除されました。’, ‘/posts’);
}
}
?>
新規投稿のsqlです。
1 DESCRIBE `posts` 5 5 7
2 DESCRIBE `tags` 2 2 7
3 SELECT `Tag`.`id`, `Tag`.`tag` FROM `tags` AS `Tag` WHERE `Tag`.`tag` = ‘gat’ LIMIT 1 0 0 1
4 INSERT INTO `tags` (`tag`,`id`) VALUES (’gat’,”) 1 1
5 SELECT LAST_INSERT_ID() AS insertID 1 1 1
6 SELECT `Tag`.`id`, `Tag`.`tag` FROM `tags` AS `Tag` WHERE `Tag`.`tag` = ‘追加’ LIMIT 1 0 0 1
7 INSERT INTO `tags` (`tag`,`id`) VALUES (’追加’,”) 1 1
8 SELECT LAST_INSERT_ID() AS insertID 1 1 1
9 INSERT INTO `posts` (`title`,`body`,`created`,`modified`) VALUES (’タグの’,'追加’,'2008-05-27 05:13:39′,’2008-05-27 05:13:39′) 1 1
10 SELECT LAST_INSERT_ID() AS insertID 1 1 1
11 DELETE FROM `posts_tags` WHERE post_id = ‘7′ 0 1
12 INSERT INTO `posts_tags` (post_id,tag_id) VALUES (7,7) 1 1
13 INSERT INTO `posts_tags` (post_id,tag_id) VALUES (7,8)
編集した場合のsqlです。
1 DESCRIBE `posts` 5 5 4
2 DESCRIBE `tags` 2 2 6
3 SELECT `Tag`.`id`, `Tag`.`tag` FROM `tags` AS `Tag` WHERE `Tag`.`tag` = ‘編集’ LIMIT 1 1 1 3
4 SELECT `Tag`.`id`, `Tag`.`tag` FROM `tags` AS `Tag` WHERE `Tag`.`tag` = ‘追加’ LIMIT 1 1 1 1
5 SELECT COUNT(id) AS count FROM `posts` WHERE `id` = 7 1 1 1
6 SELECT COUNT(id) AS count FROM `posts` WHERE `id` = 7 1 1 1
7 UPDATE `posts` SET `id` = 7,`title` = ‘タグの’,`body` = ‘追加’,`modified` = ‘2008-05-27 05:18:57′ WHERE `id` IN (7)
お忙しいところ恐縮ですが、よろしくお願いします(^-^ヾ
こんにちは、コメントありがとうございます
問題が2つあるようなので、分けて回答します。
1.フォーム上で編集したタグが追加されない
2.タグ機能はアルファベットでないと正常に動作しない
実際に動かしたわけではないので、検証お願いします。
1.editメソッドの追加部2の
if ($this->Post->save($this->data[’Post’]))
を
if ($this->Post->save($this->data))
に直さないと、タグの部分の変更が反映されないと思います。
最初のままだと、Postモデルに含まれるtitle、bodyだけしか変更が反映されないので、Tagを含めて保存するようにする必要があります。
2.これは漢字などを入れると、文字化けするということでしょうか?
もしそうであれば、title、bodyはどうですか?
データベースの中を直接覗いた場合はどうでしょうか?
また、使われている文字コードは何ですか?
新しく開発するのであれば、データベース、cakephpのデータベースの設定、ソースコード、htmlの文字コードなどはUTF8で統一しておいたほうがいいですよ(rss配信はutf8になるので、もしくは適切な位置でmb_convert_encoding)。
cakephpのデータベースの設定は1.2と1.1ではやり方が違いますが、
こちらが参考になると思います
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=19&forum=6&post_id=1544#forumpost1544
これらの設定がうまくいっていれば、後はマルチバイトの問題を解決すればいいだけです。
substrはmb_substrの方が良さそうですが、今回の場合は文字列の最後についている”,”を削除するのに使っているだけ、大丈夫だと思います。
お返事ありがとうございます。
おかげさまで、タグの編集もできるようになりました。
使っている文字コードはdatabase.php内で ‘encoding’ => ‘utf8 を追記して使用しています。
文字化けというのは表現がまずかったです。今回のソースでは引数にタグのIdではなくタグ名をそのまま使用していますのでマルチバイト文字のタグには利用できず、Tagidを引数としてタグを表示させるには、どのあたりをいじればいいのでしょうか?
先のリンク先のうち最初の方では、「6.タグクラウドの作成」の手前の時点で動作確認を行ったところ、下記のようなエラーが表示されている状態です。
Fatal error: Call to undefined function findallbytags() inC:\xampp\htdocs\blog\app\controllers\posts_controller.php on line 88
~app/controller/posts_controller.php
set('posts', $this->Post->findAll());}
function view($id = null)
{
$this->Post->id = $id;
$this->set('post', $this->Post->read());
}
function add()
{
if (!empty($this->data))
{
//追加部
if (!empty ($this->data['Post']['Tags'])){
$this->data['Tag']['Tag'] = $this->Post->Tag->parseTags($this->data['Post']['Tags']);
}
if ($this->Post->save($this->data))
{
$this->flash(’Your post has been saved.’,'/posts’);
}
}
}
function edit($id = null)
{
if (empty($this->data))
{
$this->Post->id = $id;
$this->data = $this->Post->read();
//追加部1
//DBから取得して配列に入っているタグをカンマ区切りの文字列に変換
if (count($this->data['Tag']))
{
$tags = ”;
foreach ($this->data['Tag'] as $tag)
{
$tags .= $tag['tag'] . “,”;
}
$this->data['Post']['Tags'] = substr($tags, 0, -1);
}
}
else
{
//追加部2
if (!empty ($this->data['Post']['Tags'])){
$this->data['Tag']['Tag'] = $this->Post->Tag->parseTags($this->data['Post']['Tags']);
}
if ($this->Post->save($this->data))
{
$this->flash(’投稿を更新しました。’,'/posts’);
}
}
}
function delete($id)
{
$this->Post->del($id);
$this->flash(’ id: ‘.$id.’ の投稿は削除されました。’, ‘/posts’);
}
function tag($tag = null)
{
$tags = array ();
uses(’sanitize’);
$this->Sanitize = new Sanitize;
if (isset ($this->params['pass']))
{
foreach ($this->params['pass'] as $tag)
{
$tag = $this->Sanitize->paranoid($tag, array (’ ‘));
$tags[] = $tag;
}
}
$paging['url'] = ‘/posts/tag/’ . implode(’/', $tags);
$paging['total'] = $this->Post->findCountByTags($tags);
if ($paging['total'] > 0)
{
$posts = $this->Post>findAllByTags($tags);
$this->set(compact(’posts’));
$this->render(null, null, ‘blog/posts/index.thtml’);
}
else
{
//タグが存在しなかった場合のエラー処理をここに書いてください
exit;
}
}
}
?>
何度も申し訳ありません。
こんにちは、コメントありがとうございます。
エラーの内容についてですが、
>>Fatal error: Call to undefined function findallbytags() in
読んで字のごとく、findallbytagsが定義されていないためです。
おそらく、
$posts = $this->Post>findAllByTags($tags);
のことだと思いますので、PostモデルにfindAllByTagsを作成してください
(もしかしたら、Post>findAllByTagsではなく、Post->findAllByTagsでないと文法エラーなのでこれのせい?・・・)。
>>Tagidを引数としてタグを表示させる
こんなアイディアは如何でしょうか?
PostモデルのfindAllByTagsを生かすとしたら、Postコントローラのtagに渡す引数を+(プラス)で渡すことにします
(tagが1と20と21が選ばれている場合のurlは、posts/tag/1+20+21)
function tag($tag = null){
$tags=explode(”+”,$tag);
$paging['total'] = $this->Post->findCountByTags($tags);
以下は同じ・・・
サニタイズの処理は話を単純にするため省いています
動作検証はしてません(cheesecake-photoblogのソースも読んでません。ごめんなさい)。
御返事ありがとうございます。
あ、、、->でした。お恥ずかしい(>_