Fork me on GitHub






#1 On peut pas heriter des classes du kernel de xoops!
garrath Posté le : 28/08/2006 18:32
Bonjour, j'ai poste un petit post sur le forum sourceforge ici http://sourceforge.net/forum/forum.ph ... d=1561098&forum_id=347994

Mais bon je suis vraiment pas sur que ce je dis en anglais soit super comprehensible donc si y en a dans le coin qui ecrivent un peu mieux l'anglais que moi ca serait pas mal ...

J'explique le pb.

C'est simple on ne peut pas heriter des classes du kernel de xoops qui ont un handler, c'est a dire les classes du kernel qui ont des acces aux base de donnée. Pour etre plus precis on peut pas heriter de leur handler.

Je veux modifier un petit truc sur les privmessages par exemple, je cree betement une classe etendant la classe de base, et du coup un handler etendant aussi la classe handler de base. J'ai juste un truc a modifier et je fais cela proprement dans un module pour ne pas aller toucher les classes du kernel.
Et la on tombe sur un pb, dans une bonne partie des methodes des classes handler du kernel, on teste a chaque fois que l'objet passe en parametre fait partie de la classe X.
Le hic c'est que lors d'un heritage de la classe et du handler, automatiquement mon objet passé en parametre fait partie de la classe fille (X') et non de la classe attendue par le handler...

Vous voyez meme en Français c pas tres clair ;)

Avec du code c peut-etre plus simple.
Je cree une classe customPM qui etends la classe du kernel Privmessage
class CustomPM extends XoopsPrivmessage
{
...
}


je cree aussi le handler qui va bien qui herite du handler de XoopsPrivmessage
class XoopsCustomPMHandler extends XoopsPrivmessageHandler
{
...
}


Toutes les methodes que je surcharge ok, ca se passe bien par contre les methodes que je veux utiliser sans modif par rapport XoopsPrivmessageHandler, la ca marche pas!!!!
Pourquoi? ben simplement par ce que il y a un test de fait sur le nom de la classe de l'objet. Exemple methode insert du handler
class XoopsPrivmessageHandler extends XoopsObjectHandler
{
...
    function 
insert(&$pm)
    {
        if (
strtolower(get_class($pm)) != 'xoopsprivmessage') {
            return 
false;
        }
    ....
    }
...
}

Alors oui je pourrais recopier le code complet de XoopsPrivmessageHandler et juste modifier ce dont j'ai besoin c'est clair, mais alors la du coup a quoi ca sert de faire de l'objet

Donc pour moi il ne faut pas faire de test ici sur le nom de la classe sinon cela veut dire qu'on peut pas heriter (etendre) ces classes, il faut faire un test sur le fait que l'objet en parametre est soit de la classe soit d'une classe fille.

A priori d'apres une reponse que j'ai eu par is_a() on doit y arriver (pas encore tester mais pas de raison que ca soit pas bon)
Donc normalement ca devrait donner ca
class XoopsPrivmessageHandler extends XoopsObjectHandler
{
...
    function 
insert(&$pm)
    {
        if (!
is_a($pm'xoopsprivmessage')) {
            return 
false;
        }
    ....
    }
...
}



Voilà, en français ca doit etre a peu pres clair
Si quelqu'un se sent de le faire en anglais
#2 Re: On peut pas heriter des classes du kernel de xoops!
Posté le : 01/09/2006 10:32
Salut
Moi je dis que comme pour la class de criteria C pas normal
je pense que tu ne peux pas faire autrement que de changer ce code et de le faire correctement. pk ne pas faire un controle de ce qui est table module pour savoir si on peut ou pas hériter de ces class?
Cdl
William
#3 Re: On peut pas heriter des classes du kernel de xoops!
garrath Posté le : 02/09/2006 11:34
Bon j'ai modifie toutes les classes du kernel qui ont ce genre de truc...
Je finis de verifier si ca pose des pbs chez moi avant de le mettre sur sourceforge dans le tracker.

En meme temps j'ai ete brutal, j'ai tout modifie alors que certaines classes ne sont pas et ne doivent pas etre forcement heritable (je pense aux classes lies peut etre a la securite etc...). Mais bon comme il manque le mot clef final en PHP 4, je vois pas comment empecher d'heriter de ces classes (vivement que tous les hebergeurs soient en php 5 )
#4 Re: On peut pas heriter des classes du kernel de xoops!
garrath Posté le : 03/09/2006 17:57
bon j'ai poste la modif et quelques optimisations de code par la meme occasion sur le truc de patch sur sourceforge https://sourceforge.net/tracker/index. ... roup_id=41586&atid=430842
#5 Re: On peut pas heriter des classes du kernel de xoops!
DuGris Posté le : 03/09/2006 18:18
En effet c'est très intéressant, il reste à espérer que cela soit intégré dans le CORE

MERCI
#6 Re: On peut pas heriter des classes du kernel de xoops!
garrath Posté le : 03/09/2006 18:24
ben c un peu le but...

J'ai modifie une bonne partie des classes ce qui n'est pas forcement utile, car certaines ne doivent peut etre pas etre etendue pour des questions de secu ou autre, ou parce que ca touche de tres pret au fonctionnement du core (j'ai pas touche a la class module par exemple), mais bon certaines comme privmessage il y a au contraire tout interet a le faire.
Ca permettra de faire enfin des modules de gestions des messages prives par exemple sans etre oblige de faire des hacks...
#7 Re: On peut pas heriter des classes du kernel de xoops!
philou Posté le : 09/06/2007 08:23
Un petit up pour faire remonter...

Etant donné que tes modifs n'ont pas encore été incorporées dans le noyau il faut dès que la nouvelle équipe sera en place leur demander cette incorporation.
#8 Re: On peut pas heriter des classes du kernel de xoops!
garrath Posté le : 09/06/2007 15:03
Pour etre plus precis, suite aux commentaires d'Herve sur l'autre topics.
J'exagere un petit peu, on peut heriter des classes du noyau par contre on ne peut pas heriter totalement de leur methode, en regle general il y a 2 methodes par handler qui font le test indique au dessus. Et cela empeche d'heriter de ces 2 methodes. On est donc oblige de les surcharger (c'est a dire de les reecrire) a l'interieure de la nouvelle classe.

En general les 2 methodes qui utilisent ce test sont :
- la methode insert
- la methode delete

Apres suivant les objets on peut retrouver le meme test sur d'autre methode
#9 Re: On peut pas heriter des classes du kernel de xoops!
gibaphp Posté le : 11/06/2007 16:48
Merci

@garrath, @philou, @DuGris - Looking
#10 Re: On peut pas heriter des classes du kernel de xoops!
garrath Posté le : 11/06/2007 23:23
J'ai remodifie toutes les classes du kernel du 2.0.16. Ca fait 3 jours que ca tourne chez moi sans pb, mais bon ca veut pas dire que tout marche forcement, y a des trucs qu'on utilise pas bcq chez nous.

J'ai corrige en plus un bug qui arrive pas tres frequemment et qui se produit lorsqu'il y a 2 insert a la suite du meme objet en base, mais bon autant qu'il n'arrive jamais et surtout il faudrait que les personnes qui ecrivent des classes dans leur module corrige aussi ce bug car il a ete recopie un peu partout.
Je l'ai d'ailleurs trouve en aidant quelqu'un a faire un module car il avait besoin de faire 2 appels a la method insert dans le meme code (comme quoi ca arrive).
Le generateur de class pour xoops d'ailleurs reproduit le bug.

J'ai optimise le code a gauche a droite, et j'ai modifie 2 3 trucs de façon a ce que le code soit a peu pres identique partout (fonctionne de la meme façon)

Un aperçu des optimisations :
if (!$result =& $this->db->query($sql)) {
    return 
false;
}
return 
true;

devient tout betement
return $this->db->query($sql);


while ($myrow $this->db->fetchArray($result)) {
            
$avatar = new XoopsAvatar();
            
$avatar->assignVars($myrow);
            
$avatar->setUserCount($myrow['count']);
            if (!
$id_as_key) {
                
$ret[] =& $avatar;
            } else {
                
$ret[$myrow['avatar_id']] =& $avatar;
            }
            unset(
$avatar);
        }

devient
if (!$id_as_key) {
                
$i 0;
                while (
$myrow $this->db->fetchArray($result)) {
                    
$ret[$i] = new XoopsAvatar();
                    
$ret[$i]->assignVars($myrow);
                    
$ret[$i++]->setUserCount($myrow['count']);
                }
            }
            else {
                while (
$myrow $this->db->fetchArray($result)) {
                    
$ret[$myrow['avatar_id']] = new XoopsAvatar();
                    
$ret[$myrow['avatar_id']]->assignVars($myrow);
                    
$ret[$myrow['avatar_id']]->setUserCount($myrow['count']);
                }
            }

Ce qui est un peu plus long a ecrire mais ce qui evite de faire le meme test 'if (!$id_as_key)' a chaque iteration.

Et ensuite des petits trucs, des variables qui servent a rien etc...

J'ai tous mis la :
https://sourceforge.net/tracker/index. ... roup_id=41586&atid=430840

 Haut   Précédent   Suivant



Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

Propulsé avec XOOPS | Graphisme adapté par Tatane, Grosdunord, Montuy337513

53 Personne(s) en ligne (35 Personne(s) connectée(s) sur Forum) | Utilisateur(s): 0 | Invité(s): 53 | Plus ...