[Spip] Demande : import/export BD

--- Antoine Pitrou <pitrou@free.fr> a écrit :

- 2ème étape : à partir de cet index, demander les
données de tous les objets un par un, ici en XML.
Ca tombe bien (ou mal ;-)), je n'ai rien fait de
cette partie. Il faudrait qu'il y ait une fonction
permettant de dumper les objets un à la fois, pour
ne pas risquer de dépasser la durée limite d'exécution
d'un script. Idem pour l'import.

La partie permettant de sortir un objet en XML est tres facile a faire. Le plus
dur c'est dans l'autre sens. A terme il y aura pour chacune des tables une
fonction permettant de dumper et de recuperer un ou plusieurs enregistrements.
J'ai deja fait l'interface d'import/export.
J'ai vu qu'il existe des parser XML pour php, mais ils ne sont pas en standard
sur les installs, donc je prefere tout reecrire.
Comme je suis loin d'etre un expert PHP, je t'envoie le code pour le mettre sur
le ftp (je ne peux pas d'ici) pour relecture avant que je n'aille trop loin.

Nico

Salut,

Je peux pas faire grand'chose ici, mais je vais essayer de prendre le temps
ce soir. Deux trois trucs si tu continues d'ici là : pour lire un fichier
entier, il y a la fonction file() qui est très pratique, elle renvoie chaque
ligne du fichier dans une cellule d'un tableau, et tu peux concaténer le tout
avec join(). Faudra aussi faire une fonction pour traiter un texte (transformer
le caractère < en une séquence d'échappement, par exemple <<), et une fonction
qui fasse l'opération inverse.

Sinon, ce qui m'arrangerait serait de factoriser la fonction qui exporte un
jeu d'articles (avec le $result mysql en paramètre, comme dans export.php3)
afin que je puisse la réutiliser. D'autre part, pour les noms de tags, le mieux
serait qu'ils soient égaux aux noms des champs mysql, afin de simplifier
l'import et l'export.

Un truc du genre (pas essayé si ça marche) :

<?

function export_objets($result, $type, $string) {
    $nfields = mysql_num_fields($result);
    for ($i=0; $i<$nfields;++$i) $fields[$i]=mysql_field_name($result, $i);
    while($row = mysql_fetch_array($result)) {
        $string .= build_begin_tag($type) . "\n";
        for ($i=0; $i<$nfields;++$i) {
            $field=$fields[$i];
            $value=$row[$i];
            $string .= build_begin_tag($field) . $value . build_end_tag($field) . "\n";
        }
        $string .= build_end_tag($type) . "\n";
    }
}

// Par exemple...
$string="<?xml version=\"1.0\"?>\n";
$result = mysql_query("SELECT * FROM spip_articles");
export_objets($result, "article", $string);
$result = mysql_query("SELECT * FROM spip_breves");
export_objets($result, "breve", $string);
fputs($file, $string);

?>

Non ?

Une erreur bête dans le proto-code que je viens
d'envoyer : dans la fonction, faut certainement
rajouter un return $string à la fin, et à l'appel
faire $string = export_objets(..., ..., $string);

Voilà.

Si y a des gars doués en PHP (Arno...) qui veulent
donner leur avis....

a+

Antoine.

> La partie permettant de sortir un objet en XML est tres facile a faire.

Le plus

> dur c'est dans l'autre sens. A terme il y aura pour chacune des tables

une

> fonction permettant de dumper et de recuperer un ou plusieurs

enregistrements.

> J'ai deja fait l'interface d'import/export.
> J'ai vu qu'il existe des parser XML pour php, mais ils ne sont pas en

standard

> sur les installs, donc je prefere tout reecrire.

http://www.php.net/manual/fr/ref.xml.php

Parser XML expat. Disponible à partir de PHP 3.0.6. Peut-être pas chez les
free et autres. Sinon il y a le format CSV et la fonction fgetcsv().

Rémi

Salut tout le monde,

J'y étais allé mollo sur l'export/import XML, parce qu'il me semblait qu'on pouvait agréger de nombreuses fonctionnalités à partir des mêmes fichiers si on s'y prenait bien. D'où l'idée de d'abord définir un ensemble de fonctions souhaitées et ensuite de voir si on pouvait optimiser tout ça...

Voici quelques fonctions qui pourraient être agrégées:

SAUVEGARDE DE LA BASE

Tiens...

Un bug que j'avais signalé à Arno il y a quelques temps,
totalement bizarre : quelquefois des articles étaient mal
mis à jour, voire pas du tout, après avoir tenté de les
modifier.

Eh bien en fait c'est tout con : quand un texte contient un
guillemet standard ("), MySQL prend ça pour la fin du texte
dans la requête qui lui est transmise... Ca fait probablement
une syntax error avec ce qui suit dans la requête, et le
document n'est pas mis à jour dans la base.

Il faut donc modifier toutes les requêtes UPDATE pour utiliser
une fonction échappant les guillemets dans les champs textes...
(\" au lieu de "). Il ne faut pas oublier d'échapper les
\ en \\ non plus... ;-))

a+

Antoine.

Antoine Pitrou wrote:

Il faut donc modifier toutes les requêtes UPDATE pour utiliser
une fonction échappant les guillemets dans les champs textes...
(\" au lieu de "). Il ne faut pas oublier d'échapper les
\ en \\ non plus... ;-))

C'est la fonction addslashes de php qui fait ça très bien :slight_smile:

Michael

Hello hello,

Suite à l’explication de Laz (SPIP est un bateau), voici une première proposition de logo:

(C’est minimaliste, m’enfin du coup ça ne pèse rien.)

Amicalement,
ARNO*

spip-anim.gif

Hello,

Bof, j'aime pas trop... Surtout parce que c'est un bateau à moteur et que
c'est drôlement insultant pour un voilier ! Et puis bon, le coup du bateau
je vous le disais pour la petite histoire, mais il n'a quand même pas
grand chose à voir avec l'outil...

Je préférais ce que tu avais fait il y a très longtemps (tu sais le
Powered by Spip).

Laz

Salut tout le monde,

L'un des problèmes que j'avais avec SPIP, c'est que ça ne tournait pas sur Altern. J'ai cru comprendre que certains avaient réussi la manip sur des clones Altern, moyennant une limitation (pas trop grave) qu'on devrait réussir à lever.

Est-ce qu'on peut faire un point là-dessus, parce que SPIP convient particulièrement aux sites des associations, associations qui s'orienteront naturellement vers les Altern-like pour se faire héberger. Spip fonctionne chez Free par exemple, m'enfin il serait préférable que ça tourne sur Altern, Ouvaton ou Lautre.

- Est-ce que quelqu'un a réussi l'installation sur un compte Altern ou sur un Altern-inside (Lautre, Ouvaton)?
- Est-ce que ça s'est fait dans une config particulière (genre accès root)?
- Est-ce qu'il a fallu bidouiller SPIP pour y parvenir (genre modifier le fichier inc-connect.php3 à la main)?
- Quelles sont les limitations constatées dans l'utilisation de SPIP (par exemple: problème avec les images dans les articles)?

Amicalement,
ARNO*

Bon, ben j’ai pas retrouvé ce que j’avais fait à l’époque… Mais de mémoire, c’était kekchose dans ce genre.

small-logo-spip.gif

medium-logo-spip.gif

logo-spip.gif

big-logo-spip.gif

Je ne me souviens plus ce qu’on avait trouvé comme traductions française pour: “Powered by SPIP” et “SPIP inside”?

Amicalement,
ARNO*

"SPIP est dans la cage". Avec, comme logo, un mignon lapin ?
(puisque l'écureuil ne convient pas)