我试图创建一个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;
}
编辑: 已经回答了我的问题。