Dernière publication:31/03/2023à 09:08CarolineBayle
Le CMS Ametys supporte différents types de contenus (article, actualité, galeries photos, FAQ, ...). Les types de contenus disponibles dépendent des extensions (plugins) utilisés.
Les types de contenus les plus couramment utilisés sont décrits dans le Manuel Utilisateur.
Un type de contenu est un point d'extension multiple. Un intégrateur peut créer des nouveaux type de contenus (séminaire, poste, etc) suivant vos besoins.
Des icônes, glyph ou de taille 16x16, 32x32 et 48x48 pixels
Un droit (optionnel) pour restreinte la création du type de contenu aux personnes ayant droit
Un jeu d'attributs (ex: titre, description, image, fichiers, date, ...) typés.
Des propriétés (optionnel)
Des validateurs globaux (optionnel) pour définir des règles de validation entre plusieurs éléments (ex: startDate < endDate)
Des vues
Chaque vue définit la liste des attributs et propriétés qui lui sont nécessaires, parmi les attributs et propriétés du type contenus. Par exemple, une vue "abstract" (résumé) aura besoin des attributs titre et illustration, tandis qu'une vue "main" (complète) aura besoin de l'ensemble des attributs.
Un type de contenu est un point d'extension de type org.ametys.cms.contenttype.ContentTypeExtensionPoint. Sa déclaration doit respecté le format XML suivant:
Format XML de déclaration d'un type de contenu
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Le glyph (ou l'icône "medium" s'il n'y a pas de glyph), ainsi que le libellé et la description sont utilisées pour le menu "Ajouter un contenu"
Le glyph est également utilisé lors de l'insertion d'un contenu dans une page et dans les résultats du moteur de recherche. (Dans ces 2 cas, si le glyph n'est pas présent, c'est l'icône "small" qui est utilisé.
Les attributs
Les attributs sont des paramètres classiques comme décrits dans la page Généralités sur les paramètres avec quelques variations et éléments supplémentaires.
Depuis la version d'Ametys 4.7, deux syntaxes cohabitent : - la syntaxe classique, détaillée ci-dessous, - et la syntaxe historique, présentée dans un § à part. Il est possible de déclarer certains attributs avec la syntaxe classique et d'autre avec la syntaxe historique.
Déclaration simple
Comme tout paramètre, un attribut possède à minima un nom unique, un libellé, une description et un type (string, date, long, ...) et se déclare comme suit dans la balise <cms:metadata>:
Exemple de déclaration d'un attribut "Titre" de type string, obligatoire
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
L'instruction <validation> permet de définir des règles de validation sur un attribut:
<mandatory> pour rendre l'attribut obligatoire
<regexp> pour définir une expression régulière
<invalidText> pour personnaliser le message en cas de saisie incorrecte (expression régulière non respectée)
<custom-validator> classe java implémentant l'interface org.ametys.runtime.util.parameter.Validator pour définir son propre validateur
Par exemple org.ametys.runtime.plugins.core.util.parameter.TextValidator pour champ texte simple ou org.ametys.runtime.plugins.core.util.parameter.RichTextValidator pour champ riche, supportent une sous balise
<maxlength> pour un nombre de caractères maximum supporté
Exemple de validation pour un champ "adresse mail" obligatoire
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Il est possible de préciser un "widget" pour la modification de l'attribut. Par exemple, pour un attribut de type "string", on peut utiliser le widget "edition.textarea" pour modifier l'attribut sur plusieurs lignes. L'utilisation d'un widget se fait au travers de la balise <widget> comme dans l'exemple ci-dessous:
Exemple d'utilisation d'un widget
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Un attribut peut être "composite", c'est à dire lui-même composé d'autres attributs. Par exemple, une illustration est composée d'un fichier et d'un texte alternatif.
Exemple de déclaration d'un attribut composite
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Il est possible de définir des attributs composites multiples, c'est à dire pouvant être répétés autant de fois que souhaité. Par exemple pour pouvoir ajouter 0 à n pièces jointes à un contenu. C'est ce qu'on appelle des "repeater".
Exemple de déclaration d'un repeater
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
- add-label permet de redéfinir le tooltip du bouton d'ajout ("Ajouter une entrée" par défaut) - del-label permet de redéfinir le tooltip du bouton de suppression ("Supprimer une entrée" par défaut)
Les énumérations
Un attribut énuméré peut prendre une valeur parmi une liste définie : une liste statique ou dynamique.
Pour les attributs de type content qui spécifient un type de contenu cible, la valeur par défaut peut être de type "attribute" Cela permet d'aller chercher le premier contenu dont l'attribut renseigné a une valeur particulière.
L'attribut cible ne peut pas être dans un composite ou dans un repeater, et doit être du type string, long ou double.
Exemple :
La définition ci-dessous permet de définir la valeur par défaut français pour l'attribut "Langue d'enseignement" (valeur provenant d'un table de référence).
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
la balise <right> détermine le droit que doit posséder le contributeur
si l'attribut read-write-direction vaut :
write : le contributeur ne peut modifier l'attribut que s'il possède le droit "Web_Right_SuperEdit", sinon, il aura accès à l'attribut uniquement en lecture
read : le contributeur aura accès en lecture/écriture à l'attribut uniquement s'il possède le droit "Web_Right_SuperEdit"
Restriction en lecture ou lecture/écriture en fonction d'un état du workflow
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Une propriété est une donnée dont la valeur est calculée à partir des données d'un contenu.
Elle peut soit faire référence à un autre élément du modèle (attribut ou propriété), soit pointer vers une classe qui va faire des calculs plus complexes
Les propriétés n'existent que depuis la version 4.6
Référencer un élément du modèle
Pour référencer un élément du modèle, la déclaration de la propriété doit indiquer le chemin de cet élément :
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Une propriété peut référencer un élément du modèle sur un contenu distant. Dans l'exemple suivant, linked-content est un attribut de type content du type de contenu en cours de déclaration :
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Vous pouvez également créer une propriété plus complexe en créant une classe java et en déclarant une propriété qui pointe vers cette classe. Par exemple, dans les espaces projet, les brèves ont une propriété pinned, qui détermine si la brève est étiquetée avec l'étiquette 'pin' :
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Une vue est un ensemble d'éléments du modèle. Chaque vue fait référence aux éléments déclarés nécessaires à son affichage.
Depuis la version d'Ametys 4.4, deux syntaxes de vues cohabitent : - la syntaxe classique, détaillée ci-dessous, - et la syntaxe historique, présentée dans un § à part. Il est possible de déclarer certaines vues avec la syntaxe classique et d'autre avec la syntaxe historique.
Pour une version d'Ametys antérieure à la 4.4, seule la syntaxe historique est disponible.
Les propriétés ne peuvent être référencées que par les vue qui utilisent la nouvelle syntaxe.
Certaines vues ont un attribut type, valué à "view" ou "edition". Ce type n'est plus du tout utilisé, l'attribut peut être supprimé sans problème.
Une vue est déclarée comme suit, dans la balise <view> :
Exemple de vue "main"
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
L'attribut name est le nom de vue (ex: main, abstract, link, details, ...) Pour plus de détails sur le nom des vues, consulter le § ci-dessous "Les vues obligatoires et optionnelles"
L'attribut internal, optionnel permet de "privatiser" la vue, c'est à dire la rendre invisible pour le contributeur.
La balise group permet de regrouper les différents éléments de la vue.
L'attribut name correspond au nom du groupe, cet attribut est optionnel, mais il peut être nécessaire quand on veut faire de la surcharge des vues (voir le § correspondant)
L'attribut role définit le type de regroupement :
La valeur tab représente un regroupement par onglets
La valeur fieldset correspond à un liseré représentant le regroupement
Cet attribut est optionnel : si celui-ci n'est pas défini, il prend la valeur tab par défaut pour le premier niveau de regroupement, et la valeur fieldset par défaut pour les niveaux inférieurs.
La balise label définit le libellé du groupe
La balise description définit la description du groupe
Les balises attribute-ref font référence à un élément du modèle décrit dans le type de contenu, en indiquant son nom. Il peut s'agir d'un attribut, d'une propriété définie par le type de contenu, ou d'une propriété système.
la balise label définit le libellé de la vue
la balise description définit la description de la vue
Vues jointées
Cette syntaxe de vue permet de réaliser des vues jointées (utiles pour les contenus liés); en voici les exemples :
Ajout de quelques attributs d'un contenu lié
Dans l'exemple ci-dessous, les attributs "att1" et "att2" du linked-content sont ajoutés à la vue
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Vous pouvez définir autant de vues que vous souhaitez. En revanche certaines vues sont obligatoires et doivent être déclarées pour tous types de contenus :
la vue "main" (obligatoire) utilisée pour le rendu du contenu dans sa vue "complète"
la vue "default-edition" (optionnelle) utilisée pour la modification du contenu. Si cette vue n'est pas présente, c'est la vue "main" qui sera utilisée pour la modification du contenu
la vue "abstract" (optionnelle) utilisée pour le rendu du contenu dans sa vue "résumé" (dans une remontée de contenu par exemple)
la vue "link" (optionnelle) utilisée pour le rendu du contenu dans sa vue "lien"
la vue "details" (obligatoire) pour définir les attributs à afficher dans l'outil "Propriétés du contenu"
la vue "index" (optionnelle) est utilisée par le moteur de recherche front, afin de définir les attributs saxés dans le cas des services de recherche de page (ancien moteur de recherche), ou du nouveau moteur de recherche en mode page.
Pour être rendue, une vue est liée à un fichier XSL. Les données XML en entrée de cet XSL correspondent aux attributs déclarés dans cette vue.
Syntaxe historique
Dans cette ancienne syntaxe, une vue est déclarée comme suit, dans la balise <metadata-set> :
Exemple de vue "main"
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
L'attribut name est le nom de vue (ex: main, abstract, link, details, ...). Pour plus de détails sur le nom des vues, consulter le § ci-dessus "Les vues obligatoires et optionnelles"
L'attribut internal, optionnel permet de "privatiser" la vue, c'est à dire la rendre invisible pour le contributeur.
La balise fieldset définit le groupement d'attributs
L'attribut role définit le type de groupement :
La valeur tab représente un groupement par onglets
La valeur fieldset correspond à un liseré représentant le groupement
Cet attribut est optionnel : si celui-ci n'est pas défini, il prend la valeur tab par défaut pour le premier niveau de groupement, et la valeur fieldset par défaut pour les niveaux inférieurs.
La balise label définit le libellé du groupe
La balise description définit la description du groupe
Les balises metadata-ref font référence à un attribut décrit dans le type de contenu, en indiquant son nom (il n'est pas possible de référencer une propriété dans une vue avec la nouvelle syntaxe)
La balise label définit le libellé de la vue
La balise description définit la description de la vue
Avec la syntaxe historique, il n'est pas possible de faire des vues jointées.
Les tags
Les types de contenus peuvent recevoir des tags.
Les tags permettent des traitements spécifiques en Java.
Il existe 3 tags reconnus par toute application Ametys :
private : un type de contenu privé est un type de contenu qui ne peut être créé et qui n'apparait pas dans les moteurs de recherche par défaut.
reference-table: le type de contenu est une table de référence (voir plus loin)
mixin : type de contenu qui est sémantiquement un rôle (voir plus loin)
La déclaration de "tags" dans le type de contenu s'écrit :
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Pour éviter de redéfinir entièrement la vue "main", l'instruction <include from-supertype=".."> peut être utilisée pour inclure tous les attributs de la vue héritée.
Si vous voulez en revanche insérer le nouvel attribut dans un endroit spécifique du formulaire de modification, il sera nécessaire de redéfinir la vue.
Depuis la version 4.6, il est possible de surcharger les vues sans les redéfinir complètement. Voir § sur la surcharge des types de contenus.
Pour hériter de plusieurs types de contenus, les types de contenus hérités doivent être séparés par des virgules.
Les types de contenus spécifiques
Les rôles
Les rôles sont des types de contenus transversaux qui viennent compléter la sémantique d’un type de contenu.
Il est possible de créer un contenu à partir d'un rôle.
Par exemple :
Le rôle Dateable permet d’ajouter des dates à un type de contenu
Le rôle Localisable permet d’ajouter une adresse à un type de contenu
Actualité hérite de Article et ajoute le rôle Dateable
Evenement hérite de Actualité et ajoute le rôle Localisable
Une recherche de tous les contenus Dateable renverra aussi bien des Actualités que des Evenement .
Techniquement, un "rôle" est très proche d’un type de contenu :
il se déclare de la même façon en spécifiant le tag « mixin » (voir plus haut le chapitre sur les tags)
il s’utilise avec l’héritage de type de contenus
ils peuvent aussi s’ajouter dynamiquement via l'IHM
Si on reprend l'exemple des événements géolocalisés plus haut, on peut imaginer une autre manière de faire en utilisant un rôle :
définition du rôle "content-type.Localisable"
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Les tables de référence sont des types de contenus qui s’utilisent avec les outils de modification et de recherche dédiés.
Les types d'attributs autorisés sont limités à des attributs simple: une table de référence ne peut pas contenir de composite ou de repeaters.
La modification d'un contenu de ce type table de référence se fait uniquement dans un tableau.
Une table de référence se déclare en spécifiant le tag « reference-table» (voir plus haut le chapitre sur les tags)
Type de contenu privé
Un type de contenu privé est un type de contenu qui ne peut être créé via les outils standard (menu "Ajouter un contenu" ou lors de la création de page) et qui n'apparait pas dans les moteurs de recherche par défaut.
Les types de contenus ODF (formation, parcours, elp, ...) sont par exemples des types de contenus privés. Ils possède leur propre outils de recherche et de création. L'outil de recherche standard ne permet pas de les rechercher.
Une type privé se déclare en spécifiant le tag « private» (voir plus haut le chapitre sur les tags)
Type de contenu abstrait
Un type de contenu peut être déclaré « abstrait » avec l’attribut abstract="true"
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
l'identifiant réel interne du type de contenu est "content-type.<id_du_content_type>"
le répertoire resources/img contient les ressources (notamment les icônes 16x16 et 32x32 pixels du type de contenu)
le catalogue i18n par défaut est celui de l'application (dans WEB-INF/i18n)
le répertoire stylesheets/content-type.<id_du_content_type> contient l'ensemble des fichiers content-type.<id_du_content_type>.xsl et content-type.<id_du_content_type>-<nom_de_la_vue>.xsl pour le rendu graphique des différentes vues
Le répertoire [nom_du_plugin] peut correspondre à n'importe quel nom de plugins existant. Il est conseillé d'utiliser "web".
Exemple d'organisation de fichiers pour la déclaration d'un nouveau type de contenu "séminaire"
Exemple complet de déclaration d'un type contenu simple
Voici ci-dessous l'exemple complet de déclaration d'un nouveau de type de contenu
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Le rendu graphique d'un type de contenu est traité dans la partie Intégration graphique.
Modification d'un type de contenu existant
Il est possible de surcharger un type de contenu existant. Par exemple, pour lui ajouter des attributs et/ou des vues.
Pour surcharger un type de contenu, vous devez créer un fichier <id du content type>.xml dans le répertoire WEB-INF/param/content-types/_override de votre application
Exemple de surcharge des contenus "Actualité" et "Galerie multimédia"
Exemple de surcharge: ajout de l'attribut "subject" et redéfinition des vues "link" et "main"
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.