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 :

[sf 1.4.x] calendrier action


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 44
    Par défaut [sf 1.4.x] calendrier action
    je débute dans symfony et j'avoue que je suis un peu perdu j'aimerai vos conseils pour résoudre mon problème.

    j'ai mon layout.php avec un component (petit calendrier (datePicker jquery)) dans le header et une action (main). J'aimerai que par défaut mon calendrier et mon action prenne la date du jour, et que lorsque je modifie la date dans le calendrier mon action récupère cette date. Je ne sais pas trop comment procéder, variable de session ? url ? je suis un peu perdu...

    layout.php
    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
     
    <head>
    ...
    </head>
    <body>
    <div id="header">
      ...
      <div>
        <?php 
        $form = new calendarForm();
        echo $form['from_date'] -> renderLabel () . ":" . $form['from_date'];
        ?>
      </div>
    </div>
     
    <div id="content">
      <?php echo $sf_content ?>
    </div>
     
    </body>
    </html>
    mon action:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public function executeIndex (sfWebRequest $request) {
    $this -> data = Doctrine_Core::getTable ('table') -> getAll (filtrer à partir de la date du calendrier ???);
    }
    calendarForm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class calendarForm extends sfForm {
     
    	public function configure () {		
    		$dateWidget = new sfWidgetFormDate (array ('format' => '%day%/%month%/%year%'));
     
        	$this -> setWidgets (array ('from_date' => new sfWidgetFormJQueryDate (array ('image'  => '/images/calendrier.jpg', 'date_widget' => $dateWidget))));
     
            $this -> widgetSchema['from_date'] -> setLabel ('Rapport du');
            $this -> widgetSchema['from_date'] -> setDefault("now");
     
      	}
    }

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 44
    Par défaut
    Alors j'ai fait un truc qui fonctionne, mais je ne sais guère si c'est dans la "philosophie" de symfony, si vous avez des remarques ou critiques je suis preneur.

    je part donc de mon layout.php ou j'ai crée un component dans le header:
    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
     
    <head>
    ...
    </head>
    <body>
    <div id="header">
      ...
      <div>
       <?php include_component('calendar', 'show') ?>
      </div>
    </div>
     
    <div id="content">
      <?php echo $sf_content ?>
    </div>
     
    </body>
    </html>
    la classe de mon component:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
     
    class calendarComponents extends sfComponents {
     
    	public function executeShow () {
    		$this -> form = new calendarForm ();
      	}
    }
    le template _show associé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <?php echo $form['from_date'] -> renderLabel () . ":" . $form['from_date']; ?>
    ma classe calendarForm.php utilisée dans le component:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class calendarForm extends sfForm {
     
    	public function configure () {		
    		$dateWidget = new sfWidgetFormDate (array ('format' => '%day%/%month%/%year%'));
     
        	$this -> setWidgets (array ('from_date' => new sfWidgetFormJQueryDateCalendar (array ('image'  => '/images/calendrier.jpg', 'date_widget' => $dateWidget))));
     
            $this -> widgetSchema['from_date'] -> setLabel ('Rapport du');
            $this -> widgetSchema['from_date'] -> setDefault("now");
      	}
    }
    apres c'est la que je pense que c'est tout pourri ce que j'ai fait, m'enfin ca a le mérite de fonctionner, j'ai crée la classe sfWidgetFormJQueryDateCalendar qui est juste la classe sfWidgetFormJQueryDate légèrement modifée, car je n'ai pas su l'étendre voici juste les modifs:
    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
     
    ...
     
    function wfd_%s_update_linked(date)
      {
        jQuery("#%s").val(parseInt(date.substring(0, 4), 10));
        jQuery("#%s").val(parseInt(date.substring(5, 7), 10));
        jQuery("#%s").val(parseInt(date.substring(8), 10));
     
        wfd_%s_submit();
      }
     
      function wfd_%s_check_linked_days()
      {
        var daysInMonth = 32 - new Date(jQuery("#%s").val(), jQuery("#%s").val() - 1, 32).getDate();
        jQuery("#%s option").attr("disabled", "");
        jQuery("#%s option:gt(" + (%s) +")").attr("disabled", "disabled");
     
        if (jQuery("#%s").val() > daysInMonth)
        {
          jQuery("#%s").val(daysInMonth);
        }
     
        wfd_%s_submit();
      }
     
    function wfd_%s_submit () {
      	var jour  = jQuery("#%s").val();
      	if (jour.length == 1) jour = '0' + jour;
      	var mois  = jQuery("#%s").val();
      	if (mois.length == 1) mois = '0' + mois;
      	var annee = jQuery("#%s").val();
      	var date = jour + '/' + mois + '/' + annee;
     
      	jQuery.post("main/getdata",
    	{selectJour : jour, selectMois : mois, selectAnnee : annee},
        function(data)
        {
            jQuery("#getdata").html(data);
        });  	
      }
    enfin ma classe main action:
    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
     
    class mainActions extends sfActions {
    	/**
    	 * Executes index action
    	 *
    	 * @param sfRequest $request A request object
    	 */
    	public function executeIndex(sfWebRequest $request) { 
     
      	}
     
      	public function executeGetdata(sfWebRequest $request) {
     
      		ProjectConfiguration::registerZend ();
     
      		$selectJour  = $request -> getParameter ('selectJour');
        	$selectMois  = $request -> getParameter ('selectMois');
        	$selectAnnee = $request -> getParameter ('selectAnnee');
        	$oDateSelect = new Zend_Date ($selectJour . $selectMois . $selectAnnee, 'ddMMyyyy', 'fr');
     
        	$this -> data = Doctrine_Core::getTable ('table') -> getAll ($oDateSelect -> get (Zend_Date::YEAR_8601 . '-' . Zend_Date::MONTH . '-' . Zend_Date::DAY . ' 00:00:00'));
     
    		if ($request -> isXmlHttpRequest ()) {
    			return $this -> renderPartial ('main/getdata', array ('data ' => $this -> data ));
    		}
      	}
     
    }
    le template associé au renderPartial est juste un parcours du tableau data, et enfin le template indexSuccess:
    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
     
    <!-- js -->
    <script type="text/javascript"> 
    jQuery(window).load(function(){
    	var dateSelect = new Date;
    	var jour = String(dateSelect.getDate());
      	if (jour.length == 1) jour = '0' + jour;
      	var mois = String(dateSelect.getMonth() + 1);
      	if (mois.length == 1) mois = '0' + mois;
      	var annee = String(dateSelect.getFullYear());
      	var date = jour + '/' + mois + '/' + annee;
     
        jQuery.post("main/getdata",
    	{selectJour : jour, selectMois : mois, selectAnnee : annee},
        function(data)
        {
            jQuery("#getdata").html(data);
        });
    });
    </script>
    <!-- js -->
     
    <div id="getdata"></div>

  3. #3
    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
    A vue d'œil, ceci semble satisfaisant. Quelques tous petits trucs :
    • Je ne vois pas pourquoi tu n'as pas pu étendre la class sfWidgetFormJQueryDate il n'y a pas de raison.
    • Dans ta classe main, tu as un executeGetdata que les principes d'écriture auraient condamné à s'écrire executeGetData, mais c'est plutôt cosmétique.
    • Je ne suis pas sur de comprendre le code "wfd_%s_update_linked(date)" et la présence incongrue du "%s"
    • Je ne vois pas trop l'utilité de s'embarrasser du zend framework pour gérer les dates, l'objet php 5.2 datetime devrait suffire à la tâche il me semble.
    • Toujours pour le même code, j'aurais mis le code de génération de la requête et de récupération dans une méthode (a créer) de l'objet TableTable.class.php (avoir une table qui s'appel "table" n'est peut-être pas la meilleur idée qu'il soit pour la lecture du code.
      Le code pouvant, ainsi, éventuellement, être réutilisé ailleurs.


    Bienvenu sur symfony,
    Michel

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 44
    Par défaut
    il n'y a que toi qui fait vivre ce forum ici ^^, merci bien de ton aide en tout cas

    Je ne vois pas pourquoi tu n'as pas pu étendre la class sfWidgetFormJQueryDate il n'y a pas de raison.
    je m'y suis cassé les dents, j'avoue ne pas avoir compris les grands principes, mais je vais me le garder sous le coude et m'y remettre après, parce que c'est sur ca n'est pas très propre.

    Dans ta classe main, tu as un executeGetdata que les principes d'écriture auraient condamné à s'écrire executeGetData, mais c'est plutôt cosmétique.
    j'ai changé les noms pour ce forum et j'ai écris ca vite fait, ce ne sont pas mes fonctions d'origines.

    Je ne suis pas sur de comprendre le code "wfd_%s_update_linked(date)" et la présence incongrue du "%s"
    c'est une méthode déjà existante, je n'ai fait que rajouter wfd_%s_submit() à la fin. C'était mon soucis en fait, d'avoir un évènement onChange sur tous les sélect (jour, mois, année) et sur un choix dans le calendrier pour centraliser ca dans une fonction et faire ma tambouille après.

    Je ne vois pas trop l'utilité de s'embarrasser du zend framework pour gérer les dates, l'objet php 5.2 datetime devrait suffire à la tâche il me semble.
    ha je ne connaissais pas, je vais étudier ca.

    Toujours pour le même code, j'aurais mis le code de génération de la requête et de récupération dans une méthode (a créer) de l'objet TableTable.class.php (avoir une table qui s'appel "table" n'est peut-être pas la meilleur idée qu'il soit pour la lecture du code.
    Le code pouvant, ainsi, éventuellement, être réutilisé ailleurs.
    je vais modifier ca. Sinon la table "table" c'etait juste un exemple, je ne souhaitais pas trop écrire exactement mon code.

    Merci beaucoup en tout cas.

  5. #5
    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
    Peut-être suis-je trop présent.

    Mais j'aime partager ce que j'aime.

    Bonne chance, tiens nous au courant,
    Michel

Discussions similaires

  1. [PHP-JS] action sur un calendrier
    Par benoît82 dans le forum Langage
    Réponses: 9
    Dernier message: 18/07/2007, 11h31
  2. action APRES chargement complet ...
    Par PinGuy dans le forum Delphi
    Réponses: 7
    Dernier message: 06/07/2006, 17h16
  3. [Syntaxe] Action simultanée sur plusieurs élements
    Par FranT dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/03/2003, 20h20
  4. Delphi et XMLRAD pour un calendrier
    Par Toxine77 dans le forum XMLRAD
    Réponses: 9
    Dernier message: 23/01/2003, 13h56
  5. Calcul des numéros de semaine d'un calendrier
    Par Invité dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/11/2002, 21h29

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