我正在使用Joomla 2.5构建一个中型网站,我决定通过自动创建菜单来减轻维护和内容管理问题。
我已经找到了这样做的扩展,但只找到了Joomla 1.5扩展。我最终尝试升级名为Auto Menu Magic的GPL扩展。
很容易处理扩展文件中的XML标记等基本问题,因为Joomla中有一个页面可以帮助您从Joomla 1.5迁移到1.6。
我提到的扩展名有一个名为onContentAfterSave的函数,在保存文章时由joomla调用。我一直在调试管理界面中创建垃圾文章并更改代码以在几个地方抛出异常,我可以在管理员前端看到错误消息。
这是我被困的地方:
$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之后发生了变化。
过去几个小时我已经阅读了很多资料,但我找不到一件事。如何查看Joomla表使用的列,以便正确调试此错误?
提前致谢!
PS:我也看过SQL数据库,但它没有多大帮助。变量似乎与列名具有不同的命名约定。
答案 0 :(得分:2)
我认为它应该是这样的,因为我一直在尝试转换自动菜单! $ db =& JFactory :: getDBO(); $ menu = JTable :: getInstance(' menu');
$menu->menutype = $menutype;
$menu->title = $title;
$menu->alias = strtolower($title) ;
$menu->note = "Created by automenu";
$menu->path = $link;
$menu->link = $link;
$menu->type = $linktype;
$menu->published = $published;
$menu->parent_id = $menuparentid
$menu->level = $menusublevel;
$menu->componentid = $componentid;
$menu->ordering = 0;
$menu->checked_out = 0;
$menu->checked_out_time = 0;
$menu->browserNav = 0;
$menu->access = 1;
$menu->img = '';
$menu->templat_style_id = 0;
$menu->params = $params;
$menu->lft = 0;
$menu->rgt = 0;
$menu->home = 0;
$menu->language = '*';
$menu->client_id = 0;
如果你能让它发挥作用,我会被告知!
答案 1 :(得分:1)
我建议在系统配置中启用Joomla调试。在每个页面的底部显示它已执行的所有查询,这(取决于插件)可能会显示正在执行的SQL,并且可能会失败。可能会有一个很大的列表,所以你可能需要搜索一下才能找到你感兴趣的声明。
答案 2 :(得分:1)
法比奥,
非常感谢!我会尝试一下,看看我是否可以进一步改进它。
麦克
答案 3 :(得分:0)
你忘记了Exceptions Club的第一条规则,如果你扔东西......你必须抓住它。
我的代码中没有看到try/catch
对,因此对于未捕获的异常,PHP会因“致命错误...”而停止,因此它永远不会到达DEBUG 1
。例如
致命错误:带有消息的未捕获异常“异常”...
尝试将代码包装在try/catch
对中,并允许在DEBUG 2
查看the PHP doc's for exceptions
之后继续执行