Joomla 组件开发:保存、应用和取消工具栏按钮不起作用

Posted

技术标签:

【中文标题】Joomla 组件开发:保存、应用和取消工具栏按钮不起作用【英文标题】:Joomla component development: Save, apply and cancel toolbar buttons not working 【发布时间】:2011-03-30 07:42:10 【问题描述】:

我正在学习“Learning Joomla! 1.5 Extension Development”一书中关于组件开发的课程。我完全按照本章中的说明创建了一个我称之为“carousel”的组件。我只创建了 Admin 后端,并且可以查看用于创建新条目或编辑现有条目的表单,但无法保存或应用更改。单击“保存”、“应用”和“取消”按钮只会将我带到管理索引页面,但数据库中没有任何更改。但是,如果我使用 SQL 直接在数据库中添加条目,我可以在管理界面中正确地查看它们的列表。

我在 Windows XP 上使用 Joomla 1.5.20、php 5.2.3 和 mysql 5.0.41。您可以下载“com_carousel”文件夹(我在“管理员/组件”文件夹中)from here 的 zip 文件。我还在数据库中正确注册了组件,这样我就可以在后端的“组件”菜单下看到它。这是用于创建表“jos_carousel”的 SQL:

CREATE TABLE `jos_carousel` (
`id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`title` VARCHAR( 255 ) NOT NULL ,
`description` TEXT NOT NULL ,
`published` TINYINT( 1 ) UNSIGNED NOT NULL DEFAULT '0'
) ENGINE = innodb;

请帮忙。

Rgds, 西蒙

【问题讨论】:

快速的想法:你有没有看过这本书是否有任何相关的勘误表? packtpub.com/… ...到目前为止,该书已提交 23 处更正,您可以在该页面上查看。 您真的应该考虑使用 MVC 方法为 Joomla 开发组件,这里有一个很棒的教程 - joomladevuser.com/tutorials/components Matt - 浏览了勘误表,但没有影响我的代码。 Martin,我知道 MVC 方法最适合开发我的组件,但我想先了解组件开发的非常底层的基础知识,然后再考虑 MVC 架构。 【参考方案1】:

我花了一些时间调试您的扩展程序并找到了您遇到的奇怪行为的原因。您没有将 $option 变量传递给编辑表单。因此,当提交表单时,Joomla 现在不会加载哪个组件来处理请求,这就是它只呈现主管理页面的原因。

解决此问题的最简单方法是手动将“com_carousel”添加到编辑表单的隐藏字段(admin.carousel.html.php 中的函数 editCarousel())。

替换

<input type="hidden" name="option" value="<?php echo $option; ?>" />

<input type="hidden" name="option" value="com_carousel" />

如果你真的想使用 $option 变量,你需要从 admin.carousel.php 文件中传递它。

仍有一些东西不起作用(主要是发布/取消发布),但本书后面会介绍。一旦你完成了学习 Joomla!扩展开发你最好的选择是阅读Mastering Joomla...。我即将读完它,它对我来说是非常宝贵的资源。

祝你所有的 Joomla 好运!扩展:)

【讨论】:

非常感谢 Silvo。您的回答解决了所有问题,现在“保存”、“应用”和“取消”按钮按预期工作。我只是在 admin.carousel.html.php 中的 editCarousel() 的参数和 admin.carousel.php 中的函数调用中添加了 $option,这实际上是根据书本应该是这样的。令人惊讶的是,如此简单的遗漏如何完全搞砸了一切。再次感谢,太糟糕了,我不能投票:-)【参考方案2】:

不确定这是否是问题,但在您的主开关中,您使用一个参数调用 saveCarousel:

case "apply"://NOT WORKING!
    case "save"://NOT WORKING!
        saveCarousel($option);
        break;

在函数定义中它有两个参数:

function saveCarousel($option, $task)

尝试将 $task 变量添加到开关内的函数调用中,如果这改变了任何内容,请告诉我们...

【讨论】:

他应该从函数定义中删除$task var,不需要。 也在这个函数中——函数editCarousel($option)在这一行$id = $cid[0];您应该转换为 int 以避免可能的 sql 注入攻击,例如$id = (int)$cid[0]; 从函数定义中删除了 $task。仍然没有变化:无法更新记录或在数据库中添加新记录。感谢Martin关于sql注入的提示。

以上是关于Joomla 组件开发:保存、应用和取消工具栏按钮不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Joomla组件工具栏按钮不起作用

Joomla 2.5 - 组件开发 - 使用表单

joomla 组件保存创建一个新实例而不是更新

joomla 组件不适用于我的主机帐户

使用保存/取消按钮创建模态视图

Joomla 术语:视图、布局、任务和组件开发