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)");
English German French