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

Bibliothèques et frameworks PHP Discussion :

Afficher un autre champ d'une clé étrangère à partir d'une table dont elle est issue [CakePHP]


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Février 2008
    Messages : 154
    Par défaut Afficher un autre champ d'une clé étrangère à partir d'une table dont elle est issue
    Bonsoir cher tous,
    je manipule trois tables: Marchepublic, Bailleur et Marchefinancement qui sont liés selon le model:

    Marchefinancement Model
    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
    <?php
    App::uses('AppModel', 'Model');
    /**
     * Marchefinancement Model
     *
     * @property Marchepublic $Marchepublic
     * @property Bailleur $Bailleur
     */
    class Marchefinancement extends AppModel {
     
    /**
     * Display field
     *
     * @var string
     */
    	public $displayField = 'id';
     
     
    	//The Associations below have been created with all possible keys, those that are not needed can be removed
     
    /**
     * belongsTo associations
     *
     * @var array
     */
    	public $belongsTo = array(
    		'Marchepublic' => array(
    			'className' => 'Marchepublic',
    			'foreignKey' => 'marchepublic_id',
    			'conditions' => '',
    			'fields' => '',
    			'order' => ''
    		),
    		'Bailleur' => array(
    			'className' => 'Bailleur',
    			'foreignKey' => 'bailleur_id',
    			'conditions' => '',
    			'fields' => '',
    			'order' => ''
    		)
    	);
    }
    a partir de la vue du Marché, on peut ajouter un financement (Marchefinancement);
    pour cela, j'ai recuperé l'id du marché depuis la vue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php 
    	echo $this->Html->link("Financements", array('controller' => 'marchefinancements','action'=> 'add',
            $marchepublic['Marchepublic']['id']), array( 'class' => 'button'));
    ?>
    et je le gere dans la fonction add() de Marchefinancement:

    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
     
    public function add($id = null) {
    	if ($this->request->is('post')) {
    		$this->Marchefinancement->create();
    		if ($this->Marchefinancement->save($this->request->data)) {
    		    $this->Session->setFlash(__('The marchefinancement has been saved.'));
    				//return $this->redirect(array('action' => 'index'));				
    			} else {
    				$this->Session->setFlash(__('The marchefinancement could not be saved. Please, try again.'));
    			}
    		}
     
    		$marchepublics = $this->Marchefinancement->Marchepublic->find('list',array(
            'fields' => array('Marchepublic.objet'),
            'conditions' => array('Marchepublic.id =' => $id),
            'recursive' => 0
    		));
     
    		$montantmarche = $this->Marchefinancement->Marchepublic->find('list',array(
            'fields' => array('Marchepublic.montant'),
            'conditions' => array('Marchepublic.id =' => $id),
            'recursive' => 0
    		));
     
    		$bailleurs = $this->Marchefinancement->Bailleur->find('list');
     
    		$this->set(compact('marchepublics', 'bailleurs', 'montantmarche'));
     
    		$this->Paginator->settings = $this->paginate;
     
    		$this->set('marchefinancements', $this->Marchefinancement->find('all',array(
    		'conditions' => array('Marchepublic.id' => $id),
    		'recursive' => 0
    		))
    		, $this->paginate());
    	}
    sur la vue add des Marchefinancements, je veux ajouter de nouveaux financements et au fur et à mesure, s'affiche les lignes enregistrées sur la meme page.
    jusque là tout va bien...

    dans ma vue add:
    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
     
    <table cellpadding="0" cellspacing="0" border="0" class="responsive dynamicTable table table-bordered" width="100%" >
    	<thead>
    		<tr>
    		    <th>Bailleur</th>							
    		   <th>Taux</th>
    		   <th>Montant Bailleur</th>							
    		</tr>
    	</thead>
     
    	<tbody >
    		<?php foreach ($marchefinancements as $marchefinancement): ?>
    		<tr>
    			<td><?php echo h($marchefinancement['Marchefinancement']['bailleur_id']); ?>&nbsp;</td>
    			<td><?php echo h($marchefinancement['Marchefinancement']['taux']); ?>&nbsp;</td>							
    			<td><?php echo h($marchefinancement['Marchefinancement']['montantbailleur']); ?>&nbsp;</td>
    		</tr>
    	</tbody>
    		<?php endforeach; ?>
    </table>
    	<?php echo debug($marchefinancement) ?>
    </div>

    SEULEMENT....
    les bailleurs n'affichent que leurs id, je voudrais faire ressortir le nom des bailleurs.

    aidez-moi svp!!!
    Images attachées Images attachées    

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur PHP
    Inscrit en
    Mai 2014
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 37
    Par défaut
    Il n'y a pas moyen que tu passe la liste des champs dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $bailleurs = $this->Marchefinancement->Bailleur->find('list');
    comme tu le fait sur machépublic ?

  3. #3
    Membre Expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $this->set('marchefinancements', $this->Marchefinancement->find('all', array(
                    'conditions' => array('Marchepublic.id' => $id),
                    'recursive' => 0
                ))
                , $this->paginate());
    Quand tu passes "marchefinancements" dans ta fonction set, tu as trois paramètres ce qui n'est pas normal. Que fait ce $this->paginate() ici (qui devrait être d'ailleurs $this->Paginator->paginate()) ?

    De plus la condition sur "Marchepublic.id" est fausse, il faut faire la condition sur la table marchefinancements, sinon tu n'auras qu'un seul résultat au maximum.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $this->set('marchefinancements', $this->Marchefinancement->find('all', array(
                'conditions' => array('Marchefinancement.marchepublic_id' => $id),
                'recursive' => 0
    )));
    Je pense que ton erreur vient de là. Après, il y a d'autres erreurs mais je ne pense pas que ça joue ici.

    Le displayField est le champ qui est affiché dans une liste déroulante, et donc a priori n'a jamais lieu d'être l'id. Je t'invite à le corriger dans Marchefinancement et dans les autres modèles où tu aurais mis la même chose
    De plus, faire une condition sur un id unique dans un find('list') est illogique vu que par définition on souhaite "lister", donc ramener plus d'un résultat.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Février 2008
    Messages : 154
    Par défaut
    Merci pour votre promptitude
    toutes mes excuses je vous envoie le bon écran: cf pieces jointes

    la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $bailleurs = $this->Marchefinancement->Bailleur->find('list');
    me permet de lister tous les lignes de bailleurs enregistrées dans le select Bailleur.

    le tableau comme vous le voyez me renvoie
    *tous les bailleurs qui ont participé à un marché $id
    *avec leurs taux
    *avec le montant

    comme vous le voyez, ce sont les id des bailleurs qui apparaissent; moi je veux afficher leurs noms.
    merci
    Images attachées Images attachées  

  5. #5
    Membre Expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Ca c'est à cause du "displayField = id" dans le modèle marché public, il faut mettre l'intitulé du champ qui doit apparaître à l'écran.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : Côte d'Ivoire

    Informations forums :
    Inscription : Février 2008
    Messages : 154
    Par défaut
    le display de Marchepublic est bien un intitulé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Marchepublic extends AppModel {
     
    /**
     * Display field
     *
     * @var string
     */
    	public $displayField = 'objet';
    ....
    }

    voici la requete que je veux traduire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT marchefinancements.bailleur_id, bailleurs.name 
    FROM marchefinancements 
    LEFT JOIN marchepublics ON (marchefinancements.marchepublic_id = marchepublics.id) 
    LEFT JOIN bailleurs ON (marchefinancements.bailleur_id = bailleurs.id) 
    WHERE marchepublics.id = 1

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/08/2012, 13h36
  2. Réponses: 4
    Dernier message: 10/10/2010, 11h46
  3. Réponses: 2
    Dernier message: 05/03/2010, 14h15
  4. Réponses: 1
    Dernier message: 28/04/2009, 02h12
  5. [Formulaire] Afficher 2 autres champs si on sélectionne une option
    Par plex dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 14/05/2008, 11h07

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