在Joomla组件中提交HTML表单的PHP代码需添加到哪个文件?
Joomla JCB 组件表单提交处理方案
第一步:修改表单action指向
给现有form添加action属性,指向你组件的控制器处理方法,参考修改代码:
<form method="post" action="index.php?option=com_你的组件名&task=自定义控制器名.execScript">
将com_你的组件名替换为JCB生成的组件实际名称,自定义控制器名可以用你现有的项目列表控制器,也可以单独新建一个控制器,execScript就是你要编写的提交处理函数名。
第二步:在对应控制器文件中添加处理函数
JCB生成的前台组件控制器默认路径为:组件前台目录/controllers/自定义控制器名.php,打开该文件后直接在控制器类内部添加execScript方法即可,参考代码:
public function execScript() { // Joomla标配CSRF校验,必加防止恶意请求 JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); // 获取提交的勾选复选框数据 $checkedItems = $this->input->get('test', array(), 'array'); // 可根据自身业务逻辑补充获取对应项目名称的代码 // 转义参数后传递给bash脚本,避免命令注入风险 $itemParam = escapeshellarg(implode(',', $checkedItems)); // 填bash脚本的绝对路径,需要提前给web运行用户开通执行权限 $scriptPath = '/你的脚本存放绝对路径/xxx.sh'; $execResult = shell_exec("{$scriptPath} {$itemParam}"); // 执行完成后跳转回原列表页即可 $this->setRedirect(JRoute::_('index.php?option=com_你的组件名&view=原列表视图名称', false)); }
另外需要在原form代码的闭合标签之前,添加Joomla CSRF token生成代码:
<?php echo JHtml::_('form.token'); ?>
注意事项
- 所有传递给shell执行的参数必须用
escapeshellarg做转义处理,避免命令注入漏洞 - bash脚本需要给Web服务运行用户(比如www-data)开通执行权限,路径必须填写绝对路径避免寻址错误
- 调试阶段可以打印
shell_exec的返回值,排查脚本执行相关问题
内容的提问来源于stack exchange,提问作者shaded
相关产品推荐
相关产品推荐

