Joomla 覆盖JControllerForm save()方法以修剪POST数据无效
我有一个组件,它有一个名为Joomla 覆盖JControllerForm save()方法以修剪POST数据无效,joomla,joomla-extensions,overwrite,Joomla,Joomla Extensions,Overwrite,我有一个组件,它有一个名为MyproductControllerGeneralsetting的控制器,它扩展了JControllerPerform。在MyproductControllerGeneralsetting内部,我正在覆盖父类中的save方法,以便修改$\u POST数据,然后覆盖方法调用父类的save方法来进行实际保存 以下是MyproductControllerGeneralsetting中的覆盖方法: /** * We overwrite the saved form data
MyproductControllerGeneralsetting
的控制器,它扩展了JControllerPerform
。在MyproductControllerGeneralsetting
内部,我正在覆盖父类中的save
方法,以便修改$\u POST
数据,然后覆盖方法调用父类的save
方法来进行实际保存
以下是MyproductControllerGeneralsetting
中的覆盖方法:
/**
* We overwrite the saved form data and trim them to avoid spaces
*/
public function save($key = null, $urlVar = null){
if($_POST['jform']){
foreach($_POST['jform'] as $key=>&$value){
$value = trim($value);
}
}
// Finally, save the processed form data (calls JControllerForm-save())
parent::save('id', $urlVar);
}
问题是,即使我在这个覆盖方法中修剪了每个POST数据字段,如果我提交了一些值,比如“value”(注意最后的空格),它们也不会被修剪
我已经检查了JControllerForm
类的save
方法,它似乎是从POST这里获取数据的:
$data = $this->input->post->get('jform', array(), 'array');
也许这就是原因?这是获取缓存数据还是什么?与其直接从
$\u POST
获取值,不如尝试以与父类相同的方式获取和设置数据-使用指向JInput类的(共享)实例的内部指针
这里有一个修改、工作、覆盖的save
方法:
/**
* We overwrite the saved form data and trim them to avoid spaces
*/
public function save($key = null, $urlVar = null){
if($_POST['jform']){
// Get the original POST data
$original = JRequest::getVar('jform', array(), 'post', 'array');
// Trim each of the fields
foreach($original as $key=>$value){
$original[$key] = trim($value);
}
// Save it back to the $_POST global variable
JRequest::setVar('jform', $postData, 'post');
}
// Finally, save the processed form data
return parent::save('id', $urlVar);
}
不管怎么说,控制器是这些事情的错误位置,或者您想在控制器中执行这些操作的具体原因是什么? 最好查看模型中的
prepareTable
函数。在那里,您已经有了要保存属性的表对象,并且可以在保存之前对其进行清理
其他信息:
如果扩展JControllerForm
,则可以指定
/**
* @since 1.6
*/
protected $view_item = 'item';
/**
* @since 1.6
*/
protected $view_list = 'items';
默认情况下,
$view\u项
将等于上下文。$view\u列表
尝试猜测$view\u项目的复数版本
。通常是在末尾添加一个s
。好的,但我也会根据帖子数据是否有效进行重定向。我猜从模型重定向不是一个好的MVC实践?我认为如果表单未能保存,默认情况下,控制器将重定向回带有错误消息的表单。这就是为什么你可以在控制器中指定一个项目和一个列表视图。“这就是为什么你可以在控制器中指定一个项目和一个列表视图。”你能就这一部分进行详细说明吗?在回答中添加了一些信息这也让我很吃惊,但不是自动用s进行多元化,而是猜测我的顶层视图是“awardsentries”,而不是s“awardsentrys”。这在技术上是正确的,但在我能找到的任何地方的类命名约定中都没有提到。我花了很多猜测才来到这里。我认为$postData
应该是$original
,或者$original[$key]
应该是$postData[$key]