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 :

Afficher le contenu d'un champ d'une relation n:n


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Afficher le contenu d'un champ d'une relation n:n
    Bonjour.

    Je travaille actuellement à la réécriture d'une boutique en ligne en symfony. Cette application est multilingue et les information sur un produit sont stockées dans une table dont la clef primaire est le code du produit et le code de la langue. Je souhait afficher le contenu de cette table dans mon template mais j'ai un doute sur la manière dont je procede.

    voici la description des tables en simplifié :
    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
    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
     
    Articles:
      connection: doctrine
      tableName: articles
      columns:
        id:
          type: integer(8)
          fixed: false
          unsigned: false
          primary: true
          sequence: articles_id
      relations:
        ArticlesDesc:
          local: id
          foreign: article
          type: many
     
    ArticlesDesc:
      connection: doctrine
      tableName: articles_desc
      columns:
        langue:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
        name:
          type: string()
          fixed: false
          unsigned: false
          notnull: true
          primary: false
        short_desc:
          type: string()
          fixed: false
          unsigned: false
          notnull: false
          primary: false
        long_desc:
          type: string()
          fixed: false
          unsigned: false
          notnull: false
          primary: false
        posologie:
          type: string()
          fixed: false
          unsigned: false
          notnull: false
          primary: false
        contenu:
          type: string()
          fixed: false
          unsigned: false
          notnull: false
          primary: false
        composition:
          type: string()
          fixed: false
          unsigned: false
          notnull: false
          primary: false
        msg_promo:
          type: string()
          fixed: false
          unsigned: false
          notnull: false
          primary: false
        article:
          type: integer(8)
          fixed: false
          unsigned: false
          primary: true
      relations:
        Langues:
          local: langue
          foreign: dbid
          type: one
        Articles:
          local: article
          foreign: id
          type: one
     
    Langues:
      connection: doctrine
      tableName: langues
      columns:
        dbid:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
      relations:
        ArticlesDesc:
          local: dbid
          foreign: langue
          type: many
    dans mon template pour afficher le champs short_desc en francais, je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $article->getArticlesDesc()->toKeyValueArray('langue', 'short_desc')->getRaw(1)
    1 correspond à l'ID de francais dans la base (je n'ai pas encore géré la langue ^^)

    Je doute que cette méthode soit la seule facon de récupérer les enregistrements et plus encore que ce soit une méthode très "standard" symfony.

    Si quelqu'un pouvait éclairer ma lanterne je lui en serait très reconnaissant car tout ou presque dans cette bdd est géré en fonction de la langue ou en tout cas ave des relations n:n

  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
    En fait, symfony ne sait pas gérer les données...

    ou presque.

    C'est doctrine (dans la dernière version) (ou prototype, mais plus recommandé) qui le fait.

    La documentation sur doctrine (en anglais).

    Doctrine intègre des notions de comportement (Behaviors) et entre autre la possibilité de mettre en place des tables avec une partie des champs traduits (I18N).

    Donc, tu peux définir une table et préciser que certains champs sont traduit. L'Id du produit sera unique, la disponibilité aussi, le prochain réapprovisionnement aussi, mais la description et le nom seront traduits.

    Quant tu récupères tes données pour un objet, automatiquement doctrine te retourne les données dans la langue courante définie pour l'utilisateur.

    Plus d'information dans le tutoriel Jobeet jour 19 (en français pour le coup).

    Bonne chance.

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci mimi pour cette réponse.
    J'avais bien compris le concept du multilinguisme I18N. Mais dans l'état actuel des choses, disons que je suis plus en train d'essayer de faire une démo rapide des possibilités de symfony à mon employeur.

    En fait, l'application actuelle est développée en perl. Tout ou presque a était écrit par le 1er développeur de la société qui est parti sans demander son reste le jour où le patron a décider d'en embaucher un 2e parce que l'activité prenait de l'importance. Qu'il parte n'aurait pas était gênant en soit si l'application était documentée. Mais le soucis est qu'elle ne l'est pas. Pas de doc technique, ni de commentaires dans le code. Et se baser sur les noms de fonctions ou de variables pour déterminer leur rôle serait pure folie tellement cela ne signifie rien pour les 3 développeurs que nous sommes aujourd'hui à travailler sur l'appli !!!

    Cette appli étant buguée, très mal écrite, pas optimisée, sans gestion de cache ni quelconque autre mécanisme permettant d'optimiser l'utilisation des ressources, mais étant la "colonne vertébrale" de la société, mes supérieurs veulent la réécrire. Seulement ils sont parti dans une logique où on garde le même langage, les mêmes fichiers, etc... et on corrige au fur et à mesure qu'on constate des bugs, qu'on ajoute des fonctionnalités, quitte à passer 3 jours à dérouler le code d'une fonction pour comprendre ce qu'elle fait !!!

    Personnellement, je me place dans l'optique de dire que plutôt que de mettre une rustine, autant changer la chambre à air. Alors j'essaye de mettre en place une petite démo rapide des possibilités que nous offre symfony, tout en restant très proche de la base de données actuellement en place (quelques modification sur les clefs primaires et étrangères pour ajouter des auto incrémenté).

    Du coup ta réponse ne m'aide pas. Et puis c'est vrai que j'ai mal choisi mon exemple. Donc ma question reste entière. Comment à partir de la collection retournée par l'accesseur getArticlesDesc() j'accède à chaque objet ArticleDesc individuellement ?

    Et accessoirement, penses-tu comme moi que symfony soit adapté pour re développer cette boutique en ligne + 3 ou 4 autres qui utilisent la même base de données avec chacune leur spécificité ainsi que le backend qui gere tout ca ?

  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 une méthode : getArticlesDesc() qui te retourne un objet Doctrine_collection.

    Si tu veux accéder à chaque enregistrement le code pourrait ressembler a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $Articles = $truc->getArticlesDesc();
    foreach ($articles as $article)
    {
       ... traitement que chaque objet $article.
    }
    Après, c'est un peu cours sur un forum de parler complètement de ce qui peut être ou ne pas être fait avec symfony... On a de quoi remplir des tonnes de pages avant d'arriver à cerner le problème et la solution.

    Les éléments que tu m'as donnés me semblent léger pour savoir quel est la meilleurs solution. J'en vois 3 :
    • conserver l'application actuel en la corrigeant et en l'optimisant
    • re-développer (php et symfony me semble un bon choix)
    • utiliser une boutique déjà existante quitte à l'adapter


    1) Utiliser une boutique déjà existante et l'adapter
    C'est aussi une solution a envisager. Il existe des solutions "gratuite" (osCommerce ou le module virtualmart de joomla et d'autres encore) et des boutiques payantes qui ont une très grande capacité d'adaptation et l'avantage d'être supporté par une large communauté. En inscrivant votre équipe de 3 dans la communauté et en supportant le projet que vous auriez choisi (projet "libre") les bénéfices pourraient être mutuels.

    Je pense que c'est la première solution que j'envisagerais. Mais je suis très projets "libre".


    Conserver l'application actuel et la faire évoluer
    La solution du "un tiens vaut mieux que deux tu l'auras.

    Il est évident que si l'application est tel que tu la décris, la reprendre, la documenter et la corriger ne va pas être simple. Quant à la faire évoluer par l'inclusion d'un système de cache, cela risque d'être infaisable.

    Une solution serait de budgéter le temps de documentation de l'application existante... Base de données et programme. Et ensuite de budgéter le développement d'un système de cache.

    Ceci permettrai un point de comparaison budgétaire entre les 3 solutions. Et les décideurs, les budgets clairs, ils aiment.


    Développer une nouvelle application
    C'est peut-être la meilleur solution. Mais elle risque de revenir très cher, comparée aux deux autres. Il faut y inclure la formation de l'équipe au PHP et à symfony, l'étude de l'application (qui n'a certainement jamais été faîte pour la première).

    Il est sur que ce serait la solution la plus optimisée pour l'entreprise, la plus satisfaisante pour toi, mais est-ce la meilleur pour l'entreprise ?

    Symfony est probablement le meilleur framework PHP du marché actuellement, je le préfère à zend qui est plus un collection d'outil qu'un framework, mais ce n'est jamais qu'un ensemble de briquet et fenêtre préfabriquées, la maison n'est pas encore construite.

    Si j'avais a développer une boutique en ligne (sans possibilité d'utiliser la solution d'une boutique déjà existante) j'utiliserais symfony pour ce projet. En fait, j'utilise symfony pour tous les projets que je mets en œuvre et qui n'ont pas d'outil déjà existant et correctement soutenus.


    Conclusion
    Une étude de l'existant. Une étude des besoins à un et trois ans. Une projection budgétaire pour les différentes solution.

    Après, tu pourras toujours montrer une maquette avec symfony, mais les décideurs, c'est pas le côté technique qui vont les intéresser, mais le budget.

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Salut mimi.

    Merci pour cette réponse. Concernant le choix d'une solution ou d'une autre, je partage tout a fait ton point de vue. Concernant les décideurs, certes le point de vue budget les intéresse et oriente leur choix, mais redévelopper les appli en symfony permettrait un énorme gain de temps et donc d'argent sur le long terme. Et mes supérieurs s'intéressent également au côté technique de la chose puisqu'ils sont eux même impliqués. La solution de l'utilisation d'une solution existante est a écarter car certaines fonctionnalités de l'appli sont très spécifiques et il est hors de question de perdre les infos de la base actuelle. Enfin bref là n'est pas le sujet.

    Revenons à nos moutons. J'avais encore une fois mal posé ma question. Parcourir tous les enregistrements au moyen du foreach n'est pas ce que je recherche. Je souhaite trouver l'enregistrement correspondant à un critère précis, en l'occurence la langue (2e partie de la clef primaire de la table), et l'afficher. Par exemple avec un findOneBy()

    PS : si tu a de la doc intéressante sur symfony qui pourrait m'etre (nous etre) utile pour nous former, je suis preneur.

  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
    Citation Envoyé par Hastaroth Voir le message
    La solution de l'utilisation d'une solution existante est a écarter car certaines fonctionnalités de l'appli sont très spécifiques et il est hors de question de perdre les infos de la base actuelle. Enfin bref là n'est pas le sujet.
    Je me permet de revenir à la charge. Un système comme osCommerce est très complet et un peu ouvert au développement, il semblerait que les nouvelles version (je n'y ai pas touché depuis 3 ans) soient mieux écrite et conformes au MVC. Y intervenir pour rajouter quelques comportement adapté à vos besoins pourrait être une bonne solution.

    Un projet comme virtualmart à été redéveloppé et est peut-être encore plus proche de la bonne solution.

    Ces deux projets sont mures et soutenus par une forte communauté, ce qui serait un plus important pour la pérennité de vos développements.

    Bien sur cela implique une (lourde) procédure de transfert et reformatage des informations. Mais rien d'impossible, à mon avis, mais à étudier avec soins.

    Je peux comprendre l'envie personnel de partir sur un projet vierge "rien qu'à soit", mais est-ce la meilleur solution pour la société... ?

    Citation Envoyé par Hastaroth Voir le message
    e souhaite trouver l'enregistrement correspondant à un critère précis, en l'occurence la langue (2e partie de la clef primaire de la table), et l'afficher. Par exemple avec un findOneBy()
    Tu as deux solutions, la méthode magique ou écrire une requête "à la mano".

    Méthode magique, tu as un numéro d'article (ArtNum) et une langue (Country) donnerait quelque chose du genre table::findOneByArtNumAndCoutry('artnum', 'coutry')

    J'y mettrais quelques bémols. Je n'ai pas la structure de la table, mais je crains que pour une liste d'article tu ne te retrouve avec un très grand nombre de requêtes. Reste alors la requête à la "mano".

    Citation Envoyé par Hastaroth Voir le message
    PS : si tu a de la doc intéressante sur symfony qui pourrait m'etre (nous etre) utile pour nous former, je suis preneur.
    Je n'ai pas plus de documentation que ce que l'on trouve sur internet, sauf les bouquins que j'ai en papier (je préfère lire le papier que l'écran...), mais tu les as sur le sites de symfony.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 50
    Points : 35
    Points
    35
    Par défaut
    Pour le sujet principal, en fait ça recouvre tout à fait la discussion que j'ai ouverte .

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/05/2013, 14h24
  2. Réponses: 12
    Dernier message: 10/08/2007, 15h45
  3. [VB6] Afficher le contenu d'un Pdf dans une form
    Par joquetino dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 04/08/2006, 19h59
  4. supprimer le contenu d'un champ dans une table paradox
    Par ouldfella dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/04/2006, 13h24
  5. Réponses: 23
    Dernier message: 07/02/2006, 17h55

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