覆盖JControllerForm save()方法修剪POST数据无效

时间:2013-04-29 14:16:53

标签: joomla joomla-extensions overwrite

我的组件有一个名为MyproductControllerGeneralsetting的控制器,它扩展了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数据字段,如果我提交了一些值,例如'value'(注意最后的空格),它们也不会被修剪。

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

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

也许这就是原因?这会得到缓存数据吗?

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:4)

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

其他信息: 如果您展开JControllerForm,则可以指定

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

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

默认情况下,$view_item将等于上下文。 $view_list尝试猜测$view_item的复数版本。通常是在末尾添加s