8792 sujets

Développement web côté serveur, CMS

Bonjour a tous,

voilou je ne trouve nulle part de reponse a un bug que j'ai sur un script php. Je passe un tableau en variable pour une fonction:

$this->tableau->ajoutAttributsEntete(array("class" => "entete")) ;


La fonction parcours le tableau pour generer une chaine de caractere avec les elements du tableau :

public function ajoutAttributsEntete($entete_attrs)   { 
    foreach ($entete_attrs as $nom_attr => $val_attr)
      $this->options_entete .= " $nom_attr='$val_attr' ";
  }


puis finalement, la chaine de caracteres est utilisee pour appliquer des options a une balise :

$ligne = "<TH$this->options_entete >$enteteLig</TH>";


Jusque la tout va bien...

Mais quand j'edite la page j'obtiens :

...<TH class='entete'  class='entete'  class='entete'  class='entete'  class='entete'  class='entete'  class='entete'  class='entete'  >Nom</TH>...


Visiblement, le tableau contient 8 champs (ou case je ne sais pas comment on dit) avec la meme valeur, alors que je ne veux qu'un seul champ dans le tableau.

Si vous avez une idee de ce qui peut coincer, hesitez pas, merci Smiley smile
Modifié par yohan (05 Oct 2006 - 16:03)
Salut à toi !

Tu pourrais montrer le code complet de ta fonction et la boucle d'alimentation pour les lignes du tableau ?
Salut Heyoan,

ben tout est la en fait, la fonction ajoutAttributsEntete() est en entier, y'a rien d'autre.

Le tableau est alimenté lors de son passage en tant que variable lors de l'appel de la fonction ajoutAttributsEntete(array("class" => "entete")).

En fait le probleme est justement au niveau de l'alimentation des lignes du tableau, je crois Smiley ohwell
Désolé je pige pas Smiley decu

la fonction ajoutAttributsEntete() fait bien partie d'une classe qui te sert à construire ton tableau non ?

Et si c'est le cas il y a bien un endroit dans ton code (au niveau de la classe ou quand tu appelles le constructeur) où tu indiques ce fameux 8 ?

En tous les cas sans plus de code je ne vois trop pas comment te donner un coup de main.

@+ Smiley cligne
Modifié par Heyoan (05 Oct 2006 - 00:07)
Salut,

a priori tu dois appeler ta méthode "ajoutAttributsEntete()" 8 fois ...
Car dans le code que tu nous donnes, l'atribut "options_entete" ne devrait avoir que 'class="entete"'
La classe 'Formulaire' appelle la classe 'Tableau' pour créer un formulaire dans un tableau.
Salut yohan !

On y est presque Smiley biggrin

Si j'avais su que tu mettrais autant de code je t'aurais conseillé de le mettre en .html dans un des répertoires de ton site et de simplement donner le lien Smiley cligne

Les classes sont sympas mais là comme ça je n'ai pas envie de les décortiquer d'autant plus que c'est certainement dans le code dont tu te sers pour créer ton formulaire que doit se trouver le "problème".

Donc au risque d'avoir l'air un peu lourd Smiley rolleyes ce que j'aimerais voir c'est la partie
$form = new Formulaire();
...


Bon ben @+
Si vraiment le code pose probleme , je peux editer les posts et le mettre sur mon hebergement..

L'appel pour le nouveau formulaire, est fait par dans un fichier form.php :
// Affichage du formulaire
echo $form->formulaireHTML();


La classe utilisée pour créer le formulaire est:

  public function formulaireHTML ()

  {

    // On met un attribut ENCTYPE si on transfère un fichier

    if ($this->transfertFichier) $encType = "enctype='multipart/form-data'";

    else                         $encType="";



    $formulaire = "";

    // Maintenant, on parcourt les composants et on crée le HTML

    foreach ($this->composants as $idComposant => $description)

      {

	// Agissons selon le type de la ligne

	switch ($description["type"])

	  {

	  case "CHAMP":

	  // C'est un champ de formulaire

	    $libelle = $description['libelle'];

	    $champ = $description['champ'];

	    if ($this->orientation == Formulaire::VERTICAL)

	      { 

		$this->tableau->ajoutAttributsEntete(array("class" => "entete")) ;

	      $this->tableau->ajoutEntete(1, $idComposant, $libelle);  // initialisation d entete

		// $this->tableau->ajoutValeur($idComposant, "libelle", $libelle);

		$this->tableau->ajoutValeur($idComposant, "champ", $champ);

	      }

	    else if ($this->orientation == Formulaire::HORIZONTAL)

	      {

		$this->tableau->ajoutEntete(2, $idComposant, $libelle);

		$this->tableau->ajoutValeur("ligne", $idComposant, $champ);

	      }

	    else

	      $formulaire .= $libelle . $champ;

	    break;



	  case "TEXTE":

	  // C'est un texte simple à insérer

	    $formulaire .= $description['texte'];

	    break;

	    

	  case "DEBUTTABLE":

	    // C'est le début d'un tableau HTML

	    $this->orientation = $description['orientation'];

	    $this->tableau = $description['tableau'];

	    break;

	    

	  case "FINTABLE":

	    // C'est la fin d'un tableau HTML

	    $formulaire .= $this->tableau->tableauHTML();

	    $this->orientation="";

	    break;



	  default: // Ne devrait jamais arriver...

	    echo "<p>ERREUR CLASSE FORMULAIRE!!<p>";

	  }

      }



    // Encadrement du formulaire par les balises

    $formulaire = "\n<form  method='$this->methode' " . $encType

              . "action='$this->action' name='$this->nom'>" 

              . $formulaire . "</form>";



    // Il faut éventuellement le centrer

    if ($this->centre) $formulaire = "<CENTER>$formulaire</CENTER>\n";;



    // On retourne la chaîne de caractères contenant le formulaire

    return $formulaire;

  }



  // Fin de la classe

}


Et la partie qui pose probleme est :

	    if ($this->orientation == Formulaire::VERTICAL)

	      { 

		$this->tableau->ajoutAttributsEntete(array("class" => "entete")) ;

	      $this->tableau->ajoutEntete(1, $idComposant, $libelle);  // initialisation d entete

		// $this->tableau->ajoutValeur($idComposant, "libelle", $libelle);

		$this->tableau->ajoutValeur($idComposant, "champ", $champ);

	      }

	    else ...


Voila en gros tout ce que je sais. Je ne vois pas pourquoi il crée un tableau ou il repete 8 fois ce que je lui donne 1 fois.

Il faudrait peut etre que je lui definisse plus précisement le tableau en l'initialisant, avant de l'appeler dans la fonction de la classe Formulaire, ou quelque chose dans ce genre. Mais je ne vois pas précisement comment faire.
Salut,

Visiblement ces 2 classes font partie d'un ensemble bien plus complexe de "générateur de templates" (je ne suis pas sûr du terme) Smiley sweatdrop

Effectivement pour générer un formulaire tu dois utiliser un code du genre
$libelle = 'libelle';
$nom = 'nom';
$val = 'val';
$taille = 10;

$form = new Formulaire ();
$form->champTexte ($libelle, $nom, $val, $taille, $tailleMax=0);
$form->ajoutTexte ($libelle);
$form->debutTable (VERTICAL,array('abc','bbb','ccc'),$nbLignes=3, 'Test');
...
$form->finTable ($libelle);
echo $form->formulaireHTML();

mais vu la complexité de la chose je ne vois pas trop comment t'aider Smiley decu . Le plus simple étant certainement d'aller voir sur le site où tu as téléchargé cela Smiley smile

Désolé et @+
Non ce n'est pas un generateur de templates, ce sont deux classes qui sont données en illustration du livre 'Pratique de Mysql et Php' aux editions O'Reilly. Elles sont en exemple pour la création d'objets et de classes.

La premiere classe traitee dans le livre est la classe qui permet de faire des tableaux. Puis la classe pour les formulaires vient utiliser la premiere classe definie. A titre d'exercice, l'auteur propose justement ce que je suis en train d'essayer de faire, c'est a dire definir des options pour les balises d'entete.

Il se trouve que j'en ai justement besoin pour un site que je developpe.

En tout cas merci, d'avoir essayé, en tout cas il est chouette ton site sur le groupe 'balade-sur-la-clef-de-sol'.
Modifié par yohan (05 Oct 2006 - 15:09)
yohan a écrit :
en tout cas il est chouette ton site sur le groupe 'balade-sur-la-clef-de-sol'.
Merci Smiley biggrin

Si c'est tiré d'un bouquin je suppose qu'il doit te donner des exemples au fur et à mesure ?
Sinon pour tester il faudrait voir ce que tu as entre
$form = new Formulaire ();
et
echo $form->formulaireHTML();


Ciao
ca y est j'ai trouve.

L'erreur vient du fait que je n'appelle pas ma fonction 'ajoutAttributsEntete', au bon endroit. Du coup il est appele a chaque fois qu'un champs du formulaire est créé. Donc la chaine generee par la fonction s'incremente, a chaque fois de 'class='entete''. Et comme j'ai 8 champs, la chaine est rajoutée 8 fois. J'ai sorti l'appel de la fonction de la boucle et c nickel.

Merci encore et desole pour le derangement.
Je suis justement en train de bosser sur un annuaire dynamique de nouveaux talents de la musique, si ca peut t'interesser...