comment importer le contenu de base de donnée externe

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

  • comment importer le contenu de base de donnée externe

    Avant tout, bonjour à tous.

    Je suis nouveau sur Joomla et j'ai déjà des envies de mettre les mains dans le cambouis

    Je voudrais miger sur joomla 2.5x

    Cela fait quelques années que je développe des sites en utilisant mon CMS "maison". Evidemment, la structure de la base n'a rien à voir avec celle de Joomla. Alors comme je souhaiterais pouvoir proposer à mes clients de pouvoir migrer sur Joomla, plateforme connue, il faut que je récupère toutes les données de ma base pour les injecter dans la base joomla.
    Si certains types de données ne sont pas problématiques, (ex les users), d'autres ont une structure plus complexe, moins familière (categories, assets, content) notamment à cause des champs lft, rgt, level... bref toute la partie hiérarchie.
    j'ai plusieurs questions :
    - quelle est la meilleure méthode pour effectuer cette migration de données de base (principalement pour les 3 citées categories, assets, content)
    - y'a t'il des outils tout fait pour joomla 2.5 qui permettent de faire ce type de chose ?
    - faut il faire un plugin, un module pour effectuer cette migration ? (dans ce cas, sur quel évènement se brancher ) ou bien peut-on faire une "moulinette" externe en appelant juste les classes Joomla nécessaire (dans ce cas, pouvez-vous me donner un code de base pour accéder au framework Joomla) ?


    J'ai commencé à potasser le sujet et j'ai vu qu'il pourrait être utile d'utiliser JTableNested, voire JTableCategory pour la table catégorie spécifiquement.
    S'il y a un développeur dans l'assistance, j'aimerais bien un peu d'aide.


    merci d'avance

  • #2
    Re : comment importer le contenu de base de donnée externe

    a quoi correspondent les champs de la base externe sous joomla?y as t il des correspondances possible?

    Commentaire


    • #3
      Re : comment importer le contenu de base de donnée externe

      Bonjour,

      On peut toujours migrer à peu près n'importe quoi vers Joomla!, mais en fonction des structures d'origine, c'est plus ou moins complexe.
      Personnellement, pour importer depuis un CMS alien, je n'utilise que des views SQL et de la requête SQL, seul moyen efficace pour migrer virtuellement n'importe quoi.

      Il existe des outils d'importation pour certains produist (Wordpress entre autres), mais dont le temps de développement est énorme par rapport à l'analyse SQL et l'import SQL brut.
      Pas de demande de support par MP.
      S'il n'y a pas de solution, c'est qu'il n'y a pas de problème (Devise Shadok)

      Commentaire


      • #4
        Re : comment importer le contenu de base de donnée externe

        Bonjour,
        comme je l'ai dit dans mon post, mon gros souci est de gérer correctement les imports "exotiques" :
        pour les tables du type user, une requête sql classique, même sans passer par les classes joomla se fait sans problème, là où je tire la langue c'est pour les champs catégories, asset, content où il y a utilisation d'une structure avec lft, rgt, level... Dans mon cms, j'ai des rubriques (catégories) qui peuvent avoir aussi un parent, mais ce n'est pas géré comme pour Joomla, donc je souhaiterais utiliser les classes dédiées Joomla tant qu'à faire, pour pas avoir à réinventer la roue.

        Mes questions sont donc, comment faites vous pour importer une structure de catégorie, sachant que dans Joomla, celà implique aussi des insertions dans assets : comme jisse03 le dit
        je n'utilise que des views SQL et de la requête SQL, seul moyen efficace pour migrer virtuellement n'importe quoi.
        Certes, mais encore, quel est la procédure pour gérer les champs hiérarchie cités ci-avant ?
        Avez-vous un script qui gère la partie insert dans la base de donnée d'une nouvelle catégorie avec mise à jour de sa hiérarchie ?

        J'ai regardé du coté des classesJTable, JTableNested, JTableCategory... mais concrètement, je n'ai pas vu la gestion de la partie hiérarchie.
        De plus, quand vous faites un import externe, vous passez par un script "standalone" (que j'appelle moulinette, faute d'imagination), qui n'a pas besoin d'être appelé depuis Joomla, ou bien vous passez par un outil (plugin, composant...) du type CMigrator, fait sur mesure pour la base source, dans Joomla?

        Commentaire


        • #5
          Re : comment importer le contenu de base de donnée externe

          Avec une excellente maîtrise de SQL (procedures stockées, fonctions stockées et views), ainsi qu'une très bonne compréhension des structures Joomla!, on fait 100% de la migration uniquement à grands coups de requêtes SQL.

          Si on est moins sûr de soit, une modification d'un outil genre CMigrator peut rendre la tâche plus aisée.

          Ce qui est bon à savoir, pour importer des contenus, #__content, on peut négliger totalement les assets, idem avec les catégories.

          Pour les users, il faut importer dans #__users, et dans #__user_usergroup_map, pour mapper correctement les users à leur groupe respectif, la colonne usertype de #__users étant devenue obsolète (et n'est présente que pour autoriser la migration depuis J!1.5.

          Un exemple des méthodes d'une classe pour importer des users à partir d'un système antique, en ISO-8859-1 vers du Joomla! en UTF-8
          Code PHP:
              public function mapISO$f )
              {
                  if ( 
          $this->isISO ) {
                      return 
          iconv"ISO-8859-1""UTF-8"$f ) ;
                  }
                  return 
          $f ;
              }

              public function 
          mapUserFields$rec )
              {
                  
          $db JFactory::getDBO();

                  
          $query "INSERT INTO #__users ".
                      
          "(id,name,username,email,password,usertype,block,sendEmail,registerDate,lastvisitDate, params)" .
                      
          " VALUES (" $rec->id  ",".
                      
          $db->quote$this->mapISO$rec->firstname " "$rec->lastname ) ) . "," .
                      
          $db->quote$this->mapISO$rec->login ) ) .",'" $this->mapISO$rec->mail ) . "','" $rec->pass "','" .
                      
          $this->mapUserType$rec->user_status_id ) . "'," $this->isBlocked$rec->user_status_id ) .",0,'" .
                      
          $rec->created_at "','" $rec->updated_at "','{\"timezone\":\"UTC\"}')" ;
                  
          $db->setQuery$query ) ;
                  if ( !
          $db->query() ) {
                      
          $this->info"Echec en enregistrement de l'utilisateur:<br />" $query"error"  ) ;
                  } else {
                      
          $query "insert into `#__user_usergroup_map` (user_id,group_id) " .
                          
          "VALUES (" $rec->id ", " $this->mapUserGroup$rec->user_status_id ) ." )" ;
                      
          $db->setQuery$query ) ;
                      if ( !
          $db->query() ) {
                          
          $this->info"Echec en enregistrement du mapping utilisateur:<br />" $query"error"  ) ;
                      }
                      echo 
          '.' ;
                  }
              } 
          // mapUserFields 
          Les méthodes mapUserGroup et isBlocked sont spécifiques à ce cas de figure et ne t'apprendraient pas grand chose. Pour info, un exemple simplifié:
          Code PHP:
              public function mapUserGroup$t )
              {
                  
          $types = array( => "2"=> "50"=> "10"=> "10"=> "10"=> "1"=> "8",
                              
          => "1"10 => "10"11 => "8"12 => "10",  16 => "10"17 => "51" ) ;
                  if ( 
          array_key_exists$t$types ) ) { 
                      return 
          $types[$t] ;
                  }
                  return 
          "Unknown" $t ;
              } 
          ça te donne une logique en PHP.
          On peut fair equasiment la même chose directement en SQL, à condition de compiler MySQL avec un PHP embedded en langue supplémentaire pour les procédures et fonctions stockées (ou alors en utilisant à outrance les procédures avec du CASE.. WHEN.
          Pas de demande de support par MP.
          S'il n'y a pas de solution, c'est qu'il n'y a pas de problème (Devise Shadok)

          Commentaire


          • #6
            Re : comment importer le contenu de base de donnée externe

            Merci pour tes informations. Mais comme je l'ai déjà précisé, c'est au niveau de la gestion de la hiérarchie que je coince : pour #__content et #__categories la création/Mise à jour comment gère t'on les champs lft, rgt, level lors d'un import massif. Avez-vous un script spécifique (ou pas) pour ce point précis.

            De plus, subsidiairement ?, jisse03 dit
            pour importer des contenus, #__content, on peut négliger totalement les assets, idem avec les catégories.
            Est-ce que ces assets sont générés automatiquements ? A quel moment alors ? sont ils obsolètes ?

            Merci

            Commentaire


            • #7
              Re : comment importer le contenu de base de donnée externe

              Pour les catégories, lft est en général l'id de l'enregistrement précédent, rgt l'id du suivant (sauf cas très particuliers).
              Level est le niveau de la catégorie, avec 0 pour la racine, 1 pour le premier niveau (catégories racine), 2 pour premier niveau de sous catégorie, etc..
              parent_id est l'id de la catégorie parente, toutes les catégories de premier niveau ayant un parent_id de 0.

              Le tout s egère très simplement avec une stored procedure, en utilisant de svariable sd'état dans la procédure. http://dev.mysql.com/doc/refman/5.1/...ams-views.html

              Lors d'un import de Joomla! 1.5 par JUpgrade, ces assets sont ignorés. Il ne sont pas obsolètes, mais une nouvelle fonctionalité de J! 2.5.
              Ils sont générés dès lors d'une modification d'un élément par la suite.
              Pas de demande de support par MP.
              S'il n'y a pas de solution, c'est qu'il n'y a pas de problème (Devise Shadok)

              Commentaire


              • #8
                Re : comment importer le contenu de base de donnée externe

                hmm, je ne suis pas sûr.

                Je reconnais que je ne maitrise pas les procédures stockées, donc il y a sûrement moyen de faire quelque chose avec, mais en ce qui concerne les lft, rgt, ça me parait plus compliqué que ce que tu dis :
                à part le root, le lft est l'id de l'enregistrement parent + 1, le rgt est l'id de l'enregistrement parent + 2 (pas l'enregistrement précédent, donc pas récupéré avec lastinsertid). Pour le level ça va.
                Par contre ce qui me gèene c'est que au fur et à mesure qu'on reconstruit l'arbre les valeurs lft et rgt peuvent changer (s'il y a insertion d'une nouvelle branche par ex), donc il faut vérifier/reconstruire toute cette hiérarchie (lft, rgt) à chaque insertion. C'est ça que je ne vois pas comment faire facilement.
                http://en.wikipedia.org/wiki/Nested_set_model

                J'espère que je ne suis pas trops confus dans ma demande/mon explication.

                Commentaire


                • #9
                  Re : comment importer le contenu de base de donnée externe

                  Tu peux te contenter de faire comme moi, ne pas t'occuper des lft et rgt...

                  Cette dicussion sur le forum développement https://groups.google.com/d/msg/joom...-/gdmMMQs7MCoJ
                  conclut par cette phrase
                  "They are not actually used. For example in menus lft and rgt contain the ordering information. ", donc...
                  Pas de demande de support par MP.
                  S'il n'y a pas de solution, c'est qu'il n'y a pas de problème (Devise Shadok)

                  Commentaire


                  • #10
                    Re : comment importer le contenu de base de donnée externe

                    Merci pour ton temps et pour tes informations.
                    Finalement, j'ai réussi à gérer les insertions de catégories, avec gestion auto des lft, rtg et des assets en utilisant les classes Joomla : joomla remplit et met a jour "automatiquement" les autres données. Même s'il ne les utilise pas, j'obtient une structure "Joomla officielle".
                    Pour ceux qui comme moi (peu nombreux a priori, vu le peu de nombre de sujets) pouraient en avoir besoin, je vous file mon code :
                    Code PHP:
                    try {
                        
                    $pdo = new PDO(
                            
                    'mysql:host=localhost;dbname=monanciennebase,
                            '
                    root',''
                        );
                    }
                    catch (PDOException $e) {
                        echo "Failed to get DB handle: " . $e->getMessage() . "\n";
                        exit;
                    }
                    /*
                    Je crée un tableau associatif qui contient les information des catégories de ma base d'
                    origineDifférente selon votre structureLe plus important est que :
                    les catégories soient classées dans l'ordre croissant
                    - la hiérarchie obtenue soit la même que celle que vous souhaitez dans Joomla
                    - récupérer id, nom de la rubrique, id du parent
                    on obtient un tableau du type  :
                    $rubrique = array(
                       array('
                    id_rubr'=>1, 'nom_rubr'=>'Actualités', 'id_srub'=>0),
                       array('
                    id_rubr'=>2, 'nom_rubr'=>'Actualités de la région', 'id_srub'=>1),
                       ...
                    );
                    */

                    unset($pdo);
                    try {
                        $pdo = new PDO(
                            '
                    mysql:host=localhost;dbname=mabasejoomla,
                            
                    'root',''
                        
                    );
                    }
                    catch (
                    PDOException $e) {
                        echo 
                    "Failed to get DB handle: " $e->getMessage() . "\n";
                        exit;
                    }

                    $path2joomla '/../INSTALLATION/joomla2';//A modifier selon la position du script par raport à la racine de Joomla

                    define('_JEXEC'1);
                    define('DS'DIRECTORY_SEPARATOR);

                    if (
                    file_exists(dirname(__FILE__).$path2joomla '/defines.php')) {
                        include_once 
                    dirname(__FILE__).$path2joomla '/defines.php';
                    }

                    if (!
                    defined('_JDEFINES')) {
                        
                    define('JPATH_BASE'dirname(__FILE__).$path2joomla);
                        require_once 
                    JPATH_BASE.'/includes/defines.php';
                    }

                    require_once 
                    JPATH_BASE.'/includes/framework.php';
                    require_once 
                    JPATH_BASE.'/libraries/joomla/database/tablenested.php';
                    require_once 
                    JPATH_BASE.'/libraries/joomla/database/table/category.php';

                    $db =& JFactory::getDBO();
                    $table = new JTableCategory($db);
                    $user_id 42;//votre valeur
                    $now date('Y-m-d H:i:s');
                    $rubid = array();
                    for (
                    $i=0;$i<count($rubrique);$i++)
                    {
                        
                    $data_array = array(
                            
                    'extension' => 'com_content',
                            
                    'title' => cleantitle($rubrique[$i]['nom_rubr']),
                            
                    'alias' => nettoieNom($rubrique[$i]['nom_rubr']),
                            
                    'published' => '1',
                            
                    'access' => '1',
                            
                    'params' => '{\"category_layout\":\"\", \"image\":\"\"}',
                            
                    'metadata' => '{\"author\":\"\", \"robots\":\"\"}',
                            
                    'created_user_id' => $user_id,
                            
                    'created_time' => '$now',
                            
                    'language' => '*'
                        
                    );
                        
                    //si c'est un élément racine
                        
                    if ($rubrique[$i]['id_srub'] == 0)
                        {
                            
                    $reference_id 1;
                        }
                    //sinon
                        
                    else
                        {
                            
                    $reference_id $rubid[$rubrique[$i]['id_srub']];
                        }
                        
                    $rubid[$rubrique[$i]['id_rubr']] = Jaddnode($table$reference_id$data_array'last-child');
                    }

                    function 
                    Jaddnode($table$reference_id$data_array$whereto='first-child')
                    {
                        
                    $table->setLocation$reference_id$whereto );
                        
                    // Bind data to the table object.
                        
                    $table->bind$data_array );
                        
                    // Force a new node to be created.
                        
                    $table->id 0;
                        
                    // Check that the node data is valid.
                        
                    $table->check();
                        
                    // Store the node in the database table.
                        
                    $table->store();
                        
                    //Récupère l'id créé
                        
                    return $table->id;

                    Dernière édition par beyonder à 20/07/2012, 11h09

                    Commentaire

                    Annonce

                    Réduire
                    Aucune annonce pour le moment.

                    Partenaire de l'association

                    Réduire

                    Hébergeur Web PlanetHoster
                    Travaille ...
                    X