[résolu]Retour d'expérience sur le passage de drupal 6 vers 7

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,
Après avoir pas mal galéré pour passer drupal de la dernière version 6 à la 7, je fais part de mon expérience. J'avais une dizaine de sites, et j'ai suivi scrupuleusement la doc anglaise... mais malheureusement elle ne protège pas à 100%

Pour tous vos sites, lancez l'update.php (en le tapant juste après votre nom de domaine à la place des /node/ ou de l'index) depuis votre dernière version 6 (et n'hésitez pas à le lancer très souvent pendant la migration).

Re-premier conseil :
- faites une sauvegarde de vos tables MySql, en précisant la version 6 et la date (l'upgrade pouvant durer plusieurs jours, prévoyez-le le vendredi soir pour le poursuivre le week-end...). Vous pouvez utiliser PhpMyAdmin, avec les options Drop table if exists.
- faites une sauvegarde de tous vos fichiers distants, en vérifiant que les répertoires copiés contiennent bien vos fichiers (suite à un problème de droits d'écriture, je m'étais retrouvé avec des répertoires vides... agréable surprise au moment où l'on veut récupérer sa version précédente :-/ )

Lisez bien (et gardez-les ouvertes à l'écran) les 6 ou 7 pages de : http://drupal.org/documentation/upgrade/6/7

Si vos tables sont en MyIsam, passez-les en InnoDB : créez une copie de votre sauvegarde Sql et remplacez les lignes MyIsam par InnoDB, et importez ce nouveau fichier (d'où l'utilité du Drop Table). Si vous ne voulez pas recharger tous vos sites car c'est trop lourd, il y a la possibilité d'utiliser une macro. J'en ai créé avec iMacros (je suis en train de les placer sous http://www.cyberafrique.com/?q=imacros/drupal ).

Quelques messages d'erreur et leur résolution

Les erreurs lors de l'update

  • The page isn't redirecting properly : lancez un update.php

  • warning : cannot use a scalar value as array in ... dp/modules/locale/locale.module on line 680
    relancer l'update.php

  • No active batch : relancer un update.php

Précision : vous pouvez rencontrer des messages d'erreur à n'importe quel stade de l'update : relancez toujours l'update en effaçant les paramètres qui ont été rajoutés après le "?", jusqu'à ce que vos messages soient identiques (ce qui signifie que l'update ne sert plus).

  • An AJAX HTTP error occurred. HTTP Result Code: 503 Debugging information follows. Path: http://www.....com/update.php?id=132&op=do StatusText: Service unavailable ResponseText: [avec votre texte de site en maintenance] : relancer l'update, ou cliquer sur le lien "page d'erreur".

  • oubli de se connecter en tant qu'administrateur (user ID=1), et donc erreur Access denied :
    vers la ligne 104 du fichier settings.php de votre répsertoire /sites/votresite.com:
    $update_free_access = TRUE;
    il faut écrire TRUE à la place de FALSE, puis remettre FALSE lorsqu'il sera de nouveau possible de se loguer (.../?q=user)
    puis pour passer en mode normal :
    ?q=user/login puis ?q=admin/config/development/maintenance

  • et le pire :

    DatabaseSchemaObjectExistsException: Cannot add index <em class="placeholder">system_list</em> to table <em class="placeholder">system</em>: index already exists. in DatabaseSchema_mysql->addIndex() (line 432 of /.../includes/database/mysql/schema.inc).
    The website encountered an unexpected error. Please try again later.
    PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column &#039;ssid&#039; in &#039;where clause&#039;: SELECT 1 AS expression FROM {sessions} sessions WHERE ( (sid = :db_condition_placeholder_0) AND (ssid = :db_condition_placeholder_1) ) FOR UPDATE; Array ( [:db_condition_placeholder_0] =&gt; BLGhm1PkXTf_eQ_N-1A9ivhhk-SNfHYodzb7nA4M5oc [:db_condition_placeholder_1] =&gt; ) in _drupal_session_write() (line 203 of /.../includes/session.inc).

    Il faut refaire l'installation... Ça marche après, allez savoir pourquoi...

Les problèmes de taxonomie

J'ai beaucoup galéré sur ce problème.

Les messages d'erreur "classiques" sont :
* The update process was aborted prematurely while running update #7005 in taxonomy.module. All errors have been logged. You may need to check the watchdog database table manually.
* taxonomy module Update #7005 Failed: PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry

Sur un site, je suis revenu en arrière complet sur Drupal 6, j'ai supprimé toutes les taxonomies, j'ai upgradé, et j'ai replacé à la main les taxonomies.

Mais il s'agit d'un bug (http://drupal.org/node/1140746#comment-5065284) et la solution consiste à vider une table :
TRUNCATE TABLE taxonomy_term_node;
(sans oublier de rajouter le préfixe s'il y en a un)

Les problèmes de mise en page

  • Le menu est un bloc complètement décaléen haut à droite, et le texte est en dessous au lieu d'être à côté...
    Il faut aller dans "apparences", sélectionner Garland et re-valider.

  • un problème non résolu : certains sites perdent de temps en temps leur apparence (comme si les CSS n'étaient pas chargées)

Les bases de données multiples

Si vous utilisez plusieurs bases de données, Drupal modifie automatiquement l'ancienne structure pour l'adapter.

$databases = array (
  'default' =>
  array (
    'default' =>
    array ( ...
...
    'votrebase2' =>
    array (...

En fait, il faut remonter d'un niveau votre base 2:

$databases = array (
  'default' =>
  array (
    'default' =>
...
  ),
  'votrebase2' =>
    array ( 'default' => array ...   
Version de Drupal : 

Les problèmes de taxonomie /.../ la solution consiste à vider une table : TRUNCATE TABLE taxonomy_term_node ; (sans oublier de rajouter le préfixe s’il y en a un)

il faut également et préalablement au renouvellement de l'update, supprimer (drop) la table taxonomy_update_7005 quand elle est créée:

taxonomy module
Update #7005
Failed: DatabaseSchemaObjectExistsException: Table <em class="placeholder">taxonomy_update_7005</em> already exists. in DatabaseSchema->createTable() (line 657 of /monsite.com/.../includes/database/schema.inc).

en tout cas, merci pour ce compte-rendu (direct en marque pages !)

complément 1 de "Retour d'expérience sur le passage de drupal 6 vers 7" :

Toolbar vide

1 - code à appliquer dans la DB , mais attention à la valeur VALUES indiquée ci-dessous "xxx":
elle est à adapter en fonction des mlid disponibles dans votre table, qui comporte déjà des enregistrements:

INSERT INTO menu_links (
menu_name ,
mlid ,
plid ,
link_path ,
router_path ,
link_title ,
options,
module ,
hidden ,
external ,
has_children ,
expanded ,
weight ,
depth ,
customized ,
p1 ,
p2 ,
p3 ,
p4 ,
p5 ,
p6 ,
p7 ,
p8 ,
p9 ,
updated
)
VALUES (
'management', 'xxx', '0', 'admin', 'admin', 'Administration', 0x613a303a7b7d, 'system', '0', '0', '1', '0', '9', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0'
);

selon http://drupal.org/node/1070924#comment-4356126

2 - aller dans "admin/structure/menu/manage/management"
et faire glisser tous les items souhaités sous "Administration"

PS : lors de mon dernier upgrade qui semble correct, la valeur "1" du mlid est libre !?!?!?

J'en avais peur :(

Merci de ta réponse, bonne fin de week end.

Pour ma part, les taxonomies apparaissent dans les types de contenu et dans chaque node
(je pense du moins, car en ayant plus de mille, je n'ai pas tout vérifié ;-D );
en revanche, ces nodes ne sont plus réaffectés à leur taxonomies, utilisées en "multiple select";
alors, je cherche, je teste, je cherche, je teste, ..., mais cela devient un peu long.

complément 2 de retour d'expérience

Obtention de transfert de la Taxonomie

Je vais donner ici plus des pistes qu'une solution ...
et de plus des pistes empiriques, les puristes me pardonneront !
Mais c'est tellement une galère, que si ça peut aider ... préalablement !

Comme la suppression de taxonomy_update_7005 et le "vidage" de la taxonomy_term_node ne donnaient pas de résultat sur la présence de mes "multiple select" dans mes nodes (en plus intellectuellement, et sans être une pointure, c'est bof), j'ai fait autrement :

Sur la D6, j'ai nettoyé à fond :

  • tous les modules inutiles dans la D6 ou devenant inutiles/moins utiles dans la D7 (admin menu, par exemple), en particulier ceux qui avaient pu créer un message d'erreur au moment du upgrade raté précédent, mais aussi ceux qui trainaient bêtement ... en n'oubliant pas de les désinstaller,

  • tous les contenus obsolètes ou qui pouvaient, par exemple, avoir été enregistrés sans des taxonomies apparues postérieurement (il me reste quand même plus de mille contenus avec 7 / 8 vocabulaires de taxonomie !),

  • j'ai justement supprimé les autres classes de taxonomie devenues obsolètes,

  • j'avais aussi un conflit avec les champs filefield, imagefield, et caetera, lors de la tentative d'upgrade précédent :
    j'ai changé le widget là où il le fallait (je pense à image), j'ai potassé chaque champ et viré les modules D6 qu'on m'annonçait intégré au core dans la D7 AVANT le upgrade ...
    en bref, j'ai essayé de limiter les occasions que l'upgrade se prenne les pieds dans le tapis, parce que même quand les modules sont désactivés, il les met à jour,

  • j'ai désactivé administration / configuration / clean urls comme indiqué dans la doc
    (une remarque : si vous utilisez un htaccess / htpasswd sur le site où vous testez votre upgrade, il semble que cela bloque l'accès à l'activation des url simplifiées après l'upgrade),

  • ce htaccess me permet de laisser le site on line et d'éviter d'aller dans la table, "variable" de mémoire, pour changer le "site on line" de 1 à 0 ou l'inverse, je ne sais plus,

  • j'ai vérifié qu'il n'y avait pas de date négative sur les nodes,

  • AVANT l'upgrade, j'ai enlevé tous les modules D6 (malgré la possibilité de les laisser, indiquée dans la doc) et les ai remplacés par les versions D7, sans oublier les modules nouveaux nécessités dans la D7 et pas dans la D6
    NOTE : c'est redondant avec le premier tiret, mais je pense qu'il vaut mieux le faire en deux vagues : virer les déjà-inutiles dans la D6/manifestement fonctionnellement inutiles dans la D7, PUIS remplacer pas à pas les versions D6 par les D7 / addition des nouveaux modules requis,
    (lors de mon précédent upgrade raté, j'avais eu la précaution d'aller jusqu'au bout quand même, et de stocker tous les modules nécessaires dans un répertoire "modules D7" de mon micro),

et tout ça avec des updates et sauvegardes régulières, et des copies de l'intégralité de ma procédure et des messages reçus
(10 pages d'openoffice en arial 10 !).

et lors de la réactivation des modules, j'ai tenté de les faire dans une séquence me donnant toutes les chances de tout récupérer, en particulier en commençant par CCK
(ça aussi, c'est dans la doc et le README que je ne saurais trop conseiller de suivre, même ... et surtout si on est pressé ;oD ! )

... et ça a marché

complément 3 de retour d’expérience

les Views / Vues

pour ma part, j'ai eu à aller dans chaque Vue et à l'intérieur de chaque Vue dans chaque Page, Block, flux, ... pour:

  • vérifier que les paramètres étaient tous présents : en l'occurrence, des champs avaient sauté, rendant la Vue incorrecte,
  • enregistrer bon nombre d'éléments pour lesquels il était indiqué que les données étaient stockées temporairement.

complément 4 de retour d'expérience

Custom Search : Undefined index custom_search_form_alter() custom_search.module

j'ai obtenu une dizaine de message comprenant les mots clefs ci-dessus :

ils ont disparu en allant configurer le module custom search / contenu, custom search / taxonomie :
dans "Texte pour -Tout type de contenu- *"
j'ai changé les termes présents par la valeur par défaut "-Tout-" indiquée en commentaire:
"Enter the text for "any content type" choice. The default value is "-Tout-"."

ps :j'avais aussi trouvé deux posts liés au sujet :
Notice: Undefined index in custom_search_form_alter()
Undefined index in custom_search_form_alter()

... inutilisés