Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
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 25/05/2011, 00h00   #1
Membre du Club
 
Inscription : février 2008
Messages : 207
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 207
Points : 66
Points : 66
Par défaut Un layout dans un autre layout

Bonjour,

je me retrouve confronté à un problème de layout!

Pour ma page principale, pas de souci, j'ai mon layout et la partie dynamique est la seule à bouger.

Mais, dans un module, je dois avoir une sidebar qui n'apparaitra pas dans les autres modules.

Du coup, j'aimerais créer un nouveau layout qui s'intègre au premier, de façon à ce que la seule chose qui change soit une partie de la page, mais pas la sidebar.

Est-il possible de faire ça?

Merci par avance,
Johnny
johnny3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 12h06   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Dans la version 1 tu ne peux pas intégrer un "sous layout" dans ton layout. (D'où on peut déduire qu'il est envisageable de passer en version 2 qui l'autorise, mais c'est une autre histoire).

Tu as plusieurs solutions :
  • créer deux layouts un pour le site en général et un pour ton module en particulier (je n'aime pas trop)
  • créer dans ton layout ce qu'il faut pour afficher soit avec un componement conditionel, soit avec une réserve (slot). Dans le cas du componement il ne s'activera que si c'est ton module qui est affiché mais va être peu lié à ton module. Dans le cas du slot, tu génères le code dans ton module et il est déporté dans la réserve du layout, s'il n'y a pas de code déporté, rien n'est affiché (c'est ce que je ferais).
  • Il est aussi possible que tu puisses architecturer ton layout et tes écrans pour qu'il ne soit pas nécessaire d'utiliser ces techniques et que le css suffise à gérer l'affichage des différents éléments. Dans ce cas, prévoie une feuille css qui ne sera chargée que pour ton module et le sera après la feuille générale (une autre solution que j'explorerais).
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 14h23   #3
Membre actif
 
Homme Fabrice Agnello
Développeur informatique
Inscription : octobre 2010
Messages : 76
Détails du profil
Informations personnelles :
Nom : Homme Fabrice Agnello
Âge : 39
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : octobre 2010
Messages : 76
Points : 161
Points : 161
Bonjour,

il est tout à fait possible de réaliser ça dans la version 1 moyennant l'utilisation d'une classe supplémentaire (que nous avons développé en interne). Nous l'utilisons dans le cadre de nos projets en interne et cela permet d'avoir un layout général (commun à l'ensemble d'un projet) ainsi qu'un layout pour chaque application (frontend, backend, etc.).

le code de la classe en question est le suivant :
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
 
<?php
/**
 * Description of sepView
 * @version 1.0
 * @package    sep
 * @author Fabrice AGNELLO
 */
class sepView extends sfPHPView
{
  protected function getSiteDecorator()
  {
    return $this->getDecoratorDirectory().'/'.$this->getDecoratorTemplate();
  }
 
  protected function getApplicationDecorator()
  {
    // get the current application
    $app = sfConfig::get('sf_app');
 
    // now, get the application file for the current application
    $app_config = sfConfig::get('sf_root_dir').DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.$app.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'app.yml';
 
    // no file, no render
    if(!file_exists($app_config))
      return false;
 
    // here, we have the configuration file, let's get the layout parameter if set.
    $app_yml = sfYaml::load($app_config);
    $decorator = isset($app_yml['all']['layout']) ? $app_yml['all']['layout'] : false;
 
    if(!$decorator)
      return false;
 
    // now we have the layout parameter for the current application, we can
    // check if the layout file really exists.
    $decorator = sfConfig::get('sf_root_dir').DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.$app.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR.$decorator.'.php';
    if(!file_exists($decorator))
      return false;
 
    return $decorator;
   }
 
  /**
   * Allows a cascading decoration scheme...
   * @see sfPHPView.decorate
   */
  protected function decorate($content)
  {
    $app_decorator = $this->getApplicationDecorator();
 
    if (sfConfig::get('sf_logging_enabled'))
    {
      if($app_decorator)
        $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Decorate content with "%s"', $app_decorator))));
      $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Decorate content with "%s"', $this->getSiteDecorator()))));
    }
 
    // set the decorator content as an attribute
    $attributeHolder = $this->attributeHolder;
 
    // rendering the application decorator...
    if($app_decorator)
    {
      $this->attributeHolder = $this->initializeAttributeHolder(array('sf_content' => new sfOutputEscaperSafe($content)));
      $this->attributeHolder->set('sf_type', 'layout');
 
      // check to see if the decorator template exists
      if (!is_readable($this->getSiteDecorator()))
      {
        throw new sfRenderException(sprintf('The decorator template "%s" does not exist or is unreadable in "%s".', $this->decoratorTemplate, $this->decoratorDirectory));
      }
 
      // render the application decorator and return the result
      $content = $this->renderFile($app_decorator);
    }
 
    // render the main decorator template and return the result
    $this->attributeHolder = $this->initializeAttributeHolder(array('sf_content' => new sfOutputEscaperSafe($content)));
    $this->attributeHolder->set('sf_type', 'layout');
    $ret = $this->renderFile($this->getSiteDecorator());
 
    $this->attributeHolder = $attributeHolder;
    return $ret;
  }
}
?>
cette classe est à mettre dans le classpath de symfony (le répertoire "lib" est un bon candidat).

Ensuite, pour l'utiliser, il faut ajouter dans le fichier module.yml commun :
Code :
1
2
3
 
all:
  view_class: sep
enfin, pour définir au niveau d'une application qu'elle va utiliser un sous-layout, il faut définir dans le app.yml de l'application :
Code :
1
2
3
 
all:
  layout: layout
où le second layout est le nom du fichier de layout utilisé.

Cordialement.
Agnello Fabrice est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/05/2011, 15h30   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Très ingénieux et intéressant.

Par contre, ici il s'agit de modifier un module de l'application, pas toutes le layout d'une application par rapport à l'autre. Est-ce réalisable à ce niveau de granularité ?

Ceci pourrait parfaitement faire un plugins dans ce cas et être avantageusement partagé sur le site des plugins
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h54   #5
Membre actif
 
Homme Fabrice Agnello
Développeur informatique
Inscription : octobre 2010
Messages : 76
Détails du profil
Informations personnelles :
Nom : Homme Fabrice Agnello
Âge : 39
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : octobre 2010
Messages : 76
Points : 161
Points : 161
Dans l'absolu, rien ne l'empêche.

Nous n'avons pas l'utilité d'un tel niveau de granularité sur nos projets, et c'est pourquoi je me suis arrêté à l'application.

Maintenant, dans le app.yml, on peut éventuellement ajouter :
Code :
1
2
3
4
5
 
all:
  layout: layout
  module_1:
    layout:sub_layout
Ensuite il faut modifier la classe sepView pour qu'elle prenne en compte ce nouveau paramètre via une méthode getModuleDecorator tirée de getApplicationDecorator.
Il ne reste plus qu'à implémenter la décoration dans la méthode decorate et on aura alors le niveau de profondeur voulu.
Cela implique aussi d'ajouter - dans le cas où on spécifie un layout pour un module dans le fichier app.yml - un répertoire layout dans le module avec le fichier de layout qui va bien.

Concernant le fait de le transformer en plugin, pourquoi pas... Il faudrait packager mais je n'en ai vraiment pas le temps actuellement.

à+
Agnello Fabrice est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/05/2011, 17h16   #6
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Je sors la discussion de la salle débutant, elle dépasse largement ce cadre et peut intéresser de nombreuses personnes.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 23h43   #7
Membre du Club
 
Inscription : février 2008
Messages : 207
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 207
Points : 66
Points : 66
Ouf, merci pour ces réponses. Comme je suis encore débutant dans cette histoire de layout avec symfony, je pense que je vais choisir l'option 2 ou 3 de Michel.

symfony 1.4 est impressionnant mais demande un temps d'apprentissage conséquent pour correctement l'utiliser.

Comme la discussion semble intéresser du monde, est-ce que je mets résolu malgré tout?
johnny3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h19.


 
 
 
 
Partenaires

Hébergement Web