Echo dans une fonction

Petit nouveau ! | 8 Messages

16 sept. 2011, 11:58

Bonjour à tous,
J'essaie d'appeler une variable externe (echo en ligne 2) dans une fonction dans une chaine de concaténation (l20 à 23),
mon premier echo marche très bien mais le deuxième ne veut pas s'activer alors qu'il est bien présent dans le code source de ma page. Je sais qu'on ne peut pas appeler un echo dans une fonction, j'ai donc utiliser un accesseur mais ça ne fonctionne et je n'arrive à cerner le pourquoi du comment ? Je vois pas comment faire! Merci pour votre aide
<?
echo $categories_menu;
$test= new bm_flyout();
$test->setCatMenu($categories_menu);
class bm_flyout {
    var $code = 'bm_flyout';
    var $group = 'boxes';
    var $title;
    var $description;
    var $sort_order;
    var $enabled = false;
	private $categories_menu; // uniquement accessible dans la classe bm_flyout
	public function setCatMenu($var) { 
        $this->categories_menu=$var;
    }

// partie du code supprimée, on affiche categories_menu dans une chaine concaténée
    function execute() {
      global $oscTemplate;      
      $data = '<div class="ui-widget infoBoxContainer">' .
              '  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_FLYOUT_TITLE . '</div>' .
              '  <div class="ui-widget-content infoBoxContents">' . '<tr><td>' . $this->categories_menu . '</td></tr>'. '</div>' .
              '</div>';
		 	  
         $oscTemplate->addBlock($data, $this->group);
    }
}

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 sept. 2011, 12:11

Je sais qu'on ne peut pas appeler un echo dans une fonction
ah bon et pourquoi cela ? tu fait ce que tu veux hein ;)

y a toujours un moment où il va falloir afficher quelque chose, que ce soit un MVC complet ou le bordel monstre va bien falloir le faire :mrgreen:

donc tu peux afficher ce que tu veux où tu veux c'est à ta convenance ;)
<?php
function truc($chaine) {
echo $chaine;
}

truc('bidulle'); // affiche bidulle
?>
après je ne vois où est ton soucis dans ta classe ? pas de echo, tu utiliser des variables globales, c'est un choix que je ne trouve pas judicieux mais c'est le tiens.
a priori tu code pour php5 (au vu du private) donc pas de var $truc, utilise public / private / protected idem pour la déclaration des méthodes histoire d'être "plus clair" dans leurs portées même si ce n'est pas obligatoire :)

explique nous plus concrètement ce qui ne va pas, c'est pas clair ton affaire :)

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 8 Messages

16 sept. 2011, 12:24

Alors en fait de bosse sur une solution oscommerce, voila le site sur le quel je bosse dormitoryuk.com/shop
Si tu vas dessus, tu peux voir que le menu est présent en haut à gauche grace à echo($categories_menu) en ligne 1. Mon but est en fait de l'afficher dans la première boite "Categories flyt out", code qui est généré par la fonction execute en ligne 18. Je suis obliger de l'appeler dans la variable $data tel que pour que l'installation soit propre. Mais lorsque je passe par mon assesseur, les données ne sont pas générées! Une idée ? Que veux-tu dire par plus clair au niveau de la déclaration des méthodes ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 sept. 2011, 12:46

heu echo($categories_menu); plus bas dans le code ? parce que bon la il est en dehors du html donc c'est pas propre et doit bien y avoir moyen de le faire.

je ne connais pas oscommerce, ceci dit si la méthode construit la "boite" avec ce que tu lui donne a manger ça devrais pas poser de problème.

a tu regardé si dans la classe il y avait bien pris en compte le catégorie_menu par l'accesseur ?
un var_dump($this); juste après l'affectation devrait te montrer la chose.

a tu essayé d'afficher $data dans la méthode execute() ? (juste après sa création histoire d'être sur qu'il y a tous ce que tu souhaite ?

si la c'est bon c'est que le addblock met le brin mais je ne sais pas pourquoi

je ferais un truc comme ça pour vérifier ce qui se passe dans la classe :
<?php
// pour vérif ?
echo $categories_menu;
// définition de la classe
class bm_flyout {
    private $code = 'bm_flyout';
    private $group = 'boxes';
    private $title;
    private $description;
    private $sort_order;
    private $enabled = false;
    private $categories_menu; // uniquement accessible dans la classe bm_flyout
    
	public function setCatMenu( $var ) {
        $this->categories_menu = $var;
		echo '<pre>Validation de la methode '.__METHODE__.'<br />';
		var_dump($this->categories_menu);
		echo '</pre>';
    }

// partie du code supprimée, on affiche categories_menu dans une chaine concaténée
    public function execute() {
		global $oscTemplate;      
		$data = '<div class="ui-widget infoBoxContainer">' .
		'  <div class="ui-widget-header infoBoxHeading">' . MODULE_BOXES_FLYOUT_TITLE . '</div>' .
		'  <div class="ui-widget-content infoBoxContents">' . '<tr><td>' . $this->categories_menu . '</td></tr>'
		. '</div>' .
		'</div>';
		echo '<pre>Validation de $data dans la methode '.__METHODE__.'<br />';
		var_dump($data);   
		echo '</pre>';
        $oscTemplate->addBlock($data, $this->group);
    }
}
// utilisation de la classe 
$test= new bm_flyout();
$test->setCatMenu($categories_menu);?>
@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 8 Messages

16 sept. 2011, 13:08

http://dormitoryuk.com/shop/
J'ai mis ton bout de code directement sur le site, il me sort string(191) ainsi que le contenu de la boite contenue plus bas. Mais je vois pas comment debugger ca :roll: Il n'as pas l'air de prendre en compte le public function setCatMenu( $var )!

Petit nouveau ! | 8 Messages

16 sept. 2011, 13:32

Bon, j'ai corrigé 2-3 choses, j'arrive à ce que la vérification de public function setCatMenu( $var ) fonctionne. Mais il me retourne l'erreur suivante :
Fatal error: Call to undefined method bm_flyout::isEnabled()

Mammouth du PHP | 672 Messages

16 sept. 2011, 13:42

Bon, j'ai corrigé 2-3 choses, j'arrive à ce que la vérification de public function setCatMenu( $var ) fonctionne. Mais il me retourne l'erreur suivante :
Fatal error: Call to undefined method bm_flyout::isEnabled()
Erreur fatale : Appel à une méthode non définie, bm_flyout::isEnabled()

En regardant ta classe, je ne vois pas cette méthode.
Il faudrait voir à la ligne indiquée par le message d'erreur si tu utilises bien cette méthode - et pourquoi.
Après, à toi de voir, soit tu supprimes l'appel à cette méthode, soit tu crées la méthode :roll:
A priori, la méthode devrait être du genre return $this->enabled;...

Petit nouveau ! | 8 Messages

16 sept. 2011, 14:13

C'est bon j'ai résolu l'erreur grâce à ton return, par contre il y a un problème entre public function setCatMenu( $var ) { et public function execute() { car le test ne fonctionne pas. Il m'affiche bien le contenu de la boite mais j'ai l'impression qu'il ne prend pas en compte $this->categories_menu dans la concaténation. Le string n'est pas présent dans le code source de la page. Comment résoudre ca ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

17 sept. 2011, 11:27

Laisse juste le var_dump($data); dans l'execute histoire de ce que donne ta concaténation ;)

@+
Il en faut peu pour être heureux ......