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

 PHP Discussion :

attribut dans table de liaison generator.yaml


Sujet :

PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut attribut dans table de liaison generator.yaml
    Bonjour

    J'aimerai afficher, lors de l'édition d'une séance depuis l'administration, à côté de chaque case à cocher de chaque activité, une liste déroulante permettant d'indiquer le nombre de vidéos requis pour la séance et l'activité.

    Mon schéma :
    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
    Seance:
      columns:
        name:
          type:           string(255)
          notnull:        true
    Activite:
      columns:
        name:
          type:           string(255)
          notnull:        true
      relations:
        Seances:
          class:          Seance
          refClass:       SeanceActivite
          foreignAlias:   Activites
    SeanceActivite:
      columns:
        seance_id:
          type:           integer
          primary:        true
        activite_id:
          type:           integer
          primary:        true
        nbvidrequis:
          type:           integer
      relations:
        Seance:
          foreignAlias:   SeanceActivites
        Activite:
          foreignAlias:   SeanceActivites
    Dans la page d'édition d'une séance, j'arrive à afficher la liste des activités sous forme de case à cocher :
    Mon generator.yml >
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    generator:
    ...
        config:
    ...
          form:
            class: BackendSeanceForm
    ...
    Ma classe BackendSeanceForm >
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class BackendSeanceForm extends SeanceForm
    {
      public function configure()
      {
        $this->widgetSchema['activites_list'] = new sfWidgetFormDoctrineChoice(array(
    	  'label' => 'Activités associées',
          'multiple' => true, 
    	  'expanded' => true, 
    	  'model' => 'Activite',
    	  'renderer_class' => 'myWidgetFormSelectCheckboxTable' 
        ));
      }
    }
    et le myWidgetFormSelectCheckboxTable.class.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
    22
    class myWidgetFormSelectCheckboxTable extends sfWidgetFormSelectCheckbox {
     
      public function formatter($widget, $inputs) {
        $rows = array();
        $itemsPerRow = sfConfig::get('app_itemsperrow_checkbox');
        $i=0;
        $rows[] = "<table>";
        foreach ($inputs as $input) {
          if ($i % $itemsPerRow == 0) {
            $rows[] = "<tr>";
          }
          $rows[] = $this->renderContentTag('td', $input['input'].$this->getOption('label_separator').$input['label']) ;
          $i++;
          if ($i % $itemsPerRow == 0) {
            $rows[] = "</tr>";
          }
        }
        $rows[] = "</table>";
     
        return !$rows ? '' : $this->renderContentTag('ul', implode($this->getOption('separator'), $rows), array('class' => $this->getOption('class')));
      }
    }
    Seulement, je n'ai aucune idée sur le chemin a suivre pour ajouter les listes déroulantes pour chaque activités...
    Merci de m'aider svp.

  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
    Si je comprend bien tu génères une liste qui sera utilisée pour tes case à cocher.
    A priori ton objet utilise le toString de l'autre table pour générer le texte à afficher.

    Le plus simple serait de modifier ce toString pour lui rajouter le nombre en question.
    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
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    Michel,

    je n'arrive pas à obtenir la liste déroulante des nbvidrequis à travers la méthode __toString d'Activite.
    Pourrais-tu m'éclairer stp ?

  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
    Tu as déjà utilisé myWidgetFormSelectCheckboxTable ailleurs ?

    Si non, avec un sfWidgetFormSeceltCheckbox tu as essayés ?
    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
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    oui utilisé ailleurs mais je peux en faire un dédié, je vais essayer.

    En fait je n'arrive pas à avoir l'id de séance dans la méthode __string() de la classe Activite : as-tu une façon de faire à me proposer ?

  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
    Je suppose que séance est lié à activité.

    Je suppose que la relation du côté d'activité est appelée "seances".

    Donc pour récupérer les seances depuis (le code est dans l'objet activité) une activité tu vas faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $seances = $this->getSeances();
    qui retourne la liste des séances pour cette activité (un Doctrine_Collection).

    Pour avoir le nombre de séance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nbSeances = count( $this->getSeances() );
    attention, si la requête d'origine ne retourne pas les activités ET les séances, tu vas avoir une requête supplémentaire par ligne dans le sélect, ce qui peut faire beaucoup.

    En y réfléchissant, tu devrais aussi pouvoir un peu simplifier (compliquer) la chose.

    En effet, le sfWidgetFormSelectCheckbox attend un tableau (options choices).. Il est peut-être plus simple de faire le tableau "à la main".

    Une méthode de ce type
    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
    #actionTable.class.php (non vérifié)
    static function getActionSeanceNb()
    {
      $datas = self::getInstance()->
                createQuery('a')->
                innerJoin('a.Seances s')->
                select('a.id, a.nom, count(s.id) seance')->
                orderBy('a.nom')->
                execute( array(), Doctrine_Core::HYDRATE_ARRAY_SHALLOW );
      $ret = array();
      foreach ($datas as $action)
      {
        $ret[ $action['a_id'] ] = $action['a_nom'] . ' (' . $action['s_seance'] . ')';
      }
      return $ret;
    }
    Je ne suis pas très sur des noms renvoyé par l'hydratation array_shallow, a vérifier. Et je ne suis pas plus sur de la syntaxe pour select() pour donner un nom à count, a vérifier. Mais en gros l'idée y est. Et le tout en une requête. Dommage que l'on ne puisse directement sortir le tableau.
    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
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    merci pour ta réponse, il va falloir que je la comprenne maintenant

    Dans mon coin j'étais parti sur un truc comme ça, encore en cours...

    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
    class myWidgetFormSeance extends sfWidgetFormSelectCheckbox {
     
      public function formatter($widget, $inputs) {
     
        $itemsPerRow = sfConfig::get('app_itemsperrow_checkbox');
        $i=0;
        $rows = "<ul><table>";
        $seance_id = sfContext::getInstance()->getRequest()->getParameter("id");
    	foreach ($inputs as $input) {
          if ($i % $itemsPerRow == 0) {
            $rows.= "<tr>";
          }
     
    	  $activite = Doctrine::getTable('Activite')->findOneByName( strip_tags($input['label']) );
    	  $q = Doctrine_Query::create()
    		->from('SeanceActivite s')
    		->where('activite_id = ?', $activite->getId())
    		->andWhere('seance_id= ?', $seance_id);
    	  $res = $q->execute();
     
          $rows.= "<td>".$input['input'].$this->getOption('label_separator').$input['label']."<select></select></td>" ;
          $i++;
          if ($i % $itemsPerRow == 0) {
            $rows.= "</tr>";
          }
        }
        $rows.= "</table></ul>";
     
        return !$rows ? '' : $rows;
      }
    }

  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
    Je ne sais pas ce qui me fait trouver mon code plus simple . Mais ceci ne veut pas dire qu'il soit ce que tu cherches
    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
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    effectivement, j'ai pas l'impression que ton magnifique code soit réellement le résultat escompté

  10. #10
    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
    Ben comme je ne sais pas exactement ce que tu veux

    Attention, le code permet juste d’alimenter un widget sfWidgetFormSelectxxx. En lui même il ne génère rien si ce n'est un tableau.
    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 !

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 30
    Points : 12
    Points
    12
    Par défaut
    J'aimerai afficher, lors de l'édition d'une séance depuis l'administration, à côté de chaque case à cocher de chaque activité, une liste déroulante permettant d'indiquer le nombre de vidéos requis pour la séance et l'activité.

    Alors j'arrive au résultat escompté ainsi (je sais c'est ps très beau )

    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
    class myWidgetFormSeance extends sfWidgetFormSelectCheckbox {
     
      public function formatter($widget, $inputs) {
     
        $itemsPerRow = sfConfig::get('app_itemsperrow_checkbox');
        $i=0;
        $rows = "<ul class='checkbox_list'><table>";
        $seance_id = sfContext::getInstance()->getRequest()->getParameter("id");
    	foreach ($inputs as $input) {
          if ($i % $itemsPerRow == 0) {
            $rows.= "<tr>";
          }
     
    	  $activite = Doctrine::getTable('Activite')->findOneByName( strip_tags($input['label']) );
    	  $q = Doctrine_Query::create()
    		->from('SeanceActivite s')
    		->where('activite_id = ?', $activite->getId())
    		->andWhere('seance_id= ?', $seance_id);
    	  $res = $q->execute();
    	  $options ='';
    	  for($i=0;$i<=10;$i++){
    		$options.='<option value="'.$i.'">'.$i.'</option>';
    	  }
    	  foreach ($res as $r) {
    		if($activite->getId() == $r->getActiviteId()){
    			$options ='';
    			for($i=0;$i<=10;$i++){
    				if($r->getNbvidrequis()== $i){
    					$options.='<option value="'.$i.'" selected="selected">'.$i.'</option>';
    				}else{
    					$options.='<option value="'.$i.'">'.$i.'</option>';
    				}
    			}
    		}
    	  }
     
          $rows.= "<td>".$input['input'].$this->getOption('label_separator').$input['label']."<select name='nbvid".$activite->getId()."'>".$options."</select></td>" ;
          $i++;
     
          if ($i % $itemsPerRow == 0) {
            $rows.= "</tr>";
          }
        }
        $rows.= "</table></ul>";
     
        return $rows;
      }
    }
    Par contre maintenant il va falloir sauvegarder les changements de case à cocher et des valeurs de listes déroulantes dans la base... et là je n'ai même pas idée comment on peut faire... Une idée grand maitre ? ; )

  12. #12
    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 côté de la plaque moi, j'avais compris que tu voulais afficher le nombre de vidéo liées. Pas pouvoir modifier.

    Donc tu as trois tables : séance, activité et liaison seanceActivite.

    Avec des case à cocher, ce serait réalisable, mais très lourd à monter.

    Je pense que le plus simple serait d'utiliser le plugin qui permet de gérer les embed et d'avoir une sorte de table où tu peux rajouter une ligne de seanceActivite et sélectionner l'activité et le nombre de vidéo.

    Si tu veux absolument passer par des cases à cocher, il n'y a pas beaucoup de solution, il va te falloir gérer cela à la main dans le contrôleur et le template.

    De manière a récupérer dans le tableau des réponses, un sous tableau pour chaque ligne, qu'il faudra traité ligne par ligne et valider de la même manière. Si tu passes par ton widget amélioré, tu ne pourras pas correctement récupérer les données, ce qui compte un peu malgré tout.
    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 !

Discussions similaires

  1. [MySQL] requete update et insert dans table de liaison
    Par rollingboy dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/06/2014, 18h34
  2. [C#] insert de FK dans table de liaison
    Par Raph87 dans le forum Linq
    Réponses: 6
    Dernier message: 12/07/2011, 10h32
  3. Réponses: 1
    Dernier message: 02/10/2010, 09h00
  4. Changer la position d'un attribut dans une table?
    Par gui38 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/01/2007, 21h27
  5. Comment connaitre le type d'un attribut dans une table?
    Par Abdou_9002 dans le forum Bases de données
    Réponses: 1
    Dernier message: 02/03/2006, 10h07

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