下載
軟體開發
帳戶
下載
軟體開發
登入
我忘記帳戶名和密碼了
新增帳戶
語言
手冊
語言
手冊
×
登入
登入名稱
密碼
×
我忘記帳戶名和密碼了
繁體中文翻譯狀態
類別:
軟體
人
PersonalForge
Magazine
Wiki
搜尋
OSDN
>
軟體搜索
>
Internet
>
WWW/HTTP
>
Dynamic Content
>
XOOPS
>
Ticket List/Search
>
待辦事項 #2556
XOOPS
描述
專案概要
開發人員儀表板
專案的網頁
Developers
Image Gallery
List of RSS Feeds
活動
使用統計
歷史
檔案下載
發布列表
Stats
原始碼
儲存庫列表
CVS
查看儲存庫
待辦事項
待辦事項列表
里程碑列表
類型列表
元件列表
List of frequently used tickets/RSS
新增待辦事項
文檔
溝通
討論區
討論區列表
幫助論壇 (1)
公開討論 (1)
通信論壇
通信論壇列表
xoops-cvslog
新聞
待辦事項 #2556
待辦事項列表
新增待辦事項
RSS
モジュールアンインストールでブロックが行方不明になることがある
啟用日期:
2003-07-15 13:11
最後更新:
2003-09-17 22:22
監視
ON
OFF
回報者:
ryuji_amano
負責人:
(無)
類型:
問題回報
狀態:
關閉
元件:
(無)
里程碑:
(無)
優先權:
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)
Show older 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 (
0
)
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. »
登入
新增評語
預覽
提交
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);