こんにちは,五十嵐です.ブックマークを登録しているユーザとコメントの一覧を作成します.
ユーザの一覧は "/listbookmarkusers" で呼び出します.ブックマークの ID を
bookmarkid とすると,"/listbookmarkusers/
bookmarkid" という具合に呼び出します.
指定されたブックマークをテーブルから検索し,URL とタイトルを取得します.
if( my $bdb = $c->model('SecureSBMDB::Bookmark')->find(
{
bookmark_id => $bookmarkid
}
)
){
my $bookmark = {
url => $bdb->bookmark_uri,
title => $bdb->bookmark_title
};
...
ブックマークしているユーザを検索し,プロフィールの設定から,ニックネームを公開しているかどうかを確認します.ニックネームが公開されていればニックネームを,そうでなければユーザ ID の番号を変数 $nickname に格納します.コメントも一旦変数 $comment に格納しておきます.
my %user;
my @users;
my $usersnum = 0;
foreach my $ubdb ($bdb->user_bookmarks->search(
{
-or => \@ORquery,
-and => \@ANDquery,
},
{
join => [qw/
user_bookmark_roles
/],
order_by => 'user_bookmark_ts DESC',
}
)
){
my $userid = $ubdb->user_id;
my $profile = $ubdb->user->user_profiles->find({user_id => $userid});
my $nickname;
if( $profile->user_profile_nickname_publish == 1 ){
$nickname = '<ul class="noId"><li>'
. $profile->user_profile_nickname
. '</li></ul>';
}else{
$nickname = '<ul class="onlyId"><li>'
. $profile->user_id
. '</li></ul>';
}
my $comment = $ubdb->user_bookmark_comment;
...
}
発行したい SQL はわかっているのに search() でどのように書くのか,というところでちょっと苦労しました.ロールとの関連性を記述している user_bookmark_roles の指定の仕方.ここが今回のポイントです.
話が前後しますが,ブックマークが public (role_id が 2 番)か,public ではない場合,閲覧しようとしているユーザのロールとを設定し,上の @ORquery に設定しておきます.
my @ORquery = ({'user_bookmark_roles.role_id' => 2});
if( $c->user_exists ){
my $udb = $c->stash->{user};
foreach my $ur ($udb->user_roles->all){
push( @ORquery, {'user_bookmark_roles.role_id' => $ur->role_id} );
}
}
最後に,一覧するものがあれば stash に格納してテンプレート (View) に渡します.
if( defined $bookmark && $#users > 0 ){
$c->stash->{bookmark} = $bookmark;
$c->stash->{publishusers} = \@users;
$c->stash->{usersnum} = $#users;
}
あとは,テンプレート側で体裁を整えれば終了です.
2007/06/22 記
参考:
Keyword: Perl Catalyst Secure-SBM SSBM セキュア・ソーシャル・ブックマーク