Eigentlich, was Sie versuchen, hier zu tun war bereits in mehreren Fällen von Hybris initiiert und verwendet worden, zum Beispiel:
localized
Eigenschaften wie die name
, wie name_en_string
indiziert.
- Eigenschaften mit
currency
wie price
wird als priceValue_eur_double
indiziert und auch für Sort verwendet.
Für: priceValue_eur_double
| Für: localStockForUnt_001_boolean
.
priceValue
ist der Name des Feldes | localStockForUnt
ist der Name des Feldes.
eur
ist der Feldqualifikator | 001
ist der Feldkennzeichner.
double
ist der Feldtyp | boolean
ist der Feldtyp.
Also Ihr Fall hier ist nicht anders als diese beiden Beispiele, daher müssen Sie nur wissen, wie man verwendet, was bereits existiert.
Eigentlich nichts Magisches daran, wie diese beiden Beispiele funktionieren!
- Zu allererst, fügen Sie neue boolean
attribute
-SolrIndexedPropertyModel
ist es isB2bUnit
lassen nennen:
<!-- add this to your *-items.xml -->
<itemtype code="SolrIndexedProperty" autocreate="false" generate="false">
<attributes>
<attribute qualifier="isB2bUnit" type="java.lang.boolean">
<persistence type="property" />
<!-- i would prefer to add a default value here : FALSE -->
</attribute>
</attributes>
</itemtype>
- Weiter Sie haben die gleiche
boolean attribute
in der IndexedProperty
hinzufügen dto:
<!-- add this to your *-beans.xml -->
<bean class="de.hybris.platform.solrfacetsearch.config.IndexedProperty">
<property name="isB2bUnit" type="boolean"/>
</bean>
- Dann brauchen Sie
DefaultIndexedPropertyPopulator
es ist die Verantwortung von SolrIndexedProperty
zu IndexedProperty
zur Umwandlung außer Kraft zu setzen: die propulator
in den Frühling
public class MyIndexedPropertyPopulator extends DefaultIndexedPropertyPopulator {
@Override
public void populate(SolrIndexedPropertyModel source, IndexedProperty target) throws ConversionException {
super.populate(source, target);
//add this line
target.setIsB2bUnit(source.getIsB2bUnit());
}
}
registrieren.
<!-- add this to your *-spring.xml -->
<alias name="myIndexedPropertyPopulator" alias="indexedPropertyPopulator" />
<bean id="myIndexedPropertyPopulator" class="com.foo.bar.MyIndexedPropertyPopulator" parent="defaultIndexedPropertyPopulator" />
- Die Idee ist in diesem Verfahren einzuhaken
DefaultFieldNameTranslator.translateFromProperty(...)
und zwingen es, spezifische fieldQualifier
hinzuzufügen, die b2bUnit.code
zum fieldName
ist, wenn die isB2bUnit
des Indexedproperty
TRUE
ist.
Die ursprüngliche DefaultFieldNameTranslator.translateFromProperty(...)
ist wie folgt:
protected String translateFromProperty(SearchQuery searchQuery, IndexedProperty indexedProperty, FieldType fieldType) {
//...
if(qualifierProvider != null && qualifierProvider.canApply(indexedProperty)) {
Qualifier qualifier = qualifierProvider.getCurrentQualifier();
fieldQualifier = qualifier != null?qualifier.toFieldQualifier():null;
} else if(indexedProperty.isLocalized()) {
fieldQualifier = searchQuery.getLanguage();
} else if(indexedProperty.isCurrency()) {
fieldQualifier = searchQuery.getCurrency();
}
//you have to add your else if here!!!
return this.fieldNameProvider.getFieldName(indexedProperty, fieldQualifier, fieldType);
}
So MyFieldNameTranslator
erstellen, die translateFromProperty(...)
von DefaultFieldNameTranslator
und außer Kraft setzen erstreckt.
Hinweis: SomeB2bUnitService
Dieser Dienst ist nicht real, aber es sollte in der Lage sein, die aktuelle b2bUnit zurückzugeben.
public class MyFieldNameTranslator extends DefaultFieldNameTranslator {
//To be injected!!
private SomeB2bUnitService someB2bUnitService;
@Override
protected String translateFromProperty(SearchQuery searchQuery, IndexedProperty indexedProperty, FieldType fieldType) {
//...
//...
else if(indexedProperty.getIsB2bUnit()) {
fieldQualifier = someB2bUnitService.getCurrentB2bUnit().getCode();
}
return this.fieldNameProvider.getFieldName(indexedProperty, fieldQualifier, fieldType);
}
}
Registrieren Sie den Translator
in Spring
:
<!-- add this to your *-spring.xml -->
<alias name="myfieldNameTranslator" alias="fieldNameTranslator" />
<bean id="myfieldNameTranslator" class="com.foo.bar.MyFieldNameTranslator" parent="defaultfieldNameTranslator">
<property name="someB2bUnitService" ref="someB2bUnitService" />
</bean>
- Edit: jetzt alles, was Sie tun müssen, ist
isB2bUnit
zu true
setzen für localStockForUnt
:
INSERT_UPDATE SolrIndexedProperty;solrIndexedType(identifier)[unique=true] ;name[unique=true] ;type(code) ;isB2bUnit
;$solrIndexedType ;localStockForUnt ;boolean ;true
Hinweis: dass einige Klassen und Bohnen h wurden zwischen Hybris-Versionen geändert, aber das Konzept bleibt gleich.