2017-09-16 3 views
0

J'essaye de créer un composant de Joomla (3.x) et de lutter avec l'utilisation de sous-formulaires. Il ne semble pas y avoir beaucoup de documentation pour l'utilisation de sous-formulaires, outre par exemple. https://docs.joomla.org/Subform_form_field_typeComment définir les données de formulaire pour un sous-formulaire Joomla?

Pour mon composant, j'ai une table parente et quelques lignes de base de données associées d'une table enfant. L'idée est d'afficher un formulaire d'édition pour cette table parente en utilisant la syntaxe XML de Joomla pour les formulaires et dans ce formulaire d'édition affiche également un sous-formulaire avec plusieurs éléments (les lignes associées de la table enfant). J'aimerais pouvoir modifier les champs de la table parente, mais aussi les lignes de la table enfant associée (bien sûr, on pourrait éditer chaque ligne associée individuellement à la table parente, mais je suppose que ce serait un expérience utilisateur terrible). Ou suis-je approcher cette chose dans le mauvais sens?

Maintenant, je sais comment implémenter/montrer un sous-formulaire et aussi savoir comment afficher les champs de la table parent et remplir ces champs avec les bonnes données. Mais comment puis-je remplir ou faire référence au sous-formulaire en utilisant le formulaire parent?

J'ai cette fonction dans mon modèle de composant (qui hérite de 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; 
} 

Je sais si un champ est appelé name ou title je peux changer l'objet $data après $this->getItem(), par exemple $this->set('name', 'John Doe'). Disons que le champ de type subform a un attribut de books et que je voulais insérer une ou plusieurs lignes, comment je me référerais à cela? J'ai essayé la syntaxe de point sous diverses formes, par exemple: $data->set('books.1.childfield') ou $data->set('books.pages1.childfield'). Mais il ne semble pas se référer à la bonne forme.

Il ya bien sûr getForm fonction dans le même fichier de modèle, mais je ne pense pas qu'un sous-formulaire doit être chargé indépendamment du formulaire parent contenant?

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: déjà répondu à ma propre question.

Répondre

0

Peu importe. Je me suis rendu compte après avoir pris une pause pendant un certain temps et essayer encore (inspecter les entrées de forme encore et prendre une profonde respiration).

C'est le format utilisé:

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

Cela semble fonctionner! J'utilise ceci dans la fonction getItem maintenant. Il suffit de boucler et de mettre le compteur de boucle à la place du zéro après nameofsubformfield. Voir le code ci-dessous pour un contexte (la fonction réside dans le modèle parent).

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