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 :

[route] Charger un component dans lightbox [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Points : 13
    Points
    13
    Par défaut [route] Charger un component dans lightbox
    Bonjour,

    J'ai un module se présentant sous forme de questionnaire en cascade. Quand on coche une case du formulaire, la question d'après s'affiche. J'utilise donc un formulaire avec une bonne dose de jQuery par dessus.

    Actuellement, ce formulaire s'affiche dans une page à part entière. J'aimerais cependant aussi poul'afficher dans une lightbox depuis n'importe quelle page du site.
    Ma lightbox (Colorbox pour être plus précis) me demande juste d'avoir la page à charger dans l'attribut href du lien.

    Mon formulaire s'affiche donc avec le layout. Si je désactive le layout pour cette action, il ne s'affichera pas bien dans la page à part entière.
    Je ne trouve donc pas comment faire pour rendre ce formulaire accessible des 2 manières.

    J'espère avoir été un minimum explicite :-)
    Merci d'avance pour votre aide !

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    A priori, dans ta box, tu dois afficher une page html. Donc avec les entêtes et tous le barda. Ce qui proviens du layout.

    Donc, si tu actives le layout, tu as une page viable, mais pleins d'entête que tu ne veux pas utiliser. Si tu ne l'active pas, tu as ce que tu veux, mais la page n'est pas viable...

    La solution est de créer un deuxième layout, avec le minimum pour décorer ta page. Et ensuite, plutôt que de désactiver le layout, il faut lui dire d'utiliser le light à la place du courant.
    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 !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    Oui mais je dois pouvoir utiliser mon module à la fois dans la colorbox et dans une page normal.

    A la limite, je dois pouvoir créer un component avec mon formulaire dedans puis créer 2 actions appelant le component :
    • executeQuestionnaire avec le layout normal.
    • executeQuestionnaireLight avec un second layout plus light.


    Mais le problème est que du coup, la même url n'est pas utilisée pour appeller ces 2 actions.

    Mon lien permettant d'ouvrir le questionnaire dans la box, est de la forme : <a href="http://www.monsite.com/monmodule/questionnaire"> afin de de ne pas être intrusif (permet d'accéder au questionnaire avec le layout normal si le js n'est pas activé).
    Du coup je n'ouvre pas le questionnaire light dans la box mais le normal. Une solution serait de faire un traitement javascript ajoutant Light à a fin de l'url afin de charger le questionnaire light dans la box seulement si le js est activé et ainsi obtenir : <a href="http://www.monsite.com/monmudle/questionnaireLight">
    Mais je trouve cette méthode un peu sale.

    Tu verrais une autre solution ?

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Crée deux route avec un paramètre non obligatoire, remplis par défaut.

    Le paramètre devra avoir le même nom dans les deux route.

    Tu envois l'une ou l'autre suivant le cas. Dans ton action (unique) tu vérifies le paramètre (qui est rempli par défaut par la route) et suivant le cas, tu mets l'un ou l'autre layout.

    La seule duplication est alors dans la route.
    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 !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    Oula, j'ai pas bien compris ce que tu me conseille la.

    En gros, je créé une route questionnaire et une route questionnaireLight, les 2 amenant a mon action questionnaire. La première route a le paramètre "light" vide tandis que la seconde à ce paramètre à true.

    Dans mon action executeQuestionnaire, je fais un test genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if($request->getParameter('light'))
      $this->setLayout('light');
    Et du coup dans la page appelant la box. Je fais un traitement js sur le lien pour ajouter ?light=true à la fin.

    C'est bien ça ou j'ai mal compris quelque chose ?

    Du coup je suis obligé de faire le traitement js (en soit ce n'est pas dramatique non plus). Mais pourquoi ne pas créer une seule route ?

  6. #6
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Met donc le paramètre à false sur l'autre route.

    Tu n'as pas besoin de donner le paramètre à la route, vu que symfony va le positionner par défaut. Il suffit d'utiliser la bonne route pour que le paramètre soit utiliser. Donc pas de besoin en JS.
    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 !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    J'ai du mal à voir comment le choix va être fait pour savoir si c'est le light ou non.

    Voilà ce que j'ai actuellement :

    apps/frontend/config/routing.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    questionnaire:
      url: /questionnaire/:light
      param: { module: monmodule, action: questionnaire, light: false }
     
    questionnaireLight:
      url: /questionnaire/:light
      param: { module: monmodule, action: questionnaire, light: true }
    apps/frontend/config/modules/monmodule/actions/actions.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function executeQuestionnaire(sfWebRequest $request) {
      if($request->getParameter('light'))
        $this->setLayout('light');
     
      ...
     
    }
    La page appelant le questionnaire pour l'afficher dans la box
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a href="<?php echo url_for('@questionnaire'); ?>">questionnaire</a>
    Je ne vois pas vraiment comment continuer là.

    En tout cas, merci pour ton aide

  8. #8
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Il faut que l'url des deux route soit différente, si non symfony ne pourra faire la différence et adressera toutes les entrées à la première règle.
    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 !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    Je crois commencer à comprendre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    questionnaire:
      url: /questionnaire
      param: { module: monmodule, action: questionnaire, light: false }
     
    questionnaireLight:
      url: /questionnaire/light
      param: { module: monmodule, action: questionnaire, light: true }
    Mais un point reste flou, comment est-ce qu'en appelant ma route, j'appelle une route ou l'autre suivant si le javascript est activé ?

    Le mieux serait (dans l'absolu) que mes 2 questionnaires aient la même url, et de détecter si l'affichage se fait dans la box ou non ; mais je doute que ce soit possible.

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2009
    Messages : 100
    Points : 123
    Points
    123
    Par défaut
    Sinon, pourquoi ne pas avoir une seul route et mettre le paramètre light par défaut à false ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    questionnaire:
      url: /questionnaire/:light
      param: { module: monmodule, action: questionnaire, light: false }
    ainsi dans ton action, tu pourra utiliser ce que tu as déjà écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if ( $request->getParameter('light') )
           $this->setLayout('light');
    else {
           // Rien du tout comme tu laisse ton layout par défaut
    }
    Et ainsi, dans ton javascript, tu appellera l'URL "/questionnaire/true" pour avoir le layout light, et sinon "/questionnaire" pour avoir le layout normal

  11. #11
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    C'est la même solution... côté code.

    Après, côté route, les deux se valent. Tant que la route avec le paramètre par défaut reste la route normale d'accès. Que l'autre s'appelle :
    - www.monsite.com//questionnaire/light
    - www.monsite.com//questionnaire/true
    - www.monsite.com//questionnaire_light
    - http://www.monsite.com//toto_est_par...vous_patientez

    Cela n'a pas réellement d'importance.
    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 !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    Merci à vous 2 pour votre aide.

    J'ai réussi à faire ce que je voulais du coup.

    2 routes, un test dans l'action, et j'initialise la box en js en ajoutant /light à la fin du href actuel. De cette manière, si on clic sur le lien, on charge le questionnaire dans la box, mais si on fait "ouvrir dans une nouvelle fenêtre", on charge le questionnaire avec le layout normal.

    Merci encore !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 28
    Points : 13
    Points
    13
    Par défaut
    J'aurais tout de même une autre question.

    Dans le fichier view.yml de mon application j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    default:
      stylesheets:    [global.css, colorbox.css]
      javascripts:     [jquery.min.js, jquery.colorbox.min.js, global.js]
      has_layout:     true
      layout:           layout
    Du coup, même quand je fais un $this->setLayout('light'), le fichier global.js est chargé. Hors j'aimerais qu'il le soit que pour le layout "layout".
    Est il possible de configurer ca dans le yml ou est ce que je suis obligé d'enlever du yml et de le mettre directement dans le fichier du layout ?

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

Discussions similaires

  1. [1.x] Charger un template dans une varaible depuis un component
    Par mathieu44800 dans le forum Symfony
    Réponses: 4
    Dernier message: 17/10/2009, 10h39
  2. [PL/SQL] Charger une table dans une collection
    Par nosnoss dans le forum Oracle
    Réponses: 10
    Dernier message: 03/03/2005, 17h56
  3. charger une scene dans la memoire de la carte video
    Par Arnaudv6 dans le forum OpenGL
    Réponses: 10
    Dernier message: 11/09/2004, 01h44
  4. Ajout d'un Component dans un Container
    Par willowII dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 07/09/2004, 18h08
  5. [ServletContext]Charger une ressource dans la servletContext
    Par lalou33 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 25/06/2004, 14h37

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