如何为 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
的字段具有 books
的 name
属性,我想插入一行或多行,我将如何引用它?我尝试过各种形式的点语法,例如:$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;
}
我正在尝试创建一个 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
的字段具有 books
的 name
属性,我想插入一行或多行,我将如何引用它?我尝试过各种形式的点语法,例如:$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;
}