comment importer le contenu de base de donnée externe

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

  • beyonder
    a répondu
    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

    Laisser un commentaire:


  • jisse03
    a répondu
    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...

    Laisser un commentaire:


  • beyonder
    a répondu
    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.

    Laisser un commentaire:


  • jisse03
    a répondu
    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.

    Laisser un commentaire:


  • beyonder
    a répondu
    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

    Laisser un commentaire:


  • jisse03
    a répondu
    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.

    Laisser un commentaire:


  • beyonder
    a répondu
    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?

    Laisser un commentaire:


  • jisse03
    a répondu
    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.

    Laisser un commentaire:


  • lefabdu51
    a répondu
    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?

    Laisser un commentaire:


  • 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

Annonce

Réduire
Aucune annonce pour le moment.

Partenaire de l'association

Réduire

Hébergeur Web PlanetHoster
Travaille ...
X