IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC PHP Discussion :

Appeler un helper de vue dans un layout


Sujet :

MVC PHP

  1. #1
    Membre habitué
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Points : 194
    Points
    194
    Par défaut 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 ).

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
     $this->view->fmessages = $this->_helper->Messenger->getMessages();
    et dans une vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 sans succès, comme (dans la vue partial, ou dans le layout) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //$messages= $this->view->getHelper('Messenger');
    //$messages= $this->view->getHelper('Custom_Controller_Action_Helper_Messenger');
     
    $messages = $this->_helper->Messenger->getMessages();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    protected function _initActionHelpers() {
       ...     
     
      // Messenger
      Zend_Controller_Action_HelperBroker::addHelper(new Custom_Controller_Action_Helper_Messenger());
     
      ...
    }
    Une idée ?

    Fabrice

  2. #2
    Membre habitué
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Points : 194
    Points
    194
    Par défaut
    J'ai fait une p'tite erreur de lecture : J'ai une aide d'action, et il me faut une aide de vue !

    C'est ce que j'ai fait, mais là, je vois pas ce qu'il cloche par contre, car cela me retourne rien, malgré que le code dans l'aide d'action fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?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';
            }
     
        }
    }
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    var_dump($this->displayFlashMessages());
    ?>
    Une idée ?

    Fabrice

  3. #3
    Membre éprouvé
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Points : 1 297
    Points
    1 297
    Par défaut
    Bonjour,
    Tu l'initialise comment ton aide de vue ?

  4. #4
    Membre habitué
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Points : 194
    Points
    194
    Par défaut
    Bonjour,

    L'initialiser ?, ben, pas besoin non ?, elle est dans le dossier /views/helpers/

    Fabrice

  5. #5
    Membre éprouvé
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Points : 1 297
    Points
    1 297
    Par défaut
    Il existe plusieurs instance de Zend_View et il faut peut être dans ton cas le mettre sur ViewRenderer, dans ton bootstrap ou tu initialise ta vue il te faut quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $view = new Zend_View();
    $view->setHelperPath('lien vers ton helper', 'Nom de ton helper');
    $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
    $viewRenderer->setView($view);
    Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
    Ou sinon tu procède dans l'autre sens et tu modifie directement le viewRenderer plutot que de le rajouter.

  6. #6
    Membre habitué
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Points : 194
    Points
    194
    Par défaut
    Je vois pas pourquoi... La vue est dans le bon dossier. Lorsque je vais un : return 'hello'. Tout s'affiche correctement.
    Cela vient de l'aide d'action, qui ne retourne rien. Voici un fragment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    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();
        }

  7. #7
    Membre éprouvé
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Points : 1 297
    Points
    1 297
    Par défaut
    Comment veux tu qu on le devine si tu ne l indique pas ?
    Surtout en disant plus haut que c est l aide de vue qui ne fonctionne pas et que ça n affiche rien.

    Essaye dans ton aide d action de retourner un texte à tout les coups. Puis d appeler cette action depuis ton aide de vue et de l afficher.

    Sinon tu vois bien toutes les erreurs PHP?

  8. #8
    Membre habitué
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Points : 194
    Points
    194
    Par défaut
    Bon, après plusieurs tests, j'ai encore quelques soucis :
    Lorsque je fais ceci, tout marche tres bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
                    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public function indexAction() {
            $this->view->fmessages = $this->view->flashMessages();
            $this->view->config = $this->_config;
        }
    /views/index/index.phtml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
     
    echo "Erreurs :  " . $this->fmessages;
     
    ?>
    Ensuite, en faisais çà dans le layout, par contre, plus de messages :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        <!-- 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?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

    Une idée ?
    Merci

    Fabrice

Discussions similaires

  1. [ZF 1.0] appeller une action quand on est dans le layout.phtml?
    Par keokaz dans le forum MVC
    Réponses: 3
    Dernier message: 12/09/2011, 13h54
  2. appel d'une autre vue dans une vue d'un modèle different
    Par Fiyorden dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 09/07/2008, 16h22
  3. [SqlSrv2005/C#] Appeler une vue dans un Dataset
    Par Ykaar dans le forum Accès aux données
    Réponses: 3
    Dernier message: 05/09/2007, 13h30
  4. Erreur 404 sur appel de vues dans tuto de Rob
    Par *.Har(d)t dans le forum MVC
    Réponses: 16
    Dernier message: 10/07/2007, 20h06
  5. appeller une Vue dans un Select
    Par DR. dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/12/2004, 16h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo