web-dev-qa-db-fra.com

Comment utiliser une mise en page personnalisée avec des champs de sous-formulaire JForm?

Je souhaite réutiliser certaines formes dans mon composant. Le champ de sous-formulaire fait le travail. Cependant, je dois supprimer certains champs et/ou groupes de champs lors de l'affichage du sous-formulaire.

J'ai essayé d'utiliser les méthodes JFormremoveGroup() et removeField(), mais elles ne seront pas supprimées du sous-formulaire.

Je suppose qu'une nouvelle mise en page est la voie à suivre. Je pourrais spécifier la mise en page dans le champ au lieu de layout='joomla.form.field.subform.default'.
Cela fonctionnerait-il?

Si oui, comment puis-je implémenter la mise en page personnalisée?
Des exemples seraient très appréciés.

5
nimble

Pour placer un sous-formulaire (Joomla! 3.6+) dans un autre formulaire "maître" et utiliser une présentation personnalisée:

1) Dans le fichier XML principal JForm, utilisez le type de champ de sous-formulaire.

<field name= "fieldname"
    description= "Field name description"
    type= "subform"
    label= "Field Label"
    required= "true"
    formsource= "/administrator/components/com_mycomponent/models/forms/myform.xml"
    layout="myfolder.mylayoutfile"
/>

formsource est le chemin d'accès au sous-formulaire XML JForm à restituer.

layout est le chemin d'accès de la notation par points au fichier de disposition personnalisé. Vous devez avoir un dossier "layouts" dans la structure de répertoires de votre composant. Donc, ce serait com_mon composant/layouts. Sous le dossier Layouts, vous pouvez créer d'autres dossiers (si vous le souhaitez). Dans l'exemple ci-dessus, "myfolder" est un dossier situé sous "layouts" et "mylayoutfile" est un fichier de mise en forme personnalisé PHP) dans ce dossier. Ne spécifiez pas "layouts" dans la notation pointée. chemin et ne pas ajouter .php au nom de fichier.

2) Ceci est un exemple de mise en page PHP pouvant être modifié à vos fins.

<?php
defined('_JEXEC') or die;
extract($displayData);

$form = $forms[0];
?>

<div class="subform-wrapper">
    <?php foreach($form->getGroup('') as $field): ?>
        <?php echo $field->renderField(); ?>
    <?php endforeach; ?>
</div>
2
nimble

Modifié pour ajouter une réponse spécifique au type de champ de sous-formulaire:

Après l'avoir examiné correctement, attacher votre propre mise en page au type de champ de sous-formulaire est extrêmement facile.

Créez un dossier layouts dans le même dossier de composant parent (site ou admin) que le fichier XML et placez-y votre mise en page:

-com_myComponent 
    - controllers
    - layouts
        - mylayout.php
    - models
        - forms

Ajoutez layout="mylayout" À votre champ de sous-formulaire dans votre XML et vous voilà.

Ça ne peut pas être plus facile!

Si vous notez également que vos noms de fichiers de présentation peuvent être identiques à ceux par défaut, les vôtres seront toujours chargés en cas de conflit. Ainsi, par exemple, même s'il existe une structure de sous-formulaire appelée default.php, Vous pouvez toujours nommer la vôtre default.php Et tout ira bien.

Réponse pré-édité:

Voici un exemple de la façon d'inclure une mise en page à partir de l'un des miens:

<?php echo JLayoutHelper::render('layouts.dupebutton', $dupeData, JPATH_COMPONENT_ADMINISTRATOR); ?>
  • Le premier argument est 'layoutFolder.layoutName'.
  • Le deuxième argument est la donnée à transmettre à la mise en page (vous allez transmettre votre formulaire/vos champs).
  • Troisième est le chemin de base à utiliser pour rechercher le dossier/fichier de disposition (dans ce cas, le chemin d'accès à l'installation administrative de mon composant).

Vous devez ajouter quelque chose de similaire à cela lorsque vous souhaitez que votre mise en page soit rendue.

Mon dossier com_myComponent Dans le dossier administrator de Joomla (c'est-à-dire JPATH_COMPONENT_ADMINISTRATOR) A cette structure:

-com_myComponent 
    - classes
    - controllers
    - layouts
        - dupebutton.php
        - anotherlayout.php

L'assistant de présentation de Joomla transmettra les données que vous avez spécifiées à la présentation lors du rendu. Lorsque la mise en page est rendue, elle contient une variable pré-assignée appelée $displayData. Vous pouvez simplement utiliser cette variable telle quelle, mais il semble que la convention Joomla soit d'ajouter cette ligne dans les balises <?php En haut de vos fichiers de présentation:

$data = $displayData;

Il ne reste plus qu'à créer la mise en page à l'aide des champs de formulaire souhaités. Faites-moi savoir si vous souhaitez également des exemples, mais vous savez déjà comment.

Incidemment, je suis presque sûr qu'il est en fait possible de choisir parmi des sous-groupes de formulaires, mais la syntaxe n'est pas très intuitive ou bien documentée - la dernière fois que j'ai essayé de le faire, j'ai abandonné à peu près ce que vous êtes maintenant.

Il existe également de nombreuses façons d’atteindre ce que vous voulez. Il existe des alternatives à l’utilisation d’une mise en page. Néanmoins, c'est une solution aussi efficace que tout autre, alors je m'en tiens à cela.

4
chrBrd