Créer un package de type entité ou document
Sommaire
Namespace
Le package a créer doit résider dans l'application ou dans un Store et détermine le début du namespace (VendorName). Le namespace dépendra ensuite du type de package créé. Même si ce n'est pas indispensable, il est fortement recommandé que les package de type SydonieEntity ou SydonieDocument sont dans un sous-namespace VendorName\SydonieEntity ou VendorName\SydonieDocument. On créera ensuite un sous-namespace par package.
Les packages créés peuvent bien entendu dériver de package existants, mais sinon ils doivent dériver de AbstractSydonieEntity ou AbstractSydonieDocument.
Activation du Package
Deux choses à faire pour activer le package :
- Si le package réside dans un Store, alors pour l'utiliser il faut déclarer une classe de l'application qui en dérive, par exemple :
namespace Culturenum\SydonieDocument\Article; class Article extends \Cf\SydonieDocument\Article\Article { }
- Si le package doit être utilisé via des URLs, il faut alors déclarer le mot-clé qui lui correspondra pour les URLs. Cela se fait dans le fichier config/site/config_keys.php
getManager('Keys')->addManyClasses(array( '\Greyc\Service\Contact\Contact' => array('contact'), // site specific '\Culturenum\SydonieDocument\Article\Article' => array('article'), '\Culturenum\SydonieDocument\Page\Page' => array('page') ));
Structure d'un package
En prenant l'exemple d'un package Article, la structure de dossiers à l'intérieur d'un package est en général la suivante :
Le dossier du package Article contient :
- le fichier Article.php déclarant la classe et son namespace
- les fichiers de configuration :
- config.xml pour la configuration des attributs de la classe Article
- fields.xml pour la configuration des champs de formulaire
- actions.xml pour déclarer les actions possibles et les classes et méthodes correspondantes
- le fichier labels.xml contient les labels spécifiques à la classe Article
- le dossier Action contient les classes d'actions du package
- le dossier templates contient les templates d'affichage du package
On pourrait y ajouter si nécessaire :
- ArticleUi.php pour créer des méthodes d'affichage spécifiques
- ArticleStorageDb.php pour créer des méthodes d'enregistrement spécifiques
Configuration des attributs
Le fichier config.xml
contient les informations de configuration de la classe à réaliser.
La configuration varie légèrement selon que l'on travaille avec un objet SydonieEntity ou SydonieDocument.
Configuration pour les SydonieEntity
Commençons par un objet SydonieEntity de type Organization avec la structure suivante :
<?xml version="1.0" encoding="utf-8" ?> <!-- configuration pour \Vendor\SydonieEntity\Organization --> <configuration> <!-- infos sur la classe --> <class> <name>\Vendor\SydonieEntity\Organization</name> <!-- mandatoryProp sert pour la liste des propriétés obligatoires --> <!-- attention un attribut n'est pas une propriété, donc c'est vide ici --> <mandatoryProp> </mandatoryProp> </class> <!-- élément attribute donne les infos sur l'attribut --> <attribute minOccur="1" maxOccur="1" mandatory="0"> <!-- prédicat auquel il correspond --> <predicate>name</predicate> <!-- type d'objet AttributeType qui lui sera lié --> <!-- ici l'AttributeType Text est le plus simple et contient uniquement un champ "text" --> <objectClass>\Sydonie\Core\AttributeType\Text\Text</objectClass> <!-- liste des propriétés de l'objet AttributeType qui sont obligatoires --> <mandatoryProp> <prop>text</prop> </mandatoryProp> </attribute> <!-- un autre attribut, composé de plusieurs informations --> <attribute minOccur="1" maxOccur="1" mandatory="0"> <predicate>address</predicate> <!-- Address est un AttributeType qui est dans le Store Greyc --> <objectClass>\Greyc\AttributeType\Address\Address</objectClass> <!-- on veut que la rue, le code postal et la ville soeint obligatoires --> <mandatoryProp> <prop>address1</prop> <prop>zipCode</prop> <prop>city</prop> </mandatoryProp> </attribute> ... </configuration>
Configuration pour les SydonieDocument
Le principe est exactement le même, mais il faut indiquer à quel niveau de l'arbre du document se trouve chaque attribut. On utilise pour cela l'attribut entityLevel
qui peut prendre les valeurs work, expression ou manifestation. On peut aussi spécifier à partir de quelle donnée on crée un alias (ou shorcut) pour le document, par défaut il s'agit du champ text
de l'objet Text correspondant au prédicta title.
Exemple pour la configuration de AbstractSydonieDocument (classe mère de tous les types de document) :
<?xml version="1.0" encoding="utf-8" ?> <!-- configuration for \Sydonie\Core\SydonieDocument\AbstractSydonieDocument --> <configuration> <!-- class informations --> <class> <name>\Sydonie\Core\SydonieDocument\AbstractSydonieDocument</name> <mandatoryProp> </mandatoryProp> <!-- indictaion de quelle donnée utiliser pour créer un alias --> <alias> <suggest>title.text</suggest> </alias> </class> <!-- même principe que pour les SydonieEntity mais en précisant le "entityLevel" --> <attribute entityLevel="work" minOccur="1" maxOccur="1" mandatory="0"> <predicate>publicationContext</predicate> <objectClass>\Sydonie\Core\AttributeType\Text\Text</objectClass> </attribute> <!-- idem avec un attribut pour le niveau "expression" --> <attribute entityLevel="expression" minOccur="1" maxOccur="1" mandatory="0"> <predicate>title</predicate> <objectClass>\Sydonie\Core\AttributeType\Text\Text</objectClass> </attribute> ... <!-- le contenu (corps) du document est un attributeType de type Resource --> <!-- cela correspond à un fichier stocké dans le warehouse de l'application --> <attribute entityLevel="manifestation" minOccur="1" maxOccur="1" mandatory="0"> <predicate>content</predicate> <objectClass>\Sydonie\Core\AttributeType\Resource\Resource</objectClass> <!-- la propriété de l'objet Resource qui correspond au contenu est "data" --> <mandatoryProp> <prop>data</prop> </mandatoryProp> </attribute> </configuration>