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

Symfony PHP Discussion :

Un layout dans un autre layout [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    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

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    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).

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    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 : 80
    Par défaut
    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 : 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
     
    <?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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    all:
      layout: layout
    où le second layout est le nom du fichier de layout utilisé.

    Cordialement.

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    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

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    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 : 80
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

    à+

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Je sors la discussion de la salle débutant, elle dépasse largement ce cadre et peut intéresser de nombreuses personnes.

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    Par défaut
    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?

  8. #8
    Membre éprouvé
    Ingénieur d'études et de développement
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur d'études et de développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Par défaut
    Pourquoi ne pas utiliser un slot ?

    D'après ta question cela me semble exactement ce que tu veux faire.

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Par défaut
    Je pense qu'il a trouvé la réponse, depuis 1 an et 8 mois ^^

  10. #10
    Membre éprouvé
    Ingénieur d'études et de développement
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur d'études et de développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Par défaut
    J'imagine bien

    Mais cette piste peut servir d'autres personnes qui auraient une demande similaire. La preuve, j'ai trouvé ce post en effectuant une recherche dans google quelque peu identique.

    Ne jamais oublié l'indexation de google

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changement de layout dans une requête
    Par ac264 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 01/10/2007, 12h48
  2. Taille bouton dans un grid layout
    Par Magical dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 17/07/2007, 07h29
  3. Creer un gridlayout dans un border layout
    Par rider74 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 22/10/2006, 13h31
  4. struts-layout tabs inclut dans un autre tabs
    Par david06600 dans le forum Struts 1
    Réponses: 1
    Dernier message: 15/09/2006, 16h08
  5. [C# 2.0] Layout dans un Panel
    Par jeff_76960 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/08/2006, 20h01

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