0

我正在使用 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数据库,但没有多大帮助。这些变量似乎与列名有不同的命名约定。

4

4 回答 4

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;

我很想知道你是否让它工作了!

于 2013-04-06T16:48:01.940 回答
1

我建议在系统配置中打开 Joomla 调试。在每个页面的底部,它显示了它已执行的所有查询,这(取决于插件)可能会显示正在执行的 SQL,并且可能会失败。可能有一个很大的列表,因此您可能需要稍微搜索一下才能找到您感兴趣的语句。

于 2012-05-16T18:15:34.207 回答
1

法比奥,

非常感谢!我会尝试一下,看看我是否可以进一步改进它。

麦克风

于 2013-04-08T14:08:13.663 回答
0

你忘记了例外俱乐部的第一条规则,如果你扔东西......你必须抓住它。

我在您的代码中没有看到一try/catch对,因此 PHP 会因未捕获的异常而以“致命错误...”停止,因此它永远不会到达DEBUG 1. 例如

致命错误:带有消息的未捕获异常“异常”...

尝试将您的代码包装成对,并在查看PHP 文档try/catch后允许执行继续DEBUG 2exceptions

于 2012-05-16T22:45:06.093 回答