Images of products in cart product list

Usually the cart of online shops shows a small image in the product list. EXT:cart does this not by default because the use cases for the extension can be quite diverse and a standard might not fit everyone.

It's easy to implement this functionality with an EventListener and a customized partial.

Integration

The following snippets show an example where the first image of a product is used:

EXT:cartintegration/Classes/EventListener/ExtendCartProduct.php
<?php

declare(strict_types=1);

namespace Vendor\Cartintegration\EventListener\Cart\Create;

use Extcode\CartProducts\Event\RetrieveProductsFromRequestEvent;

class ExtendCartProduct
{
    public function __invoke(RetrieveProductsFromRequestEvent $event): void
    {
        $productProduct = $event->getProductProduct();
        $cartProduct = $event->getCartProduct();

        // Using null safe operator to avoid errors
        $imageUid = $productProduct?->getFirstImage()?->getOriginalResource()?->getOriginalFile()?->getUid() ?? null;

        if ($imageUid) {
            $cartProduct->setAdditional(
                'previewImage',
                $imageUid
            );
        }
    }
}
Copied!
EXT:cartintegration/Configuration/Services.yaml
services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  Vendor\Cartintegration\:
    resource: '../Classes/*'
    exclude: '../Classes/Domain/Model/*'

  Vendor\Cartintegration\EventListener\Cart\ExtendCartProduct:
    tags:
      - name: event.listener
Copied!
EXT:cartintegration/Resources/Private/Plugins/Cart/Partials/Cart/ProductForm/ProductList.html
// This snippet is simplified and needs adaption for your styling!

<f:section name="withoutVariant">

    ...

    <f:if condition="{product.additionalArray.previewImage}">
        <f:image src="{product.additionalArray.previewImage}"/>
    </f:if>

...

<f:section name="withVariant">

    ...

    <f:for each="{product.beVariants}" as="variant">
        <f:if condition="{product.additionalArray.previewImage}">
            <f:image src="{product.additionalArray.previewImage}"/>
        </f:if>

...
Copied!