Note : For simplicity purpose I have used link of PDP inside a QR code although you can have any type of link like a Wishlist or paragraph information as well concealed in it.
<dependency>
<groupId>net.sf.barcode4j</groupId>
<artifactId>barcode4j</artifactId>
<version>2.1</version>
</dependency>
<attribute autocreate="true" qualifier="productQRCode" type="BarcodeMedia">
<modifiers read="true" write="true" search="false"
optional="true" />
<persistence type="property" />
</attribute>
public class CustomProductFacade extends DefaultProductFacade<ProductModel>
{
private static final Logger LOG = Logger.getLogger(CustomProductFacade.class);
@Resource(name = "mediaService")
MediaService mediaService;
@Resource(name = "mediaModelConverter")
Converter<MediaModel, MediaData> mediaModelConverter;
@Override
public ProductData getProductForCodeAndOptions(final String code, final Collection<ProductOption> options)
{
final ProductModel productModel = getProductService().getProductForCode(code);
try
{
if (null == productModel.getProductQRCode())
{
final BufferedImage QRImage = this.generateQRCodeImage("https://localhost:9002/myprojectstorefront/en/USD/p/" + code);
LOG.info("finished generateQRCodeImage ");
final String filePath = "productQRCode.png";
final int size = 125;
final File qrFile = new File(filePath);
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(QRImage, "png", outputStream); // Passing: (RenderedImage im, String formatName, OutputStream output)
final InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
LOG.info("Created Input stream ");
final BarcodeMediaModel barcodeMediaModel = getModelService().create(BarcodeMediaModel.class);
barcodeMediaModel.setCatalogVersion(productModel.getCatalogVersion());
barcodeMediaModel.setCode("productQRCode" + productModel.getCode());
barcodeMediaModel.setRealFileName("productQRCode" + productModel.getCode() + ".png");
barcodeMediaModel.setBarcodeText("https://localhost:9002/myprojectstorefront/en/USD/p/" + code);
barcodeMediaModel.setBarcodeType(BarcodeType.QR);
getModelService().save(barcodeMediaModel);
getModelService().refresh(barcodeMediaModel);
mediaService.setStreamForMedia(barcodeMediaModel, inputStream);
final Collection<BarcodeMediaModel> barcodeMediaList = new ArrayList<>();
barcodeMediaList.add(barcodeMediaModel);
productModel.setProductQRCode(barcodeMediaModel);
getModelService().saveAll(barcodeMediaModel, productModel);
LOG.info("Created Barcode media model in product ");
}
}
catch (final Exception e)
{
e.printStackTrace();
}
final ProductData productData = getProductConverter().convert(productModel);
final MediaData mediaData = mediaModelConverter.convert(productModel.getProductQRCode());
productData.setProductQRCodeMedia(mediaData);
if (options != null)
{
getProductConfiguredPopulator().populate(productModel, productData, options);
}
return productData;
}
public static BufferedImage generateQRCodeImage(final String barcodeText) throws Exception
{
LOG.info("Inside generateQRCodeImage ");
final QRCodeWriter barcodeWriter = new QRCodeWriter();
final BitMatrix bitMatrix = barcodeWriter.encode(barcodeText, BarcodeFormat.QR_CODE, 200, 200);
return MatrixToImageWriter.toBufferedImage(bitMatrix);
}
<alias name="customProductFacade" alias="productFacade"/>
<bean id="customProductFacade" class="com.hybris.myproject.facades.impl.CustomProductFacade" parent="defaultProductFacade" />
<bean class="de.hybris.platform.commercefacades.product.data.ProductData">
<property name="genders" type="java.util.List<com.hybris.myproject.facades.product.data.GenderData>"/>
<property name="productQRCodeMedia" type="de.hybris.platform.cmsfacades.data.MediaData" />
</bean>
<img src="${fn:escapeXml(product.productQRCodeMedia.url)}" />
DEMO :
Below are some screenshots of how PDP will be rendered after making above changes.
Please note that it is a localhost demo hence all URLs and links will be in localhost:9002 format.
Click on below shown Media model in Product Model in backoffice:
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
3 | |
3 | |
2 | |
2 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 |