2017-09-16 50 views
0

我试图创建一个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; 
} 

我知道,如果一个字段被称为nametitle我可以只改变$this->getItem()$data对象,例如$this->set('name', 'John Doe')

假设字段subformname属性为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

没关系。我休息了一段时间后又想了一遍,再次尝试(再次检查表单输入并深呼吸)。

这是使用的格式:

$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; 
}