ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
投稿者: homerun | 投稿日時: 2010/3/4 15:13 | 閲覧: 12317回
ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されないのは
「各モジュールにコンテンツが依存しているわけだから」
というのは解かりました。
もしユーザー削除時に、そのユーザーに関わるコンテンツも全て削除、というようなことをするなら、
荒業になりますですか?
☆けっこう大変そうだけれど、他の方法でも、もしくはプラグインを応用してでも何かいいアイデアはないですかね…。
削除されたユーザーのコンテンツはゲスト扱いされるので、ゲストではなくなんかのグループにしたり、とかなんとか、、できるのかな…★
XOOPS:
HD2
モジュール:
myalbum
message
よろしくお願いいたしますー!
コメント(16)
新しいものから |
古いものから |
ネスト表示 |

Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
投稿者: SAK-AXYZ | 投稿日時: 2010/3/6 0:27
引用:
ユーザアカウントの削除まわりに、がっつりと改造を加える必要が生じますね。
インストールイされているモジュールIDをもとに、各モジュールの[投稿コンテンツが収容されているテーブル]の中の
当該ユーザIDのデータ業を削除するsectionをブン回す、って感じですね。
で……その場合にいちばんうっとうしいのが、モジュール毎に、投稿者のIDを収容するフィールド名が
異なるって所かと。
なので、ご指摘の通り、モジュール毎にプラグインを作成して、それをincludeして処理する、ってのが
もっとも現実的と言えば現実的……激しくめんどっちいけど(;´Д`)
もしユーザー削除時に、そのユーザーに関わるコンテンツも全て削除、というようなことをするなら、
荒業になりますですか?
☆けっこう大変そうだけれど、他の方法でも、もしくはプラグインを応用してでも何かいいアイデアはないですかね…。
削除されたユーザーのコンテンツはゲスト扱いされるので、ゲストではなくなんかのグループにしたり、とかなんとか、、できるのかな…★
ユーザアカウントの削除まわりに、がっつりと改造を加える必要が生じますね。
インストールイされているモジュールIDをもとに、各モジュールの[投稿コンテンツが収容されているテーブル]の中の
当該ユーザIDのデータ業を削除するsectionをブン回す、って感じですね。
で……その場合にいちばんうっとうしいのが、モジュール毎に、投稿者のIDを収容するフィールド名が
異なるって所かと。
なので、ご指摘の通り、モジュール毎にプラグインを作成して、それをincludeして処理する、ってのが
もっとも現実的と言えば現実的……激しくめんどっちいけど(;´Д`)
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
やはり大変なんですね…★
でも、データベースからそのユーザーの、そのモジュールの、テーブルの、データを消す、っていうことで解決できるわけですね。
うーん、難しそうだけれど、やってみます。
SQLの呪文を勉強しなきゃならないのはめんどうかなあ、うう、あれ、でもユーザーのdeleteに関するファイルにちょっとつけたせばいい感じかな、☆
モジュールを増やしたりなんだりしないサイトならこれでいいとして、もし他のモジュールにも汎用できるっていうものだと、全部削除モジュールを1個作らなきゃならないわけですね。
挑戦してみようかしら。PHPもよくわからないけれども。
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
XCLではユーザアカウントの削除が完了した場合に
「Legacy.Admin.Event.UserDelete.Success」←管理画面より削除した場合
または
「'Legacy.Event.UserDelete'」←ユーザが自分で退会した場合
というイベントが発生します。
これらのイベントに紐つけられた関数やメソッドには引数として削除された
ユーザのアカウントがXoopsUserオブジェクトとして渡されます。
なのでこれらのイベントに紐つけた関数やメソッドをプリロードを使って
登録すればユーザ削除時に何かの処理を追加することは可能です。
本当は各モジュールがこの処理を行うべきなんですけどね。
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
あonokazuさん、いつもありがとうございます☆
引用:
XCLではユーザアカウントの削除が完了した場合に
「Legacy.Admin.Event.UserDelete.Success」←管理画面より削除した場合
または
「'Legacy.Event.UserDelete'」←ユーザが自分で退会した場合
というイベントが発生します。
↑これは大ヒントです!!
今回の質問は「XOOPSユーザーの中には同じこと考えている人も多いんじゃないか」って、勝手に妄想していますけど、糸口がひらけた気がしますー!感謝です!
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
引用:
HD2(たぶんホダ塾ディストリビューション1.02?)なら XOOPS Cube Legacy ベースなので、プリロードとデリゲートを使ってユーザ削除時の処理を追加することができます。
以下のような内容で、User_ExtendedDelete.class.php という名前のファイルを作成し、{XOOPS_URL}/preload に置いておくと、ユーザ退会時にデータが削除されます(テストしていないので動かない可能性も。必ず事前に動作をテストしてください)。
comment, message, pm, myalbum-p のデータを削除しています(使っていない機能のブロックは消してください)。
やはり大変なんですね…★
でも、データベースからそのユーザーの、そのモジュールの、テーブルの、データを消す、っていうことで解決できるわけですね。
うーん、難しそうだけれど、やってみます。
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: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
kilicaさんありがとうございます…すごい☆☆ やってもらっちゃた…
引用:
HD2(たぶんホダ塾ディストリビューション1.02?)なら XOOPS Cube Legacy ベースなので、プリロードとデリゲートを使ってユーザ削除時の処理を追加することができます。
HD1.0 for XCL2.1 のこと略しすぎだったかな。
コードまでつけていただいてありがとうございますー☆
このコード、どうにか自分でやろうとしているときにkernel/member.phpの中を見たんですが、そこにあったのと似てるなあ、と思いました。よくみるといろいろ違いますね★
なんとなく仕組みもわかってきたきがします、あやうくkernelの中にあるファイルをいじるところでした。
プリロードって簡単に言うと、カーネルとかをいじらないでいろいろできる、っていう解釈でいいのかしら。今のところそんな風に思っています。
肝心のUser_ExtendedDelete.class.phpというプリロードですが、まだ試せていません。
ちょっとお時間くださいね。
結果報告いたしますー
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
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: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
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: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
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: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
たびたびですみません★
以下のコードでよかったですか?
なんか"}"の個数に自信がなくって…
<?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: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
Re: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
試してみました。
引用:
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: ユーザー削除(退会)時に、各モジュールのコンテンツも同時に削除されない
解決しました!!…古い!いつの話だってー
include_once XOOPS_ROOT_PATH."/modules/myalbum/include/read_configs.php" ;
ここのインクルードがワンスになってたのが原因だったみたいです。
include XOOPS_ROOT_PATH."/modules/myalbum/include/read_configs.php" ;
で動きました。
検証してみないとまだわかりませんが、とにかく動いたようです☆うれちい!
ああ、もうどれくらい悩んでいたんだろ。古い話をほりかえしちゃってごめんです★
解決報告
さっき自分に返信して解決報告をしてしまったので、改めて報告します。
include_once XOOPS_ROOT_PATH."/modules/myalbum/include/read_configs.php" ;
ここのインクルードがワンスになってたのが原因だったみたいです。
include XOOPS_ROOT_PATH."/modules/myalbum/include/read_configs.php" ;
で動きました。
検証してみないと他の影響があるかどうかまだわかりませんが、とにかく動いたようです☆
include_onceだと読み込まれていませんでした。これはすでに読み込んでいるので、再度は読み込まないよ、っていう風に無視されちゃってたんですね。
大昔の話でしたが、おかげさまで、できてよかったです。
本当にありがとうございます。★