Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 09-01-2012 16:22:15

__fabrice
Membre
Date d'inscription: 25-04-2007
Messages: 131

Appeler un helper de vue dans un layout

Salut à tous (et bonne année),

Je rencontre une erreur que j'avais résolu (mais je ne me rappelle plus sad ).

J'ai une aide de vue ici : Custom_Controller_Action_Helper_Messenger qui affiche les erreurs dans le helper flashMessenger.

Tout va bien si je l'utilise dans un controller :

Code:

 $this->view->fmessages = $this->_helper->Messenger->getMessages();

et dans une vue :

Code:

<?php if (count($this->fmessages)>=1) {?>
    <div class="alert-box error">
        <?php foreach ($this->fmessages as $i => $m) {
            echo '<span class="'.$m['class'].'">- '.$m['message']."</span><br>";
        }?>
        <a href="" class="close">&times;</a>
    </div>
<?php } ?>

Mais j'aimera utiliser ce helper dans mon layout et/ou dans un partial. Mais j'ai ce message d'erreur :

Code:

Notice: Trying to get property of non-object ... ... ... application/modules/frontoffice/layouts/layout.phtml on line 98 Fatal error: Call to a member function getMessages() on a non-object in  ... ... ...

Donc, il ne trouve pas le helper et/ou la méthode du helper. J'ai essayé plusieurs options dans succès.

Une idée ?

Fabrice

Hors ligne

 

#2 09-01-2012 16:33:45

lebilien
Membre
Lieu: avranches
Date d'inscription: 19-06-2007
Messages: 270
Site web

Re: Appeler un helper de vue dans un layout

alors moi je fais ainsi :

Code:

$gestionpays = $this->view->getHelper('gestionpays');

http://www.parkaddict.com Gagner des places dans vos parcs préférés

Hors ligne

 

#3 09-01-2012 17:15:33

_Fuse_
Membre
Lieu: Aquitaine
Date d'inscription: 10-07-2008
Messages: 92

Re: Appeler un helper de vue dans un layout

Bonjour,

Est-ce que tu ne confonds pas aide d'action et aide de vue?
Dans ton controlleur tu indiques ceci :

Code:

$this->view->fmessages = $this->_helper->Messenger->getMessages();

Ce qui te permet de récupérer ce que te retourne le helper dans une vue ou dans un layout comme ceci :

Code:

echo $this->fmessages;

Par contre si tu veux utiliser directement le helper dans le layout il faudra créer une aide vue.

Dernière modification par _Fuse_ (09-01-2012 17:23:37)

Hors ligne

 

#4 09-01-2012 17:47:44

__fabrice
Membre
Date d'inscription: 25-04-2007
Messages: 131

Re: Appeler un helper de vue dans un layout

Merci "lebilien", je vais tester çà... mais cela ne marche pas: ni dans le layout, ni dans la vue "partial".

Bien sur que je confonds pas aide de vue et d'action smile smile

sad

Dernière modification par __fabrice (09-01-2012 17:48:10)

Hors ligne

 

#5 09-01-2012 17:49:16

__fabrice
Membre
Date d'inscription: 25-04-2007
Messages: 131

Re: Appeler un helper de vue dans un layout

"_Fuse_", en fait, je veux récupérer les infos directement dans le layout. Si je dois passer dans un controlleur à chaque fois... cela ne vas pas aller smile

Fabrice

Hors ligne

 

#6 10-01-2012 09:00:28

lebilien
Membre
Lieu: avranches
Date d'inscription: 19-06-2007
Messages: 270
Site web

Re: Appeler un helper de vue dans un layout

__fabrice a écrit:

Merci "lebilien", je vais tester çà... mais cela ne marche pas: ni dans le layout, ni dans la vue "partial".

Bien sur que je confonds pas aide de vue et d'action smile smile

sad

alors moi je l'utilise dans mon controller pour appeler un helper.  et dans la vu tu dois appeler ton helper d'une autre façcon .

$this->nomhelerper->action

cdt


http://www.parkaddict.com Gagner des places dans vos parcs préférés

Hors ligne

 

#7 10-01-2012 10:37:27

__fabrice
Membre
Date d'inscription: 25-04-2007
Messages: 131

Re: Appeler un helper de vue dans un layout

oui, je sais, et je fais exactement. Et cela ne marche pas :

Code:

//$messages= $this->view->getHelper('Messenger');
//$messages= $this->view->getHelper('Custom_Controller_Action_Helper_Messenger');

$messages = $this->_helper->Messenger->getMessages();

J'ai essayé cette maniere de faire, sans succès. JE n'ai pas d'erreur, mais cela ne me renvoie rien :

Code:

 $messageObject= new Custom_Controller_Action_Helper_Messenger;
 $messages = $messageObject->getMessages();

Une autre idée ?

Fabrice

Dernière modification par __fabrice (10-01-2012 10:41:32)

Hors ligne

 

#8 10-01-2012 10:44:08

lebilien
Membre
Lieu: avranches
Date d'inscription: 19-06-2007
Messages: 270
Site web

Re: Appeler un helper de vue dans un layout

alors moi dans la vue j'utilise le helper ainsi :

Code:

<?php echo $this->date()->dateFrench($date); ?>

et j'ai un fichier date .php dans un répertoire helper

Code:

class Zend_View_Helper_Date extends Zend_View_Helper_Abstract  {

après faut déclarer tes helpes dans le boostrap si je me trompe pas


http://www.parkaddict.com Gagner des places dans vos parcs préférés

Hors ligne

 

#9 10-01-2012 10:46:31

__fabrice
Membre
Date d'inscription: 25-04-2007
Messages: 131

Re: Appeler un helper de vue dans un layout

Oui, c fait :

Code:

 protected function _initActionHelpers() {
   ...     
     
  // Messenger
  Zend_Controller_Action_HelperBroker::addHelper(new Custom_Controller_Action_Helper_Messenger());

  ...
}

Dernière modification par __fabrice (10-01-2012 10:47:59)

Hors ligne

 

#10 10-01-2012 11:56:40

_Fuse_
Membre
Lieu: Aquitaine
Date d'inscription: 10-07-2008
Messages: 92

Re: Appeler un helper de vue dans un layout

C'est bien ce que je disais, tu as une jolie aide d'action disponible, alors que tu a besoin d'une aide de vue comme @lebilien te l'indique.

Hors ligne

 

#11 10-01-2012 12:02:12

__fabrice
Membre
Date d'inscription: 25-04-2007
Messages: 131

Re: Appeler un helper de vue dans un layout

houuuuuuuuulalala... yes  sad

J'étais persuadé que c t une aide de vue (je sais pas pourquoi).. la boulette smile.

Dernière modification par __fabrice (10-01-2012 12:02:39)

Hors ligne

 

#12 10-01-2012 13:41:45

_Fuse_
Membre
Lieu: Aquitaine
Date d'inscription: 10-07-2008
Messages: 92

Re: Appeler un helper de vue dans un layout

smile
Tu peux passer le sujet en "résolu".

Hors ligne

 

#13 10-01-2012 15:37:01

__fabrice
Membre
Date d'inscription: 25-04-2007
Messages: 131

Re: Appeler un helper de vue dans un layout

Pas tout de suite wink.
J'ai donc fait une aide de vue qui appelle l'aide d'action :

Code:

<?php
class Zend_View_Helper_DisplayFlashMessages extends Zend_View_Helper_Abstract {
    
    public function displayFlashMessages()  {

        //$messages=Zend_Controller_Action_HelperBroker::getStaticHelper('Messenger');
        $messages = new Custom_Controller_Action_Helper_Messenger();
        
        if ($messages->count()) {
            //return $this->view->htmlList($messages->getMessages(),false,array('id' => 'messages'));
            return $messages->getMessages();
        } else {
            return 'no messages';
        }

    }
}
?>

et l'index.html (pour tester avant le layout) :

Code:

<?php
var_dump($this->displayFlashMessages());
?>

Les messages passe bien dans l'aide d'action j'ai testé. Mais le retour est vide !!!???

Fabrice

Dernière modification par __fabrice (10-01-2012 15:37:53)

Hors ligne

 

#14 10-01-2012 17:00:39

lebilien
Membre
Lieu: avranches
Date d'inscription: 19-06-2007
Messages: 270
Site web

Re: Appeler un helper de vue dans un layout

je comprend pas tu veut utiliser le flashMessenger ? Pourquoi cherche tu à réécrire le code , il y a plein de code sur le net qui fonctionne très bien et au besoin je peut t'en fournir un .


http://www.parkaddict.com Gagner des places dans vos parcs préférés

Hors ligne

 

#15 10-01-2012 17:04:42

__fabrice
Membre
Date d'inscription: 25-04-2007
Messages: 131

Re: Appeler un helper de vue dans un layout

Je ne re-écris rien smile. L'aide d'action, je l'ai prise sur le net. Et j'ai du refaire une aide de vue, évidemment wink

Mais si tu as du code pour ce genre de chose... le flashMessenger, oui, je suis preneur.

Fabrice

Hors ligne

 

#16 11-01-2012 01:21:24

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: Appeler un helper de vue dans un layout

Pareil j'ai pas trop compris ce que tu tente de faire, et j'ai l'impression que tu te mélange les pinceaux avec les aides de vue et les aides d'action.

Pour une aide de vue pour les flashMessenger y'a en effet des trucs très sympa sur le web

Hors ligne

 

#17 11-01-2012 08:35:25

__fabrice
Membre
Date d'inscription: 25-04-2007
Messages: 131

Re: Appeler un helper de vue dans un layout

Je trouve çà simple pourtant.

1- J'ai une aide d'action pour le flashMessenger.

2- Je voudrais faire une aide de vue que je pourrais inclure dans un phtml, et surtout dans le layout. Cette aide de vue appellerai l'aide d'action.

L'aide d'action est appelé dans l'aide de vue, mais ne retourne rien. On dirai qu'il y a un soucis avec les sessions.

Je ne vais pas mettre tout le code de l'aide d'action, mais voici un fragment de class Custom_Controller_Action_Helper_Messenger extends Zend_Controller_Action_Helper_Abstract implements IteratorAggregate, Countable { :

Code:

 public function __construct()
    {
        if (!self::$_session instanceof Zend_Session_Namespace) {
            self::$_session = new Zend_Session_Namespace($this->getName());
        }
    }

    /**
     * setNamespace() - change the namespace messages are added to, useful for
     * per action controller messaging between requests
     *
     * @param  string $namespace
     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
     */
    public function setNamespace($namespace = 'default')
    {
        $this->_namespace = $namespace;
        return $this;
    }

    /**
     * resetNamespace() - reset the namespace to the default
     *
     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
     */
    public function resetNamespace()
    {
        $this->setNamespace();
        return $this;
    }

    /**
     * addMessage() - Add a message to message
     *
     * @param  string $message
     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
     */
    public function addMessage($message, $class='info')    {
        
        if (!is_array(self::$_session->{$this->_namespace})) {
            self::$_session->{$this->_namespace} = array();
        }
        self::$_session->{$this->_namespace}[] = array('message'=>$message, 'class'=>$class);
        return $this;
    }

    /**
     * setMessage() - Set a single message to message
     *
     * @param  string $message
     * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
     */
    public function setMessage($message, $class='info')
    {
        self::$_session->{$this->_namespace} = array(array('message'=>$message, 'class'=>$class));
        return $this;
    }

    /**
     * hasMessages() - Wether a specific namespace has messages
     *
     * @return boolean
     */
    public function hasMessages()
    {
        return isset(self::$_session->{$this->_namespace});
    }

    /**
     * getMessages() - Get messages from a specific namespace
     *
     * @return array
     */
    public function getMessages($rxFormat=false) {
        
        if ($this->hasMessages()) {
            $msgs = array_merge(array(),self::$_session->{$this->_namespace});
            $this->clearMessages();
            
            if ($rxFormat) {
                //@@// require_once 'Rx/Messenger/Message.php';
                
                $formatedMsgs = array();
                foreach($msgs as $msg) {
                    $formatedMsgs[] = new Rx_Messenger_Message($msg);
                }
                
                return$formatedMsgs;
            }
            
            return $msgs;
        }

        return array();
    }

Fabrice

Dernière modification par __fabrice (11-01-2012 08:37:04)

Hors ligne

 

#18 11-01-2012 08:42:19

lebilien
Membre
Lieu: avranches
Date d'inscription: 19-06-2007
Messages: 270
Site web

Re: Appeler un helper de vue dans un layout

alors le code le fichier flashmessenger

Code:

<?php
 
/**
 * @see Zend_Controller_Action_Helper_FlashMessenger
 */
require_once 'Zend/Controller/Action/Helper/FlashMessenger.php';
 
/**
 * @author grummfy
 */
class Zend_View_Helper_FlashMessenger extends Zend_View_Helper_Abstract implements IteratorAggregate, Countable
{
    protected $_fm;
 
    public function __construct()
    {
        $this->_fm = new Zend_Controller_Action_Helper_FlashMessenger();
    }
 
    public function flashMessenger($cur = false)
    {
        if ($cur)
            return $this;
        else
            return $this->getMessages();
    }
 
    /**
     * Return currents FlashMessegenr object
     * @return Zend_Controller_Action_Helper_FlashMessenger
     */
    public function getFlasMessenger()
    {
        return $this->_fm;
    }
 
    /**
     * Return previous emmited messages
     * @return array
     */
    public function getMessages()
    {
        return $this->_fm->getMessages();
    }
 
    /**
     * Renvoi le nombre de messages pass�
     * @return int
     */
    public function hasMessages()
    {
        return count($this->_fm);        
    }
 
    public function getIterator()
    {
        return $this->_fm->getIterator();
    }
 
    public function count()
    {
        return $this->_fm->count();
    }
}
?>

dans le controller  (je met cela dans le init moi)

Code:

 $this->view->messages = $this->_helper->flashMessenger->getMessages();

        $this->_helper->flashMessenger->clearCurrentMessages();

pour ajouter un message

Code:

     $this->_helper->flashMessenger->addMessage($message);

après pour l'afficher je te laisse voir mais c'est trés simple smile

Cordialement


http://www.parkaddict.com Gagner des places dans vos parcs préférés

Hors ligne

 

#19 11-01-2012 08:56:11

__fabrice
Membre
Date d'inscription: 25-04-2007
Messages: 131

Re: Appeler un helper de vue dans un layout

De mon coté, avec le code actuel, tout marche dans un controller quelconque :

Code:

   public function indexAction() {
        $this->view->fmessages = $this->_helper->Messenger->getMessages();
        $this->view->config = $this->_config;
    }

. Mais l'intêret, je pense, et de le mettre dans le layout, pour eviter de devoir mettre du code dans un controller à chaque fois qu'on veut l'utiliser.

Par contre, dans ton code, pourquoi refaire les fonctions déjà présentes de l'aide d'action ? .Elle n'est pas sensé tout gérer ? L'aide de vue ne doit pas juste afficher ?

F.

Dernière modification par __fabrice (11-01-2012 08:59:03)

Hors ligne

 

#20 11-01-2012 10:13:25

_Fuse_
Membre
Lieu: Aquitaine
Date d'inscription: 10-07-2008
Messages: 92

Re: Appeler un helper de vue dans un layout

yikes

__Fabrice a écrit:

. Mais l'intêret, je pense, et de le mettre dans le layout, pour eviter de devoir mettre du code dans un controller à chaque fois qu'on veut l'utiliser.

A chaque fois que tu veux utiliser quoi? et surtout pour quoi faire? Je pense que ce sont les premières questions sur lesquelles tu devrais te pencher avant de réutiliser des bouts de codes pris à droite à gauche.
Un petit tour dans la doc peut être?
Si tu veux gérer des messages qui peuvent prendre différentes formes dans les contrôleurs et ensuite les utilisés dans les vues pour cela Zend intègre un helper d'action appelé FlashMessenger.
Il permet de stocker des messages de façon permanente, sans qu'ils ne soient effacés a chaque requêtes sur le serveur. a voir ici

Dernière modification par _Fuse_ (11-01-2012 15:00:20)

Hors ligne

 

#21 11-01-2012 10:35:39

__fabrice
Membre
Date d'inscription: 25-04-2007
Messages: 131

Re: Appeler un helper de vue dans un layout

Oui, je sais tout çà. L'aide d'action dont je parle "remplace" le helper FlashMessenger, avec des messages en session (et namespace)

Mon utilisation est simple : Stocker des messages, et les afficher ensuite où je veux dans le code (ligne : $this->_helper->Messenger(...), qui utilise l'aide d'action)  :

Code:

if ($request->isPost()) {
               $formData = $this->getRequest()->getPost();
               
                if ($form->isValid($formData)) {
                    $authentification = new Custom_Auth_Authentication();
                    
                     if ($authentification->authenticate($formData)) {
                        $this->_redirect("/accueil-administration.html");
                    } else {
                       $this->_helper->Messenger('Vous n\'êtes pas reconnu. Veuillez vous reconnecter !','error');
                       $this->_redirect("/accueil.html");
                    }
                }
                
            }

Je pourrais donc utiliser le helper FlashMessenger de Zend dans mon aide de vue.

Mais effectivement, on peut faire çà

Fab

Dernière modification par __fabrice (11-01-2012 10:38:14)

Hors ligne

 

#22 13-01-2012 11:56:28

__fabrice
Membre
Date d'inscription: 25-04-2007
Messages: 131

Re: Appeler un helper de vue dans un layout

Bon, après plusieurs tests, j'ai encore quelques soucis :
Lorsque je fais ceci, tout marche tres bien :

Code:

                if ($form->isValid($formData)) {
                    $authentification = new Custom_Auth_Authentication();
                    
                     if ($authentification->authenticate($formData)) {
                        $this->_helper->flashMessenger->addMessage('Vous êtes authentifié. Merci');
                        $this->_redirect("/accueil-administration.html");
                    } else {
                       $this->_helper->flashMessenger->addMessage('Vous n\'êtes pas reconnu. Veuillez vous reconnecter !');
                       //$this->_helper->redirector("/");
                      $this->_redirect("/accueil.html");
                      
                    }
                }

Code:

<?php
class Zend_View_Helper_FlashMessages extends Zend_View_Helper_Abstract
{
    public function flashMessages()
    {
        $messages = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger')->getMessages();
        $currentMessages = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger')->getCurrentMessages();

        $messages = array_merge($messages,$currentMessages);
                    
        $output = '';
                
        if (is_array($messages)) {
            $output .= '<ul id="messages">';
            foreach ($messages as $key => $message) {
                $output .= '<li class="' . $key . '">' . $message . '</li>';
            }
            $output .= '</ul>';
                }
                //echo "output : " .$output;
        return $output;
    }
}
?>

IndexController :

Code:

    public function indexAction() {
        $this->view->fmessages = $this->view->flashMessages();
        $this->view->config = $this->_config;
    }

/views/index/index.phtml :

Code:

<?php

echo "Erreurs :  " . $this->fmessages;

?>

Ensuite, en faisais çà dans le layout, par contre, plus de messages :cry::

Code:

    <!-- ERRORS MESSAGES ------------------------------------- -->
    <div class="row">
        <div class="twelve columns">
             <?php
             echo $this->partial("/common/_errors_messages.phtml");
             ?>
        </div>
    </div><!-- row -->

/common/_errors_messages.phtml (ou dans le views/index/index.phtml) :

Code:

<?php
echo "_errors_messages :  " . $this->flashMessages();
?>

Si je n'appelle pas l'aide de vue dans le controller (un non sens, enfin disons qu'on doit l'appeller directement dans une vue !), cela ne marche plus sad

Une idée ?
Merci

Fabrice

Dernière modification par __fabrice (13-01-2012 11:58:07)

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