2017-09-16 7 views
0

私はJoomla(3.x)コンポーネントを作成しようとしており、サブフォームの使用に苦労しています。たとえば、サブフォーム以外にも、サブフォームを使用するためのドキュメントはあまりないようです。 https://docs.joomla.org/Subform_form_field_typeJoomlaサブフォームのフォームデータを設定する方法は?

私のコンポーネントでは、子テーブルの親テーブルと関連するデータベース行が1つあります。

フォームは、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という文字が1つ以上挿入されていますが、どのように参照すればいいですか?私はさまざまな形式のドット構文を試しました。たとえば、$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; 
} 

EDIT: はすでに自分の質問に答えました。

答えて

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; 
} 
関連する問題