ホーム > フォーラム > その他 > ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない

ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
投稿者: homerun | 投稿日時: 2010/3/4 15:13 | 閲覧: 19954回
homerun

ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されないのは
「各モジュールにコンテンツが依存しているわけだから」
というのは解かりました。

もしユーザー削除時に、そのユーザーに関わるコンテンツも全て削除、というようなことをするなら、
荒業になりますですか?

☆けっこう大変そうだけれど、他の方法でも、もしくはプラグインを応用してでも何かいいアイデアはないですかね…。
削除されたユーザーのコンテンツはゲスト扱いされるので、ゲストではなくなんかのグループにしたり、とかなんとか、、できるのかな…★


XOOPS:
HD2

モジュール:
myalbum
message

よろしくお願いいたしますー!

コメント(16)

新しいものから | 古いものから | ネスト表示 | RSS feed
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: SAK-AXYZ | 投稿日時: 2010/3/6 0:27
SAK-AXYZ
引用:
もしユーザー削除時に、そのユーザーに関わるコンテンツも全て削除、というようなことをするなら、
荒業になりますですか?

☆けっこう大変そうだけれど、他の方法でも、もしくはプラグインを応用してでも何かいいアイデアはないですかね…。
削除されたユーザーのコンテンツはゲスト扱いされるので、ゲストではなくなんかのグループにしたり、とかなんとか、、できるのかな…★


ユーザアカウントの削除まわりに、がっつりと改造を加える必要が生じますね。
インストールイされているモジュールIDをもとに、各モジュールの[投稿コンテンツが収容されているテーブル]の中の
当該ユーザIDのデータ業を削除するsectionをブン回す、って感じですね。
 
で……その場合にいちばんうっとうしいのが、モジュール毎に、投稿者のIDを収容するフィールド名が
異なるって所かと。
なので、ご指摘の通り、モジュール毎にプラグインを作成して、それをincludeして処理する、ってのが
もっとも現実的と言えば現実的……激しくめんどっちいけど(;´Д`)
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: homerun | 投稿日時: 2010/3/9 13:13 | 親コメント: #20345
homerun

やはり大変なんですね…★

でも、データベースからそのユーザーの、そのモジュールの、テーブルの、データを消す、っていうことで解決できるわけですね。
うーん、難しそうだけれど、やってみます。
SQLの呪文を勉強しなきゃならないのはめんどうかなあ、うう、あれ、でもユーザーのdeleteに関するファイルにちょっとつけたせばいい感じかな、☆

モジュールを増やしたりなんだりしないサイトならこれでいいとして、もし他のモジュールにも汎用できるっていうものだと、全部削除モジュールを1個作らなきゃならないわけですね。
挑戦してみようかしら。PHPもよくわからないけれども。
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: onokazu | 投稿日時: 2010/3/9 20:51 | 親コメント: #20366
onokazu

XCLではユーザアカウントの削除が完了した場合に
「Legacy.Admin.Event.UserDelete.Success」←管理画面より削除した場合
または
「'Legacy.Event.UserDelete'」←ユーザが自分で退会した場合
というイベントが発生します。

これらのイベントに紐つけられた関数やメソッドには引数として削除された
ユーザのアカウントがXoopsUserオブジェクトとして渡されます。

なのでこれらのイベントに紐つけた関数やメソッドをプリロードを使って
登録すればユーザ削除時に何かの処理を追加することは可能です。
本当は各モジュールがこの処理を行うべきなんですけどね。
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: kilica | 投稿日時: 2010/3/9 22:47 | 親コメント: #20366
kilica
引用:
やはり大変なんですね…★

でも、データベースからそのユーザーの、そのモジュールの、テーブルの、データを消す、っていうことで解決できるわけですね。
うーん、難しそうだけれど、やってみます。
SQLの呪文を勉強しなきゃならないのはめんどうかなあ、うう、あれ、でもユーザーのdeleteに関するファイルにちょっとつけたせばいい感じかな、☆

モジュールを増やしたりなんだりしないサイトならこれでいいとして、もし他のモジュールにも汎用できるっていうものだと、全部削除モジュールを1個作らなきゃならないわけですね。
挑戦してみようかしら。PHPもよくわからないけれども。



HD2(たぶんホダ塾ディストリビューション1.02?)なら XOOPS Cube Legacy ベースなので、プリロードとデリゲートを使ってユーザ削除時の処理を追加することができます。
以下のような内容で、User_ExtendedDelete.class.php という名前のファイルを作成し、{XOOPS_URL}/preload に置いておくと、ユーザ退会時にデータが削除されます(テストしていないので動かない可能性も。必ず事前に動作をテストしてください)。
comment, message, pm, myalbum-p のデータを削除しています(使っていない機能のブロックは消してください)。



<?php

if( ! defined( 'XOOPS_ROOT_PATH' ) ) exit ;

class User_ExtendedDelete extends XCube_ActionFilter
{
    function preFilter()
    {
        $this->mRoot->mDelegateManager->add('Legacy.Event.UserDelete' , array(&$this, 'hook'));
        $this->mRoot->mDelegateManager->add('Legacy.Admin.Event.UserDelete.Success', array(&$this, 'hook'));
    }

    function hook( &$userObj )
    {
    //---------------------------------------------------------------
    //comment delete
        $handler =& xoops_gethandler('comment');
        $handler->deleteAll(new Criteria('com_uid', $userObj->get('uid')));
    
        unset($handler);
    //---------------------------------------------------------------
    //message delete:inbox
        $handler =& xoops_getmodulehandler('inbox', 'message');
        $handler->deleteAll(new Criteria('uid', $userObj->get('uid')));
    
        unset($handler);
    //---------------------------------------------------------------
    //message delete:outbox
        $handler =& xoops_getmodulehandler('outbox', 'message');
        $handler->deleteAll(new Criteria('uid', $userObj->get('uid')));
    
        unset($handler);
    //---------------------------------------------------------------
    //message delete:users
        $handler =& xoops_getmodulehandler('settings', 'message');
        $handler->deleteAll(new Criteria('uid', $userObj->get('uid')));
    
        unset($handler);
    //---------------------------------------------------------------
    //pm delete
        $handler =& xoops_gethandler('privmessage');
        $objs =& $handler->getObjects(new Criteria('to_uid', $userObj->get('uid')));
    
        foreach(array_keys($objs) as $key){
            $handler->delete($objs[$key]);
        }
        unset($objs);
        unset($handler);
    //---------------------------------------------------------------
    //myalbum-p
    //次の行の'myalbum'をインストールしたマイアルバムのディレクトリ名に変更
        include_once XOOPS_ROOT_PATH."/modules/myalbum/include/functions.php" ;
        $uid = $userObj->get('uid');
        $whr = "submitter=$uid" ;
    
        myalbum_delete_photos( $whr ) ;
    }
}
?>
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: homerun | 投稿日時: 2010/3/10 10:59 | 親コメント: #20370
homerun

あonokazuさん、いつもありがとうございます☆

引用:
XCLではユーザアカウントの削除が完了した場合に
「Legacy.Admin.Event.UserDelete.Success」←管理画面より削除した場合
または
「'Legacy.Event.UserDelete'」←ユーザが自分で退会した場合
というイベントが発生します。


↑これは大ヒントです!!
今回の質問は「XOOPSユーザーの中には同じこと考えている人も多いんじゃないか」って、勝手に妄想していますけど、糸口がひらけた気がしますー!感謝です!
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: homerun | 投稿日時: 2010/3/10 11:10 | 親コメント: #20371
homerun

kilicaさんありがとうございます…すごい☆☆ やってもらっちゃた…

引用:
HD2(たぶんホダ塾ディストリビューション1.02?)なら XOOPS Cube Legacy ベースなので、プリロードとデリゲートを使ってユーザ削除時の処理を追加することができます。


HD1.0 for XCL2.1 のこと略しすぎだったかな。

コードまでつけていただいてありがとうございますー☆
このコード、どうにか自分でやろうとしているときにkernel/member.phpの中を見たんですが、そこにあったのと似てるなあ、と思いました。よくみるといろいろ違いますね★
なんとなく仕組みもわかってきたきがします、あやうくkernelの中にあるファイルをいじるところでした。
プリロードって簡単に言うと、カーネルとかをいじらないでいろいろできる、っていう解釈でいいのかしら。今のところそんな風に思っています。

肝心のUser_ExtendedDelete.class.phpというプリロードですが、まだ試せていません。
ちょっとお時間くださいね。

結果報告いたしますー
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: homerun | 投稿日時: 2010/3/10 15:55 | 親コメント: #20375
homerun

User_ExtendedDelete.class.php
をpreloadフォルダに入れ、内容のmyalbumのディレクトリに書き換えたのですが、うまく働きません★
preloadフォルダって、中に入ってるものはなんでも読み込んでくれるんですか?(入れただけでいいのか不安になって…)

他に気をつけるところがあればどこでしょうか?

※ちなみに

$uid = $userObj->get('uid');
        $whr = "submitter=$uid" ;
    
        myalbum_delete_photos( $whr ) ;

は↓これを動かそうとしてるんですよね。ふむふむ、勉強になりますー☆!!


// Delete photos hit by the $whr clause
function myalbum_delete_photos( $whr )
{
	global $xoopsDB ;
	global $photos_dir , $thumbs_dir , $myalbum_mid ;
	global $table_photos , $table_text , $table_votedata ;

	$prs = $xoopsDB->query("SELECT lid, ext FROM $table_photos WHERE $whr" ) ;
	while( list( $lid , $ext ) = $xoopsDB->fetchRow( $prs ) ) {

		xoops_comment_delete( $myalbum_mid , $lid ) ;
		xoops_notification_deletebyitem( $myalbum_mid , 'photo' , $lid ) ;

		$xoopsDB->query( "DELETE FROM $table_votedata WHERE lid=$lid" ) or die( "DB error: DELETE votedata table." ) ;
		$xoopsDB->query( "DELETE FROM $table_text WHERE lid=$lid" ) or die( "DB error: DELETE text table." ) ;
		$xoopsDB->query( "DELETE FROM $table_photos WHERE lid=$lid" ) or die( "DB error: DELETE photo table." ) ;
	
		@unlink( "$photos_dir/$lid.$ext" ) ;
		@unlink( "$photos_dir/$lid.gif" ) ;
		@unlink( "$thumbs_dir/$lid.$ext" ) ;
		@unlink( "$thumbs_dir/$lid.gif" ) ;
	}
}



もう一度やってみますー
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: kilica | 投稿日時: 2010/3/10 19:48 | 親コメント: #20381
kilica

myalbum のブロックを以下に書き換えてやってみてください m(__)m

    //myalbum-p
    //次の行の'myalbum'をインストールしたマイアルバムのディレクトリ名に変更
        include_once XOOPS_ROOT_PATH."/modules/myalbum/include/read_configs.php" ;
        $uid = $userObj->get('uid');
        $whr = "submitter=$uid" ;
		$prs = $xoopsDB->query("SELECT lid, ext FROM $table_photos WHERE $whr" ) ;
		while( list( $lid , $ext ) = $xoopsDB->fetchRow( $prs ) ) {
			xoops_comment_delete( $myalbum_mid , $lid ) ;
			xoops_notification_deletebyitem( $myalbum_mid , 'photo' , $lid ) ;

			$xoopsDB->query( "DELETE FROM $table_votedata WHERE lid=$lid" ) or die( "DB error: DELETE votedata table." ) ;
			$xoopsDB->query( "DELETE FROM $table_text WHERE lid=$lid" ) or die( "DB error: DELETE text table." ) ;
			$xoopsDB->query( "DELETE FROM $table_photos WHERE lid=$lid" ) or die( "DB error: DELETE photo table." ) ;
		
			@unlink( "$photos_dir/$lid.$ext" ) ;
			@unlink( "$photos_dir/$lid.gif" ) ;
			@unlink( "$thumbs_dir/$lid.$ext" ) ;
			@unlink( "$thumbs_dir/$lid.gif" ) ;
	    }
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: homerun | 投稿日時: 2010/3/11 1:06 | 親コメント: #20385
homerun

Notice [PHP]: Undefined variable: xoopsDB in file preload/User_ExtendedDelete.class.php line 55

ユーザーを消した途端にというエラーが出ました★ガーン

該当するのは
$prs = $xoopsDB->query("SELECT lid, ext FROM $table_photos WHERE $whr" ) ;
でした、。うう、どうしたら、いいんでしょ。 $whrってなんでしょうか、気になるんですが、関係ないですよね…。
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: homerun | 投稿日時: 2010/3/11 12:43 | 親コメント: #20385
homerun

たびたびですみません★

以下のコードでよかったですか?
なんか"}"の個数に自信がなくって…


<?php

if( ! defined( 'XOOPS_ROOT_PATH' ) ) exit ;

class User_ExtendedDelete extends XCube_ActionFilter
{
    function preFilter()
    {
        $this->mRoot->mDelegateManager->add('Legacy.Event.UserDelete' , array(&$this, 'hook'));
        $this->mRoot->mDelegateManager->add('Legacy.Admin.Event.UserDelete.Success', array(&$this, 'hook'));
    }

    function hook( &$userObj )
    {
    //---------------------------------------------------------------
    //comment delete
        $handler =& xoops_gethandler('comment');
        $handler->deleteAll(new Criteria('com_uid', $userObj->get('uid')));
    
        unset($handler);
    //---------------------------------------------------------------
    //message delete:inbox
        $handler =& xoops_getmodulehandler('inbox', 'message');
        $handler->deleteAll(new Criteria('uid', $userObj->get('uid')));
    
        unset($handler);
    //---------------------------------------------------------------
    //message delete:outbox
        $handler =& xoops_getmodulehandler('outbox', 'message');
        $handler->deleteAll(new Criteria('uid', $userObj->get('uid')));
    
        unset($handler);
    //---------------------------------------------------------------
    //message delete:users
        $handler =& xoops_getmodulehandler('settings', 'message');
        $handler->deleteAll(new Criteria('uid', $userObj->get('uid')));
    
        unset($handler);
    //---------------------------------------------------------------
    //pm delete
        $handler =& xoops_gethandler('privmessage');
        $objs =& $handler->getObjects(new Criteria('to_uid', $userObj->get('uid')));
    
        foreach(array_keys($objs) as $key){
            $handler->delete($objs[$key]);
        }
        unset($objs);
        unset($handler);
    //---------------------------------------------------------------
    //myalbum-p
    //次の行の'myalbum'をインストールしたマイアルバムのディレクトリ名に変更
        include_once XOOPS_ROOT_PATH."/modules/myalbum/include/read_configs.php" ;
        $uid = $userObj->get('uid');
        $whr = "submitter=$uid" ;
		$prs = $xoopsDB->query("SELECT lid, ext FROM $table_photos WHERE $whr" ) ;
		while( list( $lid , $ext ) = $xoopsDB->fetchRow( $prs ) ) {
			xoops_comment_delete( $myalbum_mid , $lid ) ;
			xoops_notification_deletebyitem( $myalbum_mid , 'photo' , $lid ) ;

			$xoopsDB->query( "DELETE FROM $table_votedata WHERE lid=$lid" ) or die( "DB error: DELETE votedata table." ) ;
			$xoopsDB->query( "DELETE FROM $table_text WHERE lid=$lid" ) or die( "DB error: DELETE text table." ) ;
			$xoopsDB->query( "DELETE FROM $table_photos WHERE lid=$lid" ) or die( "DB error: DELETE photo table." ) ;
		
			@unlink( "$photos_dir/$lid.$ext" ) ;
			@unlink( "$photos_dir/$lid.gif" ) ;
			@unlink( "$thumbs_dir/$lid.$ext" ) ;
			@unlink( "$thumbs_dir/$lid.gif" ) ;
	    }

    }
}
?>
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: kilica | 投稿日時: 2010/3/15 21:34 | 親コメント: #20390
kilica

引用:

Notice [PHP]: Undefined variable: xoopsDB in file preload/User_ExtendedDelete.class.php line 55

ユーザーを消した途端にというエラーが出ました★ガーン

画面ってどうなりますか?真っ白?


global $xoopsDB;

をmyalbumの処理の頭に入れてみてください。
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: homerun | 投稿日時: 2010/3/16 15:41 | 親コメント: #20408
homerun

お返事ありがとうございます☆

引用:
画面ってどうなりますか?真っ白?


真っ白にエラー文字だけです。
ユーザーは消えたけどモジュール依存の情報は消えなかった…的です。


引用:

global $xoopsDB;

をmyalbumの処理の頭に入れてみてください。


試してみます!お時間くださいー
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: homerun | 投稿日時: 2010/3/17 17:00 | 親コメント: #20412
homerun

試してみました。

引用:

global $xoopsDB;

をmyalbumの処理の頭に入れてみてください。


エラーはなくなりましたが、やはりコンテンツは残ったままになってしまいます。
以下のようにしたんですけど、間違っていないでしょうか??


//myalbum-p
    //次の行の'myalbum'をインストールしたマイアルバムのディレクトリ名に変更

global $xoopsDB;

        include_once XOOPS_ROOT_PATH."/modules/myalbum/include/read_configs.php" ;
        $uid = $userObj->get('uid');
        $whr = "submitter=$uid" ;
		$prs = $xoopsDB->query("SELECT lid, ext FROM $table_photos WHERE $whr" ) ;
		while( list( $lid , $ext ) = $xoopsDB->fetchRow( $prs ) ) {
			xoops_comment_delete( $myalbum_mid , $lid ) ;
			xoops_notification_deletebyitem( $myalbum_mid , 'photo' , $lid ) ;

			$xoopsDB->query( "DELETE FROM $table_votedata WHERE lid=$lid" ) or die( "DB error: DELETE votedata table." ) ;
			$xoopsDB->query( "DELETE FROM $table_text WHERE lid=$lid" ) or die( "DB error: DELETE text table." ) ;
			$xoopsDB->query( "DELETE FROM $table_photos WHERE lid=$lid" ) or die( "DB error: DELETE photo table." ) ;
		
			@unlink( "$photos_dir/$lid.$ext" ) ;
			@unlink( "$photos_dir/$lid.gif" ) ;
			@unlink( "$thumbs_dir/$lid.$ext" ) ;
			@unlink( "$thumbs_dir/$lid.gif" ) ;
	    }

    }
}
?>



また今回のglobal $xoopsDB;はどういう働きをさせるんでしょうか?
調べてみるとなんとなく、xoops全体の変更を許可する、みたいな呪文のようですね(文字通りそのまんまですね★)
エラーが出るということは実際にこのプリロードが働いてる、ってことになるし、コードにはちゃんと削除するように命令されているはずですし…。
この動きをトレースできたりしないんですか??
フラッシュだとtrace();みたいなことで追跡できるのでいつも使ってます。(phpだとdebug_print_backtraceこんなかんじのですか)
試してみようと思います…

もし肝の部分がお分かりでしたら必要なところに設置しますー!ので教えてくださいね☆
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない 
投稿者: homerun | 投稿日時: 2010/3/17 17:55 | 親コメント: #20419
homerun

他の動きも見てみました。

Messageはちゃんと動いて消されていました!
これだけでもすごいなあ、…

myalbumのハックも少々やっているせいかしら。
でもmyalbumのモジュール内の操作ではちゃんと消せているので問題ないと思うんですが…。

現時点でMessageが動いてるので感謝してますー!☆☆☆
解決しました!!…古い!いつの話だってー 
投稿者: homerun | 投稿日時: 2011/9/28 1:57 | 親コメント: #20420
homerun

include_once XOOPS_ROOT_PATH."/modules/myalbum/include/read_configs.php" ;

ここのインクルードがワンスになってたのが原因だったみたいです。

include XOOPS_ROOT_PATH."/modules/myalbum/include/read_configs.php" ;

で動きました。

検証してみないとまだわかりませんが、とにかく動いたようです☆うれちい!

ああ、もうどれくらい悩んでいたんだろ。古い話をほりかえしちゃってごめんです★
解決報告 
投稿者: homerun | 投稿日時: 2011/9/28 11:27 | 親コメント: #20408
homerun

さっき自分に返信して解決報告をしてしまったので、改めて報告します。

include_once XOOPS_ROOT_PATH."/modules/myalbum/include/read_configs.php" ;

ここのインクルードがワンスになってたのが原因だったみたいです。

include XOOPS_ROOT_PATH."/modules/myalbum/include/read_configs.php" ;

で動きました。
検証してみないと他の影響があるかどうかまだわかりませんが、とにかく動いたようです☆
include_onceだと読み込まれていませんでした。これはすでに読み込んでいるので、再度は読み込まないよ、っていう風に無視されちゃってたんですね。

大昔の話でしたが、おかげさまで、できてよかったです。

本当にありがとうございます。★

    投票(0)

    新しいものから | 古いものから | RSS feed
     
    To Top