如何在Joomla前端文章提交覆写中添加HTML输入并保存到_content表attribs字段
问题根因
Joomla的JForm组件默认开启了字段白名单校验,仅会处理在表单XML定义中存在的字段,不在白名单内的POST字段会被直接过滤,这就是你添加的vidurl字段值返回null的原因。
而image_intro是com_content文章模型原生定义的字段,本身就在白名单内,所以就算你替换了前端HTML代码也能正常保存。
解决方案(优先选第一种,无需改核心,升级兼容)
方案1:通过内容插件注入自定义字段到表单白名单
创建一个自定义内容插件,通过onContentPrepareForm事件将你的自定义字段注入到com_content的表单定义中,示例代码如下:
<?php defined('_JEXEC') or die; class PlgContentCustomvidfield extends JPlugin { public function onContentPrepareForm($form, $data) { // 仅对com_content的文章提交表单生效 if ($form->getName() !== 'com_content.article') { return true; } // 加载自定义字段定义 $fieldXml = ' <form> <fields name="attribs"> <field name="vidurl" type="text" filter="safehtml" label="视频地址" /> </fields> </form> '; $form->load($fieldXml); return true; } }
插件安装启用后,你的前端自定义输入字段就会被JForm正常识别,值会自动序列化保存到#__content表的attribs字段中。
方案2:通过保存事件手动处理字段值
如果你不想创建新的字段定义,可以通过onContentBeforeSave事件手动接收POST的字段值合并到文章数据中:
public function onContentBeforeSave($context, $article, $isNew) { if ($context !== 'com_content.article') { return true; } $input = JFactory::getApplication()->input; $jform = $input->get('jform', [], 'array'); if (isset($jform['attribs']['vidurl'])) { $attribs = new JRegistry($article->attribs); $attribs->set('vidurl', $jform['attribs']['vidurl']); $article->attribs = $attribs->toString(); } return true; }
注意事项
- 不要直接修改com_content的核心XML表单定义,否则Joomla版本升级后修改会被覆盖
- 字段过滤规则可根据业务需求调整,比如需要存储原生HTML可改为
filter="raw",但要做好输入校验避免XSS安全问题
内容的提问来源于stack exchange,提问作者Nadal
相关产品推荐
相关产品推荐

