如何为Joomla子表单设置表单数据?
我试图创建一个Joomla(3.x)组件,并努力使用子窗体。除了例如使用子表单之外,似乎没有太多的文档。 https://docs.joomla.org/Subform_form_field_type如何为Joomla子表单设置表单数据?
对于我的组件我有一个父表和子表的一些相关的数据库行。
的想法是,以显示使用Joomla的XML语法形式,并在编辑表单还显示有多个项目子窗体(从子表中的相关行)是父表的编辑表单。
我想能够修改父表字段,但也可以在关联的子表行(一个可以编辑每个与父表单独关联的行,但我猜这将是一个糟糕的用户体验)。还是我以错误的方式接近这件事?
现在,我知道如何实现/显示子窗体,也知道如何显示父表的字段和填充用正确的数据这些领域。但是,如何使用父窗体填充或引用子窗体?
我有我的组件模型,这里面的功能(从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
的name
属性为books
,我想插入一行或多行,我将如何引用它?我试过各种形式的点语法,例如:$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;
}