我正在尝试创建一个Joomla(3.x)组件并努力使用子表单。除了例如,使用子表单似乎没有太多文档。 https://docs.joomla.org/Subform_form_field_type
对于我的组件,我有一个父表和子表中的一些关联数据库行。
我们的想法是使用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
我可以在$data
之后更改$this->getItem()
字段,例如$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;
}
修改 已经回答了我自己的问题。
答案 0 :(得分:1)
没关系。休息了一段时间后我再次尝试了(再次检查表格输入并深呼吸)。
这是使用的格式:
$ sudo apt-get install clang-3.6
[sudo] password for xristina:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package clang-3.6
E: Couldn't find any package by regex 'clang-3.6'
这似乎有效!我现在正在$data->set('nameofsubformfield',
[
'nameofsubformfield0' => [
'fieldwithinsubform' => 'value-of-field-within-subform'
]
]);
函数中使用它。只需在getItem
之后循环并放置循环计数器代替零。有关某些上下文,请参阅下面的代码(函数位于父模型中)。
nameofsubformfield