【问题标题】:How to find out Joomla JTable column/field names?如何找出 Joomla JTable 列/字段名称?
【发布时间】:2012-05-24 03:42:47
【问题描述】:

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

【问题讨论】:

    标签: joomla joomla2.5


    【解决方案1】:

    我认为它应该看起来像这样,因为我也一直在尝试转换自动菜单! $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;
    

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

    【讨论】:

    • 哈哈。似乎我未能发布该代码。 github.com/fabiosantoscode/joomla-auto-menus 我确实让它工作了,但它非常糟糕。我不太擅长 Joomla 或 PHP。我会在星期一来清理我的工作电脑,如果找到了就告诉你。
    • 当我停止设置 $menu->lft、rgt、level、parent_id 和 ordering 时它起作用了。显然这些不再是菜单项的一部分了。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      法比奥,

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

      迈克

      【讨论】:

        【解决方案4】:

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

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

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

        尝试将您的代码包装在try/catch 对中,并允许在DEBUG 2 之后继续执行查看the PHP doc's for exceptions

        【讨论】:

        • 也许问题不清楚。抛出这些异常的目的正是为了让错误出现在事物的前端,这就是我一直在调试的方式。 DEBUG 2 是在 DEBUG 1 之后添加的,因为从未到达 DEBUG 1。
        • 我知道我正在使用一种糟糕的调试方法。但我只是不太了解 PHP 和 Joomla 的内部结构。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-11
        • 1970-01-01
        相关资源
        最近更新 更多