2011-03-18 2 views
2

J'essaie de comprendre cela, je posais cette question en Liferay's forum here - la dernière entrée.Comment ajouter un fichier avec des propriétés supplémentaires dans la bibliothèque de documents de Liferay

Et la seule chose que je suis capable de créer est de créer un Expando pour FileEntry, ce qui semble très compliqué. Qui sait si cela a du sens? Je n'aime pas la fonctionnalité expando car je ne pouvais pas les interroger correctement via hibernate.

Est-ce que quelqu'un connaît la réponse à ma question dans ce forum Liferay?

Le problème est que,

DLAppLocalServiceUtil.addFileEntry(...); 
DLLocalServiceUtil.addFile(....); 

ne vous permet pas de stocker des informations supplémentaires/propriétés sur le fichier. En conséquence, il faudrait utiliser JackRabbit directement, au lieu d'utiliser JCRHook de Liferay. Mais vous perdez tous les avantages apportés par la bibliothèque de documents.

Répondre

3

Oui, la seule option est d'utiliser les propriétés/champs personnalisés Expando AKA. Dans le cas de fileEntry, vous n'avez pas besoin de créer une table et des colonnes par programme, mais vous pouvez le configurer dans Panneau de configuration> Champs personnalisés.

Après cela, vous avez quelques options pour remplir les valeurs expando.

fileEntry.getExpandoBridge().setAttribute("propName", "propValue") 

ou si vous obtenez les propriétés de la vue couche

<liferay-ui:custom-attributes-available className="<%= DLFileEntry.class.getName() %>"> 
    <liferay-ui:custom-attribute-list 
     className="<%= DLFileEntry.class.getName() %>" 
     classPK="<%= (fileVersion != null) ? fileVersion.getFileVersionId() : 0 %>" 
     editable="<%= true %>" 
     label="<%= true %>" 
     /> 
</liferay-ui:custom-attributes-available> 

puis

ServiceContext serviceContext = ServiceContextFactory.getInstance(
      DLFileEntry.class.getName(), actionRequest); 

ServiceContext se peuplé par des paramètres dans actionRequest et vous alors il suffit d'appeler

fileEntry.getExpandoBridge().setAttributes(serviceContext) 

Enfin, vous devrez peut-être interroger pour fileEntries avec des propriétés particulières

public Hits search() { 
    Map<String, Serializable> attributes = new HashMap<String, Serializable>(); 
    attributes.put("propertyName", "propertyValue"); 

    SearchContext searchContext = new SearchContext(); 
    searchContext.setAttributes(attributes); 
    Indexer indexer = IndexerRegistryUtil.getIndexer(FileEntry.class); 
    return indexer.search(searchContext); 
} 

Bien sûr, cette solution peut sembler un peu compliqué, parce que Liferay bibliothèque de documents n'est pas un référentiel de contenu JCR, mais il est littéralement une bibliothèque de documents qui fournit Couche d'abstraction pour les implémentations concrètes de repo via Hooks, comme JCRHook (où les fichiers sont stockés dans le référentiel jackrabbit), support CMIS, support de migration, etc. Il gère également permissionChecking, fileVersioning, workflow de document et gestion des assets. Par conséquent, si vous avez l'intention de faire quelque chose de plus compliqué et que vous devrez interroger les propriétés/métadonnées, changez-les et développez-les. Vous devriez envisager d'utiliser JCR repository directement ...

+2

J'adore certaines de ces solutions de contournement que vous êtes obligé d'utiliser pour Liferay;) – Jakub

+1

Eh bien, il a besoin de modifier la bibliothèque de documents LR pour qu'il puisse ajouter un fichier avec des métadonnées supplémentaires. Liferay n'est pas un référentiel de gestion de contenu. Il a un référentiel intégré, mais il a également une couche d'abstraction pour quelques autres dépôts. Il doit juste avoir une interface qui convient à tous. Et par cette "solution de contournement" vous étendez dynamiquement un modèle de base de données, avec toutes ces propriétés en recherche fulltext et il couvre également les conséquences sur la couche vue ... Cette fonction expando est bonne, mais seulement si on ne va pas plus loin c'est les propriétés – lisak

Questions connexes