私は Joomla 2.5 を使用して中規模の Web サイトを構築しています。メニューを自動的に作成することで、メンテナンスとコンテンツ管理の頭痛の種を軽減することにしました。
これを行う拡張機能を探しましたが、Joomla 1.5 拡張機能しか見つかりませんでした。結局、Auto Menu Magic という GPL 拡張機能をアップグレードしようとしました。
Joomla には、Joomla 1.5 から 1.6 への移行を支援するページがあるため、拡張ファイルの XML タグなどの基本的な問題に対処するのは簡単でした。
私が言及した拡張機能には、記事が保存されたときに joomla によって呼び出される onContentAfterSave という名前の関数があります。私は、管理インターフェイスでゴミ記事を作成し、いくつかの場所で例外をスローするようにコードを変更してデバッグを行ってきました。これは、管理フロントエンドでエラー メッセージとして表示されます。
これは私が立ち往生した場所です:
$db = &JFactory::getDBO();
$menu = JTable::getInstance( 'menu');
$menu->menutype = $menutype;
$menu->name = $name;
$menu->link = $link;
$menu->type = $linktype;
$menu->published = $published;
$menu->componentid = $componentid;
$menu->parent = $menuparentid;
$menu->sublevel = $menusublevel;
$menu->checked_out = 0;
$menu->checked_out_time = 0;
$menu->pollid = 0;
$menu->browserNav = 0;
$menu->access = 0;
$menu->utaccess = 0;
$menu->lft = 0;
$menu->rgt = 0;
$menu->home = 0;
$menu->params = $params;
// Figure out the order (Just pop this article at the end of the list):
$menu->ordering = $menu->getNextOrder(
"menutype = ".$db->Quote($menu->menutype).
" AND published >= 0 AND parent = ".(int) $menu->parent
);
// Validate:
if (!$menu->check())
return NULL;
// DEBUG 2 -- Integrity check
throw new Exception ("menutype: $menutype, name: $name, link: $link published: $published, componentid: $componentid menuparentid: $menuparentid menusublevel: $menusublevel");
// Save:
if (!$menu->store())
return NULL;
// DEBUG 1
throw new Exception(" Could save! ");
上記のように、メニューがデータベースに保存されたときに例外 (DEBUG 1) をスローしようとしました。この例外には到達していませんが、上位の例外 (DEBUG 2) に到達しています。つまり、$menu->check() は true を返しますが、$menu->store() は返しません。Joomla データベース構造の一部が 1.5 以降に変更された可能性があるため、データベースがエラーを返していると思います。
この数時間、ソースを何度も読みましたが、1 つも見つかりません。このエラーを適切にデバッグできるように、Joomla テーブルが使用する列を確認するにはどうすればよいですか?
前もって感謝します!
PS: SQL データベースも調べましたが、あまり役に立ちません。変数には、列名とは異なる命名規則があるようです。