Développer avec RBS Change : [Résolu] Creation d'un dossier en BO et insertion de donnees

  • 78000.1

    01/05/2013 08:48


    ehochedez
    Rang : Membre
    Bonjour,

    Je souhaiterais dans un patch créer un sous dossier pour le BO d'un module et ensuite passer un script d'import de données qui insérera des documents dans ce nouveau dossier.

    Quelle est la manière la plus appropriée pour créer un dossier et récupérer la référence du dossier pour l'utiliser en parent lors de l'insertion des données ? Faut-il créer un nouveau xml dans le dossier setup et après utiliser le document de service du module generique folder?

    Merci d'avance

  • 78000.2 en réponse à 78000.1 écrit par ehochedez

    02/05/2013 10:25


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    Bonjour,

    L'avantage de la structure XML d'import c'est de permettre justement d'expliciter l'arborescence des documents de part la structure XML. Dans votre cas, cela signifie que vous devez créer d'abord un noeud XML représentant votre dossier et à l'intérieur de ce noeud faire un noeud par document.

    En ce qui concerne la possibilité de faire référence à un noeud précédemment créé, vous pouvez utiliser l'attribut id sur un noeud et pour faire référence à ce noeud dans le reste du fichier, au niveau de la propriété faisant la relation, vous devez ajouter le suffixe "-refid" et lui fournir la valeur précédemment définie pour l'attribut "id".
    Pour plus d'information, vous pouvez consulter le wiki sur l'importation de documents, ou de voir l'un des tutos sur l'import de document et d'y voir l'importation du media d'id "paveBoeuf" et de voir la manière dont il est rattaché au document "recipe" sur la propriété "picture" ce qui se traduit par l'attribut "picture-refid"

    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 78000.3 en réponse à 78000.2 écrit par Jean-Michel

    03/05/2013 04:11


    ehochedez
    Rang : Membre
    Bonjour Jean-Michel,

    Merci pour ces infos. Sauf erreur de ma part le cas de l'importation des recettes n'est pas tout à fait similaire au mien car je souhaite faire une importation de données automatique (disons journalière) en utilisant un sript PHP. Les données sources sont contenues dans un fichier texte, et à l'aide de ces données je souhaite faire des importations de documents dans un dossier bien précis "monDossier" de mon Backoffice.

    Je pensais donc, utiliser le XML pour créer le dossier "monDossier"

    <rootfolder module="monModule">
            <folder byLabel="monDossier" />
     </rootfolder>
    


    Et pour récupérer le référence de mon dossier dans le script PHP d'importation des données, effectuer une recherche en base dans la table "m_generic_doc_folder" pour retrouver l'id de mon dossier (en utilisant comme paramètre de rechere son label). Et ensuite je passe cet id en parent lors de la création de mes documents.

    Penses-tu que c'est une solution qui peut fonctionner ?

    (RBS version 3.0.4)

  • 78000.4 en réponse à 78000.3 écrit par ehochedez

    03/05/2013 10:48


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    Bonjour,

    Je n'avais pas l'informations qu'il s'agissait d'un import journalier, mais disons que ça ne pose pas de problème, la mécanique reste la même.

    Voici la signification du fragment XML que tu fournis dans le post précédent :
    Créer à la racine de l'arbre du module "monModule" un dossier (folder) avec une propriété label valant "monDossier" s'il n'existe pas déjà.


    L'information "s'il n'existe pas déjà" est fournie par le préfixe "by", si ce dernier ne figurait pas, à ce moment on créerait à chaque fois un dossier avec le label "monDossier".
    Maintenant pour ajouter un document à l'intérieur du dossier créé, il suffit de faire quelque chose de ce type :
    <rootfolder module="monModule">
            <folder byLabel="monDossier">
                    <monDoc label="label1" description="création d'un nouveau document avec pour label label1" ... />
                    <monDoc label="label2" description="exemple d'import XML" ... />
                    <monDoc byLabel="label3" description="Mise à jour du document ayant pour label la valeur label3 s'il existe, sinon on le créé" ... />
            </folder>
     </rootfolder>
    


    Il suffit ensuite d'invoquer la commande d'import. Je te conseille de t'inspirer du code de la commande "import-data" disponible dans "framework/change-commands/ImportData.php", comme ça pas la peine de réinventer la roue, tu pourras t'appuyer sur les mécaniques d'imports standard qui font ces vérifications et établissent les relations correctement à partir du moment ou l'on a un fichier XML définit correctement.

    Édité par Jean-Michel 03/05/2013 10:49


    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 78000.5 en réponse à 78000.4 écrit par Jean-Michel

    13/05/2013 09:18


    ehochedez
    Rang : Membre
    Bonjour Jean-Michel,

    Excuse moi pour ma réponse tardive à nouveau, j'étais parti sur un autre dev..

    Finalement j'ai utilisé la méthode :

    	
            <rootfolder module="monModule" >
    		<folder byLabel="monDossier" />
    	</rootfolder>
    


    pour créer le dossier et ensuite

    $folderService = generic_FolderService::getInstance();
    $result = $folderService->createQuery()->add(Restrictions::eq('label', "monDossier"))->findUnique();
    


    Pour récupérer le dossier créé dans mon script PHP.

    La méthode que tu proposes est effectivement plus officielle je pense mais je dois intégrer la fonctionnalité dans un script PHP d'intégration de produit déja existant. C'est donc plus simple de récupérer l'ID de mon dossier dans le script et de le passer en id parent lors du $product->save(idparent) (toute cette partie existe déjà)

    Ma méthode a par contre ses limites car si l'on créée un autre dossier en BO portant le même nom cela va poser problème. Je souhaiterais donc dans ma requête pour récupérer le dossier préciser que c'est un dossier enfant du module MonModule.. comment puis-je faire cela ? Utilisation de childOf ?

    ->add(Restrictions::childOf(???))


    Merci à nouveau de ton aide,
  • 78000.6 en réponse à 78000.5 écrit par ehochedez

    13/05/2013 16:49


    Mathias
    Rang : Expert
    bonjour,

    pour récupérer le root folder d'un module, tu peux passer par :
    $rootFolder = DocumentHelper::getDocumentInstance(ModuleService::getInstance()->getRootFolderId('myModuleName'), 'modules_generic/rootfolder');


    Ce qui te renvoie l'ID du root folder.

    Ensuite, effectivement, tu peux utiliser childOf dans ta requête ;)

    Mathias

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

    13/05/2013 21:03


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    Bonjour,

    J'étais effectivement parti sur un format XML à cause du premier fragment fournit.
    Le bout de code PHP complété des informations fournies par Mathias va effectivement te permettre de faire ce que tu souhaites et c'est également une méthode officielle et reconnue. Seul bémol effectivement, la manière de détecter le document de manière certaine.
    Une chose peut être envisagée ; étendre le document folder du module generic et refuser l'action de création en BO pour le document qui étend. Ainsi, seule ta moulinette d'import pourra créer le document et le modifier au besoin.

    Une autre chose, qu'il te faudra noter ; la méthode "findUnique" retourne un résultat (même s'il y a plusieurs documents qui satisfont la requête, seul le premier élément sera retourné et un warning sortira dans les logs), sinon le retour vaudra "null" .

    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 78000.8 en réponse à 78000.7 écrit par Jean-Michel

    14/05/2013 04:47


    ehochedez
    Rang : Membre
    Parfait, je vais donc utiliser cette méthode, merci beaucoup à tous les deux pour votre aide.

    Concernant les doublons de nom de dossier dans "MonModule", c'est un cas qui ne devrait pas arriver donc je ne vais pas m'en inquiéter... Merci pour l'info Jean Michel.
 
Merci de prendre connaissance et de respecter les règles des forums.
 
1425 membres
Aucun membre connecté