2017-09-16 12 views
0

나는 Joomla (3.x) 구성 요소를 만들고 하위 양식 사용에 어려움을 겪고 있습니다. 예를 들어 하위 폼을 사용하는 데 대한 많은 문서가없는 것 같습니다. https://docs.joomla.org/Subform_form_field_typeJoomla 하위 양식의 양식 데이터를 설정하는 방법은 무엇입니까?

내 구성 요소에는 하나의 상위 테이블과 하위 테이블의 일부 관련 데이터베이스 행이 있습니다.

아이디어는 양식에 대한 Joomla의 XML 구문을 사용하여 해당 상위 테이블에 대한 편집 양식을 표시하고 해당 양식에서 여러 항목 (하위 테이블의 관련 행)이있는 하위 양식을 표시합니다.

부모 테이블 필드를 수정할 수 있지만 관련 하위 테이블 행 (물론 하나는 부모 테이블과 관련된 개별 행을 개별적으로 편집 할 수 있음)을 수정할 수 있기를 원하지만 그럴 것이라고 생각합니다. 끔찍한 사용자 경험). 아니면 내가이 일에 잘못 접근하고 있는가?

이제 서브 폼을 구현/표시하는 방법을 알고 부모 테이블 필드를 표시하고 해당 필드에 올바른 데이터를 채우는 방법을 알고 있습니다. 그러나 상위 폼을 사용하여 하위 폼을 채우거나 참조하려면 어떻게해야합니까?

이 기능은 내 구성 요소 모델 (에서 상속)에 있습니다.

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

는 편집 : 이미 내 자신의 질문에 대답했다.

답변

0

신경 쓰지 마세요. 나는 잠시 쉬고 다시 (폼 입력을 검사하고 심호흡을) 시도한 후에 그것을 알아 낸 것입니다.

$data->set('nameofsubformfield', 
[ 
    'nameofsubformfield0' => [ 
     'fieldwithinsubform' => 'value-of-field-within-subform' 
    ] 
]); 

이 작동하는 것 같다 :

이 사용되는 형식입니다! 지금 getItem 기능 내에서 사용하고 있습니다. nameofsubformfield 뒤에 루프 카운터를 0 대신에 넣어야합니다. 일부 컨텍스트 (상위 모델에있는 함수)에 대해서는 아래 코드를 참조하십시오.

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