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 :

Creer un post et ajouter catégories


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 207
    Par défaut Creer un post et ajouter catégories
    Voici tout d'abord le schéma de ma BDD, mon schéma yml se trouve tout en bas au cas ou.



    Pour le besoin de faire des tests simples j'essaye de créer un post et de lui ajouter des catégories.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $post1 = new Post(); //création d'un post
    $post1->body = 'post avec deux catégories cat1 et cat2';
    //Jusque la tout va bien le post est bien créé avec le bon body.
    //ajouter des catégories à un post.
     
     
    $post1->save();
    J'ai essayé pleins de trucs pour ajouter des catégories mais je ne sais vraiment pas comment m'y prendre, il doit me manquer encore cette logique symfony.

    Merci pour votre éventuelle aide.

    Mon yml.
    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
    98
    99
    100
    Post:
      actAs:
        Sluggable:
          unique: true
          fields: [title]
          canUpdate: true
          notnull: true
      columns:
        id:
          type: integer(8)
          primary: true
          notnull: true
          autoincrement: true
        author_user_id:
          type: integer(8)
          notnull: true
        title:
          type: string(256)
          notnull: true
        excerpt:
          type: clob
        body:
          type: clob
          notnull: true
        #publish, pending, future, trash, ne pas pouvoir effacer un post tant qu'il n'est pas en mode trash
        post_status:
          type: string(16)
          notnull: true
        comment_status:
          type: boolean
          notnull: true
          default: 1
        ActAsnb_comment:
          type: integer(8)
          notnull: true
          default: 0
      relations:
        postAuthor:
          class: sfGuardUser
          local: author_user_id
          foreign: id
          type: one
          foreignType: many
          foreignAlias: Posts
      options:
        charset: armscii8
        collate: armscii8_bin
     
     
    Category:
      columns:
        id:
          type: integer(8)
          primary: true
          notnull: true
          autoincrement: true
        name:
          type: string(32)
          notnull: true
        ActasSlug:
          type: string(45)
          notnull: true
        description:
          type: clob
        parent:
          type: integer(8)
          notnull: true
          default: 0
        count:
          type: integer(4)
          notnull: true
          default: 0
      options:
        charset: utf8
        collate: utf8_unicode_ci
     
    PostCategory:
      columns:
        post_id:
          type: integer(8)
          primary: true
          notnull: true
        cat_id:
          type: integer(8)
          primary: true
          notnull: true
      relations:
        post:
          class: Post
          local: post_id
          foreign: id
          foreignAlias: PostCategories
        cat:
          class: Category
          local: cat_id
          foreign: id
          foreignAlias: PostCategories
      options:
        charset: utf8
        collate: utf8_unicode_ci

  2. #2
    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
    Il manque des relations dans ton schéma YAML. Dans les tables Post et Category.

    Si dessous le shema.yml tel que je l'aurais écris.

    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
    98
    99
    100
    101
    102
    103
    104
    105
     
    Post:
      actAs:
        Sluggable:
          unique: true
          fields: [title]
          canUpdate: true
          notnull: true
      columns:
        id:
          type: integer(8)
          primary: true
          notnull: true
          autoincrement: true
        author_user_id:
          type: integer(8)
          notnull: true
        title:
          type: string(256)
          notnull: true
        excerpt:
          type: clob
        body:
          type: clob
          notnull: true
        post_status:
          type: string(16)
          notnull: true
        comment_status:
          type: boolean
          notnull: true
          default: 1
        ActAsnb_comment:
          type: integer(8)
          notnull: true
          default: 0
      relations:
        postAuthor:
          class: sfGuardUser
          local: author_user_id
          foreign: id
          type: one
          foreignType: many
          foreignAlias: Posts
      options:
        charset: armscii8
        collate: armscii8_bin
     
     
    Category:
      columns:
        id:
          type: integer(8)
          primary: true
          notnull: true
          autoincrement: true
        name:
          type: string(32)
          notnull: true
        ActasSlug:
          type: string(45)
          notnull: true
        description:
          type: clob
        parent:
          type: integer(8)
          notnull: true
          default: 0
        count:
          type: integer(4)
          notnull: true
          default: 0
      relations:
        Posts:
          foreignAlias: Categorys
          class: Post
          refClass: PostCategory
      options:
        charset: utf8
        collate: utf8_unicode_ci
     
    PostCategory:
      columns:
        post_id:
          type: integer(8)
          primary: true
          notnull: true
        cat_id:
          type: integer(8)
          primary: true
          notnull: true
      relations:
        post:
          class: Post
          local: post_id
          foreign: id
          foreignAlias: PostCategories
        cat:
          class: Category
          local: cat_id
          foreign: id
          foreignAlias: PostCategories
      options:
        charset: utf8
        collate: utf8_unicode_ci
    Il semble y manquer un lien dans la table category ou dans la table post pour définir qu'elles ont, entre elles, une relation n-n (le lien entre deux tables ne doit être défini que sur une seul des deux tables). Il est évident qu'entre les tables Tag et Post, il faudra aussi définir ce lien.

    On pourra alors utiliser :
    $newpost = new Post
    ... Initialiser les données du post
    $newcat = new Category
    ... Initialiser les données de la catégorie
    $newpost->setCategorys($new1cat)

    $newcat pourrait être un array d'objet catégories.

    Pour récupérer les données, on va récupérer un post dans un objet $actuPost puis pour les catégories :
    $actuCategories = $actuPost->getCategorys
    foreach $actuCategorys as $actuCatego { ... }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 207
    Par défaut
    En effet merci, parfait

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 207
    Par défaut
    JE me permet de rebondir sur mon Post.

    Je galarais comme un ane pour ajouter des catégories à un post car à mon avis mon schéma était faux non?

    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
     
    Post:
      actAs:
        Sluggable:
          unique: true
          fields: [title]
          canUpdate: true
          notnull: true
      columns:
        id:
          type: integer(8)
          primary: true
          notnull: true
          autoincrement: true
        author_user_id:
          type: integer(8)
          notnull: true
        title:
          type: string(256)
          notnull: true
        excerpt:
          type: clob
    .........
      relations:
        PostAuthor:
          class: sfGuardUser
          local: author_user_id
          foreign: id
          type: one
          foreignType: many
          foreignAlias: Posts
        #dans une relation many-many le local est le local de la refClass
        PostCategories:
          class: Category
          refClass: PostCategory
          local: post_id
          foreign: cat_id
          foreignAlias: Posts
        PostTags:
          class: Tag
          foreignAlias: Posts
          refClass: PostTag
          local: post_id
          foreign: tag_id
     
    Category:
      actAs:
        Sluggable:
          unique: true
          fields: [name]
          canUpdate: true
          notnull: true
      columns:
        id:
          type: integer(8)
          primary: true
          notnull: true
          autoincrement: true
        name:
          type: string(32)
          notnull: true
        description:
          type: clob
        parent:
          type: integer(8)
          notnull: true
          default: 0
        count:
          type: integer(4)
          notnull: true
          default: 0
     
    PostCategory:
      columns:
        post_id:
          type: integer(8)
          primary: true
          notnull: true
        cat_id:
          type: integer(8)
          primary: true
          notnull: true
      relations:
        Post:
          class: Post
          local: post_id
          foreign: id
          foreignAlias: PostCategories
          onDelete: CASCADE
        Category:
          class: Category
          local: cat_id
          foreign: id
          foreignAlias: PostCategories
          onDelete: CASCADE
    Mimi ou quelqu'un d'autre vous confirmez que mon yml est pas bon du tout?

    Sinon pour le besoin des test, j'ai refait mon yml comme tu me l'avait conseillé.

    Voici mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $newpost = new Post();
    $newpost->setTitle('DSDSQDQDQSDQDQDSQSDQS');
    //Initialiser les données du post
    $newcat = new Category();
    $newcat->setName('KOKOKOKOKOOKKO');
    //Initialiser les données de la catégorie
    $newpost->setCategories($newcat);
    $newpost->save();
    J'obtiens ceci.

    00 | Internal Server Error | Doctrine_Record_Exception
    Couldn't call Doctrine_Core::set(), second argument should be an instance of Doctrine_Collection when setting many-to-many references.
    Merci

  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
    En effet, tu as une relation de type 1-n, tu peux donc ajouter plusieurs criterias.

    Il faut lui fournir une collection pour le setCriterias, même si l'élément de la collection est unique.

    Dans mes souvenir, si tu lui donnes :
    $newpost->setCategories(array($newcat));

    cela devrait passer.

    Mais non testé.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 207
    Par défaut
    Citation Envoyé par mimi68 Voir le message
    En effet, tu as une relation de type 1-n, tu peux donc ajouter plusieurs criterias.

    Il faut lui fournir une collection pour le setCriterias, même si l'élément de la collection est unique.

    Dans mes souvenir, si tu lui donnes :
    $newpost->setCategories(array($newcat));

    cela devrait passer.

    Mais non testé.
    Malheureusement non j'ai déjà testé.
    Je suis désespéré!!!

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 207
    Par défaut
    Je sais pas si c'est propre mais maintenant j'arrive en faisant comme ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //création d'une doctrine collection
    $collection = new Doctrine_Collection('Category');
    //ajoute ma catégorie à la collection
    $collection->add($newcat);

  8. #8
    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
    Ceci me semble la bonne (seul) solution.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 207
    Par défaut
    Pour mettr en forme cela, j'ai créer un formulaire embed pour l'ajout de catégories.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->embedForm('category', new CategoryForm());
    Quand je valide mon formulaire de post, le post s'insère bien en base, la catégorie aussi, mais la table PostCategory ne se rempli pas et donc la catégorie n'est pas assigné au post.

    Cela ne devrait pas se faire automatiquement?

    Merci

  10. #10
    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
    Tu veux poster simultanément un "post" et un catégorie

    ou

    Rajouter une catégorie à un post existant ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 207
    Par défaut
    Citation Envoyé par mimi68 Voir le message
    Tu veux poster simultanément un "post" et un catégorie

    ou

    Rajouter une catégorie à un post existant ?
    EN fait dans mon formulaire de post, j'ai une liste déroulante avec la liste des catégories déjà existantes, si mon nouveau post n'a aucune catégorie qui lui correspond je rempli donc l'embed et j'aimerai que cette catégorie lui soit associé.

    Merci

  12. #12
    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
    C'est un peu ce que j'avais cru comprendre

    Je pense que la solution est ailleurs en fait il ne te faut pas de formulaire "embeded"

    Fais deux formulaires indépendants et deux balise "<form ...>" dans ta page, une pour l'enregistrement et une pour l'ajout éventuel d'une catégorie.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 207
    Par défaut
    Je vais finir par en arriver la en effet mais c'est dommage ca m'aurait beaucoup appris de pouvoir faire cela, mais bon je pense que je vais finir par faire des trucs séparés.

  14. #14
    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
    Je pense que tu aurais surtout appris que ce n'est pas la bonne méthode pour ce que tu souhaite réaliser

    Pourquoi faire simple et rapide alors qu'on peut faire compliquer et long ?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 207
    Par défaut
    Les quelques lignes qu'on a codé ci-dessus démontre bien qu'il est hyper facile d'associer des catégories à un post, je ne vois pas pourquoi le fait de passer par un formulaire rend tout cela compliqué.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Tu as déjà regardé ce lien : http://www.symfony-project.org/blog/...implementation ?

  17. #17
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Salut,

    Comme je l'ai dis sur le sdz, il est très facile d'adapter ton formulaire actuel (avec l'Embed) en surchargeant la méthode doSave() de ton formulaire pour y faire la requête qui va associer la catégorie créée et le post créé.

    Faire 2 forms séparés c'est une solution pour développeur, pas pour utilisateur final.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 207
    Par défaut
    Citation Envoyé par winzou Voir le message
    Salut,

    Comme je l'ai dis sur le sdz, il est très facile d'adapter ton formulaire actuel (avec l'Embed) en surchargeant la méthode doSave() de ton formulaire pour y faire la requête qui va associer la catégorie créée et le post créé.

    Faire 2 forms séparés c'est une solution pour développeur, pas pour utilisateur final.
    Pour le premier j'ai déjà tenté de surcharger la méthode doSave() mais j'ai jamais réussi à m'en sortir, je sais pas trop quoi faire.

    Ton lien je l'avais déjà regardé par contre, mais le problème c'est que tout ces exemples c'est pour des relations simples entre deux tables.
    Moi c'est ma table qui fait la relation entre les deux qui me bloquent, si tu as un code explicite je suis preneur.

    Pour le deuxième point on est bien d'accord!!!

    Merci

  19. #19
    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
    Je ne vois pas en quoi la solution avec les deux formulaires serait moins satisfaisante que le embeded qui n'est pas fait pour ce type de cas et qui devrait être bricolé...

    Par contre, après réflexion, j'ai une solution avec un seul form, un peu de code simple et pas d'usine autour d'un embeded.

    Tu crées ton form et sous la liste, tu laisses un champ défini dans le form, champ vide, non rattaché à la base et tu lui attribues un validator qui va bien.

    Dans la liste, tu rajoutes créer un nouveau libellés.

    Tu met un validators post qui vérifie que si dans la liste nouveau libellés, la zone est remplie et si pas nouveau libellé elle est vide.

    Dans le save si la zone n'est pas vide, tu crées le libellé et tu lie l'enregistrement.

    Et pour faire très jolis, du rajoute un bout de javascript qui n'affiche le champ libellé que si la liste le demande et qui l'efface si on change dans la liste.

  20. #20
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    J'ai quelques questions pour toi :
    • Est-ce que si tu sélectionnes une catégorie existante pour ton post, il fait la liaison dans PostCategory ?
    • Dans le formulaire embeded pour ajouter une catégorie, est-ce qu'il t'affiche un champ Posts_list ?
    • Si oui, et si tu sélectionnes dans ce champ des posts à associer à ta nouvelle catégorie, est-ce qu'il fait la liaison dans PostCategory ?

Discussions similaires

  1. [wordpress] Creer un post avec champs ACF en front end
    Par inoxis91 dans le forum WordPress
    Réponses: 4
    Dernier message: 08/02/2015, 17h40
  2. Ajout catégories Sources : COBOL & JCL (voire REXX ?)
    Par Metalman dans le forum Evolutions du club
    Réponses: 0
    Dernier message: 05/02/2014, 10h50
  3. creer un post it sur le bureau
    Par albedo dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/05/2006, 16h38
  4. [Shell] Ajouter des éléments au poste de travail
    Par Feeder_Fan dans le forum Framework .NET
    Réponses: 2
    Dernier message: 04/12/2005, 04h07
  5. Réponses: 3
    Dernier message: 07/10/2005, 12h07

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