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]