2015-05-12 4 views
2

Я создал тип документа, и я использую Asset Publisher для отображения этих типов документов. Я хотел бы просмотреть значения, которые я связал с моим пользовательским документом, который Я создал библиотеку документов. Каков способ сделать это со скоростью?Как показать значения, связанные с пользовательским документом в liferay 6.2

Я нашел этот код Java

long classPK = GetterUtil.getLong((String) workflowContext.get(WorkflowConstants.CONTEXT_ENTRY_CLASS_PK)) 

long fileEntryTypeId = DLFileVersionLocalServiceUtil.getFileVersion(classPK).getFileEntry().getFileEntryTypeId()                
DLFileEntryType dlFileEntryType = DLFileEntryTypeLocalServiceUtil.getFileEntryType(fileEntryTypeId); 

List<DDMStructure> ddmStructures = dlFileEntryType.getDDMStructures(); 

DDMStructure ddmStructure = ddmStructures.get(0);         

DLFileEntryMetadata dlFileEntryMetadata = DLFileEntryMetadataLocalServiceUtil.getFileEntryMetadata(ddmStructure.etStructureId(), classPK); 

Fields fields = StorageEngineUtil.getFields(dlFileEntryMetadata.getDDMStorageId());         

String value = GetterUtil.getString(fields.get("radio6255").getValue()); 

Я пытаюсь сделать это в скорости

#set($actualDoc = $curEntry.get(0)) 

#set($dlFileUtil = $serviceLocator.findService("com.liferay.portlet.documentlibrary.service.DLFileEntryLocalService")) 

#set($metadata2 = $serviceLocator.findService("com.liferay.portlet.documentlibrary.service.DLFileEntryMetadataLocalService")) 

#set($type = $serviceLocator.findService("com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalService")) 
#set($gid = $getterUtil.getLong($request.get("theme-display").get("scope-group-id"))) 

#set($fileEntry = $dlFileUtil.getFileEntryByUuidAndGroupId($actualDoc.classUuid, $actualDoc.groupId)) 

#set($fileEntryTypeId = $fileEntry.getFileEntryTypeId()) 

#set ($dlFileEntryType = $type.getFileEntryType($fileEntryTypeId)) 

#set ($ddmStructures = $dlFileEntryType.getDDMStructures()) 

#set ($ddmStructure = $ddmStructures.get(0)) 

#set($dlFileEntryMetadata = $metadata2.getFileEntryMetadata($ddmStructure.getStructureId(), $fileEntry.getLatestFileVersion(true).getFileVersionId())) 

##set ($storageUtil = $portal.getClass().forName("com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil").newInstance()) 
#set($storageUtil = $serviceLocator.findService("com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil")) 

#set($dDMStorageId = $dlFileEntryMetadata.getDDMStorageId()) 

#set($fields = $storageUtil.getFields($dDMStorageId)) 
<br> fields> $fields 

но $storageUtil.getFields($dDMStorageId)) пуст

ответ

2

Я предлагаю вам попробовать другой подход, который позволяет избежать использования StorageEngineUtil.

Мои шаблоны написаны во Фримаркере, но я уверен, что вы можете быстро перевести его в синтаксис Velocity.

Первая функция принимает экземпляр DLFileEntry в качестве параметра и возвращает карту поля:

<#function getDLFileEntryFieldsMap dlFileEntry> 
    <#assign fileVersionId = dlFileEntry.getLatestFileVersion(true).getFileVersionId() /> 
    <#return dlFileEntry.getFieldsMap(fileVersionId) /> 
</#function> 

Возвращенный полей карта является экземпляром Map<String, com.liferay.portlet.dynamicdatamapping.storage.Fields>.

Вторая функция выполняет поиск поля карты для данной области:

<#function getDLFileEntryFieldValue fieldsMap fieldName> 
    <#list fieldsMap?keys as structureKey> 
     <#list fieldsMap[structureKey].iterator() as field> 
      <#if field.getName() = fieldName> 
       <#return field.getValue()> 
      </#if> 
     </#list> 
    </#list> 
    <#return ""> 
</#function> 

Функция перебирает структуры в области отображения и пытается найти первую структуру, содержащую данное поле.

2

Я реализовал портлет, работающий с документами ... Возможно, части моего исходного кода помогут вам решить эту проблему.

Чтобы собрать все структуры документа:

public Set<DDMStructure> findStructureOfEntry(DLFileEntry entry) { 

    LOGGER.log(Level.INFO, "Finding file entry structures."); 
    Set<DDMStructure> dLMSDddmStructures = new HashSet<DDMStructure>(); 
    DLFileEntryType type = null; 

    try { 
     type = DLFileEntryTypeLocalServiceUtil.getFileEntryType(entry 
       .getFileEntryTypeId()); 
    } catch (PortalException | SystemException e1) { 
     LOGGER.log(Level.SEVERE, 
       "Exception while getting DLFileEntry TYPE." + e1); 
     e1.printStackTrace(); 
    } 

    try { 
     dLMSDddmStructures.addAll(type.getDDMStructures()); 
    } catch (SystemException e) { 
     LOGGER.log(Level.SEVERE, 
       "Exception while getting DLFileEntry structures." + e); 
     e.printStackTrace(); 
    } 
    LOGGER.log(Level.INFO, "Success."); 
    return dLMSDddmStructures; 

} 

Теперь получать поля из структур:

Field field; 
    DLFileEntryMetadata dlFileEntryMetadata = null; 
    Fields fields = null; 

     try { 
      dlFileEntryMetadata = DLFileEntryMetadataLocalServiceUtil 
        .getFileEntryMetadata(structure.getStructureId(), entry 
          .getFileVersion().getFileVersionId()); 
     } catch (PortalException | SystemException e) { 
      LOGGER.log(Level.SEVERE, 
        "Exception while getting DLFileEntry metadata sets." 
          + e); 
      e.printStackTrace(); 
     } 

     try { 
      fields = StorageEngineUtil.getFields(dlFileEntryMetadata 
        .getDDMStorageId()); 
     } catch (StorageException e) { 
      LOGGER.log(Level.SEVERE, 
        "Exception while getting fields of DLFileEntry DDMStructures." 
          + e); 
      e.printStackTrace(); 
     } 

, а затем вы можете получить то, что поле вы хотите по его имени:

field = fields.get(name); 

Я думаю, что у вас неправильные параметры в методе getFileEntryMetadata ... вот почему он пуст эн.

+0

Как вы получите ваш 'structure' объекта? –

1

Я был в состоянии получить значение значения настраиваемого поля в пользовательском документе, используя этот шаблон Freemarker:

<#assign fileEntry = dlFileEntryService.getDLFileEntryByUuidAndCompanyId(entry.getClassUuid() , entry.getCompanyId()) /> 
<#assign fileEntryTypeId = fileEntry.getFileEntryTypeId() /> 

<#if fileEntryTypeId gt 0 > 
    <#assign fileEntryType = dlFileEntryTypeService.getDLFileEntryType(fileEntryTypeId) /> 
    <#assign dlFileVersion = dlFileVersionService.getLatestFileVersion(fileEntry.getUserId(), fileEntry.getFileEntryId()) /> 
    <#assign fieldsMap = fileEntry.getFieldsMap(dlFileVersion.getFileVersionId()) /> 

    <#list fieldsMap?keys as structureKey> 

     <#list fieldsMap[structureKey].iterator() as field> 
      <#if field.getName() == 'nameOfYourCustomField'> 
       <#assign nameOfYourCustomField = field.getValue() /> 
      </#if> 
     </#list> 

    </#list> 
    <#-- Print the value of your custom field --> 
    ${nameOfYourCustomField} 
</#if> 
Смежные вопросы