Joli bug upgrade PROFILE (zk 1.1.1 à zk 1.2.3)  Début

  • J'ai mis en oeuvre les possibilités offerte par le module PROFILE avec ses données dynamiques. Résultat : 13 champs (+ _UREALEMAIL et _PASSWORD) dont 7 en liste déroulante.

    Lors de l'upgrade zk 1.1.1 à zk 1.2.3 (en localhost), je perd toutes les valeurs de ces 7 champs pour mes 1000 membres. Cool icon_wink .

    Le problème semblerait provenir :

    - soit de la fonction upgrade du module Users, puisque c'est lui qui "migre" les données des membres de 'zk_user_data' vers 'zk_objectdata_attributes',
    - soit de la fonction upgrade du module Profile, qui passe derrière l'upgrade de Users et qui retraiterait zk_objectdata_attribute.

    Je n'ai pas encore compris, pourquoi ni trouvé de solution.

    Laurent
  • Je te rappelle que selon la tradition tu dois répondre à tes propres questions :)



    Mon espace d'expressions libres

    Un site de guide haute montagne sous zikula
  • Mwouais ! Sauf que là je vais rompre avec les traditions : la réponse tardera à venir. Je galère ...

    laurent
  • Une présomption de culpabilité (après n-ième upgrade, sauf de Profile) : cela proviendrait de la fonction upgrade du module Profile, qui opérerait un retraitement de zk_objectdata_attribute : avant upgrade profile (1.2. -> 1.5.2), zkobjectdata_attribute comporte des values conformes aux saisies utilisateurs (pour les champs '4' = type select); après upgrade, toutes les values sont remplacées par "a:0 {}".

    A suivre ...

    Laurent
  • Ai trouvé ! (grâce à Drak)

    La fonction d'upgrade de Profile (pninit.php) est effectivement bugguée. Elle traite, pendant la conversion, les champs Dropdown list (SELECT) comme si c'était des valeurs serialisées ... alors qu'elles ne le sont pas.

    En remplaçant le code :

    Code

    switch ($displaytype)
                        {
                            case 3: // RADIO
                                $userdata[$k]['value'] = isset($userprops[$a][$v]) ? $userprops[$a][$v] : $v;
                                break;

                            case 4: // SELECT
                                $v = @unserialize($v);
                                $newvalues = array();
                                foreach ($v as $value) {
                                    $newvalues[] = isset($userprops[$a][$value]) ? $userprops[$a][$value] : $value;
                                }
                                $userdata[$k]['value'] = serialize($newvalues);
                                break;
                        }


    par

    Code

    switch ($displaytype)
                        {
                            case 3: // RADIO
                                $userdata[$k]['value'] = isset($userprops[$a][$v]) ? $userprops[$a][$v] : $v;
                                break;

                            case 4: // SELECT
    /*                            $v = @unserialize($v);
                                $newvalues = array();
                                foreach ($v as $value) {
                                    $newvalues[] = isset($userprops[$a][$value]) ? $userprops[$a][$value] : $value;
                                }
                                $userdata[$k]['value'] = serialize($newvalues);
    */

                                $userdata[$k]['value'] = isset($userprops[$a][$v]) ? $userprops[$a][$v] : $v;
                                break;
                        }


    Et là les données des champs Dropdown list ne sont plus perdues.

    Je soupçonne que le code pour le case 4: // SELECT était peut-être prévu pour les champs Combo (text). Mais je n'en ai pas.
    Dans ce cas, le code devrait être :

    Code

    switch ($displaytype)
                        {
                            case 3: // RADIO
                            case 4: // SELECT
                                $userdata[$k]['value'] = isset($userprops[$a][$v]) ? $userprops[$a][$v] : $v;
                                break;

                            case 7: // COMBO (Text)
                                $v = @unserialize($v);
                                $newvalues = array();
                                foreach ($v as $value) {
                                    $newvalues[] = isset($userprops[$a][$value]) ? $userprops[$a][$value] : $value;
                                }
                                $userdata[$k]['value'] = serialize($newvalues);
                                break;
                        }



    Peut-être cela pourra-t-il servir à quelqu'un ?

    Laurent
  • 5 visiteurs

Données pour les 20 dernières minutes