Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > MVC
MVC Forum de support sur le développement d'applications de type modèle-vue-contrôleur avec Zend Framework ainsi que vos questions sur les plugins, les helpers etc. Avant de poster -> Cours MVC, FAQ ZF Controller
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/01/2012, 10h44   #1
Membre actif
 
Avatar de __fabrice
 
Fabrice
Inscription : août 2004
Messages : 308
Détails du profil
Informations personnelles :
Nom : Fabrice
Âge : 40

Informations forums :
Inscription : août 2004
Messages : 308
Points : 180
Points : 180
Envoyer un message via ICQ à __fabrice Envoyer un message via MSN à __fabrice
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 :
 $this->view->fmessages = $this->_helper->Messenger->getMessages();
et dans une vue :
Code :
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 :
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 :
1
2
3
4
//$messages= $this->view->getHelper('Messenger');
//$messages= $this->view->getHelper('Custom_Controller_Action_Helper_Messenger');
 
$messages = $this->_helper->Messenger->getMessages();
Code :
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
__fabrice est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 18h49   #2
Membre actif
 
Avatar de __fabrice
 
Fabrice
Inscription : août 2004
Messages : 308
Détails du profil
Informations personnelles :
Nom : Fabrice
Âge : 40

Informations forums :
Inscription : août 2004
Messages : 308
Points : 180
Points : 180
Envoyer un message via ICQ à __fabrice Envoyer un message via MSN à __fabrice
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 :
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 :
1
2
3
<?php
var_dump($this->displayFlashMessages());
?>
Une idée ?

Fabrice
__fabrice est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 19h37   #3
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Bonjour,
Tu l'initialise comment ton aide de vue ?
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 19h56   #4
Membre actif
 
Avatar de __fabrice
 
Fabrice
Inscription : août 2004
Messages : 308
Détails du profil
Informations personnelles :
Nom : Fabrice
Âge : 40

Informations forums :
Inscription : août 2004
Messages : 308
Points : 180
Points : 180
Envoyer un message via ICQ à __fabrice Envoyer un message via MSN à __fabrice
Bonjour,

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

Fabrice
__fabrice est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 20h20   #5
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
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 :
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.
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 08h57   #6
Membre actif
 
Avatar de __fabrice
 
Fabrice
Inscription : août 2004
Messages : 308
Détails du profil
Informations personnelles :
Nom : Fabrice
Âge : 40

Informations forums :
Inscription : août 2004
Messages : 308
Points : 180
Points : 180
Envoyer un message via ICQ à __fabrice Envoyer un message via MSN à __fabrice
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 :
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();
    }
__fabrice est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 13h15   #7
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
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?
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 11h56   #8
Membre actif
 
Avatar de __fabrice
 
Fabrice
Inscription : août 2004
Messages : 308
Détails du profil
Informations personnelles :
Nom : Fabrice
Âge : 40

Informations forums :
Inscription : août 2004
Messages : 308
Points : 180
Points : 180
Envoyer un message via ICQ à __fabrice Envoyer un message via MSN à __fabrice
Bon, après plusieurs tests, j'ai encore quelques soucis :
Lorsque je fais ceci, tout marche tres bien :
Code :
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 :
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 :
1
2
3
4
    public function indexAction() {
        $this->view->fmessages = $this->view->flashMessages();
        $this->view->config = $this->_config;
    }
/views/index/index.phtml :
Code :
1
2
3
4
5
<?php
 
echo "Erreurs :  " . $this->fmessages;
 
?>
Ensuite, en faisais çà dans le layout, par contre, plus de messages :
Code :
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 :
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
__fabrice est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h28.


 
 
 
 
Partenaires

Hébergement Web