Forum Ametys

Forum de la communauté Ametys

You are not logged in.

#1 13/05/2014 17:14:44

jorog
Guest
Registered: 26/09/2013
Posts: 14

[LTE] Utilisation d'un champ de type "sub_content"

Bonjour,
la méthode de String[] actualValues = compositeMetadata.getStringArray(field); ne fonctionnne pas sur un champ de type sub_content. Existe t-il une méthode alternative ?

Extiste-il une méthode qui permet de de tester un champ pour savoir si il est de type sub_content ?

Merci

Offline

#2 13/05/2014 18:02:47

Laurence Aumeunier
Expert Team
Registered: 10/08/2010
Posts: 142

Re: [LTE] Utilisation d'un champ de type "sub_content"

Bonjour,

Oui la méthode getStringArray ne fonctionne pas sur un champ de type "sub_content" puisqu'il ne s'agit pas d'un type "string" ...

Pour récupérer la valeur d'un champ de type "sub_content" il faut faire:

TraversableAmetysObject subContentMeta = compositeMetadata.getObjectCollection(field);
AmetysObjectIterable<Content> subcontents = contentMeta.getChildren();
for (Content subcontent : subcontents)
{
     // Traitement ...
}

Pour savoir si un champ est de type sub_content, c'est plus compliqué. Il faut avoir accès à la définition du champ (MetadataDefinition).

Voici un exemple de code permettant de faire cela.

String contentTypeId = content.getTypes()[0];

ContentTypeExtensionPoint ctypesEP = (ContentTypeExtensionPoint) manager.lookup(ContentTypeExtensionPoint.ROLE);

ContentType cType = ctypesEP.getExtension(contentTypeId );

MetadataDefinition metadataDef= cType.getMetadataDefinitionByPath(field);
if (MetadataType.SUB_CONTENT.equals (metadataDef.getType())
{
     // Traitement ..
}

Laurence Aumeunier
Ametys Expert

Offline

#3 14/05/2014 13:06:08

jorog
Guest
Registered: 26/09/2013
Posts: 14

Re: [LTE] Utilisation d'un champ de type "sub_content"

Merci.

Qu'en est-il de l'insertion de nouveau noeuds ?
Il n'existe pas de compositeMetadata.setObjectCollection(field);

Offline

#4 14/05/2014 15:19:28

Laurence Aumeunier
Expert Team
Registered: 10/08/2010
Posts: 142

Re: [LTE] Utilisation d'un champ de type "sub_content"

Un "sub_content" est un contenu qui possède un contenu parent. Comme il s'agit d'un contenu, il faut donc le créer comme tout autre contenu, en exécutant l'action d'initialisation du workflow. Par exemple:

_workflow.initialize("content", 1, inputs);

Dans les "inputs", tu as le nom du contenu, son titre, le type de contenus à créer, etc ... mais tu peux aussi lui passer l'identifiant du contenu parent ainsi que le nom de la métadonnée parente qui va porter ce sous-contenu.

inputs.put(CreateContentFunction.PARENT_CONTENT_ID_KEY, parentContentId);
inputs.put(CreateContentFunction.PARENT_CONTENT_METADATA_PATH_KEY, field);

Il existe un helper dans Ametys pour cela : ContentWorkflowHelper.createContent(...)


Laurence Aumeunier
Ametys Expert

Offline

#5 16/05/2014 11:22:15

jorog
Guest
Registered: 26/09/2013
Posts: 14

Re: [LTE] Utilisation d'un champ de type "sub_content"

Est-il possible de mettre ces valeurs (PARENT_CONTENT_ID_KEY et PARENT_CONTENT_METADATA_PATH_KEY) à jours alors que l'objet a déjà été créé (à partir d'un ModifiableContent) ? Si oui comment ?

Merci.

Offline

#6 16/05/2014 14:12:41

Laurence Aumeunier
Expert Team
Registered: 10/08/2010
Posts: 142

Re: [LTE] Utilisation d'un champ de type "sub_content"

Non, ce n'est pas possible. Ces valeurs(PARENT_CONTENT_ID_KEY et PARENT_CONTENT_METADATA_PATH_KEY) ne sont pas stockées en tant que propriétés du contenu créé mais sont passées à la fonction de création pour déterminer le parent du sous-contenu. Dans l'arbre JCR un sous-contenu est stocké sous le noeud de son contenu parent. On ne peut pas créer donc un contenu, puis en faire un sous-contenu d'un autre contenu après coup.


Laurence Aumeunier
Ametys Expert

Offline

Board footer

Powered by FluxBB