EdeeShop · Implementace

Lokalizované vlastnosti entit

Upraveno

Entity jako jsou produkt, značka, kategorie a další mohou mít buď základní vlastnosti nebo tzv. lokalizovatelné vlastnosti. Lokalizovatelné vlastnosti se ukládají do bundlu localizedLabels, který zpřístupňuje rozhraní WithLocalization.

Zároveň není nutné a nesmí se na úrovni projektové implementace definovat těla metod, které tyto lokalizované vlastnosti zpřístupňují nebo nastavují. EdeeShop obsahuje logiku automatické implementace vlastností, které jsou anotované pomocí @LocalizedLabel anotace.

Pokud budou dodržena následující pravidla, bude u nové lokalizovatelné vlastnosti automaticky a správně fungovat:

  • lokalizace vlastnosti přes API
  • lokalizace vlastnosti pomocí administračního GUI
  • správná dědičnost popisků z master produktu na variantu
  • správná dědičnost popisku z originu na alias
  • možnost přetěžovat popisky na úrovni aliasu
  • automatické zpracování lokalizovaných popisků při exportu/importu
  • automatická publikace lokalizovaných popisků do EvitaDB

Přístup k lokalizovaným textům entity

Pokud entita implementuje rozhraní WithLocalization, je možné na ní volat všechny metody pro získání lokalizovaných popisků dle kontraktu rozhraní. Entita bude mít ve výchozím stavu nakonfigurovaný jazyk pro popisky dle výchozího jazyka katalogu. Tj. popisky pro výchozí jazyk katalogu lze číst podle zkrácených metod:

java
entity.getShortDescription();entity.getDescription();entity.getLabel("kodPopisku");

Pro přístup k popiskům jiných jazyků je možné použít přetížené metody, které mají jazyk přímo v argumentu:

java
entity.getShortDescription("en");entity.getDescription("en");entity.getLabel("en", "kodPopisku");

Alternativně je možné využít blokového nastavení jazyka, které jazyk nastaví jen pro určitý omezený blok kódu - viz. ukázka:

java
WithLocalization.doWithLanguage("en", () -> {    entity.getShortDescription();    entity.getDescription();    entity.getLabel("kodPopisku");});

Při nastavování popisků platí úplně stejná logika.

Definování nové lokalizovatelné vlastnosti

Základem projektového rozšíření EdeeShop entity je tzv. @Trait. Jednoduchý trait obsahující lokalizovatelnou vlastnost disclaimer by mohl vypadat například takto:

java
@Traitpublic interface WithDisclaimer {
	@LocalizedLabel	String getDisclaimer();	String getDisclaimer(String language);	void setDisclaimer(String disclaimer);	void setDisclaimer(String disclaimer, String language);	void removeDisclaimer();	void removeDisclaimer(String language);	}

Pokud budeme chtít aplikačně nastavovat příznaky přetížení popisku na úrovni aliasu je třeba přidat další rozhraní. Tento krok není podmínkou - pokud bude stačit aby se přetížení popisků definovalo pomocí administračního GUI, tak toto rozhraní není potřeba:

java
@Traitpublic interface WithDisclaimerAlias extends WithDisclaimer {
	boolean isDisclaimerOverridden();	boolean isDisclaimerOverridden(String language);	void setDisclaimerOverridden(boolean overridden);	void setDisclaimerOverridden(boolean overridden, String language);	}

Registrace nových traitů do modelu EdeeShop

Tyto traity je nutné zaregistrovat k deskriptorům EdeeShop entity modelů. Pokud budeme chtít aby trait byl dostupný na úrovni entity Product je nutné provést ve feature projektového rozšíření následující volání:

java
@Overridepublic void beforeSpringInitialization() {    super.beforeSpringInitialization();
    if (isFeatureEnabled()) {               entityModel.addTrait(WithDisclaimer.class);
        if (isFeaturesEnabled(ProductAliasFeature.class)) {            entityModel.registerLazyTrait(                CatalogEntityType.PRODUCT,                 ProductAliasWrapper.class,                WithDisclaimerAlias.class,                 true            );        }        if (isFeaturesEnabled(ProductVariantFeature.class)) {            entityModel.registerLazyTrait(                CatalogEntityType.PRODUCT,                 ProductVariantWrapper.class,                WithDisclaimer.class,                 true            );        }    }}