Fork me on GitHub






On peut pas heriter des classes du kernel de xoops!
Régulier
Inscrit: 06/01/2006 23:55
Messages: 379
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

Posté le : 28/08/2006 18:32
Partager Twitter Partagez cette article sur GG+
Re: On peut pas heriter des classes du kernel de xoops!
Guest_
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

Posté le : 01/09/2006 10:32
Partager Twitter Partagez cette article sur GG+
Re: On peut pas heriter des classes du kernel de xoops!
Régulier
Inscrit: 06/01/2006 23:55
Messages: 379
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 )

Posté le : 02/09/2006 11:34
Partager Twitter Partagez cette article sur GG+
Re: On peut pas heriter des classes du kernel de xoops!
Régulier
Inscrit: 06/01/2006 23:55
Messages: 379
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

Posté le : 03/09/2006 17:57
Partager Twitter Partagez cette article sur GG+
Re: On peut pas heriter des classes du kernel de xoops!
Xoops accro
Inscrit: 25/02/2004 00:20
De Région parisienne
Messages: 2526
En effet c'est très intéressant, il reste à espérer que cela soit intégré dans le CORE

MERCI

Posté le : 03/09/2006 18:18
Partager Twitter Partagez cette article sur GG+
Re: On peut pas heriter des classes du kernel de xoops!
Régulier
Inscrit: 06/01/2006 23:55
Messages: 379
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...

Posté le : 03/09/2006 18:24
Partager Twitter Partagez cette article sur GG+
Re: On peut pas heriter des classes du kernel de xoops!
Admin Frxoops
Inscrit: 04/02/2003 16:46
De Blois
Messages: 3071
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.

Posté le : 09/06/2007 08:23
Partager Twitter Partagez cette article sur GG+
Re: On peut pas heriter des classes du kernel de xoops!
Régulier
Inscrit: 06/01/2006 23:55
Messages: 379
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

Posté le : 09/06/2007 15:03
Partager Twitter Partagez cette article sur GG+
Re: On peut pas heriter des classes du kernel de xoops!
Aspirant
Inscrit: 13/07/2003 14:14
De Brasil - SíƒÂ£o Paulo - Guarulhos
Messages: 72
Merci

@garrath, @philou, @DuGris - Looking

Posté le : 11/06/2007 16:48
Partager Twitter Partagez cette article sur GG+
Re: On peut pas heriter des classes du kernel de xoops!
Régulier
Inscrit: 06/01/2006 23:55
Messages: 379
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

Posté le : 11/06/2007 23:23
Partager Twitter Partagez cette article sur GG+

 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

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