BlogSection
出典: GeeklogJpWiki
[3]運用方法 > 3.クイックハウトゥー > 話題(記事カテゴリ)毎に管理権限を分離させて複数ブロガー参加
以下,Geeklogで複数ブロガー参加型サイトを運営する方法をご紹介します。マルチユーザーCMSとしてはWordPress MUがあります。Geeklogでもある程度可能ですが,専用CMSを組み込むこともご検討ください。WordPress MUを使えば,ブロガー承認からブロガーごとのテーマ変更まで行うことが可能です。
目次 |
話題(記事カテゴリ)毎に管理権限を分離させて複数ブロガー参加
方法1:自身の投稿記事のみ編集できるが話題は編集できない
話題の中に複数の投稿者がいる設定です。
Geeklogの基本機能で設定できます。
- ユーザの管理権限は,Story Adminのみ。Topicを追加しないでください。(Topicを追加すると話題まで編集できてしまいます。)
- 話題の管理権限を細工して,所有者を「ゲストユーザ」,グループ「 All Users」にしてください。
- 話題のパーミッションは,3 3 2 2
- 記事は,3 2 2 2
話題の所有者をゲストユーザにするのは,話題譲渡プラグインで行えます。 これで,ユーザは,記事を作成できて,自分が所有している記事だけ編集・削除が可能です。話題は管理権限がないので一切編集できません。
なお,投稿時に話題を特定したい場合には,admin/story.phpをコピーして,たとえばadmin/story_user.php として,admin/story_user.phpから呼ばれるテンプレートファイル(storyeditor_advanced.thtml)を変更してたとえば「storyeditor_advanced_user.thtml」とし,そのテンプレートでは,特定の話題しか選べないように修正しておきます。
ユーザへは,ログイン時にadmin/story_user.phpを表示させます。
方法2:自身の投稿記事と,自身が投稿する話題を管理
話題ごと管理する設定です。
話題(記事カテゴリ)毎に、投稿できるユーザIDを制限するハックを追加することで制限します。そのユーザは、投稿できる話題にしか、投稿できず、自身が投稿した記事は編集することができます。
ハック1で、記事投稿画面で権限のある話題しか選択できないよう、投稿先の制限を行う必要があります。さらに、ハック2で、記事編集管理画面で,編集できる話題だけをリストさせます。
話題譲渡(nmoxtopicown)プラグインをインストールすれば,話題の所有者としてゲストユーザを設定することができます。これで,だれでもログインしたらゲストユーザが所有者の話題に投稿でき,しかも,自身の記事は編集できます。
記事投稿の際,パーミッションは、話題、記事それぞれ (3,2,2,2)にします。これで記事・話題の管理者であっても所有者しか編集できません。パーミッションのデフォルトは,コンフィギュレーションエディタプラグインで設定できます。
ハック1.投稿先話題を権限のある話題のみに制限する
admin/story.phpの中で COM_topicList ('tid,topic', $A['tid'])); で記事リストを選択してきています。 CUSTOM_topicList()を新たに作成し、ユーザの管理権がある話題だけを表示します。
CUSTOM_topicList()内に、COM_getPermSQL()があり、COM_getPermSQL('WHERE',0,3)に変更します。これで、編集権限がある話題だけがリストアップされます。
admin/story.php
修正前:
COM_topicList ('tid,topic', $A['tid']));
修正後:
CUSTOM_topicList ('tid,topic', $A['tid']));
system/lib-custom.php
// 話題選択カスタム関数を組み込む require_once( 'custom/custom_topiclist.php' );
system/custom/custom_topiclist.php
<?php
/**
* Create and return a list of available topics
*
* This is a variation of COM_optionList() from lib-common.php. It will add
* only those topics to the option list which are accessible by the current
* user.
*
* @param string $selection Comma delimited string of fields to pull The first field is the value of the option and the second is the label to be displayed. This is used in a SQL statement and can include DISTINCT to start.
* @param string $selected Value (from $selection) to set to SELECTED or default
* @param int $sortcol Which field to sort option list by 0 (value) or 1 (label)
* @see function COM_optionList
* @return string Formated HTML of option values
*
*/
function CUSTOM_topicList( $selection, $selected='', $sortcol=1 )
{
global $_TABLES;
$retval = '';
$tmp = str_replace( 'DISTINCT ', '', $selection );
$select_set = explode( ',', $tmp );
$result = DB_query( "SELECT * FROM {$_TABLES['topics']}" . COM_getPermSQL('WHERE',0,3)
. " ORDER BY $select_set[$sortcol]" );
$nrows = DB_numRows( $result );
for( $i = 0; $i < $nrows; $i++ )
{
$A = DB_fetchArray( $result, true );
$retval .= '<option value="' . $A[0] . '"';
if( $A[0] == $selected )
{
$retval .= ' selected';
}
$retval .= '>' . stripslashes( $A[1] ) . '</option>' . LB;
}
return $retval;
}
?>
この場合、ログインしなければ、投稿できる話題を選べないことになります。そのためconfig.phpで、記事投稿をloginrequired ONにしておいてください。
※投稿先の制限を行う方法は、その他,メール記事投稿機能を利用する方法があります。初期設定ファイルに送信元アドレスと、投稿先話題名を設定しておけば、他の話題へ間違って投稿することはありません。
ハック2.サイト管理者が、記事編集一覧ページで所有記事のみリストして編集する
admin/story.php 127行目付近
$topicsql = "SELECT tid,topic FROM {$_TABLES['topics']}" . COM_getPermSQL ();
↓
$topicsql = "SELECT tid,topic FROM {$_TABLES['topics']}" . COM=getPermSQL('WHERE',0,3);
ハック3.会員登録時に自動的に「Story Admin」を付加する
権限を自動的に付加するのは,運営上注意が必要ですが,ユーザー登録を承認制にする場合には,十分実用的なハックになりそうです。
/system/lib-users.php:
修正前:
$normal_grp = DB_getItem ($_TABLES['groups'], 'grp_id', "grp_name='Logged-in Users'");
$all_grp = DB_getItem ($_TABLES['groups'], 'grp_id', "grp_name='All Users'");
DB_query ("INSERT INTO {$_TABLES['group_assignments']} (ug_main_grp_id,ug_uid) VALUES ($normal_grp, $uid)");
DB_query ("INSERT INTO {$_TABLES['group_assignments']} (ug_main_grp_id,ug_uid) VALUES ($all_grp, $uid)");
修正後:
$normal_grp = DB_getItem ($_TABLES['groups'], 'grp_id', "grp_name='Logged-in Users'");
$all_grp = DB_getItem ($_TABLES['groups'], 'grp_id', "grp_name='All Users'");
$story_grp = DB_getItem ($_TABLES['groups'], 'grp_id', "grp_name='Story Admin'");
DB_query ("INSERT INTO {$_TABLES['group_assignments']} (ug_main_grp_id,ug_uid) VALUES ($normal_grp, $uid)");
DB_query ("INSERT INTO {$_TABLES['group_assignments']} (ug_main_grp_id,ug_uid) VALUES ($all_grp, $uid)");
DB_query ("INSERT INTO {$_TABLES['group_assignments']} (ug_main_grp_id,ug_uid) VALUES ($story_grp, $uid)");




