2

我有一个组件,它有一个名为MyproductControllerGeneralsettingextends的控制器JControllerForm。在里面MyproductControllerGeneralsetting我覆盖save父类的方法以修改$_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 数据字段,但如果我提交了一些值,例如“值”(注意最后的空格),它们不会被修剪。

我检查了类的save方法,JControllerForm它似乎是从这里的 POST 获取数据:

$data  = $this->input->post->get('jform', array(), 'array');

也许这就是原因?这是获取缓存数据还是什么?

4

2 回答 2

4

与其尝试$_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);
}
于 2013-04-29T14:33:24.577 回答
4

无论如何,控制器都是错误的地方,或者您想在控制器中执行此操作是否有特定原因?更好地查看prepareTable模型中的功能。在那里,您已经有了要保存属性的表格对象,并且可以在保存之前对其进行清理。

附加信息:如果您扩展JControllerForm,您可以指定

/**
 * @since   1.6
 */
protected $view_item = 'item';

/**
 * @since   1.6
 */
protected $view_list = 'items';

默认情况下,$view_item将等于上下文。试图$view_list猜测. $view_item通常s在末尾添加一个。

于 2013-04-29T14:42:03.390 回答