Как создать локализованную коллекцию строк

У меня есть сценарий, в котором мне нужно отобразить список элементов String на витрине. После исследования я заметил, что Hybris имеет StringCollection OOTB. Однако строки, которые должны отображаться на витрине, должны быть локализованы.

Как лучше всего реализовать такой сценарий? Я знаю, что могу создать ItemType, который имеет только один локализованный атрибут типа String, а затем создать связь между этим вновь созданным элементом и элементом, который будет содержать список строк.


Изменить:

Если я использую:

<collectiontype code="localizedStringColl" elementtype="localized:java.lang.String"  autocreate="true" generate="true"  type="list" />

Я получаю сообщение об ошибке в бэк-офисе при попытке добавить новую строку в список:

  de.hybris.platform.servicelayer.exceptions.UnknownIdentifierException: No composed type localized:java.lang.String exists
at de.hybris.platform.servicelayer.type.daos.impl.DefaultTypeDao.findComposedTypeByCode(DefaultTypeDao.java:71) ~[coreserver.jar:?]
at de.hybris.platform.servicelayer.type.impl.DefaultTypeService.getComposedTypeForCode(DefaultTypeService.java:114) ~[coreserver.jar:?]
at com.hybris.backoffice.solrsearch.services.impl.DefaultBackofficeFacetSearchConfigService.findSearchConfigForTypeCode(DefaultBackofficeFacetSearchConfigService.java:172) ~[backofficesolrsearchserver.jar:?]
at com.hybris.backoffice.solrsearch.services.impl.DefaultBackofficeFacetSearchConfigService.isSolrSearchConfiguredForType(DefaultBackofficeFacetSearchConfigService.java:122) ~[backofficesolrsearchserver.jar:?]

Версия Hybris 6.7


person dj_frunza    schedule 09.10.2018    source источник


Ответы (2)


Как создать локализованную коллекцию строк?

Вы можете объявить CollectionType с помощью localized: java.lang.String и использовать его как тип при объявлении своего атрибута.

<collectiontype code="localizedStringColl" elementtype="localized:java.lang.String"  autocreate="true" generate="true"  type="list" />

Теперь вы можете использовать это как

            <attribute qualifier="myAttib" type="localizedStringColl" >
                <description>MyAttib</description>
                <persistence type="property" />
            </attribute>

Как лучше всего реализовать такой сценарий?

Сначала просмотрите этот ответ, который поможет вам понять, как данные хранятся в collectionTypes и RelationTypes.

Как объясняется в ссылке, в случае CollectionTypes будет сохранен список PK, разделенных запятыми, что может привести к усечению значения и, следовательно, к потере данных, если ваши данные коллекции растут ... В этом случае лучше пойти с RelationType.

Если вы знаете, что ваша коллекция String не такого большого размера, вы можете использовать collectionType.

person HybrisHelp    schedule 10.10.2018
comment
Я отредактировал свой вопрос с помощью трассировки стека, которую получил при попытке добавить новую строку в коллекцию. - person dj_frunza; 10.10.2018
comment
Да, я обновил свою систему. Может мне нужно настроить новый тип в Solr - person dj_frunza; 10.10.2018

Все локализованные типы определены в {extensionName} -items.xml как карты. Например, localized: java.lang.String определен в core-items.xml.

Поэтому лучший подход - создать новый тип карты:

<maptypes>
    <maptype code="localized:StringCollection" argumenttype="Language" returntype="StringCollection" generate="false"/>
</maptypes>

Теперь остается только использовать localized: StringCollection для атрибута, которому нужен этот тип:

        <itemtype code="CustomCmsItemComponent" extends="SimpleCMSComponent"
                  autocreate="true" generate="true"
                  jaloclass="com.test.hybris.core.jalo.cms.CustomCmsItemComponent">
            <attributes>
                <attribute qualifier="localizedStringCollectionTest" type="localized:StringCollection">
                    <persistence type="property"/>
                </attribute>
            </attributes>
        </itemtype>

После создания и обновления базы данных я заметил, что это решение работает должным образом.

person dj_frunza    schedule 13.07.2019