Bonjour, je réalise une refonte de mon petit CMS pour l'ensemble de mes projets récurrents et je souhaiterais ajouter une fonctionnalité dans l’ajout et l’édition des Posts (Articles), en effet l’ensemble des Posts possède la plupart du temps un Titre et un Contenu, mais parfois ces posts possèdes d’autres propriétés comme, une date de début et une date de fin, ou une carte google maps avec une latitude et une longitude

Je souhaiterais donc réfléchir avec vous à une organisation de code, pour ajouter lors de l'ajout / modification d’un « Post » un Type de post qui ajouterais des champs.

Ensuite dans ma vue Template/Posts/view.ctp j’imagine bien inclure un Template/Element/xxx.ctp  en fonction du type du post qui contiendrai la logique d’affichage / mise en page.

Table posts

+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| category_id | int(11)          | YES  |     | NULL    |                |
| type_id     | int(11)          | YES  |     | NULL    |                |
| title       | varchar(90)      | YES  |     | NULL    |                |
| slug        | varchar(255)     | YES  |     | NULL    |                |
| body        | text             | YES  |     | NULL    |                |
| online      | tinyint(4)       | YES  |     | NULL    |                |
| created     | datetime         | YES  |     | NULL    |                |
| modified    | datetime         | YES  |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+

En revanche, pour la table types je n’ai pas trop idées, enfin je pense sauvegarder les données avec serialize() pour ne pas avoir de limitation dans les champs.

Avez vous une idée d’organisation ou autre pour structurer proprement la champs dynamiques des types de posts.

4 réponses


Sinon on peut s'inspirer de ce que fait wordpress en imaginant une nouvelle table post_meta qui stocke id, post_id, meta_key, meta_value ce qui te permettrai d'ajouter autant de champs que tu le souhaite

Bed0sk!l
Auteur

Merci pour ta réponse Grafikart, je vais regarder la structure MySQL de Wordpress plus en detail.
Un post se retrouve donc avec plusieurs types (postemeta) et les types contiennent des fields.
En meta_key je defini le nom du champ ex: start_date, et en meta_value la valeur.
Je reviens vers vous après avoir fait deux trois test d’implémentations pour détailler mon organisation.

Bed0sk!l
Auteur

Alors après avoir regardé Wordpress j’aime bien ce fonctionnement, j’aimerais néanmoins avoir un éclaircissement.

En somme je souhaiterais :

Créer des Types de posts :

    Actu
        start_at : datetime
        end_at : datetime
        tpl_back : /path/to/tpl/back.ctp
        tpl_front : /path/to/tpl/front.ctp
    partners
        latitude : DECIMAL(10, 8)
        longitude : DECIMAL(11, 8)
        tpl_back : /path/to/tpl/back.ctp
        tpl_front : /path/to/tpl/front.ctp
    […]

Ces Types de posts ont des champs mais qui sont propre au post sélectionné, ce sont de types que je créer en fonction du projet.
Ensuite dans l’édition des ces posts en backoffice, j’aurais un fichier .ctp (ou stocké un imput en base de données) qui m’afficherais les champs à compléter propre au post.

Si je comprend bien je dois avoir la key type_id dans la table posts pour qu’un post ai un type puis les types doivent avoir une table metas qui elle contient les champs des types par posts ?

Quelle de relation dois-je utiliser pour bien structurer cette fonctionnalité ?

Tu va voir

post
   - id
   - content
   - type ('post', 'partner', 'point'....)
post_meta
    - id
    - post_id
    - meta_key (lattitude, longitude...)
    - meta_value

Les méta disponible par "type" de post seront géré dans ton code et la relation est Post hasMany PostMeta