8721 sujets

Développement web côté serveur, CMS

Bonjour a vous

Je tente de mettre un script PHP à jour (afin qu'il soit compatible PHP 5.+).
N'y connaissant rien je sollicite votre aide afin de tenter de comprendre et corriger les erreurs.

Premièrement, est-ce que :

 $this->polls        =  array();
            $this->pollsLoaded  =  false;
            
            $this->poll_table   =  $core->prefix.'dotpoll';
            
            $this->blog_id      =  $core->blog->id;
            $this->db           =& $core->con;
            $this->core         =& $core;
            
            $this->config       =& $core->blog->settings;


peut se changer en


 $this->polls        =  array();
            $this->pollsLoaded  =  false;
            
            $this->poll_table   =  $core->prefix.'dotpoll';
            
            $this->blog_id      =  $core->blog->id;
            $this->db           = $core->con;
            $this->core         = $core;
            
            $this->config       = $core->blog->settings;


????

et dans mon cms un rapport d'erreur m'indique que dans :

[plugins/dotpoll/class/class.dc.dotpolls.php:82] : record::__get
Undefined index: poll_progressbar

[plugins/dotpoll/class/class.dc.dotpolls.php:83] : record::__get
Undefined index: poll_progressbar_color

[plugins/dotpoll/class/class.dc.dotpolls.php:84] : record::__get
Undefined index: poll_percentage

[plugins/dotpoll/class/class.dc.dotpolls.php:85] : record::__get
Undefined index: poll_percentage_color



 $poll                    = new dcDotpoll($this->core);
                  $poll->title             = $record->poll_title;
                  $poll->id                = $record->poll_id;
                  $poll->author            = $record->poll_user;
                  $poll->status            = $record->poll_status;
                  $poll->cdate             = dt::str($this->config->date_format,
                                                     $record->poll_cdate);
                  $poll->progressbar       = $record->poll_progressbar;
                  $poll->progressbar_color = $record->poll_progressbar_color;
                  $poll->percentage        = $record->poll_percentage;
                  $poll->percentage_color  = $record->poll_percentage_color;
                  
                  $this->polls[$record->poll_id] = $poll;

les lignes

                  $poll->progressbar       = $record->poll_progressbar;
                  $poll->progressbar_color = $record->poll_progressbar_color;
                  $poll->percentage        = $record->poll_percentage;
                  $poll->percentage_color  = $record->poll_percentage_color;
posent problemes,

voyez- vous quelques choses que je puisse corriger svp ?
Modifié par poilozorey (25 Feb 2015 - 16:45)
poilozorey a écrit :
Je tente de mettre un script PHP à jour (afin qu'il soit compatible PHP 5.+).
N'y connaissant rien

Si tu ne t'y connais rien, le mieux serait d'apprendre le modèle objet de PHP 5, non ? Smiley rolleyes

Pour le reste, mon petit doigt me dit qu'il s'agit d'un plugin pour Dotclear. As-tu songé à poser ton problème sur le forum de Dotclear ?
Oui, c'est un plugin dotclear, mais certes avant tout du PHP lol.

Publier sur le forum dotclear une demande d'aide de mise à jour de ce plugin fut mon premier réflexe.
Le second réflexe fut de contacter directement l'auteur du plugin.
Un premier message fut laissé à l'auteur il y a 2mois...
Un second, il y a 1 mois et le dernier message via son formulaire de contact il y à 15 jours.
Que ce soit sur le forum dotclear ou de la part du créateur..aucunes réponses...

N'ayant pas de support de la part de dotclear ou de l'auteur du plugin...
J'en conclut donc que c'est un travail abandonné...mais j'utilise ce plugin,.
Etant donné que c'est de l'open source, je tente de moi même de le mettre à jour.

D’où mon "ultime recours" à venir chercher de l'aide au près de ce forum de qualité qu'est alsacreations.

Donc spécifique à dotclear ou pas, sans connaitre le PHP je pense que comme tout autres languauge (html, .css, .js..etc) qu'il y a des standards...
Donc, je me disais qu'une personne connaissant bien ce langage aurait sur me dire s'il y avait des choses "évidentes" à corriger etc...
Modifié par poilozorey (02 Mar 2015 - 04:07)
Fournir un plug-in en PHP consiste à definir une ou plusieurs classes d'objets, cest â dire des "propriétés" (paramètres) et des "méthodes" (fonctions et sous-programmes). Â la lecture du code donné dans ton message on ne peut qu'essayer de deviner comment ça marche. il faudrait plutôt regarder le détail de l'implémentation de l'objet en cause, mais c'est un gros travail.
Bonjour,

Tu as un undefined index, ça signifie que ta variable est appelée sans avoir été déclarée au préalable ou qu'elle n'existe tout simplement pas dans ton cas actuel. La class de l'objet $record ne possède pas les attributs poll_progressbar, poll_progressbar_color, poll_percentage et poll_percentage_color.
Pour éviter cette erreur tu peux faire un test au préalable grâce à property_exist() comme ceci :
(ce test est à répéter pour toutes les lignes de type $poll->quelquechose)

$recordClass = get_class($record);
$poll->progressbar = property_exist($recordClass, 'poll_progressbar') ? $record->poll_progressbar : false;

Modifié par Raphi (02 Mar 2015 - 10:12)
Bonjour raphi....

Merci pour cette analyse que je n'ai pas encore testée...
Pour vous permettre de mieux analyser ou comprendre le "dit plugin" je vous met le zip en question.

plugin Dotpoll


J'ai essayer de corriger quelques ligne, à savoir :

Dans class.dc.dotpoll.widget.php ligne 4

public static function initWidget(&$w)


modifiée en

public static function initWidget($w)


Ligne 29

public static function showWidget(&$w)


modifiée en

public static function showWidget($w)


Afin de faire ré-apparaitre le plugin en partie "publique"...
Dans l'attente de vos précieux conseils
Je ne crois pas qu'abandonner les & soit une bonne idée.

Passer une variable en & signifie que la fonction appelée peut en modifier le contenu, alors que sans le & c'est une copie de la variable qui est passée à cette fonction.
Si l'auteur du plug in a mis des & c'est qu'il a l'intention de modifier le contenu; sans & il ne pourra plus le faire.
Exemple:

<?php

$toto = 'TOTO';
echo "<pre>$toto\n";
abcd($toto);
echo "$toto\n";

$titi = 'TITI';
echo "<pre>$titi\n";
xyz($titi);
echo "$titi\n";

function abcd($data) {
    $data .= ' ' . 'ABCD';
}

function xyz(&$data) {
    $data .= ' ' . 'ABCD';
}
?>

Résultat:

TOTO
TOTO

TITI
TITI ABCD

Explication : la fonction abcd a beau modifier la variable qu'on lui passe, comme c'est une copie, la variale elle même n'est pas modifiée.

Par contre la fonction xyz agit sur la donnée passée en paramètre, elle peut donc la omdifier.
Merci PapyJP pour cette remarque...

Cependant, c'est le seul moyen que j'ai trouvé pour faire réapparaitre le plugin coté publique (qui avait disparut lors de la mise en service d'une version PHP supérieure a 5.2

donc en supprimant l'esperluette dans les dites lignes sités ci-dessus, j'ai vue ré-apparaitre le plugin..et aux vues de mes capacités proches de 0 en matiere de PHP j’étais tout fier lol...

J'ai donné un lien (zip du plugin) qui peut être vous permettra de mieux comprendre plus en details le fonctionnement du plugin..
poilozorey a écrit :
Merci PapyJP pour cette remarque...

Cependant, c'est le seul moyen que j'ai trouvé pour faire réapparaitre le plugin coté publique (qui avait disparut lors de la mise en service d'une version PHP supérieure a 5.2

donc en supprimant l'esperluette dans les dites lignes sités ci-dessus, j'ai vue ré-apparaitre le plugin..et aux vues de mes capacités proches de 0 en matiere de PHP j’étais tout fier lol...

J'ai donné un lien (zip du plugin) qui peut être vous permettra de mieux comprendre plus en details le fonctionnement du plugin..

J'ai jeté un coup d’œil, pas le temps de regarder en détail.
Pour les passages de paramètres par référence, regarder http://php.net/manual/fr/language.references.pass.php et en particulier le paragraphe suivant:
php.net a écrit :

Note: Il n'y a pas de signe de référence dans l'appel de la fonction, uniquement sur sa définition. La définition de la fonction en elle-même est suffisante pour passer correctement des arguments par référence. A partir de PHP 5.3.0, vous devriez recevoir une alerte disant que "Call-time pass-by-reference" est obsolète, lorsque vous utilisez un & dans foo(&$a);. Et à partir de PHP 5.4.0, call-time pass-by-reference a été supprimé, l'utiliser lèvera une erreur fatale.

Cela doit te donner des idées sur ce qui s'est passé dans ton plug-in au changement de version du PHP.
Il faut donc enlever les & partout sauf dans les définitions de fonctions.
Modifié par PapyJP (02 Mar 2015 - 17:35)
Modérateur
je vais dire un truc un peu ballot, mais pourquoi pas mettre simplement le plugin à jour? Normalement on est pas censé aller modifier le code dedans…
kustolovic a écrit :
je vais dire un truc un peu ballot, mais pourquoi pas mettre simplement le plugin à jour? Normalement on est pas censé aller modifier le code dedans…


C'est ce que je tente de faire Smiley smile

Comme je le récapitule, ce plugin est fait pour une version PHP5.2.
Pour des raisons de sécurité, les hébergeurs updragent leurs version php et invitent gentiellement à n'utiliser que des versions minimale => 5.4

Comme je l'explique depuis le premier message de ce topic, j'essaye donc de mettre a jour ce plugin, la seul chose que jai su faire jusqu'alors c'est...

polozoreyc a écrit :
Cependant, c'est le seul moyen que j'ai trouvé pour faire réapparaitre le plugin coté publique (qui avait disparut lors de la mise en service d'une version PHP supérieure a 5.2

donc en supprimant l'esperluette dans les dites lignes sités ci-dessus, j'ai vue ré-apparaitre le plugin..et aux vues de mes capacités proches de 0 en matiere de PHP j’étais tout fier lol...


mais depuis je n'ai pas avancé +
Modérateur
Non mais je disais mettre à jour le plugin à partir du code mis-à-jour de ceux qui ont créé le plugin…
Utiliser la version 5.4 du plugin.
Modifié par kustolovic (03 Mar 2015 - 00:19)
Comme je l'ai déjà dis dans ce topic, mais vous avez du manquer ces lignes...


"L'auteur du plugin ne répond pas depuis 3 mois au multiples relances."
Il n'y a donc pas de "mise à jour" du plugin sauf si une ou plusieurs personnes compétentes arrivent à mettre a jour ce dit plugin .
Choses que j'essaye de faire, puisque j'ai besoin de ce plugin
Modifié par poilozorey (03 Mar 2015 - 01:18)
PapyJP a écrit :

Si l'auteur du plug in a mis des &amp; c'est qu'il a l'intention de modifier le contenu; sans &amp; il ne pourra plus le faire.


T'es super balèse pour deviner ce que voulait faire le dev sans prendre la peine de regarder le code. Si tu avais juste pris 2 minutes pour ouvrir le fichier et lire les 30 lignes de code tu aurais vu tout de suite que l'objet n'est jamais modifié.

@poilozorey tu peux supprimer sans problème les &, y compris dans les définitions des fonctions.

Je pense qu'ils sont là parce que le plug-in a du être écrit en PHP 4 à l'origine et jamais réécrit en full PHP5 depuis.

Quand tu tombes sur un vieux script à mettre à jour tu peux aller regarder du coté de la doc PHP, il y a une section consacrée aux migrations de code :

http://php.net/manual/fr/appendices.php
Raphi a écrit :
Bonjour,

Tu as un undefined index, ça signifie que ta variable est appelée sans avoir été déclarée au préalable ou qu'elle n'existe tout simplement pas dans ton cas actuel. La class de l'objet $record ne possède pas les attributs poll_progressbar, poll_progressbar_color, poll_percentage et poll_percentage_color.
Pour éviter cette erreur tu peux faire un test au préalable grâce à property_exist() comme ceci :
(ce test est à répéter pour toutes les lignes de type $poll-&gt;quelquechose)

$recordClass = get_class($record);
$poll-&gt;progressbar = property_exist($recordClass, 'poll_progressbar') ? $record-&gt;poll_progressbar : false;


Dans le cas présent isset() suffit. property_exist() sert à vérifier que la propriétée a été définie dans la classe.