Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Lorsque qu'une action d'un controller est appelée, automatiquement, la vue associée à cette action est affichée. Y a-t-il un moyen pour empêcher l'affichage de la vue ou alors de ne pas afficher cette vue en premier ?
Je m'explique plus clairement. J'ai un controller PersonnelController avec diverses actions dont la suivante preferencesAction.
Lorsque je veux accéder à l'url suivante : http://localhost:monport/personnel/preferences
la vue preferences.phtml est affichée au début de ma page. Or, je souhaite afficher un contenu avant pour avoir une page qui ressemble à ca :
----------------maPage1.phtml-------------
----------monMenu.phtml-------------------
----------preferences.phtml----------------
Actuellement, j'ai :
----------preferences.phtml----------------
----------maPage1.phtml-------------------
----------monMenu.phtml-------------------
J'espère avoir été suffisamment clair pour que vous puissiez m'aider. Sinon n'hésitez pas à me demander, je mettrais une copie d'écran.
Par avance merci,
Nikko
Dernière modification par Nikko (13-03-2009 15:20:00)
Hors ligne
Hello,
Dans le controller, pour désactiver :
$this->_helper->viewRenderer->setNoRender();
et pour effectuer le rendu plus loin :
$this->render()
A+
Hors ligne
Je te remercie Mikealkeal (sympa ton pseudo, ca rappelle certains souvenir de télé ), je vais tester ça
Edit : Ca fonctionne bien, mais j'ai un problème (que j'avais déjà auparavant) qui persiste. Ma page affichée n'a pas de propriété CSS alors que dans le code source, j'ai bien l'inclusion de mes fichiers CSS. Pareil pour les images. Tu aurais une idée ?
Dernière modification par Nikko (19-02-2009 09:04:36)
Hors ligne
Hello,
Utilises-tu les aides de vues ?
$this->headStyle()...;
Si non, je te conseille de regarder de ce côté.
A+
Hors ligne
Non, je ne les utilise pas. Je vais regarder ça. Merci encore !
Nikko
Edit : Je fais des imports de fichiers CSS. D'après ce que j'ai lu, il faudrait que j'utilise plutôt
$this->headLink()
Mais ça ne fonctionne pas. Voici ce que j'ai ajouté dans ma vue :
$this->headTitle($this->title); $this->headMeta()->setHttpEquiv('Content-Type', 'text/html ; charset=iso-8859-1'); $this->headLink(array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => './document_root/scripts/extjs/resources/css/ext-all.css')); $this->headScript(array('type' => 'text/javascript', 'src' => './document_root/scripts/extjs/adapter/ext/ext-base.js')); $this->headScript(array('type' => 'text/javascript', 'src' => './document_root/scripts/extjs/ext-all.js')); $this->headLink(array('rel' => 'stylesheet', 'type' => 'text/css', 'media' => 'print', 'href' => './document_root/styles/print.css')); $this->headLink(array('rel' => 'stylesheet', 'type' => 'text/css', 'media' => 'screen', 'href' => './document_root/styles/site.css')); $this->headScript(array('type' => 'text/javascript', 'src' => './document_root/js/prototype.js'));
Dernière modification par Nikko (19-02-2009 10:46:34)
Hors ligne
Salut,
Vite fait comme ça je dirais que "./" ne pointe pas forcément là où tu penses.
Tu devrais plutôt utiliser un baseUrl ou des urls absolues.
Sinon, tu devrais utiliser l'aide de vue headStyle() plutôt que headLink() dans ton cas, c'est plus facile à manipuler.
A+ benjamin.
Dernière modification par Delprog (19-02-2009 10:50:18)
Hors ligne
bonjour Delprog,
Quelle est la différence entre headStyle() et headLink() ?
J'ai omis de le préciser, mais mes CSS fonctionnent sur ma page d'accueil mais lorsque je clique sur un lien, tout disparait dans la nouvelle page affichée. Comme s'il ne trouvait plus les chemins vers les fichiers CSS.
Hors ligne
Hello,
headStyle : c'est pour mettre du mettre du css dans ton head html. headLink c'est pour lier un fichier externe (css ou non).
$this->headLink(array('rel' => 'stylesheet', 'type' => 'text/css', 'href' => './document_root/scripts/extjs/resources/css/ext-all.css')); // est équivalent à $this->headLink()->appendStyleSheet('./document_root/scripts/extjs/resources/css/ext-all.css'); // et dans ton cas je mettrais $this->headLink()->appendStyleSheet('/scripts/extjs/resources/css/ext-all.css');
Il faut aussi ajouter dans ton layout :
<?= $this->headLink() ?> // ou <?php echo $this->headLink() ?>
A++
Hors ligne
Autant pour moi j'ai dis une connerie, tu dois bien utiliser headLink(), mais tu te compliques la vie, il y une utilisation plus simple pour les ressources CSS.
Ex.
$this->headLink()->appendStylesheet($this->_httpRoot . '/styles/layout/layout.css') ->appendStylesheet($this->_httpRoot . '/styles/layout/header.css') ->appendStylesheet($this->_httpRoot . '/styles/layout/accroche.css') ->appendStylesheet($this->_httpRoot . '/styles/layout/menu.css') ->appendStylesheet($this->_httpRoot . '/styles/layout/footer.css');
Idem pour headScript()
$this->headScript()->appendFile($this->_httpRoot . '/scripts/ajax/lib/prototype.js') ->appendFile($this->_httpRoot . '/scripts/ajax/effects/scriptaculous.js') ->appendFile($this->_httpRoot . '/scripts/tools.js') ->appendFile($this->_httpRoot . '/scripts/json/json.js');
Ca revient au même que ton code, c'est simplement plus lisible et fait pour ça
Concernant les chemins ça ne m'étonne pas. Pour ne pas avoir de problèmes, il faudrait que tu utilises soit des chemins relatifs, par ex. avec une aide de vue baseUrl, soit des chemins absolus.
De mon côté, j'ai surchargé Zend_View pour ajouter une variable _httpRoot et une méthode pour le configurer au moment de l'initialisation de l'appli.
Je suppose qu'on peut faire la même chose avec un view helper personnalisé, mais je ne me suis pas trop penché sur la question.
Dans tous les cas je n'utilise jamais des chemins du type "./" et les chemins relatifs que dans mes CSS ("../../" etc.).
A+ benjamin.
Hors ligne
Ah ben réponse plus rapide de mikaelkael.
Hors ligne
Je vous remercie tous les deux pour vos éclaircissements. J'ai donc modifié mon layout.phtml comme suit :
<html> <head> <?php if($_SESSION['acl']['role'] != 'visiteur') { echo $this->headMeta()->setHttpEquiv('Content-Type', 'text/html; charset=iso-8859-1'); echo $this->headTitle($this->escape($this->title)); echo $this->headScript()->appendFile(DOCUMENT_ROOT . '/scripts/extjs/adapter/ext/ext-base.js') ->appendFile(DOCUMENT_ROOT . '/scripts/extjs/ext-all.js') ->appendFile(DOCUMENT_ROOT . '/js/prototype.js'); echo $this->headLink()->appendStylesheet(DOCUMENT_ROOT . '/styles/site.css') ->appendStylesheet(DOCUMENT_ROOT . '/scripts/extjs/resources/css/ext-all.css') ->appendStylesheet(array('media' => 'print', 'href' => DOCUMENT_ROOT . '/styles/print.css')); ?> <script type="text/javascript"> Ext.onReady(function(){ new Ext.ToolTip({ target: 'tip_change_profil', title: 'Changer de profil', width:200, html: 'Cliquez ici pour emprunter un autre profil', trackMouse:true }); new Ext.ToolTip({ target: 'tip_connexion', title: 'Déconnexion', width:150, html: 'Cliquez ici pour vous déconnecter', trackMouse:true }); new Ext.ToolTip({ target: 'tip_revenir', title: 'Profil', width:150, html: 'Revenir au profil d\'origine', trackMouse:true }); Ext.QuickTips.init(); }); function refreshMonth() { var url = "<?php print ROOT_URL; ?>/check-year/"; var myAjax = new Ajax.Request( url, { method: 'get', parameters: {year: $('menu_selected_year').value}, onComplete: renderResults, onFailure: function(){ alert('Erreur'); } }); } function renderResults(response) { eval(response.responseText); } </script> <?php } ?> </head> <!-- <body onLoad="hide_loading_layer();"> --> <?php if ( $_SESSION['acl']['role'] != 'visiteur') { echo "<div id='en_tete'>"; $this->layout()->header ; echo "</div>"; echo "<div>"; echo $this->layout()->menu; echo "</div>"; } echo $this->layout()->content ; ?> </div> </div> </body> </html>
J'ai ma page d'accueil qui s'affiche correctement, mais dès que je clique sur un lien, je perds toujours toutes les propriétés CSS.
Dernière modification par Nikko (19-02-2009 16:22:26)
Hors ligne
Salut,
Encore un peu d'optimisation:
layout.phtml:
<?php /** * Layout par défaut * * */ echo '<?xml version="1.0" encoding="iso-8859-1" ?>'; echo $this->doctype(); // Ajout des balises Meta communes $this->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=iso-8859-1'); // Ajout des css communes $this->headLink()->appendStylesheet(DOCUMENT_ROOT . '/styles/site.css') ->appendStylesheet(DOCUMENT_ROOT . '/scripts/extjs/resources/css/ext-all.css') ->appendStylesheet(array('media' => 'print', 'href' => DOCUMENT_ROOT . '/styles/print.css')); // Ajout des scripts communs $this->headScript()->appendFile(DOCUMENT_ROOT . '/scripts/extjs/adapter/ext/ext-base.js') ->appendFile(DOCUMENT_ROOT . '/scripts/extjs/ext-all.js') ->appendFile(DOCUMENT_ROOT . '/js/prototype.js'); ?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <?php echo $this->headTitle(); echo $this->headMeta(); echo $this->headLink(); echo $this->headScript(); ?> </head> <body> </body> </html>
C'est la même chose, mais encore une fois plus clair. Et si tu ne le sais pas, tu peux ajouter aussi des feuilles de styles ou des scripts spécifiques dans les vues et le layout ne les chargera que lors du rendu de ces vues.
De la même manière tu peux configurer le titre spécifiquement dans chaque vue, il te chargera le bon.
Pour tes chemins, qu'a-tu dans DOCUMENT_ROOT ? Est-ce que ce sont les styles que tu perds ou les images dans les styles ?
DOCUMENT_ROOT ne te donne pas non plus forcément ce que tu voudrais.
A+ benjamin.
Dernière modification par Delprog (19-02-2009 17:48:08)
Hors ligne
Bonjour Benjamin,
Je te remercie de m'aider à rendre mon code plus clair et à t'intéresser à mon problème.
Pour ce qui est de la constante DOCUMENT_ROOT, voici sa valeur
define('DOCUMENT_ROOT', './document_root');
Et voici son contenu :
document_root
|-images ==> contient toutes les images de l'application
|-js ==> contient le javascript
|-scripts ==> contient également du javascript (je ne suis pas le développeur de l'application, je ne sais pas pourquoi il y a 2 répertoires différents pour | le js...)
|-styles ==> contient les CSS
Et ce n'est pas seulement les styles, mais également les images que je perds. C'est comme-ci il ne trouvait pas le bon chemin pour les CSS/images. En gros, au niveau rendu, j'ai une page qui ne contient que du code html. Mais quand j'affiche le code source de la page, j'ai bien les lignes de code d'inclusion des feuilles CSS/images.
Hors ligne
Salut,
Essaie d'utiliser un helper qui te renvoie le baseUrl() de ton appli, et utilise ce chemin comme base plutôt que "document_root" en dur.
J'ai pas trop de le temps de donner un exemple là, normalement tu ne devrais pas avoir de problème pour un trouver un.
A+ benjamin.
EDIT: regarde ici http://g-rossolini.developpez.com/tutor … =vue#LIV-C
Dernière modification par Delprog (20-02-2009 09:14:31)
Hors ligne
Bonjour Delprog,
Je regarde le lien que tu m'as fais parvenir et je te donne des nouvelles de l'implémentation de baseUrl().
Merci encore de m'aider,
Nikko
Edit : j'ai modifié comme suit :
dans app/views/helpers/BaseUrl.php ==>
<?php class Zend_View_Helper_BaseUrl { function baseUrl() { $fc = Zend_Controller_Front::getInstance(); return $fc->getBaseUrl(); } }
dans /app/views/layouts/layout.phtml ==>
$this->headScript()->appendFile($this->baseUrl() . '/scripts/extjs/adapter/ext/ext-base.js') ->appendFile($this->baseUrl() . '/scripts/extjs/ext-all.js') ->appendFile($this->baseUrl() . '/js/prototype.js'); $this->headLink()->appendStylesheet($this->baseUrl() . '/styles/site.css') ->appendStylesheet($this->baseUrl() . '/scripts/extjs/resources/css/ext-all.css') ->appendStylesheet(array('media' => 'print', 'href' => $this->baseUrl() . '/styles/print.css'));
Résultat : je perds mon CSS même sur ma page d'accueil. Et lorsque je fais un echo $this->baseUrl() . '/styles/site.css';
Il m'est seulement affiché "/styles/site.css"
Dernière modification par Nikko (20-02-2009 10:59:16)
Hors ligne
Où se trouve ton index ?
C'est difficile de t'aiguiller sur ce genre de problème. La méthode avec le baseUrl() est valable, mais elle ne fonctionne que si ta config Apache est correcte et que le DOCUMENT_ROOT est bien ce que tu penses.
Personnellement, je n'utilise que des urls absolues, donc je n'ai pas ce genre de problèmes.
A+ benjamin.
Hors ligne
Mon index se trouve à la racine de mon projet :
Projet
|
|-->application
|-->document_root
|-->library
|-->index.php
Dernière modification par Nikko (20-02-2009 14:49:43)
Hors ligne
J'ai réussi (tant bien que mal) à avoir le rendu attendu.
Maintenant j'ai un autre problème. Je n'ai plus aucun rendu sur un autre lien de mon menu. Comme si le Zend_Layout n'était pas initialisé. J'ai désactivé ce dernier lors de l'appel à mon AuthController. Est-ce qu'il faut que je le réactive ou alors est-ce que la désactivation ne se fait que dans le AuthController ?
Auriez-vous une autre idée de pourquoi mon header et mon menu (partie commune à toutes les pages) ne s'affichent pas ?
Par avance, merci
Nikko
Hors ligne
Salut,
De quelle manière as-tu désactivé le layout et à quel endroit ?
a+ benjamin
Hors ligne
J'ai désactivé le layout dans mon loginAction du AuthController avec le code suivant :
$this->_helper->layout->disableLayout();
Ca te donne des idées ? Peut-être aurais-je dû le mettre dans le init() de ce Controller ou alors dans l'index ?
Hors ligne
salut,
<body onLoad="hide_loading_layer();"> --> <?php if ( $_SESSION['acl']['role'] != 'visiteur') { echo "<div id='en_tete'>"; $this->layout()->header ; -> ton header echo "</div>"; echo "<div>"; echo $this->layout()->menu; ->ton menu echo "</div>"; } echo $this->layout()->content ; -> la vue de ton action ?> </div> </div> </body>
c'est normal tu dit de désactiver ton layout alors que celui ci affiche ton header et ton menu, donc tu ne va afficher que la vue de ton action.
Auriez-vous une autre idée de pourquoi mon header et mon menu (partie commune à toutes les pages) ne s'affichent pas ?
Ce sont des partie commune a toute tes pages par le biais de ton layout
Hors ligne
Merci pour ta réponse Baboune. Mais quand je désactive le layout, ca le désactive de façon permanente ou juste pour le controller (ou action) dans lequel j'ai appelé ce code-là : $this->_helper->layout->disableLayout(); ?
Et le problème c'est que je n'ai absolument rien qui s'affiche, pas même la vue de mon action...
Dernière modification par Nikko (27-02-2009 11:11:19)
Hors ligne
si dans ton action tu as :
$this->_helper->layout->disableLayout();
se sera effectif juste pour l'action
tu affiche quelquechose dans la vue de ton action ? fais un simple test en affichant du texte.
Hors ligne
Quand je fais un echo "Test"; J'ai bien le "Test" qui s'affiche, mais c'est tout... Je n'ai pas mon header, ni mon menu qui s'affiche... Et encore moins la vue de mon action...
Dernière modification par Nikko (27-02-2009 11:26:07)
Hors ligne
c'est normal,
si tu veut afficher ton header et menu tu ne doit pas désactiver ton layout dans ce cas.
en gros, ta vue général, c'est ton layout et chaque action éxécuté sera afficher dans celui-ci grace à
echo $this->layout()->content ;
PS: ton echo "Test"; n'est pas dans la vue de ton action ?
Dernière modification par baboune (27-02-2009 11:34:08)
Hors ligne