【问题标题】:JRegistry exists() returns empty arrayJRegistry exists() 返回空数组
【发布时间】:2013-05-23 07:53:38
【问题描述】:

我试图将表单数据保存到数据库。在控制器的save()函数中有一条语句

$data = $model->validate($form, $data);

但它总是返回空。我将问题追踪到 /libraries/joomla/form/form.php 中的 filter() 函数(随 joomla 包一起提供)。这是一些代码(缩短):

    $input = new JRegistry($data);
    $output = new JRegistry;

    foreach ($fields as $field)
    {   
            // Initialise variables.
            $name = (string) $field['name'];  
    if ($input->exists($name)){
       $output->set($name, $this->filterField($field, $input->get($name, (string)  field['default'])));
    }      
}

$input 看起来像:

JRegistry Object ( [data:protected] => stdClass Object ( [jform] => stdClass Object ( [title] => Utility Model/Patent application [ap_name] => d ...) [option] => com_eipoapplications [task] => save ) )

并且循环中的每个 $name 始终包含表单元素名称(如 'title'、'ap_name' ... )。 但是 if 条件语句总是返回 false。有没有人帮我知道为什么 JRegistry exists() 函数找不到元素?

【问题讨论】:

    标签: joomla joomla2.5 joomla-extensions


    【解决方案1】:

    我认为您的表单和数据之间存在不一致。

    假设表单包含名称为title 的字段。 $data 数组应该在同名键下有一个值:

    $data = array(
      'title' => 'Utility Model/Patent application',
      'ap_name' => 'd'
    );
    

    或者使用 print_r

    Array
    (
        [title] => Utility Model/Patent application
        [ap_name] => d
    )
    

    如果该字段没有数据,则省略验证。如果所有数据键都错误,函数返回空数组。

    问题是,它是怎么发生的:/

    【讨论】:

    • 感谢您的评论。让我添加更多信息。
    • 如果您不使用本机 JControllerLegacy->save,请确保 $data 已从帖子正确填充:$data = $this->input->post->get('jform', array(), 'array'); 并且模型中的表单控件名称为 jform
    • $data 看起来像:Array ( [jform] => Array ( [title] => Utility Model/Patent application [ap_name] => d。我认为问题在于 JRegistry 添加了另一层对象并将 jform 放在 [data:protected] 索引下。该层使表单元素(例如标题)对 JRegistry exists() 函数隐藏。还有其他方法吗?
    • 这就是 JRegistry 的工作方式,这很好,$data 是错误的 :)。不知何故,你没有得到 jform 数组,但可能是整个 POST 数据。请检查您是否正在检索$data,如我上面的评论中所述。一个非标准的解决方案是像这样传递数据进行验证:$data = $model->validate($form, $data['jform']);。您如何检索初始 $data 变量?
    • 谢谢你。这就是问题所在。我使用了$data = JFactory::getApplication()->input->getArray($_POST);,它将整个 $_POST 内容放在 jform (jform->array(POST ITEMS HERE)) 下。我想了解更多关于 JControllerLegacy 的信息。有什么地方可以去吗?再次感谢您!
    猜你喜欢
    • 2012-07-17
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2021-08-11
    • 2017-02-27
    • 2020-04-01
    • 2019-04-17
    相关资源
    最近更新 更多