Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/08/2011, 12h01   #1
Membre du Club
 
Inscription : novembre 2005
Messages : 103
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 103
Points : 44
Points : 44
Envoyer un message via MSN à Legenyes
Par défaut Requête invalide après un component

bien le bonjour,
je tourne en rond depuis quelques heures.

J'ai fais un système de panier pour un eCommerce, en utilisant les variables de Session du User (get et set Attribut)

myUser.class.php
Code :
1
2
3
4
5
6
7
$basket = $this->getAttribute('basket', array());
 
if($basket==null)
    $basket = new Basket();
$basket->addItem(1, $produit);
 
$this->setAttribute('basket', $basket);
Basket.class.php
Code :
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
 
...
function addItem($qty, $product) {
        $ok = false;
        foreach ($this->items as $id => $item) {
            if ($item->getProduit()->getId() == $product->getId()) {
                if ($this->getItemQty($id) > 0) {
                    $this->setItemQty($id, $this->getItemQty($id) + $qty);
                } else {
                    $this->items[$id] = new BasketObject();
                    $this->items[$id]->setProduit($product);
                    $this->items[$id]->setQuantite($qty);
                }
                $ok = true;
                break;
            }
        }
        if (!$ok) {
            $id = $this->getNbLineItems();
            $this->items[$id] = new BasketObject();
            $this->items[$id]->setProduit($product);
            $this->items[$id]->setQuantite($qty);
        }
    }
...
BasketObject.class.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class BasketObject extends BaseBasketObject {
 
    function getPrice() {
        return $this->Produit->getPrix();
    }
 
    function getWeight() {
        return "0.00";
    }
 
    function extendedPrice() {
        return ($this->quantite * ($this->getPrice() * (1 - $this->reduction)));
    }
 
    function discountedAmount() {
        return ($this->getPrice() * $this->reduction);
    }
 
}
Jusque la pas de soucis.
j'arrive a afficher via un component qui lis monAttribut('basket') les différents éléments de mon panier

Le problème apparais lorsque sur une page je veux afficher ls produits de la db.

actions.class.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
  public function executeShow(sfWebRequest $request)
  {
	$this->pager = new sfDoctrinePager(
		'produit',
		sfConfig::get('app_max_prod_on_artisan')
	);
 
	$this->pager->setQuery($this->artisan->getActiveProduitQuery());
	$this->pager->setPage($request->getParameter('page', 1));
	$this->pager->init();
 
  }
A partir de ce moment la, j'ai une erreur
Citation:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'p.libelle' in 'field list'
(A savoir que mon objet produit est i18n sur le champ libelle.)
Legenyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 14h20   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505


Quel rapport entre la panier et la liste ?

Qui donne l'erreur ?

Comment tu peux récupérer l'objet panier alors que tu récupères un array depuis la session ?
__________________
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 !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 10h53   #3
Membre du Club
 
Inscription : novembre 2005
Messages : 103
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 103
Points : 44
Points : 44
Envoyer un message via MSN à Legenyes
La liste c'est une liste d'objet Produit
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
    public function getActiveProduit(Doctrine_Query $q = null) {
        return $this->addActiveProduitQuery($q)->execute();
    }
 
    public function addActiveProduitQuery(Doctrine_Query $q = null) {
        if (is_null($q)) {
            $q = Doctrine_Query::create()
                    ->from('produit p');
        }
 
        $alias = $q->getRootAlias();
        $q->addOrderBy($alias . '.created_at DESC');
 
        return $q;
    }
et la panier lui est composé de basketObjet , qui comprend lui aussi un objet Produit
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
BasketObject:
  actAs: { Timestampable: ~ }
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    produit_id:   { type: integer }
    quantite:     { type: integer }
    reduction:    { type: integer }
  relations:
    Produit:
      local: produit_id
      foreign: id
      foreignAlias: Produit
Legenyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 09h17   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
S'il n'est pas trop grand, peux-tu mettre tout ton shema.yml ?
__________________
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 !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 12h33   #5
Membre du Club
 
Inscription : novembre 2005
Messages : 103
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 103
Points : 44
Points : 44
Envoyer un message via MSN à Legenyes
Code :
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
 
Adresse:
  actAs: { Timestampable: ~ }
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    rue:          { type: string(500) }
    codePostal:   { type: string(10) }
    localite:     { type: string(255) }
    pays:         { type: string(255) }
    url:          { type: string(255) }
    telephone:    { type: string(255) }
    gsm:          { type: string(255) }
    fax:          { type: string(255) }
 
BasketObject:
  actAs: { Timestampable: ~ }
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    produit_id:   { type: integer }
    commande_id   { type: integer }
    quantite:     { type: integer }
    reduction:    { type: integer }
  relations:
    Produit:
      local: produit_id
      foreign: id
      foreignAlias: Produit
    Commande:
      local: commande_id
      foreign: id
      foreignAlias: Commande
 
Commande:
  actAs: { Timestampable: ~ }
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    client_id:   { type: integer }
    quantite:     { type: integer }
    reduction:    { type: integer }
  relations:
    Client:
      local: client_id
      foreign: id
      foreignAlias: Client
 
WishlistItem:
  actAs: { Timestampable: ~ }
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    produit_id:   { type: integer }
    client_id:    { type: integer }
  relations:
    Produit:
      local: produit_id
      foreign: id
      foreignAlias: Produit
    Client:
      local: client_id
      foreign: id
      foreignAlias: Client
Client:
  actAs: { Timestampable: ~ }
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    adresse_id:   { type: integer }
    societe:      { type: string(255) }
    numTVA:       { type: string(255) }
  relations:
    Adresse:
      local: adresse_id
      foreign: id
      foreignAlias: Adresse
Artisan:
  actAs:
    Timestampable: ~
    I18n:
      fields: [description, metaKeyword]
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    banqueNom:    { type: string(255)  }
    banqueBIC:    { type: string(255)  }
    banqueIBAN:   { type: string(255)  }
    is_valid:     { type: boolean, notnull: true, default: 0 }
    abonnement_id:       { type: integer, notnull: true  }
    abonnementActif:     { type: boolean, notnull: true, default: 0 }
    description:  { type: clob, notnull: true }
    photo:        { type: string(255) }
    video:        { type: string(255) }
    metaKeyword:  { type: string(255) }
    adresse_id:   { type: integer }
    societe:      { type: string(255) }
    activite:      { type: string(255) }
    numTVA:       { type: string(255) }
  relations:
    Metier:
      class: Metier
      local: artisan_id
      foreign: metier_id
      refClass: ArtisanMetier
    Abonnement:
      local: abonnement_id
      foreign: id
      foreignAlias: Abonnement
    Adresse:
      local: adresse_id
      foreign: id
      foreignAlias: Adresse
 
Metier:
  actAs:
    Timestampable: ~
    I18n:
      fields: [libelle, description, metaKeyword]
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    libelle:      { type: string(255), notnull: true }
    photo:      { type: string(255) }
    video:      { type: string(255) }
    description:  { type: clob }
    metaKeyword:  { type: string(255) }
  relations:
    Artisan:
      class: Artisan
      local: metier_id
      foreign: artisan_id
      refClass: ArtisanMetier
      onDelete: CASCADE
 
ArtisanMetier:
  columns:
    artisan_id:
      type: integer
      primary: true
    metier_id:
      type: integer
      primary: true
  indexes:
    fk_ArtisanMetier_artisan1:
      fields: [artisan_id]
    fk_ArtisanMetier_metier1:
      fields: [metier_id]
 
Produit:
  actAs:
    Timestampable: ~
    I18n:
      fields: [libelle, description, metaKeyword]
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    categorie_id:    { type: integer }
    artisan_id:      { type: integer, notnull: true }
    libelle:         { type: string(255) }
    prix:            { type: decimal }
    promoDate:       { type: datetime }
    promoPrix:       { type: decimal }
    delaisRealisation:   { type: timestamp }
    description:     { type: clob }
    metaKeyword:     { type: clob}
    photo:           { type: string(255) }
  relations:
    Categorie:
      local: categorie_id
      foreign: id
      foreignAlias: Categorie
    Artisan:
      local: artisan_id
      foreign: id
      foreignAlias: Artisan
 
Categorie:
  actAs:
     Timestampable: ~
     I18n:
      fields: [libelle, description, metaKeyword]
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    libelle:      { type: string(255), notnull: true }
    description:     { type: clob }
    metaKeyword:     { type: string(255)}
  relations:
    Stage:
      class: Stage
      local: categorie_id
      foreign: stage_id
      refClass: StageCategorie
 
Abonnement:
  actAs:
    Timestampable: ~
    I18n:
      fields: [libelle]
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    libelle:      { type: string(255), notnull: true, unique: true }
    prix:         { type: decimal, notnull: true,  }
 
Mailing:
  actAs: { Timestampable: ~ }
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    userfrom_id:
      type: integer
    userto_id:
      type: integer
    user_id:
      type: integer
    from_nompnom:      { type: string(255)}
    from_email:      { type: string(255)}
    to_email:      { type: string(255)}
    sujet:      { type: string(255), notnull: true }
    message:  { type: clob }
    statut:
      type: enum
      values: [new, read, reply, forward]
      default: new
    folder:
      type: enum
      values: [inbox, drafts, sent, trash]
      default: inbox
 
 
sfGuardUserProfile:
  actAs:
    Timestampable: ~
  columns:
    user_id:
      type: integer
      notnull: true
      unique: true
    email_new:
      type: string(255)
      unique: true
    firstname:
      type: string(255)
    lastname:
      type: string(255)
    validate_at:
      type: timestamp
    validate:
      type: string(33)
    artisan_id:
      type: integer
    client_id:
      type: integer
  relations:
    User:
      class: sfGuardUser
      foreign: id
      local: user_id
      type: one
      onDelete: cascade
      foreignType: one
      foreignAlias: Profile
    Artisan:
      class: Artisan
      foreign: id
      local: artisan_id
      type: one
      onDelete: cascade
      foreignType: one
      foreignAlias: Profile
    Client:
      class: Client
      foreign: id
      local: client_id
      type: one
      onDelete: cascade
      foreignType: one
      foreignAlias: Profile
  indexes:
    validate:
      fields: [validate]
 
Stage:
  actAs:
    Timestampable: ~
    I18n:
      fields: [libelle, description]
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    artisan_id:      { type: integer, notnull: true }
    adresse_id:      { type: integer, notnull: true }
    categorie_id:    { type: integer, notnull: true }
    prix:            { type: decimal }
    dateDebut:       { type: datetime , notnull: true }
    dateFin:         { type: datetime }
    libelle:         { type: string(255), notnull: true }
    description:     { type: clob}
    personneMax:     { type: integer}
  relations:
    Adresse:
      local: adresse_id
      foreign: id
      foreignAlias: ADresse
    Artisan:
      local: artisan_id
      foreign: id
      foreignAlias: Artisan
    Categorie:
      class: Categorie
      local: stage_id
      foreign: categorie_id
      refClass: StageCategorie
 
StageCategorie:
  columns:
    categorie_id:
      type: integer
      primary: true
    stage_id:
      type: integer
      primary: true
  indexes:
    fk_StageCategorie_categorie1:
      fields: [categorie_id]
    fk_StageCategorie_stage1:
      fields: [stage_id]
 
Page:
  actAs:
    Timestampable: ~
    I18n:
      fields: [titre, contenu, metaKeyword]
  columns:
    id:
      type: integer
      autoincrement: true
      primary: true
    datePublication: { type: datetime , notnull: true }
    dateExpiration:  { type: datetime }
    user_id:         { type: integer }
    titre:           { type: string(255), notnull: true }
    contenu:         { type: clob}
    metaKeyword:     { type: string(255)}
    statut:
      type: enum
      values: [draft, published]
      default: published
  relations:
    User:
      class: sfGuardUser
      foreign: id
      local: user_id
Legenyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 18h48   #6
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
A priori (on n'a pas la même notion de "pas trop grand" ) ton shema.yml est viable. Seul remarque, tu peux alléger dans certains cas, par exemple ici
Code :
1
2
3
4
    Produit:
      local: produit_id
      foreign: id
      foreignAlias: Produit
Vu que produit_id et id sont des valeurs par défaut pour un lien appelé Produit, tu pourrais te contenter d'écrire.
Code :
1
2
    Produit:
      foreignAlias: Produit
Mais ceci ne résout pas le problème mais simplifie (un peu) la lecture du schéma.

J'ai cherché mais je ne vois pas le code de la méthode $this->artisan->getActiveProduitQuery(). En fait, je ne vois pas trop d'où vient $this->artisan et qui pourrait avoir initialisé, dans ton contrôleur, cette variable avant l'exécution de ton action.

Il est possible que l'erreur soit dans le DQL généré par getActiveProduitQuery().

Pourrais-tu mettre le code de la méthode et le SQL généré par ta méthode (getQuery() que le résultats de ta méthode si mes souvenirs sont bon)
__________________
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 !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 09h17   #7
Membre du Club
 
Inscription : novembre 2005
Messages : 103
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 103
Points : 44
Points : 44
Envoyer un message via MSN à Legenyes
produitTable.class.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
...
public function getActiveProduit(Doctrine_Query $q = null) {
        return $this->addActiveProduitQuery($q)->execute();
    }
 
    public function addActiveProduitQuery(Doctrine_Query $q = null) {
        if (is_null($q)) {
            $q = Doctrine_Query::create()
                    ->from('produit p');
        }
 
        $alias = $q->getRootAlias();
        $q->addOrderBy($alias . '.created_at DESC');
 
        return $q;
    }
Legenyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 11h05   #8
Invité de passage
 
Homme
Ingénieur développement logiciels
Inscription : août 2011
Messages : 1
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2011
Messages : 1
Points : 1
Points : 1
Pour que ton champs "libelle" soit présent dans ton objet, étant donné qu'il est dans les champs i18n, il te faut faire une jointure avec la table Translation
Code :
1
2
3
4
5
6
 
ex: symfony jobeet tuto J19
$categories = Doctrine_Query::create()
  ->from('JobeetCategory c')
  ->leftJoin('c.Translation t WITH t.lang = ?', $culture)
  ->execute();
bon courage !
abwebmedia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 11h08   #9
Membre du Club
 
Inscription : novembre 2005
Messages : 103
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 103
Points : 44
Points : 44
Envoyer un message via MSN à Legenyes
Je ne l'ai pas fait jusqu'a aujourd'hui (ajout de mon component)
La jointure était faite implicitement.
Legenyes est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h23.


 
 
 
 
Partenaires

Hébergement Web