Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-11-2011 17:37:47

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Bonjour,

J'ai un système de pub dans mon application. L'affichage de la pub est commandée dans le layout par l'intermédiaire d'un view helper :

Code:

$this->publicite( $emplacement, $format )

J'ai donc un view helper Publicite.php qui étend Zend_View_Helper_Abstract. Dedans il y a toute la logique d'extraction, de tirage au sort et d'incrémentation du nombre d'impression de la pub.

Le souci que je rencontre est que la pub est incrémentée de 6 7 fois à chaque fois. Après de longues recherches et tests, il semblerait que mon helper Publicite soit appelé 6 fois. Pourtant il n'y a bien qu'une seule ligne dans ce layout.
Je ne connais pas très bien le mécanisme du routage et de la distribution du framework, mais quelqu'un saurait m'expliquer pour quelle raison il y aurait des appels multiples à un view helper appelé dans le layout ? Est ce qu'il y aurait des plugin ou d'autres view helper qui ferait qu'on repasse par le layout ce qui génèrerait un autre appel etc...

Merci d'avance

Dernière modification par supertino7 (24-11-2011 17:45:09)

Hors ligne

 

#2 24-11-2011 23:08:58

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Tu utilises les action stack ? Comme ça, c'est le seul élément que je vois qui pourrait éventuellement faire une boucle au niveau du dispatch...

Hors ligne

 

#3 25-11-2011 11:36:01

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

bakura a écrit:

Tu utilises les action stack ? Comme ça, c'est le seul élément que je vois qui pourrait éventuellement faire une boucle au niveau du dispatch...

Je pensais que tu me parlais parlais de l'aide de vue $this->action(), que j'utilise dans le layout.phtml pour générer la barre d'identification, mais je me trompe c'est autre chose.

Non je n'utilise pas du tout d'action stack.

En fait, y a un truc de pas logique.... Comme je le disais, toute la logique d'extraction des pubs actives, de tirage au sort, d'incrémentation et d'affichage est dans le view helper. Mais si c'était le helper qui était appelé 6 fois, la pub serait également affichée 6 fois non ? Là, la pub n'est affichée qu'une seule fois. Ce qui voudrait dire que c'est la méthode d'incrémentation des impressions qui est actionnée 6 fois...

Hors ligne

 

#4 25-11-2011 16:42:58

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Tu veux pas fournir un peu plus de code ? Un bout de code ton aide de vue, la layout et éventuellement l'action du contrôleur si ça n'arrive que sur une action bien précise.

Sinon j'ai jamais vraiement utilisé l'aide de vue action mais d'paèrs le code source elle effectue bien un nouveau dispatch, donc c'est possible que la fautive soit elle !

Hors ligne

 

#5 28-11-2011 13:42:10

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Hello,

Bon voici plus de code. Il n'y a rien de plus simple :

Le layout, il y a 3 appels à l'aide de vue Pub :

Code:

<?= $this->doctype() ?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
    <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <?= $this->headTitle()?>
    <?= $this->headMeta()?>
        <?= $this->publicite('partout', 'habillage', null, true /* true active l'affichage selon le statut */) ?>
    <?= $this->headLink() ?>
    <?php 
    if ($this->dojo()->isEnabled()){
        $this->dojo()->setLocalPath('/js/dojo/dojo/dojo.js')
                     ->addStyleSheetModule('dijit.themes.tundra');
        echo $this->dojo();
       }
    ?>
    <?= $this->headScript() ?>

    </head>

<body class="tundra">

<h1 id="globaltitle"><?= $this->placeholder('globaltitle') ?></h1>
<div class="topseparator"></div>

<?= $this->placeholder('habillage_link') ?>

<div id="headercontainer">

    <div id="logocontainer">
        <div id="logo_sport_strategies">
            <a href="<?= $this->url(array(), 'www-index')?>">
                              Page d'accueil
            </a>
        </div>
        <div id="banniere_header">
                    <?= $this->publicite('partout', 'banniere_grande'); ?>
                </div>
        <div id="outils_header">
                    <table>
                        <tr>
                            <td><a href="/section/premiere-visite"><img height="16" width="16" alt="Aide" title="Aide" src="/images/layout/aide.png"/></a></td>
                        </tr>
                        <tr>
                            <td><a href="/section/plan-du-site" id="plan"><img height="16" width="16" alt="Plan du site" title="Plan du site" src="/images/layout/plan.png"/></a></td>
                        </tr>
                        <tr>
                            <td><a href="/rss" id="rss"><img height="16" width="16" alt="RSS" title="Inscription RSS" src="/images/layout/rss.png"/></a></td>
                        </tr>
                        <!--<tr>
                            <td><a href="#"><img height="16" width="16" alt="Recherches Fréquentes" title="Recherches Fréquentes" src="/images/layout/most-search.png"/></a></td>
                        </tr>-->
                    </table>
                </div>



        
    </div>
    
    <div class="headerseparator"></div>    
        
        <ul id="topmenu">
                      ... liste de liens ...
        </ul>
        
    <div class="headerseparator"></div>
    
    <div id="conteneur_sousmenu">    
        
        <div class="coin_g_sousmenu">&nbsp;</div>
        
        <div class="centre_sousmenu">
            <ul id="sousmenu">
            <?= $this->sousMenu() ?>
            </ul>
        </div>
        
        <div class="coin_d_sousmenu">&nbsp;</div>
    
    </div>


    <div id="personalmenu">
        <div id="login_form"> <?= $this->action('islogged', 'Auth') ?> </div>
        <div id="personalmenu_encartpub">
                    <?= $this->publicite('partout', 'bouton'); ?>
                </div>
        <div id="personalmenu_ssmenu">        
            
            <div id="searcharea">
            <?= $this->rechercheRapide() ?>
            </div>    
            <!-- Fin de zone de recherche -->
        </div>
        
    </div>
    
</div>

<div id="globalcontainer">

    <div id="content">
        
        <div class="breadcrumbs">
        &nbsp;
        <?=
            $this->navigation()
                 ->breadcrumbs()
                 ->setMinDepth(1)
                 ->setLinkLast(false)
                 ->setSeparator(' >> ');
        
            //$this->navigation()->menu();
        ?>
        </div>
        
        <div id="undercontent">

            <?php foreach (Zend_Controller_Action_HelperBroker::getStaticHelper('Minimessage')->getMessages() as $message): ?>
            <div class="<?= $message['class'] ?>">
                <?= $message['message']; ?>
            </div>
            <?php endforeach;?>
        
        <?= $this->layout()->content ?>
            <hr style="clear: both"/>
        </div>
        
    </div>
    
</div>


<div id="footercontainer">
       ... Footer ...
</div>

</body>
</html>

L'aide de vue Pub :

Code:

<?php

/**
 * Description of Publicite
 *
 * @author supertino
 */
class My_View_Helper_Publicite extends Zend_View_Helper_Abstract
{
    private $_liste;
    private $_model;

    public function  __construct()
    {
        if (Zend_Registry::isRegistered('liste_pubs')){
            $this->_liste = Zend_Registry::get('liste_pubs');
        } else {
            $model = new Core_Model_Publicites();
            $banners = $model->getActivePubs();
            Zend_Registry::set('liste_pubs', $banners);
            $this->_liste = $banners;
        }
    }

    public function publicite($emplacement, $format, $id_campaign = null, $statut = null, $module = null, $controller = null)
    {
        // Si emplacement ou taille non défini, on affiche rien
        if (!isset($emplacement) || !isset($format)){
            return;
        }

        $model = new Core_Model_Publicites();

        $liste = $this->_liste->toArray();

        // Si un id est fourni, on sélectionne une pub en particulier
        if ($id_campaign){
            $liste = array( $model->findById($id_campaign) );
        }

        // S'il n'y aucune pub à afficher
        if (!count($liste)){
            return;
        }

        // On filtre les emplacements et la taille
        $liste = $model->filterEmplacement($liste, $emplacement);
        $liste = $model->filterTaille($liste, $format);

        // Si seulement pour mon statut
        if ($statut){
            $cred_helper = Zend_Controller_Action_HelperBroker::getStaticHelper('credits');
            $my_statut = isset( $cred_helper->getIdentity()->statut ) ? $cred_helper->getIdentity()->statut : '';
            $liste = $model->filterStatut($liste, $my_statut);
        }

        // A ce stade, s'il n'y a plus rien après les filtrages on arrête la.
        if (!count($liste)){
            return;
        }

        // Sélection au pif d'une pub parmi les filtrés
        $pub = $model->tirageAuSort($liste);

        // Si habillage
        if ($pub['format'] == 'habillage'){

            $link = '<a id="habillage-link" href="'. $this->view->url(array(
                'id' => $pub['id']
            ), 'www-pub-url', true) .'">&nbsp;</a>';

            $this->view->placeholder('habillage_link')->set($link);
            $this->view->headLink()->appendStylesheet('/css/' . $pub['stylesheet']);

        } else {

            // Afficher l'image ou le custom_code ?
            if (!empty($pub['image_url'])){

                echo $this->genererTag($pub);

                // Sinon on affiche le custom code.
            } else {

                echo $pub['custom_banner_code'];

            }

        }

        $model_cred = new Core_Model_Credits();

        // On incremente le nb de vues
        if (!$model_cred->isBot()){
            $model->increasePrint($pub['id']);
        }

        // Test insertion DB
        $model_com = new Core_Model_Commentaires();
        $model_com->addComment(1234, array(
            'id_membre' => 12345,
            'pseudo' => 'Supertino',
            'commentaire' => 'Coucou, comment ca va ? je teste',
            'created_at' => new Zend_Db_Expr('NOW()')
            )
        );
       // Résultat => le test est inséré 4 5 6 fois.

        /**
         * Controle des impressions.
         *
        $file = fopen( APPLICATION_PATH . '/data/affichage_pubs.txt', 'a+' );
        $infos = My_Dater::formater('now', 'HH:mm:ss') . ' : ' .
            $pub['id'] . ' - ' .
            $pub['format'] . ' - ' .
            $pub['name'] . ' - ' .
            'Imp_made : ' . $pub['imp_made'] . "\r\n";
        
        fwrite($file, $infos);
        fclose($file);
        // Résultat => il apparait 4 5 6 lignes avec imp_made +1 à chaque fois, pour une seule campagne.

    }

    public function genererTag($pub)
    {
        $extension = substr(strrchr($pub['image_url'],'.'),1);

        switch ($extension){

            case 'jpg':
            case 'jpeg':
            case 'gif':
                // Si c'est un lien absolu
                if (preg_match('#http://#', $pub['image_url'])){
                    $src = $pub['image_url'];
                } else {
                    // Si c'est un nom de fichier
                    $src = '/images/banners/'.$pub['image_url'];
                }
                $tag = '<a href="'. $this->view->url(array(
                    'id' => $pub['id']
                    ), 'www-pub-url', true) .'" target="_blank">
                        <img src="'. $src .'" alt="'. $pub['alt'] .'" title="'. $pub['title'] .'" />
                        </a>';

            break;

        case 'swf':

            $taille = '';
            
            if ($pub['format'] == 'pave'){
                $taille = 'width="300" height="250"';
            } elseif ($pub['format'] == 'banniere_grande'){
                $taille = 'width="728" height="90"';
            }
            
            $tag = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
                codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"
                ' . $taille . '>
                <param name="wmode" value="opaque" />
                <param name="movie" value="/images/banners/'. $pub['image_url'] .'">
                <param name="quality" value="high">
                <embed wmode="opaque" src="/images/banners/'. $pub['image_url'] .'" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" '. $taille .'></embed></object>';
            break;
        }

        return $tag;
    }
}
?>

La méthode increasePrint() du modèle :

Code:

    public function getActivePubs(){
        $table = $this->getTable();

        $select = $table->select();

        // Ou l'état = 1
        $select->where('state = ?', 1)
               ->where('publish_down_date IS NULL OR publish_down_date > CURDATE()')
               ->where('imp_total IS NULL OR imp_made < imp_total');

        return $table->fetchAll($select);
    }

    public function filterEmplacement($array, $emplacement){
        foreach ($array as $key => $value){

            $value['emplacement'] = trim($value['emplacement']);

            if ($value['emplacement'] != $emplacement){
                unset($array[$key]);
            }
        }

        return $array;
    }


    public function increasePrint($id){

        $table = $this->getTable();

        $row = $table->find($id)->current();
        $row->imp_made = $row->imp_made + 1;

        return $row->save();
    }

Je viens de faire un refresh et voici ce qui s'affiche dans le log :

Code:

13:42:59 : 101 - banniere_grande - Pub partenaire - Imp_made : 39
13:43:02 : 67 - banniere_grande - Pub test - Imp_made : 2552511
13:43:03 : 101 - banniere_grande - Pub partenaire - Imp_made : 40

Et ce, pour un seul refresh et un seul emplacement. la pub 101 a été sélectionnée puis incrémentée 2 fois, et la 67 qu'est ce qu'elle fout là...

J'ai essayé sans le $this->action('islogged', 'Auth')... malheureusement, toujours le même problème hmm

Hors ligne

 

#6 28-11-2011 18:03:13

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Honnêtement j'ai essayé de lire le code et c'est trop spécifique pour y trouver quelque chose d'intéressant... Je pense que la meilleure chose que tu as à faire c'est d'essayer d'isoler au maximum pour voir d'où peut venir le problème (supprimer toute ta logique dans l'aide de vue pour vérifier le nombre de fois ou elle est appelée, et remonter jusqu'à trouver le problème).

La ton code est beaucoup trop gros, faut que t'essayes de te ramener à un code minimal ou ça merde, parce que là, en tout cas, je vois pas sad...

Désolé hmm.

Hors ligne

 

#7 29-11-2011 16:57:55

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Merci pour ton aide quand même.
Mais oui, c'est vraiment la grosse merde à débugger ça...

Du coup, j'ai essayé de réfléchir logiquement :

Si le problème était que le helper était appelé 5 fois,  la bannière devrait au final s'afficher 5 fois non ?

J'ai relevé une autre incohérence dans le log.
Dans le __construct() du helper, la 1ere fois que le helper est instancié, il y a une sélection des campagnes actives, puis la sélection est stockée dans le Zend_Registry. (pour éviter de refaire des sélections lorsqu'une ou plusieurs pubs apparaissent sur une page) La méthode increasePrint() met à jour le row en base, mais pas l'entrée dans le Registre. Et justement les valeurs que je fais afficher dans le log sont les valeurs de ce qu'il y a dans ce registre.
Mettons, une pub A qui aurait en imp_made = 1. Le helper est instancié, rien dans le registre, on fait donc une selection des pubs actives et on les stocke dans le registre. On se retrouve avec la pub A et 1 impression. Il y a un bug dans le système, donc en db le imp_made est incrémenté 5 fois. Mais dans le registre, imp_made n'est pas modifié et tjrs égal à 1.
Comment expliquer que dans le log, imp_made monte bien de 1 en 1 à chaque fois ?
Ce qui pourrait signifier que le registre est à chaque fois rappelé et mis à jour.

Je sais pas si ça change quoi que ce soit, mais bon hmm

Hors ligne

 

#8 30-11-2011 20:25:32

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Bon j'ai passé toute l'après midi à chercher la cause.

Le dysfonctionnement parait plus clair :
en fait, dès que je fais appel à un helper (un view helper, ou un action helper) depuis la vue ou le layout, toutes les instructions du style écriture dans un fichier texte, ou reqûete SQL sont exécutées 4 5 6 fois. Tout ce qui est echo, var_dump ou setting d'une variable de l'instance fonctionne parfaitement (j'entends variable de l'instance, si j'ajoute un protected $_count = 0 et que je dump un $this->_count++ , le count aura bien été incrémenté qu'une seule fois, et non pas 6 fois)
C'est un truc à rendre fou un fou.

Je viens d'essayer une chose, c'est de virer tout ce qui est dans le layout, et de ne faire figurer qu'un $this->publicite();

Et là miracclle ! Une seule ligne dans mon log à chaque fois.
Le pb viendrait donc du contenu de layout.phtml, il faut que je trouve quoi...

Hors ligne

 

#9 30-11-2011 21:03:51

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Ok, j'ai donc trouvé la ligne fautive.

Il s'agit de ..... $this->layout()->content. hmm²²²²

Quand je la désactive, toutes les publicités présentes dans la layout et dans la vue sont bien incrémentées 1 fois. Si la réactive, toutes celles présentes dans le layout sont incrémentées 2 fois.

Maintenant, va comprendre pourquoi ?
Je peux bien évidemment pas me passer de cette ligne..

Dernière modification par supertino7 (30-11-2011 21:04:11)

Hors ligne

 

#10 01-12-2011 22:37:36

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

C'est bizarre ton problème... Cela voudrait dire que ton content (donc le contenu de la vue qui est affichée par layout->content) incrémenterait le compteur de tes pubs ? Si je comprends bien ?

Hors ligne

 

#11 02-12-2011 12:04:52

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

bakura a écrit:

C'est bizarre ton problème... Cela voudrait dire que ton content (donc le contenu de la vue qui est affichée par layout->content) incrémenterait le compteur de tes pubs ? Si je comprends bien ?

C'est ça ...
Toutes les requêtes, présentes dans le helper (update, insert, écriture dans un fichier) sont exécutées 2 fois. A l'exception de l'affichage (echo, var_dump). Et ceci uniquement pour les appels à $this->publicite() présents dans le layout, pas dans la vue.
Bien sur dans le content, il n'y a rien qui actionne intentionnellement ça.

C'est à rendre fou non ? hmm

Dernière modification par supertino7 (02-12-2011 12:08:34)

Hors ligne

 

#12 02-12-2011 15:41:10

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Oui, c'est assez bizarre. Est-ce que ce problème arrive sur TOUTES les actions ou juste sur une action spécifique ? T'as pas des éventuels redirect, des trucs bizarres que tu ferais à l'intérieur de tes actions ?

Hors ligne

 

#13 02-12-2011 16:58:47

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

bakura a écrit:

Oui, c'est assez bizarre. Est-ce que ce problème arrive sur TOUTES les actions ou juste sur une action spécifique ? T'as pas des éventuels redirect, des trucs bizarres que tu ferais à l'intérieur de tes actions ?

Purée, c'est encore plus tordu que je ne l'imaginais...

Je simplifie le tout.
Mon layout.phtml :

Code:

<head>
   <?= $this->publicite('habillage') ?>
</head>
<body>
   <div>
      <?= $this->publicite('banniere_grande') ?>
   </div>
</body>

Sur une vue toute simple

Code:

<div>
   Bonjour tout le monde
</div>

résultat du log :

Code:

16:20:29 : 107 - habillage - Habillage test - Imp_made : 931
16:20:29 : 91 - banniere_grande - Banniere test - Imp_made : 44

Tout fonctionne bien.

Sur une vue un peu plus complexe et qui contient :

Code:

<div>
   Ceci est une pub dans la vue : 
   <div>
      <?= $this->publicite('pave')  ?>
   </div>
</div>

résultat du log :

Code:

16:23:40 : 107 - habillage - Habillage test - Imp_made : 932
16:23:40 : 91 - banniere_grande - Banniere test - Imp_made : 45
16:23:40 : 80 - pave - Pave test - Imp_made : 52
16:23:43 : 107 - habillage - Habillage test - Imp_made : 933
16:23:43 : 91 - banniere_grande - Banniere test - Imp_made : 46

En gros les éléments du layout sont sélectionnés et incrémentés deux fois.

Je précise que les actions sont vides, il n'y a que des requetes pour extraire les lignes à afficher dans la vue.
Il y a donc un élément dans la page qui amène la boucle !
Mais quoi...

Hors ligne

 

#14 02-12-2011 17:15:08

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

J'ai trouvé le coupable.

Code:

<?= $this->logoEvent( $evenement['logo'], '88') ?>

C'est un view helper qui s'occupe d'afficher un logo. L'image s'il est spécifié dans le row, sinon une image par défaut.

Code:

class My_View_Helper_LogoEvent extends Zend_View_Helper_Abstract
{
    public function logoEvent($image, $taille = null)
    {
        $image = trim($image);
        
        if (null !== $taille){
            $width = 'max-width: ' . $taille . 'px;';
        } elseif (null === $taille) {
            $width = '';
        }
        
        if ($image!=''){ ?>
            <img src="/images/agenda/logos/<?= $image ?>" style="<?= $width; ?>" alt="Logo" />
        <?php
        } elseif ($image == ''){
            echo '<img src="/images/agenda/logos/no-logo.png" style="'. $width .'" alt="Logo Absent" />';
        }
    }
}

Maintenant... pourquoi ? big_smile telle est la question.
Mais ça fait du bien d'avoir un coupable déjà big_smile

Hors ligne

 

#15 02-12-2011 18:47:36

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Ok on avance ! suite de ma recherche :

Je bosse avec une copie en local de la base en production. Il y a donc certaines images ou certains logos qui n'existe pas sur mon disque dur.
Et justement : la double incrémentation se produit quand une de ces images n'est pas sur mon disque !

Mais alors quel est le rapport :?
Parce que le helper se contente de retourner du code HTML, et même si l'image n'existe pas le navigateur affichera quand même le ALT.

Y aurait-il des erreurs qui ne me seraient pas affichées, du style des notice ou des warnings, qui provoquerait une boucle ou une bêtise comme ça...

Dernière modification par supertino7 (02-12-2011 18:53:02)

Hors ligne

 

#16 02-12-2011 19:40:23

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Bon, suite. Maintenant que je me focalise sur le helper LogoEvent qui affiche des images, et comme il y a ce genre de helper dans une grosse partie de mon application...

Je récapitule :
J'ai un View Helper Publicite.php qui permet d'afficher aléatoirement une pub. $this->publicite() est appelé à la fois dans le layout, à la fois dans les vues. Le helper incrémente le nb l'impression de la pub avant son affichage.
Problème, lorsque j'affiche certaines actions, les pubs du layout sont sélectionnées et incrémentées 2 fois. Comme si le helper était de nouveau instancié.
Après recherches, il s'avère que le problème vient d'un autre View Helper : LogoEvent. Ce helper permet d'afficher un logo en retournant le code HTML approprié. Lorsque l'on demande d'afficher une image qui n'existe pas sur le disque dur, le bug des double-incrémentations se produit.

Code:

echo $this->logoEvent( 'une_image_inexistante.jpg', '100');

=> bug double-incrémentation

Par contre

Code:

echo htmlentities($this->logoEvent( 'une_image_inexistante.jpg', '100'));

=> ça fonctionne parfaitement, rien en double.

En espérant que ça puisse soulever des pistes...

Hors ligne

 

#17 02-12-2011 22:52:36

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Grr, c'est vraiment compliqué ton truc, le code impliqué est quand même super large. Le truc que je comprends pas, c'est que l'image soit prsente ou pas sur ton disque, ça ne fait qu'afficher un code HTML ? Ca ne charge rien de la base de donnée ni rien ?

Je sais pas si c'est toi en copiant qui l'a ajouté, mais pourquoi tu as ça :

if ($image!=''){ ?>

Tu refermes le bloc php mais tu ne fais pas d'echo pour le code HTML, du coup ton helper ne renvoie rien si ? De plus, logiquement ton view helper devrait faire un return, et pas un echo (puisque l'echo tu le fais lorsque tu appelles l'aide de vue dans la vue). Bon, je doute que ça corrige quoi que ce soit mais quand même.

Hors ligne

 

#18 05-12-2011 12:59:47

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Eh bien après 2 semaines de recherches très longues et intensives... j'ai enfin trouvé !

Le problème venait du htaccess d'origine, et en particulier de la ligne :

Code:

RewriteCond %{REQUEST_FILENAME} -s [OR]

Cette condition fait que toute requête dirigée vers un fichier introuvable sera redirigé vers index.php (puis vers ErrorController ou autre). Pour tester, j'ai affiché dans le browser une images inexistante, et chez moi c'est la page d'accueil qui s'affichait. D'où les pubs du layout qui s'affichaient une seconde fois !
Du coup j'ai modifié la rule finale :

Code:

RewriteRule !\.(js|ico|gif|jpg|jpeg|png|css)$ index.php [NC,L]

Et voila, tout fonctionne smile

Merci de m'avoir suivi Bakura. Et effectivement le helper était très très cradement écrit... c'était à mes débuts sur ZF, je faisais un peu n'importe comment, pressé par le délai de livraison...
J'ai corrigé depuis smile

Code:

<?php 

class SS_View_Helper_LogoEvent extends Zend_View_Helper_Abstract
{
    public function logoEvent($image, $taille = null)
    {
        $image = trim($image);

        if ($taille){
            $width = "max-width: {$taille}px;";
        } else {
            $width = '';
        }
        
        if (!empty($image)){
            
            return '<img src="/images/agenda/logos/'. $image .'" style="'. $width .'" alt="Logo" />';

        }

         return '<img src="/images/agenda/logos/no-logo.png" style="'. $width .'" alt="Logo Absent" />';
    }
}

Dernière modification par supertino7 (05-12-2011 13:01:48)

Hors ligne

 

#19 05-12-2011 20:53:09

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Ouah, bravo pour avoir trouvé l'erreur ! T'as du te taper quelques crises de nerf j'imagine ^^...

Hors ligne

 

#20 06-12-2011 10:59:18

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: Pourquoi mon Zend_View_Helper est appelé plusieurs fois ?

Un vrai jeu de piste smile

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages