【问题标题】:Overwriting JControllerForm save() Method to Trim POST Data Has No Effect覆盖 JControllerForm save() 方法来修剪 POST 数据无效
【发布时间】:2013-04-23 06:07:58
【问题描述】:

我有一个组件,它有一个名为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'(注意最后的空格),它们不会被修剪。

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

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

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

【问题讨论】:

    标签: joomla joomla-extensions overwrite


    【解决方案1】:

    不要尝试直接从 $_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);
    }
    

    【讨论】:

    • 我认为$postData 应该是$original,或者$original[$key] 应该是$postData[$key]
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 好的,但我也在根据 POST 数据是否有效进行重定向。我猜从模型重定向不是一个好的 MVC 做法?
    • 我认为如果表单保存失败,控制器默认会重定向回表单并显示错误消息。这就是您可以在控制器中指定项目和列表视图的原因。
    • "这就是为什么你可以在控制器中指定一个项目和一个列表视图。"你能详细说明这部分吗?
    • 在答案中添加了一些信息
    • 这也引起了我的注意,但不是自动用 s 复数,而是猜测我的顶级视图是“awardsentries”而不是“awardsentrys”。这在技术上是正确的,但是在我能找到的任何地方的类命名约定中都没有提到这一点。花了很多猜测才把我带到这里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2021-11-21
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    相关资源
    最近更新 更多