如何为 Joomla 子表单设置表单数据?

How to set form data for a Joomla subform?

我正在尝试创建一个 Joomla (3.x) 组件并在使用子表单方面遇到困难。除了例如,似乎没有太多关于使用子表单的文档。 https://docs.joomla.org/Subform_form_field_type

对于我的组件,我有一个父项 table 和一些来自子项的关联数据库行 table。

想法是使用 Joomla 的 XML 表单语法为该父项 table 显示一个编辑表单,并且在该编辑表单中还显示一个包含多个项目的子表单(来自子项的关联行table).

我希望能够修改父 table 字段,但也可以一次性修改关联的子 table 行(当然可以只编辑与父 [=] 关联的每一行49=] 单独但我猜这将是一个糟糕的用户体验)。还是我处理这件事的方式不对?

现在,我知道如何 implement/show 子表单,也知道如何显示父 table 字段并用正确的数据填充这些字段。但是如何使用父表单填充或引用子表单?

我的组件模型中有这个函数(继承自 JModelAdmin)。

protected function loadFormData()
{
  $data = JFactory::getApplication()->getUserState('com_mycomp.edit.parent.data', array());

  if (empty($data))
  {
    $data = $this->getItem();
    // how to refer to subform fields inside $data?
  }

  return $data;
}

我知道一个字段是 name 还是 title 我可以在 $this->getItem() 之后更改 $data 对象,例如$this->set('name', 'John Doe').

假设类型 subform 的字段具有 booksname 属性,我想插入一行或多行,我将如何引用它?我尝试过各种形式的点语法,例如:$data->set('books.1.childfield')$data->set('books.pages1.childfield')。但它似乎没有提到正确的形式。

在同一个模型文件中当然有 getForm 函数,但是我不认为子表单应该独立于包含的父表单加载?

public function getForm($data = array(), $loadData = true)
{
  $app = JFactory::getApplication();

  $form = $this->loadForm('com_mycomp.parent', 'parent', array('control' => 'jform', 'load_data' => $loadData));
  if (empty($form))
  {
    return false;
  }

  return $form;
}

编辑: 已经回答了我自己的问题。

没关系。休息了一段时间再试(再次检查表单输入并深吸一口气)后我想通了。

这是使用的格式:

$data->set('nameofsubformfield',
[
  'nameofsubformfield0' => [
    'fieldwithinsubform' => 'value-of-field-within-subform'
  ]
]);

这似乎行得通!我现在在 getItem 函数中使用它。只需要循环并将循环计数器放在 nameofsubformfield 之后的零位置。有关某些上下文,请参见下面的代码(函数驻留在父模型中)。

public function getItem($pk = null)
  {
    $data = parent::getItem((int)$pk);
    if (empty($data))
    {
       return false;
    }
    $childModel = JModelLegacy::getInstance('child', 'MycompModel');
    $rowChildren = $childModel->getChildrenByParentID((int)$data->get('id'));
    $childArray = [];
    for ($i = 0; $i < count($rowChildren); $i++)
    {
        $childArray['children'. $i] = [
            'name' => $rowChildren[$i]['name']
        ];
    }
    $data->set('children', $childArray);
    return $data;
}