05/07
Thu
2009
XSNSモジュールで、コミュニティ数を固定とし各サイトユーザーが全てのコミュニティに参加するという使い方をしたい。
前のエントリーでコミュニティの新規作成を管理者だけが行えるようにし、ユーザーが自由にコミュニティを作れなくする方法を紹介した。次はサイトへの登録時に全てのコミュニティに自動的に参加するように手を加える。
[環境]
XOOPS Cube Legacy 2.1.6
XSNS 1.11
① コミュニティへの自動参加用関数の作成
ユーザーIDを引数にし、未参加のコミュニティを検出し一括参加登録する関数を作成し、
XOOPS_TRUST_PATH/modules/xsns/act/tmp/add_toAllCommunity.php として保存する。
XOOPS_TRUST_PATH/modules/xsns/act/tmp/add_toAllCommunity.php
<?php
//全てのコミュニティに参加する
require_once XOOPS_ROOT_PATH."/class/database/database.php";
function addToAllCommunity($uid=0){
if($uid+0==0) return false;
$db=&Database::getInstance();
$table="setagaya100_xsns_c_commu";
$table2="setagaya100_xsns_c_commu_member";
//全コミュニティidリスト
$prs=$db->query("SELECT c_commu_id FROM $table");
if(!$prs) die( "xsns custom error: auto add to community : ".__LINE__ ) ;
$num=$db->getRowsNum( $prs );
if( $num <= 0 ) die( "xsns custom error: auto add to community : ".__LINE__ ) ;
$c_commu_ids=array();
for($i=0;$i<$num;$i++){
$row=mysql_fetch_row($prs);
$c_commu_ids[]=$row[0];
}
//参加済みコミュニティidリスト
$prs=$db->query("SELECT c_commu_id FROM $table2 WHERE uid=$uid");
if(!$prs) die( "xsns custom error: auto add to community : ".__LINE__ ) ;
$num=$db->getRowsNum( $prs );
$participate_commus=array();
for($i=0;$i<$num;$i++){
$row=mysql_fetch_row($prs);
$participate_commus[]=$row[0];
}
//未参加コミュニティidリスト
$un_participate_commus=array_diff($c_commu_ids,$participate_commus);
if( !count($un_participate_commus)) return true;
//参加処理
$count=0;
foreach( $un_participate_commus as $value){
$prs=$db->query("INSERT INTO $table2 (uid,c_commu_id,r_datetime) VALUES ($uid,$value,NOW() )");
//print("sql: INSERT INTO $table2 (uid,c_commu_id,r_datetime) VALUES ($uid,$value,NOW() )");
if(!$prs) die( "xsns custom error: auto add to community : ".__LINE__ .":".$db->logger->dumpQueries() );
$count++;
}
return $count;
}
?>
② サイト登録時に①の関数を実行するように修正
ユーザーの登録処理は User_UserRegister_confirmActionクラスのexecute()で実行される。XOOPS_ROOT_PATH/modules/user/actions/UserRegister_confirmAction.class.php
の60行目に①で作成した関数を呼び出す処理を追加する。
XOOPS_ROOT_PATH/modules/user/actions/UserRegister_confirmAction.class.php
execure() (30行目以下)
function execute(&$controller, &$xoopsUser)
{
$memberHandler =& xoops_gethandler('member');
$this->mNewUser =& $memberHandler->createUser();
$this->mRegistForm->update($this->mNewUser);
$this->mNewUser->set('uorder', $controller->mRoot->mContext->getXoopsConfig('com_order'), true);
$this->mNewUser->set('umode', $controller->mRoot->mContext->getXoopsConfig('com_mode'), true);
if ($this->mConfig['activation_type'] == 1) {
$this->mNewUser->set('level', 1, true);
}
if (!$memberHandler->insertUser($this->mNewUser)) {
$this->mRedirectMessage = _MD_USER_LANG_REGISTERNG;
return USER_FRAME_VIEW_ERROR;
}
if (!$memberHandler->addUserToGroup(XOOPS_GROUP_USERS, $this->mNewUser->get('uid'))) {
$this->mRedirectMessage = _MD_USER_LANG_REGISTERNG;
return USER_FRAME_VIEW_ERROR;
}
//ここを追加
$file=XOOPS_TRUST_PATH."/modules/xsns/act/tmp/add_toAllCommunity.php";
if( file_exists($file) ){
require_once($file);
if( !addToAllCommunity($this->mNewUser->get('uid')) ){
die("Failed to add to all communities: XSNS custom error:");
}
}
$this->_clearRegistForm($controller);
$this->_processMail($controller);
$this->_eventNotifyMail($controller);
XCube_DelegateUtils::call('Legacy.Event.RegistUser.Success', new XCube_Ref($this->mNewUser));
return USER_FRAME_VIEW_SUCCESS;
}
この記事にトラックバックする