Important
You are browsing documentation for version 5.0 of OroCommerce. Support of this version ended in January 2025. Read the documentation for version 6.1 (the latest LTS version) to get up-to-date information.
See our Release Process documentation for more information on the currently supported and upcoming releases.
Add the Customer Consents Field to a Form (Example)
Mapped Field
If an entity contains the customerUser property, add the customerConsents field to the form using property_path in the form_options.
$form->add(
ConsentAcceptanceType::TARGET_FIELDNAME,
ConsentAcceptanceType::class,
[
'property_path' => 'customerUser.acceptedConsents',
'constraints' => [
new RemovedLandingPages(),
new RemovedConsents(),
new RequiredConsents()
]
]
);
Non-Mapped Field
If an entity does not contain the customerUser property:
Add the customerConsents field to the form and set mapped = false in the form_options.
$form->add( ConsentAcceptanceType::TARGET_FIELDNAME, ConsentAcceptanceType::class, [ 'mapped' => false, 'constraints' => [ new RemovedLandingPages(), new RemovedConsents(), new RequiredConsents() ] ] );
Create a form listener service.
acme_demo.event_listener.form_listener: class: Acme\Bundle\DemoBundle\EventListener\BeforeFlushFormListener lazy: true tags: - { name: kernel.event_listener, event: oro.form.update_handler.before_entity_flush.__FORM_NAME__, method: beforeFlush } - { name: oro_featuretogle.feature, feature: consents }
Implement the logic before the flush event.
namespace Acme\Bundle\DemoBundle\EventListener; use Oro\Bundle\ConsentBundle\Form\Type\ConsentAcceptanceType; use Oro\Bundle\FeatureToggleBundle\Checker\FeatureCheckerHolderTrait; use Oro\Bundle\FormBundle\Event\FormHandler\AfterFormProcessEvent; class BeforeFlushFormListener { use FeatureCheckerHolderTrait; public function beforeFlush(AfterFormProcessEvent $event) { // No actions if consents feature disabled if (!$this->isFeaturesEnabled()) { return; } $formData = $event->getData(); if ($formData instanceof Request) { $customerUser = $formData->getCustomerUser(); if ($customerUser && $customerUser->isGuest()) { $form = $event->getForm(); $acceptedConsents = $form->get(ConsentAcceptanceType::TARGET_FIELDNAME)->getData(); $customerUser->setAcceptedConsents($acceptedConsents); } } } }
Render Form Field in the Storefront
First, check that customerConsents is rendered in the form template, the input with type hidden should be rendered on the page.
{% if form.customerConsents is defined %}
{{ form_widget(form.customerConsents) }}
{% endif %}
To show a block with consent items, import the layout with consent items and configure it.
layout:
imports:
-
id: oro_consent_items
root: consent_container
actions:
- '@setBlockTheme':
themes: 'consents.html.twig'
- '@add':
id: consent_container
blockType: container
parentId: __PARENT_BLOCK_ID__
- '@add':
id: consent_message
blockType: consent_acceptance_choice
parentId: consent_container
If all consents are accepted, add a template with a success message.
{% block _checkout_consent_message_widget %}
{% set attr = layout_attr_defaults(attr, {
'class': 'notification notification--success'
}) %}
{% if consents is empty %}
<div {{ block('block_attributes') }}>
<span class="notification__item"><i class="fa-check"></i> {{ 'All mandatory consents were accepted.' }}</span>
</div>
{% endif %}
{% endblock %}