解答

以前ブログでOpenPNE2.0系のイイネ!機能について書きました.
そこへのコメントでソースコードを公開してほしいという声があったのと,
自分のメモとしても残すべき,と思ったので書きます.

興味のない方は引き返したほうがいいかも笑

ではいきましょう.まずは振り返り.
そのブログというのがこちら.要望

今回使用したのはオープンソースのソフトウェアであるOpenPNEの2.0系.
僕が構築し,今も現役で使われているISC-SNSはこの2.0系になります.

そして,以下が実装したイイネ!機能.(名称はいいでしょう!機能)

挙動としては,いいでしょう!ボタンをクリックすると,
日記がリロードされ,ボタンが消えると同時に,押した人の名前が下部に並びます.

***
#0 - Prepare
 * 設置済みのOpnePNEのファイル構造は以下の通りとします(参照:ロリポップ).
  - URLを http://hoge.lolipop.jp
  - OpenPNEのアドレスを http://hoge.lolipop.jp/sns
  - OpenPNEの本体を http://hoge.lolipop.jp/openpne

#1 - Database
 * OpenPNEのDBと同じところに次のようなテーブル(sns_liked)を用意します.
 

#2 - Source code
 * 編集するソースコードは以下の通り(下二つは新規作成).
  - /openpne/webapp/modules/pc/templates/fh_diary.tpl
  - /openpne/webapp/modules/pc/page/fh_diary.php
  - /openpne/webapp/lib/db/member.php
  - /sns/modules/pc/add_liked/set.php
  - /sns/modules/pc/add_liked/inc/function.php

#3 - fh_diary.tpl - 138行目くらいに追記
  - フレンドの日記のテンプレートファイルに追記する.
  - $kasanariの値が0であれば,イイネ!ボタンを表示する.
  - formで送る先はset.php
  - valueはmember_id,nickname,diary_id,pager.end

[php]<!-- イイネ!機能(2011.09.17--Kiyoshi)-->
<div class="dparts diaryDetailBox">
<div class="parts">
<div class="partsHeading"><h3>イイネ!</h3>
<p class="public">
({if $kasanari == 0})
<form method="GET" action="../sns/modules/pc/add_liked/set.php">
<input type="hidden" name="member_id" value="({$c_member.c_member_id})" />
<input type="hidden" name="member_name" value="({$c_member.nickname})" />
<input type="hidden" name="diary_id" value="({$target_diary.c_diary_id})" />
<input type="hidden" name="comment" value="({$pager.end})" />
<input type="submit" value="イイネ!">
</form>
({/if})
</p>
</div>
<div class="body" style="padding:5px">
({foreach from=$liked key=k item=f})
({$f})
({/foreach})
</div>
</div>
</div>[/php]

#4 - fh_diary.php - 27行目くらいに追記
  - フレンドの日記のPHPファイルに追記する.
  - イイネ!をDBから取得し,foreach文でユーザのものか判定する.
  - ユーザのものがある場合は$msg=1とし,switch文で$kasanari=1とする.
   (わざわざ二回に分けなくても$msgの値を$kasanariとして使えばきれいかも)

[php] //2011.09.17--Kiyoshi
//Liked情報取得
$liked = db_liked($target_c_diary_id);
$this->set('liked', $liked);
$msg = 0;
foreach($liked as $tmp){
if($tmp == $c_member['nickname']){
$msg = 1;
break;
}
}
switch($msg){
case 0:
$kasanari=0;
break;
case 1:
$kasanari=1;
break;
}
$this->set('kasanari', $kasanari);[/php]

]

#5 - member.php
  - fh_diary.phpから呼び出される関数
  - DBから当該diaryにイイネ!を付けたmember_nameを取得するSQL

[php]//2011.09.17--Kiyoshi
function db_liked($diary_id){
$result = mysql_query("SELECT `member_name` FROM `sns_liked` where `diary_id` = $diary_id");
$table_array = array();
while($row = mysql_fetch_assoc($result)){
$table_array[] = $row["member_name"];
}
return $table_array;
}[/php]

#6 - set.php
  - DBに接続し,fh_diary.tplから受け取ったイイネ!を格納する.
  - 格納後は元のURLをリロードする.

[php]<?php
/*=================================================*/
error_reporting(E_ALL);
ini_set('display_errors', '1');
require_once('inc/functions.php');
define('OPENPNE_URL', 'http://hoge.lolipop.jp/sns');
define('DB_HOST', '****');
define('DB_USER', '****');
define('DB_PASS', '****');
define('DB_NAME', '****');
define('TBL_PRE', '');
/*=================================================*/
//main
$dbh = mysql_connect(
DB_HOST,
DB_USER,
DB_PASS
);
mysql_set_charset("utf8");
mysql_select_db(
DB_NAME,
$dbh
);
$member_id = $_GET["member_id"];
$member_name = $_GET["member_name"];
$diary_id = $_GET["diary_id"];
$comment = $_GET["comment"];
setLiked($member_id, $member_name, $diary_id);
mysql_close($dbh);
header("Location:../../../?m=pc&a=page_fh_diary&target_c_diary_id=$diary_id&comment_count=$comment");
?>[/php]

#7 - function.php
  - set.phpが呼び出す関数で,DBへのINSERTを行う.

[php]<?php
/*
* set liked
* 2011.09.17--Kiyoshi
*/
function setLiked($member_id, $member_name, $diary_id){
global $dbh;
$sql = "INSERT INTO `sns_liked` (`id`, `diary_id`, `member_id`, `member_name`) VALUES (NULL, '$diary_id', '$member_id', '$member_name')";
$result = mysql_query($sql);
}
?>[/php]

#8 - Complete
  * 以上がOpenPNE2.0系へのイイネ!機能の追加になります.
  * 本ソースコードを使用したことによる不利益・不具合等には一切責任を持ちません.

***

一応元々の開発背景として,委員内でのみ使うという前提なので,
エスケープ処理とかここでは全くしてないけど,必要があれば施してください.
(というかOpenPNE自体が他でやってくれてる部分もたぶんある)

その他,何かあればコメント等を頂ければ,と思います.
ではここらで失礼します,どろん.