Développer avec RBS Change : [Résolu] rafraishir une perspective backoffice via le code

  • 81538.1

    24/10/2013 19:16


    Mathias
    Rang : Expert
    Bonjour !

    je suis entrain de faire un module qui utilise une API fournie par un service tiers.
    cette API me permet de récupérer des documents, que je synchronise dans change, j'ai donc :
    - créé des persistentdocument qui sont le reflet des documents récupérés via l'API
    - créé une action qui synchronise les documents
    - maj de la perspective des documents en ajoutant l'action de synchronisation

    Mon soucis, c'est que quand je clique sur le bouton "synchroniser", j'ai tout qui se passe comme prévu quant à la récupération des documents et leur synchronisation en base de données.
    Cependant, pour qu'ils s'affichent dans la perspective, je suis obligé de cliquer sur clic droit sur dossier parent -> "Actualiser", pour rafraichir la perspective et voir mes documents apparaître.

    C'est pas très "user-friendly", du coup, je me demandais s'il était possible de rafraichir la vue directement après avoir fini la synchro.

    Existe t'il un callback que je pourrai utiliser au sein de mon action, ou dans sa définition XML qui est implémenté comme suit :
    <action name="syncLists">
        <parameter name="listWidget"/>
        <body><![CDATA[     
          if (confirm("&amp;modules.project.bo.general.ConfirmSyncListsMessage;"))
          {
            var docId = listWidget.getSelectedIds()[0];
            var lang = this.getContextLang(listWidget);
            wToolkit.openlink('project', 'SyncLists');
          }
        ]]></body>
      </action>
    


    Merci d'avance !

    Mathias

    Développe sous linux Ubuntu 12.04 LTS Desktop
    Projet ecommerce core 3.6.7
  • 81538.2 en réponse à 81538.1 écrit par Mathias

    25/10/2013 15:16


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    Bonjour,

    A priori il suffit d'ajouter un this.refresh();, cette méthode étant définie dans uixul/lib/bindings/core/cModule.xml.

    C'est en tous cas ce qui est fait dans la plupart des actions qui affectent le contenu de la liste (suppression, désactivation, etc).
  • 81538.3 en réponse à 81538.2 écrit par Gaël Port

    25/10/2013 17:19


    Mathias
    Rang : Expert
    Ca marche bien !

    J'ai donc implémenté comme suit :
    <action name="syncLists">
        <parameter name="listWidget"/>
        <body><![CDATA[     
          if (confirm("&amp;modules.project.bo.general.ConfirmSyncListsMessage;"))
          {
            var docId = listWidget.getSelectedIds()[0];
            var lang = this.getContextLang(listWidget);
            wToolkit.openlink('project', 'SyncLists');
            this.refresh();
          }
        ]]></body>
      </action>
    


    Mais comment est-on sûr que this.refresh() est appelé après que l'action de synchronisation soit terminée et que tous les documents à récupérés soient enregistrés en base ?

    Néanmoins c'est résolu ;)

    Développe sous linux Ubuntu 12.04 LTS Desktop
    Projet ecommerce core 3.6.7
  • 81538.4 en réponse à 81538.3 écrit par Mathias

    25/10/2013 17:47


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    En fait, l'action SyncLists elle fait juste un traitement ou bien elle renvoie un résultat (genre téléchargement de fichier) ?

    Parce que sinon il est préférable de faire sur le modèle de ce qui est fait notamment dans certaines actions de catalog, ex : removeProductsFromShelf, avec un appel à executeJSON pour exécuter l'action puis un onRemoveProductsFromShelfSuccess qui est appelé au retour de l'action (là du coup on est sûr de quand c'est fait).

    NB : le nom onRemoveProductsFromShelfSuccess est construit à partir du nom de l'action PHP appelée dans executeJSON et pas du nom de l'action JavaScript (même si souvent ce sont les mêmes).
  • 81538.5 en réponse à 81538.4 écrit par Gaël Port

    26/10/2013 21:25


    Mathias
    Rang : Expert
    Merci Gaël pour ces infos.
    J'ai donc réussi à implémenter tes recommandations.

    Pour répondre à ta question, mon action récupère bien le résultat de l'appel à l'API. Du coup, je l'utilise dans la méthode $this->sendJSON() de mon action JSON.

    Ce qui est bien, c'est que désormais, si tout se passe bien, ma perspective est rafraichie, et si j'ai une erreur dans mon échange avec l'API du service tiers, j'ai l'erreur et sa description qui s'affiche dans une popup d'erreur. C'est top !

    Voici ce que j'ai implémenté :

    Mon action JSON :
    class projectSyncListsAction extends f_action_BaseJSONAction
    {
      /**
       * @param Context $context
       * @param Request $request
       */
      public function _execute($context, $request)
      {
        $ls = project_ListsService::getInstance();
        $result = $ls->syncRemoteLists();
        $this->sendJSON($result);
      }
    }


    Mes actions javascripts :
    <action name="syncLists">
        <parameter name="listWidget"/>
        <body><![CDATA[     
          if (confirm("&amp;modules.project.bo.general.ConfirmSyncListsMessage;"))
          {
            var docId = listWidget.getSelectedIds()[0];
            var lang = this.getContextLang(listWidget);
            this.executeJSON("SyncLists");
          }
        ]]></body>
      </action>
      <action name="onSyncListsSuccess">
        <parameter name="listWidget"/>
        <body><![CDATA[     
          this.refresh();
        ]]></body>
      </action>



    Normalement, j'ai bien suivi tes recommandations et désormais, je suis sûr que ma perspective est rafraîchie uniquement après la fin de la l'action SyncLists ;)

    Merci !

    Développe sous linux Ubuntu 12.04 LTS Desktop
    Projet ecommerce core 3.6.7
 
Merci de prendre connaissance et de respecter les règles des forums.
 
1471 membres
Aucun membre connecté