待辦事項 #2556

モジュールアンインストールでブロックが行方不明になることがある
啟用日期: 2003-07-15 13:11 最後更新: 2003-09-17 22:22

回報者:
負責人:
(無)
類型:
狀態:
關閉
元件:
(無)
里程碑:
(無)
優先權:
5 - 中
嚴重程度:
5 - 中
處理結果:
修正
檔案:

細節

http://ryus.joetsu.info/modules/bwiki/index.php?XOOPS2%
2FBugTrack%2F6 より

◆原因
ブロックがどのモジュールで表示されるかは、_block_module_linkテ
ーブルに記述されます。

モジュールアンインストール時に、_block_module_linkテーブル内
で、そのモジュールでのみ表示されるようにしてあるデータを削除して
しまうのが問題。

◆対策(toshimitsuさんより)
/kernel/module.php の function delete 425行目

/* 2003-07-10 orignal 削除はしない
$sql = sprintf("DELETE FROM %s WHERE module_id = %
u", $this->db->prefix('block_module_link'), $module->getVar
('mid'));
$this->db->query($sql);
*/
/* only visible false 非表示にする*/
$sql = sprintf("SELECT block_id FROM %s WHERE
module_id = %u", $this->db->prefix('block_module_link'),
$module->getVar('mid'));
$result = $this->db->query($sql);
if ($result) {
while ($myrow = $this->db->fetchArray($result)) {
$sql = sprintf("UPDATE %s SET visible = 0
WHERE bid = %u", $this->db->prefix('newblocks'), $myrow
['block_id']);
$this->db->query($sql);
}
}
/* only show all page 全てのページに表示 */
$sql = sprintf("UPDATE %s SET module_id = 0 WHERE
module_id = %u", $this->db->prefix('block_module_link'),
$module->getVar('mid'));
$this->db->query($sql);

Ticket History (3/6 Histories)

2003-07-18 17:01 Updated by: None
評語
Logged In: NO

toshimitsuですが、上記対策案に問題ありました。
この対象のブロックをすべてのページではなくて
複数のモジュールページに指定にしている場合
その削除モジュール以外のページでも、非表示になってしまいます。
 そのため、
「表示・非表示」
「表示するページ」の指定を指定しなおす必要が出てきてしまいます。
2003-07-29 05:41 Updated by: onokazu
評語
Logged In: YES
user_id=754

遅くなりすいません。
この際、今まで通り'block_module_link'から全て削除するように
しておいて、ブロック管理ページでどのページにも割り当てられて
いないブロックをリスト表示させるようにする方がいいかもしれま
せんね。
2003-07-29 14:52 Updated by: None
評語
Logged In: NO

「ページにも割り当てられていないブロックをリスト表示させるように
する」のは賛成です。
ただ、マルチセレクトでページ指定している人にとっては、単純に「全
て削除する」のはやっぱり、使いづらいと思います。
下記案あたりで、判定を一度いれてみるというのはどうでしょうか?

対策案の再改定案
/*-----2003-07-24 hack for lost block_module_link--------*/
// $sql = sprintf("DELETE FROM %s WHERE
module_id = %u", $this->db->prefix('block_module_link'),
$module->getVar('mid'));
// $this->db->query($sql);
/*-----get block_id array from block_module_link --------*/
$sql = sprintf("SELECT block_id FROM %s WHERE
module_id = %u", $this->db->prefix('block_module_link'),
$module->getVar('mid'));
if ($result = $this->db->query($sql)) {
$block_id_arr = array();
while ($myrow = $this->db->fetchArray($result))
{
array_push
($block_id_arr, $myrow['block_id']);
}
}
/*-----loop block_id array --------*/
if (isset($block_id_arr)) {
foreach ($block_id_arr as $i) {
$sql = sprintf("SELECT block_id FROM %1\$s
WHERE NOT(module_id = %2\$u) AND (block_id = %3\$u)", $this-
>db->prefix('block_module_link'), $module->getVar('mid'),
$i);
if ($result2 = $this->db->query($sql)) {
if (0 < $this->db->getRowsNum
($result2)) {
/*-----this is multi select block-----*/
$sql = sprintf("DELETE FROM %1\$s
WHERE (module_id = %2\$u) AND (block_id = %3\$u)", $this-
>db->prefix('block_module_link'), $module->getVar('mid'),
$i);
$this->db->query($sql);
} else {
/*-----only visible false-----*/
$sql = sprintf("UPDATE
%s SET visible = 0 WHERE bid = %u", $this->db->prefix
('newblocks'), $i);
$this->db->query($sql);
/*-----oonly show top page-----*/
$sql = sprintf("UPDATE
%s SET module_id = -1 WHERE module_id = %u", $this->db-
>prefix('block_module_link'), $module->getVar('mid'));
$this->db->query($sql);
}
}
}
}
2003-08-01 08:58 Updated by: onokazu
評語
Logged In: YES
user_id=754

度々遅れてすいません。
'block_module_link'に削除するモジュール以外のエントリがあれ
ばブロックを非表示にするということですね。これであれば大丈夫
そうですね。CVSへと反映させておこうと思います。
2003-08-04 15:39 Updated by: toshimitsu
評語
Logged In: YES
user_id=6033

onokazuさん誤記だと思いますが、念のため補足します。

WHERE記述がNOT条件を使って解りにくいですが

処理の分けている条件として、
1.'block_module_link'に削除するモジュール以外のエントリがあれ
ば、「削除されるモジュールページ」のリンクデータは、
'block_module_link'から削除しても問題ないのでさっさと削除して、
そのかわり、他のページにリンクされているデータはそのままにしてお
く。

2.(それ以外 = 「削除されるモジュールページ」にしかない)場合
には、
 ブロックを非表示、
 「削除されるモジュールページ」の代わりにトップページにしてお
く。
 と書いたつもりです。  
2003-09-17 22:22 Updated by: onokazu
  • Ticket Close date is changed to 2003-09-17 22:22
  • 處理結果 Update from to 修正
  • 狀態 Update from 開啟 to 關閉
評語
Logged In: YES
user_id=754

了解です。ありがとうございます。

Attachment File List

No attachments

編輯

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » 登入