2017-09-16 80 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; 
}