Migrationd'un module vers j4

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • #16
    Je suis justement sur une migration repeatable => subform sur un de mes modules.

    Au niveau du xml du module en J3, j'avais
    Code:
    <field name="slideslist" showon="cg_img_type:files"
    type="repeatable" label="CG_SLIDE_LIST" description="CG_SLIDE_LIST_DESC" select="CG_SLIDE_LIST">
    <fieldset hidden="true" name="slideslist_modal" repeat="true">
    <field name="file_name" type="media" default="" label="FILE_NAME" description="FILE_NAME_DESC" preview="tooltip" preview_width="100" preview_height="100">
    </field>
    </fieldset>
    </field>
    En J4, c'est devenu :
    Code:
    <field name="slideslist" showon="cg_img_type:files"
    type="subform" multiple ="true"
    formsource="/modules/mod_cg_parallax/mod_cg_imgs.xml" />
    avec un fichier mod_cg_imgs.xml qui contient
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <form>
    <fieldset name="slideslist_modal" >
    <field name="file_name" type="media" default="" label="FILE_NAME" description="FILE_NAME_DESC" preview="tooltip" preview_width="100" preview_height="100">
    </field>
    </fieldset>
    </form>
    Facile, non ?

    Eh bien, pas tout à fait, car les informations stockées dans la base de données ne sont plus compatibles.

    En J3 et en J4, pour récupérer les images, on n'a pas la même structure, donc, 1ere bidouille pour fonctionner dans les 2 versions :

    Code:
    if (is_object($item->slideslist)) { // joomla 4.0 : subform
    $unearray = [];
    foreach ($item->slideslist as $uneimage) {
    $unearray[] = $uneimage->file_name;
    }
    } else { // joomla 3.0 : repeatable
    $imglist = json_decode($item->slideslist);
    $unearray = $imglist->file_name;
    }
    Pour l'instant, j'ai un souci au niveau de l'interface d'admin, car, là aussi, les informations étant stockées différemment, je n'ai pas récupéré mes images J3 dans la version J4 et réciproquement.

    Autrement dit, si on veut un seul source J3/J4, il faut que je trouve au niveau du XML la version Joomla pour afficher "repeatable" ou "subform" (car repeatable plante le chargement du xml en J4).

    Mais peut-être que tout sera résolu par le PR en cours https://github.com/joomla/joomla-cms/pull/28319

    Pascal
    Dernière édition par pmleconte à 17/09/2020, 20h11
    If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

    Commentaire


    • #17
      Envoyé par pmleconte Voir le message
      Je suis justement sur une migration repeatable => subform sur un de mes modules.

      ....

      Autrement dit, si on veut un seul source J3/J4, il faut que je trouve au niveau du XML la version Joomla pour afficher "repeatable" ou "subform" (car repeatable plante le chargement du xml en J4).

      Mais peut-être que tout sera résolu par le PR en cours https://github.com/joomla/joomla-cms/pull/28319

      Pascal
      Bonjour à tous.

      Juste pour info : le champ de type "repeatable" était marqué "obsolète" depuis J3.6 et il était conseillé de la remplacer par le champ "subform" de type multiple.

      Voir : https://docs.joomla.org/Repeatable_form_field_type/fr

      Je pense qu'il doit donc être possible d'avoir un même code J3.6+ et J4, mais je suis moins avancé que vous sur le portage J4 de mes composants.

      J'avais moi aussi commencé à faire quelques notes pour l'utilisation du champ subform : https://ordi-genie.com/joomla/develo...-champ-subform

      Dernière édition par roland_d_alsace à 17/09/2020, 22h19
      A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
      Rejoignez le Joomla Users Groupe Alsace...
      roland_d_alsace va-t-il devenir roland_du_grand_est ?

      Commentaire


      • #18
        génial ! quel est la différence entre les deux j'ai du mal a comprendre peut on réallement charger un sous formulaire dynamiquement ?
        genre une liste déroulante qui charge les formulaires en fonction

        pour le jquery un petit bout de code ?
        Société : http://www.com3elles.com
        Bénévole : http://www.flexicontent.org

        Commentaire


        • #19
          je me bat avec le jquey le dociment.ready etc ..... il me renvoit toujours jquery not define ...
          Société : http://www.com3elles.com
          Bénévole : http://www.flexicontent.org

          Commentaire


          • #20
            Bonjour Y.,

            Comme signalé par Manu, il faut vérifier l'ordre de chargement de tes scripts. Jquery doit être dans les 1er.

            Pascal
            If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

            Commentaire


            • #21
              Bonjour,

              Je viens de me prendre un sacré mal de tête, mais, je pense qu'avec un minimum de modification, on peut rendre compatible des modules J3/J4.

              Comme évoqué plus haut, il existe la possibilité de créer 2 versions des modules, une par version Joomla, il est possible aussi de créer un fichier script d'installation qui vérifiera les versions. J'ai essayé de faire plus simple.

              J'ai créé 2 fields : joomversion et joomversionsub qui permettent de déterminer au niveau du fichier xml du module si on est en Joomla 3 ou 4 et de montrer les champs en fonction du résultat par la commande showon.

              Il y en a 2 parce que les subforms n'existent pas à la création du formulaire (voir https://docs.joomla.org/Subform_form_field_type ).

              Au niveau d'un formulaire, il faut ajouter :
              Code:
              <fieldset name="<name>" addfieldpath="/modules/<module>/models/fields">
              <field name="joomversion" type="joomversion" default="j4" class="hidden"/>
              Ensuite, il suffit d'ajouter showon="joomversion:j3" ou showon="joomversion:j4" au niveau des champs que l'on veut cacher/montrer en fonction de la version Joomla.

              Dans mon cas, en J3, j'ai des champs "repeatable" (je sais Roland, je devrais avoir honte) et, en J4, ils sont devenus des subforms.

              Mon problème est que mes subforms sont dans un subform, d'où mon 2eme field : versionjoomsub.

              Donc, j'ai dans mon xml le code suivant :
              Code:
              <fieldset name="<name>" addfieldpath="/modules/<module>/models/fields">
              <field name="joomversionsub" type="joomversionsub" default="j4" class="hidden"/>
              Ensuite, il suffit d'ajouter showon="joomversionsub:j3" ou showon="joomversionsub:j4" au niveau des champs que l'on veut cacher/montrer en fonction de la version Joomla.

              Les 2 fields sont dans le zip models.zip : models.zip

              Je viens de mettre à jour mon module CG Parallax avec ce principe : https://www.conseilgouz.com/cg-parallax

              Pascal
              Fichiers joints
              If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

              Commentaire


              • #22
                Bonjour,

                Pour résoudre les problèmes jQuery absent en J4, j'ai modifié les models pour qu'ils soient en "pur javascript".

                Pascal
                Fichiers joints
                If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

                Commentaire


                • #23
                  Bon génial !!! grace a ton code j'ai corrigé le chargement du css !!!
                  résultat, un icon picker !
                  Cliquez sur l'image pour l'afficher en taille normale

Nom : 2020-09-21_09h07_34.png 
Affichages : 99 
Taille : 19,5 Ko 
ID : 2020777
                  Société : http://www.com3elles.com
                  Bénévole : http://www.flexicontent.org

                  Commentaire


                  • #24
                    Bon j'avance il ne reste plus qu'à remettre les quickicons ...
                    j'ai essayer de recuperer le code du module de j4
                    mis dans mon helper
                    Code:
                    public static function &getIconFromPlugins(Registry $params, CMSApplication $application = null)
                        {
                            $key     = (string) $params;
                            $context = (string) $params->get('context', 'mod_quickicon');
                            $application = Factory::getApplication();
                            PluginHelper::importPlugin('quickicon');
                            $buttons[$key] = [];
                                $arrays = (array) $application->triggerEvent(
                                    'onGetIcons',
                                    new QuickIconsEvent('onGetIcons', ['context' => $context])
                                );
                                foreach ($arrays as $response)
                                {
                                    if (!\is_array($response))
                                    {
                                        continue;
                                    }
                                    foreach ($response as $icon)
                                    {
                                        $default = array(
                                            'link'    => null,
                                            'image'   => null,
                                            'text'    => null,
                                            'name'    => null,
                                            'linkadd' => null,
                                            'access'  => true,
                                            'class'   => null,
                                            'group'   => 'MOD_QUICKICON',
                                        );
                                        $icon = array_merge($default, $icon);
                                        if (!\is_null($icon['link']) && !\is_null($icon['text']))
                                        {
                                            self::$buttons[$key][] = $icon;
                                        }
                                    }
                                }
                                return self::$buttons[$key];
                        }
                    essayer de l'adapté à ma sauce ...
                    mais voici l'erreur ...
                    Code:
                    Access to undeclared static property: modDashboardHelper::$buttons
                    dans mon entrée
                    Code:
                    $systme_buttons   = modDashboardHelper::getIconFromPlugins($params);
                    Merci pour votre future aide !
                    Société : http://www.com3elles.com
                    Bénévole : http://www.flexicontent.org

                    Commentaire


                    • #25
                      Bonjour Yannick.

                      Envoyé par y.berges Voir le message
                      Code:
                      $systme_buttons = modDashboardHelper::getIconFromPlugins($params);
                      N'aurais-tu pas une inversion de lettres là dedans ? Ne devrait-ce pas être $system_buttons = ? Disons que ça me parait juste logique…
                      Cordialement.
                      __
                      Eddy !!!
                      Tutoriels BreezingForms en Français : https://www.breezingforms.eddy-vh.com/

                      Commentaire


                      • #26
                        Bonsoir,

                        Perso, je ne pense pas que l'inversion ait un rapport avec l'erreur actuelle.

                        Cela vient de $buttons. Je ne comprends pas le self:: que tu as mis devant. $buttons est une variable (local ?) et non une fonction.

                        S'il s'agit d'une variable de classe, la syntaxe pourrait être $this->buttons. S'il s'agit d'une variable locale à ta fonction, $buttons suffira.

                        Pascal
                        Dernière édition par pmleconte à 21/09/2020, 17h36
                        If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

                        Commentaire


                        • #27
                          cool merci pour vos retours..
                          @eddy => j'ai corrigé pour etre p^lus propre
                          pmleconte => j'ai changé....
                          Code:
                                         if (!\is_null($icon['link']) && !\is_null($icon['text']))
                                              {
                                                  $buttons[$key][] = $icon;
                                              }
                                          }
                                      }
                                      return $buttons[$key];
                          plus d'erreur mais cela ne revoit plus rien
                          Code:
                          <?php var_dump($system_buttons);?>
                          ne renvoit rien ...
                          Société : http://www.com3elles.com
                          Bénévole : http://www.flexicontent.org

                          Commentaire


                          • #28
                            Que contient $key ? dans l'appel à ta fonction, params est un Registry et tu le mets tout entier dans $key ???
                            If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

                            Commentaire


                            • #29
                              D'autre part, d'après la doc php array_merge, https://www.php.net/manual/fr/function.array-merge.php , je pense qu'il est normal que tu aies link et text à null.

                              Je pense qu'il faudrait essayer array_replace : https://www.php.net/manual/fr/functi...ay-replace.php

                              Pascal
                              If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

                              Commentaire


                              • #30
                                en fait j'essai de m'inspiré du quick icon de joomla (ce qu j'avais reussis en j3)

                                pour récuperer les quickicons
                                Société : http://www.com3elles.com
                                Bénévole : http://www.flexicontent.org

                                Commentaire

                                Annonce

                                Réduire
                                Aucune annonce pour le moment.

                                Partenaire de l'association

                                Réduire

                                Hébergeur Web PlanetHoster
                                Travaille ...
                                X