Как добавить файл с дополнительными свойствами в библиотеку документов Liferay - PullRequest
2 голосов
/ 18 марта 2011

Я пытаюсь это выяснить, я задавал этот вопрос на форуме Liferay здесь - последняя запись.

И единственное, что я могу придумать, - это создать Expando для FileEntry, что кажется очень сложным. Кто знает, имеет ли это смысл. Мне не нравится функция расширения, так как я не могу правильно запросить их через спящий режим.

Кто-нибудь знает ответ на мой вопрос на этом форуме Liferay?

Проблема в том, что

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

не позволяет вам хранить дополнительную информацию / свойства о файле. В результате нужно будет использовать JackRabbit напрямую, а не JCRHook от Liferay. Но вы теряете все преимущества библиотеки документов.

1 Ответ

3 голосов
/ 20 марта 2011

Да, единственный вариант - использовать пользовательские свойства / поля Expando AKA. В случае fileEntry вам не нужно создавать таблицы и столбцы программно, но вы можете настроить их в Панели управления> Пользовательские поля.

После этого у вас есть несколько вариантов, как заполнить значения в расширенном формате.

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

или если вы получаете свойства из слоя представления

<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>

, а затем

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

serviceContext заполняется параметрами в actionRequest, и вы просто вызываете

fileEntry.getExpandoBridge().setAttributes(serviceContext)

Наконец, вам может потребоваться запросить fileEntries с определенными свойствами

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);
}

Конечно, это решение может показаться немного сложным, потому что Liferay Document Library не является репозиторием содержимого JCR, но буквально это библиотека документов, которая обеспечивает уровень абстракции для конкретных реализаций репо с помощью Hooks, таких как JCRHook (где хранятся файлы). в хранилище jackrabbit), поддержку CMIS, поддержку миграции и т. д. Он также обрабатывает проверку разрешений, проверку файлов, обработку документов и управление активами.

Так что, если вы намереваетесь сделать что-то более сложное, и вам придется запрашивать свойства / метаданные, измените их и разверните их. Вам следует подумать об использовании JCR-репозитория напрямую ...

...