web-dev-qa-db-fra.com

Comment créer une fonctionnalité de champ de formulaire xml pouvant être répétée?

Je construis un composant personnalisé et tout va bien. Je pensais pouvoir essayer la nouvelle fonctionnalité de champ de formulaire xml répétable 3.2. Bien que cela fonctionne, je ne sais pas trop comment sauvegarder les données.

Cela me permet de lancer une modale et d'y créer jusqu'à 999 champs personnalisés que je spécifie. Mais le bouton de sauvegarde vert dans le modal ferme le modal et n'applique pas réellement la sauvegarde?

Est-ce que je manque quelque chose?

-

<field name="list_templates"
    type="Repeatable"
    icon="list"
    description="Main description"
    label="Main Label"
    default="">
    <fields name="params">
    <fieldset hidden="true" name="list_templates_modal" repeat="true">
            <field name="template"
                    label="Template Label"
                    size="30"
                    type="text" />
            <field name="location"
                    label="Location Label"
                    description="desc"
                    size="30"
                    type="filelist"
                    directory="media/editors/tinymce/templates"
                    exclude="index.html"
                    hide_default="true"
                    hide_none="true" />
            <field name="description"
                    label="Description Label"
                    size="30"
                    type="textarea" />
    </fieldset>
    </fields>

Bravo d'avance

Jonny

7
Jonnypixel

Ok, voici la réponse à ma propre question et quelques observations et corrections.

Tout d'abord, lors de l'utilisation de l'exemple de bloc de code dans mon fichier de composant XML personnalisé, j'ai oublié d'ajouter le nom du champ dans ma table de base de données personnalisée.

Ainsi, par exemple: list_templates à partir de l'exemple XML

Doit aller dans la base de données MYSQL dans ma table de composants comme suit:

nom de colonne: list_templates type de colonne: TEXT

Fondamentalement, c'est parce que ses données JSON et il s'intègre mieux dans une colonne de type TEXT.

Prochain...

Il y avait un bogue dans lequel lors de la fermeture du modal, puis de la réouverture, le contenu dupliqué serait dupliqué.

Pour résoudre ce problème, j’ai trouvé le fichier repeatable.js situé dans media/system/js et en ai fait une copie de sauvegarde. J'ai ensuite collé la version non compliquée dans un fichier js répétable et constaté que, en modifiant cette ligne:

30 // Set original content for cancel            
31 origContent = getTrs().clone();

pour ça

30 // Set original content for cancel            
31 origContent = getTrs();

Qu'il corrige réellement le bug de duplication. J'ai fait plusieurs tests pour voir si c'est ce qu'il a fait de bien. Aucune perte de données ne se produit et aucune donnée n'est plus dupliquée. Vous pouvez ouvrir et fermer la boîte modale autant de fois que vous le souhaitez et cela ne vous montrera que les sélections que vous avez enregistrées.

J'ai essayé ceci en fermant le fichier view et en rouvrant également les données et plusieurs autres méthodes, qui fonctionnent toutes.

Et enfin!

Parce que je voulais faire écho au contenu du JSON dans ma vue sous forme de tableau sous le bouton de sélection, j'ai également ajouté quelques éléments à répétable/js pour me permettre de pouvoir enregistrer et appliquer après avoir cliqué sur le bouton de sauvegarde dans le modal.

Cela signifie que lorsque je clique sur enregistrer sur les champs répétables modaux, la page est enregistrée et appliquée, ce qui me permet de collecter les données directement à partir du champ de colonne de la table à afficher sur la page.

J'ai réalisé ceci en ajoutant les deux choses suivantes.

Une fonction pour obtenir la vue = composantnameview à partir de l'URL

 // get the url values function

 function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,    
    function(m,key,value) {
      vars[key] = value;
    });
    return vars;
  }

puis en fixant une varibale pour voir comme si

var componentName = getUrlVars()["view"]; 

puis après la ligne 341

J'ai ajouté ceci

Joomla.submitbutton(''+componentName+'.apply'); 

Maintenant, le bouton modal Enregistrer fait son effet, puis joomla enregistre l’élément et sait à quel composant il l’a enregistré et reste sur la page. Cela me permet de collecter les données de la table mais enregistre également le contenu dans les champs modifiables au cas où l'utilisateur pensait l'enregistrer et cliquait accidentellement sur le groupe de boutons par défaut de l'élément.

J'espère que je peux aider quelqu'un avec ma réponse/post. Si ce n'est pas approprié de mettre tout cela dedans faites le moi savoir et je le déplacerai ailleurs.

-

6
Jonnypixel