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 :

Ajout d'un composant disposant d'un formulaire [1.x]


Sujet :

PHP

  1. #1
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut Ajout d'un composant disposant d'un formulaire
    Bonjour,

    Je développe actuellement un site et je souhaite avoir une interface permettant l'édition si l'on est authentifié.

    Pour expliquer le contexte, mon layout dispose d'une colonne à droite contenant un petit texte qui pourra être modifiable en WYSIWYG si l'on dispose des droits (sera rajouté ultérieurement). Pour cela mon composant doit afficher en fonction d'un paramètre (définit en base de donnée, mais considérons pour l'instant qu'il s'agisse d'une constante) l'action show et permettre l'édition (edit et update).

    Afin de réaliser la chose de manière progressive, j'ai rajouté le code suivant :

    Mon layout.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php include_component('pagecontent','showtest'); ?>
    Mon components.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
    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 pagecontentComponents extends sfComponents
    {
    [...]
      public function executeShowtest(sfWebRequest $request)
      {
        $q = Doctrine_Query::create()
          ->from('sfContent s')
          ->where('s.slugname = ?', 'test');
     
        $this->sf_content = $q->fetchOne();
      } 
     
      public function executeEdittest(sfWebRequest $request)
      {
        $q = Doctrine_Query::create()
          ->from('sfContent s')
          ->where('s.slugname = ?', 'test');
     
        $this->sf_content = $q->fetchOne();
        $this->form = new sfContentForm($sf_content);    
      }
     
      public function executeUpdatetest(sfWebRequest $request)
      {
        $q = Doctrine_Query::create()
          ->from('sfContent s')
          ->where('s.slugname = ?', 'test');
     
        $this->sf_content = $q->fetchOne();
        $this->form = new sfContentForm($sf_content);
     
        $this->processForm($request, $this->form);
     
        $this->setTemplate('_edittest');    
      }
     
      protected function processForm(sfWebRequest $request, sfForm $form)
      {
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid())
        {
          $sf_content = $form->save();
     
          $this->redirect('pagecontent_view',$sf_content);
        }
      }
    }
    et mon template _showtest
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <h2><?php echo $sf_content->getPagename() ?></h2><a href="<?php echo url_for('pagecontent_edit',$sf_content) ?>">Edit</a>
     
    <?php echo $sf_content->getBody(ESC_RAW) ?>

    Jusqu'ici tout va à peu près bien en lecture...
    Mon composant s'affiche correctement où il faut, cependant :

    - je ne peux pas éditer son contenu sans perdre la visualisation des modules de la page (grosso modo, j'obtiens mon composant en édition comme s'il était un module en plus de sa place habituelle en lecture). J'imagine qu'il s'agit d'une erreur de ma part dans url_for du template _showtest. Que dois-je mettre afin de lancer l'action executeEdittest du composant sans perdre pour autant le contenu du module en lecture ?

    - j'aimerais que la chaine 'test' soit fourni en paramètre à l'action executeShowtest (bref la transformer en executeShow avec 'test' fournis en paramètre via $request)

    Pour le premier point, j'ai tenté d'adapter ce qui est indiqué à l'adresse suivante mais sans résultat...
    http://www.blogafab.com/symfony-gere...-un-composant/

    Je suis preneur de toutes explication ou toute piste. Merci d'avance

    [EDIT]
    Après consultation de plusieurs topic, je m'interroge également sur la pertinence de mon schema.yml je suis preneur de tout conseil (je débute et j'ai du mal ^^)
    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
    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
    SfContent:
      connection: doctrine
      tableName: sfContent
      actAs:
        Timestampable: ~
        Sluggable:
          fields: [pagename]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        pagename:
          type: string(50)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        istitle:
          type: boolean
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        body:
          type: string(10000)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
    SfDownload:
      connection: doctrine
      tableName: sfDownload
      actAs:
        Timestampable: ~
        Sluggable:
          fields: [label, version]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        label:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        sfdownloadtype_id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        compatible:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        version:
          type: string(15)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        url:
          type: string(200)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        changelog:
          type: string(3000)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        sfproduct_id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        SfDownloadType:
          local: sfdownloadtype_id
          foreign: id
          type: one
        SfProduct:
          local: sfproduct_id
          foreign: id
          type: one
    SfDownloadType:
      connection: doctrine
      tableName: sfDownloadType
      actAs:
        Sluggable:
          fields: [label]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        label:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        picture:
          type: string(200)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        backcolor:
          type: string(10)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
      relations:
        SfDownload:
          local: id
          foreign: sfdownloadtype_id
          type: many
    SfLicence:
      connection: doctrine
      tableName: sfLicence
      actAs:
        Timestampable: ~
        Sluggable:
          fields: [name]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: false
        name:
          type: string(100)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        content:
          type: string(10000)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        url:
          type: string(200)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        picture:
          type: string(200)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        SfProduct:
          local: id
          foreign: licence_id
          type: many
    SfPartner:
      connection: doctrine
      tableName: sfPartner
      actAs: { Timestampable: ~ }
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        name:
          type: string(50)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        url:
          type: string(200)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        logo:
          type: string(200)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        description:
          type: string(100)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
    SfProduct:
      connection: doctrine
      tableName: sfProduct
      actAs:
        Timestampable: ~
        Sluggable:
          fields: [name]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        name:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        is_downloadable:
          type: integer(1)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        short_desc:
          type: string(100)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        long_desc:
          type: string(3000)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        features:
          type: string(1000)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        last_version:
          type: string(15)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        licence_id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: false
          autoincrement: false
        copyrights:
          type: string(45)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        screenshot:
          type: string(200)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        SfLicence:
          local: licence_id
          foreign: id
          type: one
        SfDownload:
          local: id
          foreign: sfproduct_id
          type: many
    CV :
    - LinkedIn
    - Viadeo

  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
    Pour le shema.

    Tu peux déjà virer toutes les lignes par défaut, notamment :
    fixed: false
    unsigned: false
    primary: false
    notnull: false
    autoincrement: false

    Ensuite je ne vois pas l'intérêt du préfix sf devant les noms des entités.

    Les relations ne doivent être définies que sur un côté de la relation, le côté n. Il faut renseigner le paramètre foreignAlias: pour donner le nom de la relation vue par l'autre côté.


    Pour ton formulaire, si j'ai bien compris... Tu veux une page qui affiche un texte mais si c'est certaines personnes précises, tu veux que ton texte soit dans un form pour l'éditer. Ne serait-il pas plus judicieux de l'afficher pour tous le monde et de prévoir, pour certain, un bouton modifier ?

    Dans ton code, tu devrais factoriser le code pour récupérer qui existe à trois endroits différent à priori à l'identique. Crées une méthode dans ton modèle pour récupérer ces informations.
    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 expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Merci pour ta réponse

    Visiblement je suis peut être aller trop vite... Je vais essayer de résoudre les problèmes progressivement.

    Avant toute chose, je souhaite apporter quelques précision sur le projet en question. Il s'agit de mon site personnel mais également (et surtout) de la possibilité de confirmer ou non ma compréhension du Framework symfony avant de me lancer dans un projet plus ambitieux. Il est donc possible que des solutions soient mises en place plus pour un besoin de développeur que d'utilisateur.

    Citation Envoyé par Michel Rotta Voir le message
    Pour le shema.

    Tu peux déjà virer toutes les lignes par défaut, notamment :
    fixed: false
    unsigned: false
    primary: false
    notnull: false
    autoincrement: false

    Ensuite je ne vois pas l'intérêt du préfix sf devant les noms des entités.

    Les relations ne doivent être définies que sur un côté de la relation, le côté n. Il faut renseigner le paramètre foreignAlias: pour donner le nom de la relation vue par l'autre côté.
    Si j'ai bien compris, je peux également virer les champs Id qui sont insérés automatiquement par symfony. (J'ai également corrigé quelques erreurs d'inattention)

    Concernant le préfixe sf, il est dû au fait que je commence par la "méthode du pauvre" afin de limiter les coûts en prod (je suis sur un mutualisé en prod et ma base est partagée entre ce projet, Piwik et PhpBB). Il s'agit plus pour moi d'un artifice pour repérer quelle table appartient à quel projet.

    Voici mon MCD (ne contient pas les champs Sluggable et Timestampable)


    et le schema.yml correspondant (enfin je l'espère) :
    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
    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
     
    SfContent:
      connection: doctrine
      tableName: sfContent
      actAs:
        Timestampable: ~
        Sluggable:
          fields: [pagename]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        pagename:
          type: string(50)
          notnull: true
        istitle:
          type: boolean
          notnull: true
        body:
          type: string(10000)
          notnull: true
     
    SfPartner:
      connection: doctrine
      tableName: sfPartner
      actAs: { Timestampable: ~ }
      columns:
        name:
          type: string(50)
          notnull: true
        url:
          type: string(200)
        logo:
          type: string(200)
          notnull: true
        description:
          type: string(100)
     
    SfDownloadType:
      connection: doctrine
      tableName: sfDownloadType
      actAs:
        Sluggable:
          fields: [label]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        label:
          type: string(45)
          notnull: true
        picture:
          type: string(200)
          notnull: true
        backcolor:
          type: string(10)
     
    SfLicence:
      connection: doctrine
      tableName: sfLicence
      actAs:
        Timestampable: ~
        Sluggable:
          fields: [name]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        name:
          type: string(100)
          notnull: true
        content:
          type: string(10000)
          notnull: true
        url:
          type: string(200)
          notnull: true
        picture:
          type: string(200)
          notnull: true
     
    SfProduct:
      connection: doctrine
      tableName: sfProduct
      actAs:
        Timestampable: ~
        Sluggable:
          fields: [name]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        name:
          type: string(45)
          notnull: true
        is_downloadable:
          type: boolean
          notnull: true
        short_desc:
          type: string(100)
          notnull: true
        long_desc:
          type: string(3000)
          notnull: true
        features:
          type: string(1000)
          notnull: true
        last_version:
          type: string(15)
        sf_licence_id:
          type: bigint(20)
          notnull: true
        copyrights:
          type: string(45)
          notnull: true
        screenshot:
          type: string(200)
          notnull: true
      relations:
        SfLicence:
          foreignAlias: SfProducts
     
    SfDownload:
      connection: doctrine
      tableName: sfDownload
      actAs:
        Timestampable: ~
        Sluggable:
          fields: [label, version]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        label:
          type: string(45)
          notnull: true
        compatible:
          type: string(45)
        version:
          type: string(15)
        url:
          type: string(200)
        changelog:
          type: string(3000)
        sf_download_type_id:
          type: bigint(20)
          notnull: true
        sf_product_id:
          type: bigint(20)
          notnull: true
      relations:
        SfDownloadType:
          foreignAlias: SfDownloads
        SfProduct:
          foreignAlias: SfDownloads
    Ai-je bien tout compris ?

    Citation Envoyé par Michel Rotta Voir le message

    Pour ton formulaire, si j'ai bien compris... Tu veux une page qui affiche un texte mais si c'est certaines personnes précises, tu veux que ton texte soit dans un form pour l'éditer. Ne serait-il pas plus judicieux de l'afficher pour tous le monde et de prévoir, pour certain, un bouton modifier ?
    Mon objectif final serait de pouvoir modifier n'importe quel contenu d'une page en dynamique. Je suppose qu'au final je devrais utiliser JQuery mais bon je tente de m'imposer une étape intermédiaire ^^ (c'est déjà bien compliqué comme ca )

    Un petit croquis me permettra de mieux expliquer la chose :



    Dans un premier temps :
    Je souhaite rajouter un bouton Editer a côté du composant B. Lorsque l'on cliquerait dessus, cela rechargerait la page telle qu'elle est présenté dans le croquis avec le composant B en édition. (Ainsi cela permettrait d'avoir un rendu en édition "relativement proche" de ce que cela donnerait en lecture.

    Dans un second temps :
    permettre l'édition du composant B sans rechargement de la page entière (un peut comme lorsque l'on ajout un lien ou un statut sur facebook). Mais je garde cette étape pour plus tard, lorsque la première étape n'aura plus de secret pour moi ^^

    Citation Envoyé par Michel Rotta Voir le message
    Dans ton code, tu devrais factoriser le code pour récupérer qui existe à trois endroits différent à priori à l'identique. Crées une méthode dans ton modèle pour récupérer ces informations.
    J'ai rajouter dans le fichier SfContentTable.class.php la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class SfContentTable extends Doctrine_Table
    {
    [...]    
        public function getPagecontent($slug)
        {
            $q = Doctrine_Query::create()
              ->from('SfContent page')
              ->where('page.slugname = ?', $slug);
     
            return $q->fetchOne();
        }
    }
    Du coup, mon components.class.php ressemble a ça :
    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
     
    class pagecontentComponents extends sfComponents
    {
    [...]
      public function executeShowtest(sfWebRequest $request)
      {
        $this->sf_content = Doctrine_Core::getTable('sfContent')->getPagecontent('test');
      } 
     
      public function executeEdittest(sfWebRequest $request)
      {
        $this->sf_content = Doctrine_Core::getTable('sfContent')->getPagecontent('test');
        $this->form = new sfContentForm($this->sf_content);    
      }
     
      public function executeUpdatetest(sfWebRequest $request)
      {
        $this->sf_content = Doctrine_Core::getTable('sfContent')->getPagecontent('test');
        $this->form = new sfContentForm($this->sf_content);    
     
        $this->processForm($request, $this->form);
     
        $this->setTemplate('_edittest');    
      }
     
      protected function processForm(sfWebRequest $request, sfForm $form)
      {
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid())
        {
          $sf_content = $form->save();
     
          $this->redirect('pagecontent_view',$sf_content);
        }
      }
    }
    Ai-je bien compris ?

    Merci d'avance
    Images attachées Images attachées   
    CV :
    - LinkedIn
    - Viadeo

  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 peux parfaitement avoir un nom de table dans ta base différent du nom de l'objet dans ton modèle, c'est à cela que sert le paramètre "tableName:" donc par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Content:
      tableName: symfony_Content
    Trop de "notNull: true" tue le "not null". Est-ce réellement nécessaire pour body dans content ?

    Avec tes nom d'objet un peu tordu, ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        sf_licence_id:
          type: bigint(20)
          notnull: true
    devient cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        SfLicence_id:
          type: integer // c'est le type par défaut pour les clefs
          notnull: true
    et si je me laisse aller a virer les not null qui ne sont pas structurellement indispensables :
    ouf, c'est plus léger.

    Ici le nom doit suivre le nom de l'objet aussi non doctrine ne pourra retrouver les champs de liaison par défaut dans sa création des liaisons.

    J'ai cru voir passer des champs sans not null dans sfDownload, un oubli ? J'ai honte

    Hors les corrections à apporter sur le nom des champs de liaison (et peut-être quelques not null surnuméraires, le schéma est bon). Je corrigerais le nom des objets en local pour virer le préfixe qui restera pour la base. Attention à bien mettre en corrélation la première partie du nom des champs xxx_id avec le nom de l'objet (pas le nom de la table physique). Et le type de ces champs qui doit être "integer".


    Pour ce que tu veux faire niveau visuel d'édition, j'ai des doutes hors ajax. En effet, si tu cliques sur un bouton éditer du composant, il va aller vers un lien qui va demander à PHP (et symfony) d'afficher la page avec le composant en édition. Mais comment lui dire ce qu'il y a dans A (qui semble la partie importante de la page) ?

    Pour la factorisation, c'est pas mal, mais, peut mieux faire !

    Regarde du côté des routes intelligentes les sfDoctrineRoute et sfDoctrineRouteCollection. Non seulement elle vont router vers ton module/action, mais en plus elle vont vérifier que ton enregistrement existe bien (si non, elle génère une err 404) et te le mettre à disposition (donc pas à le rechercher toi). Et elle peut travailler sur le slug et/ou l'Id suivant ce que tu mets dans la route et à la condition de lui envoyer un doctrine_record en argument.

    Le mieux, pour voir, est de générer un CRUD non verbose et de regarder le code. Tu as un exemple d'une route simple et d'une collection dans jobeet job.

    Ton action devient alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      public function executeEdittest(sfWebRequest $request)
      {
        $this->sf_content = $this->getRoute()->getObject();
        $this->form = new sfContentForm($this->sf_content);    
      }
    Encore un peu de travail
    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 expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Tout d'abord merci pour ton aide

    Aie... Visiblement je n'ai pas tout compris (mon script plante et prétend qu'une colonne n'existe pas alors qu'elle existe ou le générateur doctrine plante avec 2 pages de traces de debug ^^)

    Afin de bien comprendre ("qui" s'appelle "comment"), supposons que j'ai deux tables :
    TableDataA et TableDataB en base de données
    les objets correspondants sous symfony sont respectivement DataA et DataB
    et TableDataA a une FK sur TableDataB

    si j'ai bien compris, j'obtiens donc le schema.yml suivant
    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
     
    DataA:
      connection: doctrine
      tableName: TableDataA
      columns:
        label: string(50)
        data_b_id: integer
      relations:
        DataB:
          foreignAlias: DataAs
     
    DataB:
      connection: doctrine
      tableName: TableDataB
      columns:
        info: string(50)
    Ca c'était pour savoir si j'ai bien compris la théorie... ou pas... ?


    Concernant les champs not null, je pensais que le linker de Doctrine (ou de symfony) ferait alors en sorte que les champs correspondants du formulaire soient requis ? si j'ai faux, effectivement ya peut être un peu trop de not null


    Maintenant en pratique voici mon script modifié (qui ne marche pas) :

    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
    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
    Content:
      connection: doctrine
      tableName: sfContent
      actAs:
        Timestampable: ~
        Sluggable:
          fields: [pagename]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        pagename:
          type: string(50)
          notnull: true
        istitle:
          type: boolean
          notnull: true
        body:
          type: string(10000)
          notnull: true
     
    Partner:
      connection: doctrine
      tableName: sfPartner
      actAs: { Timestampable: ~ }
      columns:
        name:
          type: string(50)
          notnull: true
        url:
          type: string(200)
        logo:
          type: string(200)
          notnull: true
        description:
          type: string(100)
     
    DownloadType:
      connection: doctrine
      tableName: sfDownloadType
      actAs:
        Sluggable:
          fields: [label]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        label:
          type: string(45)
          notnull: true
        picture:
          type: string(200)
          notnull: true
        backcolor:
          type: string(10)
     
    Licence:
      connection: doctrine
      tableName: sfLicence
      actAs:
        Timestampable: ~
        Sluggable:
          fields: [name]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        name:
          type: string(100)
          notnull: true
        content:
          type: string(10000)
          notnull: true
        url:
          type: string(200)
          notnull: true
        picture:
          type: string(200)
          notnull: true
     
    Product:
      connection: doctrine
      tableName: sfProduct
      actAs:
        Timestampable: ~
        Sluggable:
          fields: [name]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        name:
          type: string(45)
          notnull: true
        is_downloadable:
          type: boolean
          notnull: true
          default: true
        short_desc:
          type: string(100)
          notnull: true
        long_desc:
          type: string(3000)
          notnull: true
        features:
          type: string(1000)
          notnull: true
        last_version:
          type: string(15)
        licence_id:
          type: integer
          notnull: true
        copyrights:
          type: string(45)
          notnull: true
        screenshot:
          type: string(200)
          notnull: true
      relations:
        Licence:
          foreignAlias: Products
     
    Download:
      connection: doctrine
      tableName: sfDownload
      actAs:
        Timestampable: ~
        Sluggable:
          fields: [label, version]
          name: slugname
          unique: true
          canUpdate: true
      columns:
        label:
          type: string(45)
          notnull: true
        compatible:
          type: string(45)
        version:
          type: string(15)
        url:
          type: string(200)
        changelog:
          type: string(3000)
        download_type_id:
          type: integer
          notnull: true
        product_id:
          type: integer
          notnull: true
      relations:
        DownloadType:
          foreignAlias: Downloads
        Product:
          foreignAlias: Downloads
    et l'erreur correspondante (mise en page pour des facilités de lecture) :
    SQLSTATE[42000]: Syntax error or access violation: 1072 Key column 'product_id' doesn't exist in table.
    Failing Query:
    "ALTER TABLE sfDownload ADD CONSTRAINT sfDownload_product_id_sfProduct_id
    FOREIGN KEY (product_id) REFERENCES sfProduct(id)".

    Failing Query:
    ALTER TABLE sfDownload ADD CONSTRAINT sfDownload_product_id_sfProduct_id
    FOREIGN KEY (product_id) REFERENCES sfProduct(id)
    Et pour cause... Si je regarde ma BD de l'intérieur je constate que mon champs product_id de type integer a été remplacé par symfony par :
    sf_product_id bigint(20)
    (il en va de même pour toutes les autres FK, et c'est également pour cela que j'avais précisé bigint dans mes précédents script )

    J'ai peut être mal configurer quelque chose quelque part...


    Citation Envoyé par Michel Rotta Voir le message
    Pour ce que tu veux faire niveau visuel d'édition, j'ai des doutes hors ajax. En effet, si tu cliques sur un bouton éditer du composant, il va aller vers un lien qui va demander à PHP (et symfony) d'afficher la page avec le composant en édition. Mais comment lui dire ce qu'il y a dans A (qui semble la partie importante de la page) ?

    Pour la factorisation, c'est pas mal, mais, peut mieux faire !

    Regarde du côté des routes intelligentes les sfDoctrineRoute et sfDoctrineRouteCollection. Non seulement elle vont router vers ton module/action, mais en plus elle vont vérifier que ton enregistrement existe bien (si non, elle génère une err 404) et te le mettre à disposition (donc pas à le rechercher toi). Et elle peut travailler sur le slug et/ou l'Id suivant ce que tu mets dans la route et à la condition de lui envoyer un doctrine_record en argument.

    Le mieux, pour voir, est de générer un CRUD non verbose et de regarder le code. Tu as un exemple d'une route simple et d'une collection dans jobeet job.

    Ton action devient alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      public function executeEdittest(sfWebRequest $request)
      {
        $this->sf_content = $this->getRoute()->getObject();
        $this->form = new sfContentForm($this->sf_content);    
      }
    Encore un peu de travail
    Pour le visuel en édition, je tenterais de voir au niveau d'ajax (enfin quand j'aurais déjà compris la partie BD ).

    Pour la factorisation, je peux donc utiliser le même système pour un composant comme pour un module, c'est à dire récupérer l'objet en fonction de la route utilisée.
    Cependant, autant pour afficher le module en lieu et place du Contenu A (croquis), la route est automatiquement analysée et renvoie bien ce qu'il faut, autant pour afficher un composant (croquis : B), je ne sais pas préciser dans mon layout l'identifiant de l'enregistrement ou la route à envoyer au show :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php include_component('pagecontent','show');
    Merci pour tes réponses
    Je progresse... Je progresse...
    CV :
    - LinkedIn
    - Viadeo

  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
    J'aime pas les DataA à cause de "data a" en deux mots. Je n'aime pas les nom composés, source d'erreur.

    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
     
    DataA:
      connection: doctrine
      tableName: TableDataA
      columns:
        label: string(50)
        dataB_id: integer
      relations:
        DataB:
          foreignAlias: DataAs
     
    DataB:
      connection: doctrine
      tableName: TableDataB
      columns:
        info: string(50)
    ou

    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
     
    DataA:
      connection: doctrine
      tableName: TableDataA
      columns:
        label: string(50)
        data_b_id: integer
      relations:
        DataB:
          local: data_b_id
          foreignAlias: DataAs
     
    DataB:
      connection: doctrine
      tableName: TableDataB
      columns:
        info: string(50)
    Explications déjà données plus haut. (si je ne me trompe pas de message )

    Pour les notnull, ce n'est pas faux .

    Mais tu peux préciser un require dans les validators du form sans qu'il soit require dans la table physique. C'est plus souple au niveau du form. Donc a limiter dans le physique à ce qui est nécessaire pour que le MPD marche et reste stable.

    Pour l'erreur de génération c'est... étonnant. Il semblerait qu'il y ait eu un changement dans doctrine récemment qui ait fait passer le integer du schéma à bigint alors qu'avant il générait du integer.

    Par contre, je viens de régénérer un modèle qui marchait, équivalent à ce que tu as saisis et sans problème, les clefs et les clefs étrangères sont simplement passées en bingint et les fixatures se sont fixées.

    Tout est-il en bigint ? Les clefs et les clefs étrangères ?

    Si non je ne met jamais de notnull sur une clef étrangère, peut-être est-ce là l'erreur ?
    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 expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Merci pour ta réponse, les choses me semblent plus clair à présent

    Bon visiblement mon problème est ailleurs...
    (c'est pourquoi entre autre j'avais du mal à comprendre les différences entre explication et résultat)

    Apparemment, les modifications du fichiers /config/doctrine/schema.yml ne sont pas prise en compte (l'ajout d'un champs toto n'est par exemple jamais pris en compte quelque soit la table)
    Pire, le fichier schema.sql "doublonne" chaque création de table ou d'index/FK

    Si je vide complètement schema.yml, il me répond un message du genre :
    No yml schema found in /tmp/doctrine_schema_41569.yml
    Par contre si je ne mets que la table sfContent, il me recrée toutes les tables (même celles supprimées).

    Je précise qu'à la base mon schema avait été généré depuis la base de données (mais ce n'est plus le cas maintenant).

    J'utilise actuellement
    soit la commande :
    php symfony doctrine:build --all --no-confirmation

    soit les commandes suivantes :
    php symfony doctrine:build --model
    php symfony doctrine:build --sql
    php symfony doctrine:insert-sql

    J'imagine que je dois oublier quelque chose...
    Faut-il que je supprime certains fichiers (peut être ceux contenu dans lib/model/doctrine/base/ ) ? ou que je lance une commande supplémentaire ?
    CV :
    - LinkedIn
    - Viadeo

  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
    Tes deux commandes sont équivalentes

    Supprimes manuellement les objets dans lib/model/doctrine/base

    et un petit coup de cc aussi
    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 expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Merci infiniment pour ta réponse
    Cela fonctionne à merveille

    Tout est-il en bigint ? Les clefs et les clefs étrangères ?
    Oui, visiblement les clés primaires générés par symfony sont en bigint(20).

    Je reconstruis un peu tout ce que j'ai cassé (ya du boulot avec ce que j'ai fait depuis 2 jours ) avant de donner suite à ce topic, à savoir si je pense avoir les connaissances nécessaire pour inclure de l'AJAX (jQuery je pense) ou si je dois m'orienter vers une solution plus simple.
    CV :
    - LinkedIn
    - Viadeo

  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
    A priori la dernière mise à jour de Doctrine a passé les clef primaire de integer à bigint...

    Note, il y a deux ans on est déjà passé de small integer à integer. La course à la puissance...
    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 expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Me revoilà

    Citation Envoyé par Michel Rotta Voir le message
    A priori la dernière mise à jour de Doctrine a passé les clef primaire de integer à bigint...

    Note, il y a deux ans on est déjà passé de small integer à integer. La course à la puissance...
    Quelque part, c'est le signe que symfony s'adapte de plus en plus à des gros sites dont probablement la limite des clés primaires (configurées par défaut) était atteinte. C'est plutôt encourageant


    J'ai repris tout mon projet et obtiens de meilleurs résultats.

    Cependant, il me reste quelques interrogations théoriques sur le fonctionnement des composants avant de me lancer dans de l'AJAX.

    Dans le layout.php, on inclut un composant comme ceci avec en array les informations à transmettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php include_component("pagecontent","show",array('myslug'=>'test')); ?>
    Ainsi le code du executeShow de mon components.class.php est lancer avec une propriété supplémentaire ($this->myslug) et permet donc de charger un enregistrement en particulier.

    Le template _show.php est alors utiliser afin d'afficher le résultat.

    Jusqu'ici nous sommes resté uniquement dans l'utilisation du composant.

    Afin de pouvoir utiliser l'édition dans le composant, je m'interroge sur la distinction entre actions.class.php et components.class.php. En effet, j'avoue ne pas comprendre comment faire pour lancer une méthode du composant et non de l'action du module. Bref, comment générer un lien dans _show.php qui ira chercher dans components.class.php ?

    En fait, j'avoue que, malgré le tutoriel JobeetJob, je n'ai toujours pas compris les subtilités d'un composant. Je suis preneur de toute information a ce sujet.

    Merci d'avance
    CV :
    - LinkedIn
    - Viadeo

  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
    Il n'est pas possible de lier un composant à une route.

    Donc, si tu as un form dans un composant, il faudra créer, dans le même module un contrôleur action en charge de récupérer et traiter le résultat.

    Le problème étant de retrouver la page d'origine, ce qui n'est pas gagné.

    Si tu veux un composant qui tourne en local sur la page, javascript et l'ALAX sont tes amis. Attention, passer par de l'AJAX n’empêche pas qu'il faudra deux contrôleur, un pour le composant, un pour l'action standard..
    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 !

  13. #13
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Ok merci pour ta réponse

    Visiblement je ne prends pas le problème du bon côté, je vais donc consulter mes amis javascript et AJAX (enfin on va faire connaissance et j'espère que cela va bien se passer ).
    CV :
    - LinkedIn
    - Viadeo

  14. #14
    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
    Mon dernier message chez eux est resté sans réponses...

    Bonne chance
    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 !

  15. #15
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    C'est bon ca marche

    Code javascript : 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
    $(function() {
        $('.imgedit').live('click',(function()
            {
               $('.sbtext').empty().load('/pagecontent/edit/2');
            }
        ));
     
        $("form").live('submit',(function()
            {
                //déclaration des variables :
                var pSfMethod = $(this).find("input[name=sf_method]").val();
                var pPageName = $("#content_pagename").val();
                var pBody     = $("#content_body").val();
                var pId       = $("#content_id").val();
                var pcsrf     = $("#content__csrf_token").val();
                var purl      = $(this).attr("action");
                $.post(
                    "/pagecontent/updjson/"+pId,
                    {
                        sf_method:pSfMethod,
                        content:{
                        pagename:pPageName,
                        body:pBody,
                        id:pId,
                        _csrf_token:pcsrf
                        },
                        ajax:true
                    },
                    function(data) {
                        if (data.error == "") {
                            $(".sbtext").empty().load(data.load);
                        } else {
                            $(".sbtext").before(data.error);
                        } 
                    },
                    "json"
                );
                return false;
            }    
        ));
    });

    Mon action pour JSON
    Code php : 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
      public function executeUpdjson(sfWebRequest $request)
      {
        $this->forward404Unless($request->isMethod(sfRequest::PUT));
        $content = Doctrine_Core::getTable('Content')->find(array($request->getParameter('id')));
        $this->form = new ContentForm($content);
        $this->form->bind($request->getParameter($this->form->getName()), $request->getFiles($this->form->getName()));
     
        $data = array();
     
        if ($this->form->isValid())
        {
          $content = $this->form->save();
     
          $data["error"] = "";
          $data["load"] = $this->generateUrl("pagecontent_view",$this->form->getObject());
     
        } else {
          $data["error"] = "erreur";
        }
     
        $this->getResponse()->setHttpHeader('Content-type', 'application/json; charset=utf-8');
        return $this->renderText(json_encode($data));
      }

    et le template correspondant au composant
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <div class="sbtext">
        <h2><?php echo $compocontent->getPagename() ?>&nbsp;
        <img src="/images/icons/icon_settings.gif" class="imgedit" /></h2>
     
        <?php if ($compocontent->getIstitle() == 1)
        { 
            slot('title',$compocontent->getPagename());
        }
        ?>
     
        <?php echo $compocontent->getBody(ESC_RAW) ?>
    </div>

    sans oublier la route pour le JSON
    Code yaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    pagecontent_updjson:
      url: /pagecontent/updjson/:id
      class: sfDoctrineRoute
      options:
        model: Content
        type: object
      param:
        module: pagecontent
        action: updjson
      requirements:
        sf_method: [POST]
        sf_format: (json)

    D'après ce que j'ai compris, le composant n'est afficher qu'au premier affichage. Dès que l'on click sur l'image de modification, JS nous renvoie sur les actions du module, la validation du formulaire se fait en "live" et une fois celle-ci terminée, nous visualisons le module et non pas le composant.

    Michel Rotta: un grand merci à toi pour ton aide

    Merci également à SpaceFrog et a Thimess pour leurs aides

    Sujet résolu
    (M'enfin reste du nettoyage de code et de l'optimisation, le code ci-dessus n'est pas forcément le plus optimisé, il consiste seulement à mettre en évidence le fonctionnement désiré)
    CV :
    - LinkedIn
    - Viadeo

  16. #16
    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 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 !

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

Discussions similaires

  1. [JTabbedPane] Pb lors de l'ajout d'un composant
    Par Zanton dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 15/05/2006, 13h30
  2. [D7] Ajout enregistrement avec composant Interbase
    Par jer64 dans le forum Bases de données
    Réponses: 9
    Dernier message: 23/02/2006, 22h49
  3. Réponses: 6
    Dernier message: 06/12/2005, 15h52
  4. Réponses: 14
    Dernier message: 22/09/2005, 16h49
  5. [C#] Ajouter son propre composant dans Design de VS.Net
    Par yannick_sch dans le forum Windows Forms
    Réponses: 2
    Dernier message: 26/08/2004, 11h14

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