Fork me on GitHub






problème pour rajouter une combobox dans module 'weblinks'
Aspirant
Inscrit: 12/02/2005 20:24
Messages: 45
Bonjour à toute la communauté,

CE QUE J’ESSAYE DE FAIRE :
Dans le module weblinks, je suis en train de modifier le champs ‘state’ du formulaire de soumission ‘submit_form.php’ pour en faire une combobox de liste des pays.

LE CODE QUE JE FAIS POUR Y ARRIVER :

J’ai donc créer notamment une classe weblinks/class/option.php où j’ai dû comme l’explique le tutorial DAO de xoops spécialisé la fonction ‘getObjects’.

function &getObjects($criteria null)
{
    
$ret = array();
    
$limit $start 0;
    
$sql 'SELECT * FROM '.$this->db->prefix('weblinks_options');
    if (isset(
$criteria) && is_subclass_of($criteria'criteriaelement')) 
    {
    
$sql .= ' '.$criteria->renderWhere();
         
$sort = ($criteria->getSort() != '') ? $criteria->getSort() : 'option_id';
         
$sql .= ' ORDER BY '.$sort.' '.$criteria->getOrder();
    
$limit $criteria->getLimit();
    
$start $criteria->getStart();
    }
    
$result $this->db->query($sql$limit$start);
    if (!
$result
    {
    return 
$ret;
    }
    while (
$myrow $this->db->fetchArray($result)) 
    {
    
$option = new weblinksOption();
    
$option->assignVars($myrow);
    
$ret[] =& $option;
    unset(
$option);
    }
    return 
$ret;
}


MON PROBLEME :

J’ai crée cette classe, mais j’ai un problème avec la ligne de code unset($option) qui me produit un « Internal Server Error » au chargement de la page.

Et si je mets en commentaire cette ligne de code, je vois que c’est bien celle-ci l’origine de mon problème, car ça marche presque, sauf que du coup je ne libère pas les objets dans la boucle du while, et en conséquence ma liste de pays qui apparaît au chargement de la page n’a qu’un élement, en l’occurence le dernier que j’ai pris dans la boucle du while (soit le ‘zimbabwe’ )…

Quelqu’un pourrait il m’aider à savoir pourquoi le ‘unset($option)’ me fait planter mon site, là j’ai vraiment du mal .

merci

Posté le : 05/09/2006 10:27

Edité par cali76 sur 05/09/2006 10:54:57
Edité par cali76 sur 05/09/2006 10:56:05
Edité par cali76 sur 05/09/2006 10:58:27
Partager Twitter Partagez cette article sur GG+
Re: problème pour rajouter une combobox dans module 'weblinks'
Guest_
Bonjour
pk modifier cette class? pk ne pas créer une une autre instance sur la table qui contient tes pays? se serait plus simple et surtout portable vers les prochaines versions.
Cdl
William

Posté le : 05/09/2006 10:52
Partager Twitter Partagez cette article sur GG+
Re: problème pour rajouter une combobox dans module 'weblinks'
Xoops accro
Inscrit: 25/02/2004 00:20
De Région parisienne
Messages: 2526
@William, tu as raison, surtout que des modules possèdent déjà ce genre d'instance, je pense à XFGuestbook entre autre.

Posté le : 05/09/2006 11:02
Partager Twitter Partagez cette article sur GG+
Re: problème pour rajouter une combobox dans module 'weblinks'
Aspirant
Inscrit: 12/02/2005 20:24
Messages: 45
oups excusez moi, je mettais tromper dans l'arborescence :

ce n'est pas dans /html/modules/kernel/ que j'ai crée option.php,
mais bien dans /html/modules/weblinks/class/ que j'ai crée option.php, afin de spécialiser la classe mère du kernel, comme le dis le tutoriel sur le 'xoopsObjectHandler' si j'ai bien suivi, d'ailleurs pour le code de option.php j'ai repris exactement le même code que dans l'excellent module 'catads'.

Du coup, je ne comprends pas pourquoi la ligne 'unset($option)' marche dans 'catads/class/option.php' et pas dans 'weblinks/class/option.php' ?

cali76

Posté le : 05/09/2006 11:23
Partager Twitter Partagez cette article sur GG+
Re: problème pour rajouter une combobox dans module 'weblinks'
Guest_
Re
je pense que la réponse reste la même.
je ne suis pas allé voir dans le code du module donc tu parles mais normalement il n'est pas prévu pour afficher des pays.

Si oui alors
tu dois avoir créer une table avec toutes les listes....

30 secondes.

regarde dans les class de xoops il y a formselectcountry.php qui devrait de faife ce que tu veux.

Cdl
William

Posté le : 05/09/2006 11:54
Partager Twitter Partagez cette article sur GG+
Re: problème pour rajouter une combobox dans module 'weblinks'
Régulier
Inscrit: 06/01/2006 23:55
Messages: 379
Citation :

cali76 a écrit:
function &getObjects($criteria null)
{
    
$ret = array();
    
$limit $start 0;
    
$sql 'SELECT * FROM '.$this->db->prefix('weblinks_options');
    if (isset(
$criteria) && is_subclass_of($criteria'criteriaelement')) 
    {
    
$sql .= ' '.$criteria->renderWhere();
         
$sort = ($criteria->getSort() != '') ? $criteria->getSort() : 'option_id';
         
$sql .= ' ORDER BY '.$sort.' '.$criteria->getOrder();
    
$limit $criteria->getLimit();
    
$start $criteria->getStart();
    }
    
$result $this->db->query($sql$limit$start);
    if (!
$result
    {
    return 
$ret;
    }
    while (
$myrow $this->db->fetchArray($result)) 
    {
    
$option = new weblinksOption();
    
$option->assignVars($myrow);
    
$ret[] =& $option;
    unset(
$option);
    }
    return 
$ret;
}




Alors j'ai fait 2 3 tests sur le unset dans ce genre de boucle car pour moi l'interet logique du truc est inexistant...
Je m'explique... Unset sert a liberer la memoire, mais au final unset ne libere pas la memoire immediatement, ca detache ta variable de la zone de memoire utilise, cette zone de memoire tombe dans un garbage collector façon java et ensuite a un moment ca va etre nettoye...
Premier point : du coup a quoi sert le unset($option) dans la boucle vue que de toutes façons tu rattaches a chaque fois ton $option a une nouvelle adresse et donc automatiquement ton ancienne zone memoire n'est plus 'attache'.
Second point : la donnee de toutes façon n'est pas nettoye vu que tu l'as mise dans ton tableau normalement (enfin c la logique) donc ce que tu liberes au final c juste un pointeur.

Alors ca c la logique
Dans la pratique ce qui est tres rigolo c'est que si tu ne fais pas le unset tu vas te retrouver a la fin avec un tableau contenant le bon nombre de donnee mais pointant toutes sur la meme chose c-a-d un tabelau rempli de la meme ligne... ce qui est tres bizarre. C'est comme si au final le New n'avait pas alloue reellement un nouvel objet (nouveau pointeur) mais reutilise l'ancien.
Ensuite d'apres mes tests en PHP 5 ca peut marcher si tu evites de mettre le &
while ($myrow $this->db->fetchArray($result)) 
    {
    
$option = new weblinksOption();
    
$option->assignVars($myrow);
    
$ret[] = $option;
    }
    unset(
$option);

alors que si tu laisses le & ca marche pas. Alors que en toute logique d'apres ce que j'ai pu lire en php 5 que l'on mette le & ou pas c'est pareil... ben en pratique non
(j'ai pas teste la difference sur le 4 mais normalement en 4 ca fonctionne pas avec ce code...)


Voila ca c pour le unset...
Maintenant question bete a quoi sert ta variable option? et du coup le unset($option)
$i 0;
    while (
$myrow $this->db->fetchArray($result)) 
    {
    
$ret[$i] = new weblinksOption();
    
$ret[$i++]->assignVars($myrow);
    }

c pas mieux ainsi?... et ca devrait fonctionner a priori...




Sinon comme l'a indique William au dessus il y a une classe deja existante pour la selection des pays formselectcountry.php.

Posté le : 05/09/2006 12:24

Edité par garrath sur 05/09/2006 13:19:18
Partager Twitter Partagez cette article sur GG+
Re: problème pour rajouter une combobox dans module 'weblinks'
Aspirant
Inscrit: 12/02/2005 20:24
Messages: 45
Ok, merci beaucoup à vous trois,

je vais en fait tout simplement essayer les 2 méthodes :

- la première qui est un peu "l'artillerie lourde", mais peut être plus conventionnelle car dans l'esprit du modèle objet de XOOPS, où j'implémente mon modèle suivant le DAO pattern en spécialisant notamment la class /kernel/object.php pour mon module et en utilisant des instances de la class Criteria pour mes critères de requêtes SQL (comme par exemple dans le module catads V 1.40, voire alors les fichiers include/form1_ads.inc.php et class/option.php) (attention au fonctionnement du 'unset', faire alors la petite modif suggérée par garrath)

- et la seconde méthode qui est plus "légère", qui consiste à instancier une class spécifique, laquelle est utilisée pour une requête davantage dédiée et moins générique que la précédente (comme par exemple la class 'xfgbFormSelectCountry' dans le module 'XF Guestbook v2.22', voire alors les fichiers include/form_edit.inc.php et class/xfgbformselectcountry.php)

Je vais maintenant m'ateller à la tache !

Posté le : 05/09/2006 14:43
Partager Twitter Partagez cette article sur GG+
Re: problème pour rajouter une combobox dans module 'weblinks'
Régulier
Inscrit: 06/01/2006 23:55
Messages: 379
Citation :

cali76 a écrit:
Ok, merci beaucoup à vous trois,

je vais en fait tout simplement essayer les 2 méthodes :

- la première qui est un peu "l'artillerie lourde", mais peut être plus conventionnelle car dans l'esprit du modèle objet de XOOPS, où j'implémente mon modèle suivant le DAO pattern en spécialisant notamment la class /kernel/object.php pour mon module et en utilisant des instances de la class Criteria pour mes critères de requêtes SQL (comme par exemple dans le module catads V 1.40, voire alors les fichiers include/form1_ads.inc.php et class/option.php) (attention au fonctionnement du 'unset', faire alors la petite modif suggérée par garrath)

Attention... un des principes fondamentaux de l'objet c la reutilisabilite... si tu as une classe qui existe deja et qui fait ce dont tu as besoin l'esprit du modele objet veut que tu l'utilise
(je parle bien sur ici de formselectcountry.php qui en plus fait partie des classes fournis de base par xoops...)

Posté le : 05/09/2006 15:36
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

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