diff --git a/AtlDiscountExtension-main/.DS_Store b/AtlDiscountExtension-main/.DS_Store new file mode 100644 index 0000000..9a874b5 Binary files /dev/null and b/AtlDiscountExtension-main/.DS_Store differ diff --git a/AtlDiscountExtension-main/README.md b/AtlDiscountExtension-main/README.md new file mode 100644 index 0000000..5de8aeb --- /dev/null +++ b/AtlDiscountExtension-main/README.md @@ -0,0 +1,5 @@ +**Possible issues** + +- The plugin only reacts to the state 'shipped', partially shipped and returned items are not influencing the customer tag +- Plugin only works with a boolean custom field, because it is looking for a truthy value +- Delete limit set to 999 \ No newline at end of file diff --git a/AtlDiscountExtension-main/composer.json b/AtlDiscountExtension-main/composer.json new file mode 100644 index 0000000..3b86f4c --- /dev/null +++ b/AtlDiscountExtension-main/composer.json @@ -0,0 +1,34 @@ +{ + "name": "atl/discount-extension", + "description": "Discount Extension", + "version": "1.0.0", + "type": "shopware-platform-plugin", + "license": "proprietary", + "authors": [ + { + "name": "Atloss GmbH", + "role": "Agency" + } + ], + "require": { + "shopware/core": "~6.4.0" + }, + "autoload": { + "psr-4": { + "Atl\\DiscountExtension\\": "src/" + } + }, + "extra": { + "shopware-plugin-class": "Atl\\DiscountExtension\\AtlDiscountExtension", + "plugin-icon": "src/Resources/config/plugin.png", + "copyright": "(c) by Atloss", + "label": { + "de-DE": "Rabatt Erweiterung", + "en-GB": "Discount Extension" + }, + "description": { + "de-DE": "Versieht ausgewählte Kunden bei Bestellungen mit Tags für den Rabatt von Folgebestellungen.", + "en-GB": "Tags selected customers on orders for discount on subsequent orders." + } + } +} \ No newline at end of file diff --git a/AtlDiscountExtension-main/src/.DS_Store b/AtlDiscountExtension-main/src/.DS_Store new file mode 100644 index 0000000..99a426c Binary files /dev/null and b/AtlDiscountExtension-main/src/.DS_Store differ diff --git a/AtlDiscountExtension-main/src/AtlDiscountExtension.php b/AtlDiscountExtension-main/src/AtlDiscountExtension.php new file mode 100644 index 0000000..e2307ae --- /dev/null +++ b/AtlDiscountExtension-main/src/AtlDiscountExtension.php @@ -0,0 +1,22 @@ +keepUserData()) { + return; + } + + $connection = $this->container->get(Connection::class); + $connection->executeStatement("DROP TABLE IF EXISTS `spwn_repeat_discount`"); + } +} \ No newline at end of file diff --git a/AtlDiscountExtension-main/src/Command/CheckDiscountEligibility.php b/AtlDiscountExtension-main/src/Command/CheckDiscountEligibility.php new file mode 100644 index 0000000..ca5c6d9 --- /dev/null +++ b/AtlDiscountExtension-main/src/Command/CheckDiscountEligibility.php @@ -0,0 +1,136 @@ +systemConfigService = $systemConfigService; + $this->repeatDiscountRepository = $repeatDiscountRepository; + $this->customerTagRepository = $customerTagRepository; + } + + protected function configure(): void + { + $this->setDescription('Checks the discount eligibility and removes the discount customer tag if it expired.'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int + */ + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new ShopwareStyle($input, $output); + + $tagId = $this->systemConfigService->get('AtlDiscountExtension.config.tag'); + + if (empty($tagId)) { + $io->warning('Customer tag assignment in plugin configuration is missing.'); + return self::FAILURE; + } + + $expiredDiscounts = $this->getExpiredDiscounts(); + + if (empty($expiredDiscounts)) { + $io->success('No customer tags were removed.'); + return self::SUCCESS; + } + + $tags = []; + $discounts = []; + foreach ($expiredDiscounts as $expiredDiscount) { + $tags[] = [ + 'customerId' => $expiredDiscount->getCustomerId(), + 'tagId' => $tagId + ]; + + $discounts[] = [ + 'id' => $expiredDiscount->getId() + ]; + } + + $this->removeCustomerTags($tags); + $this->removeDiscounts($discounts); + + $io->success(sprintf('Successfully deleted %d expired discounts.', count($expiredDiscounts))); + + return self::SUCCESS; + } + + /** + * @return array + */ + private function getExpiredDiscounts(): array + { + $expirationDays = $this->systemConfigService->get('AtlDiscountExtension.config.expirationDays'); + + // Go $expirationDays back in time + $expirationDate = (new \DateTime())->add(\DateInterval::createFromDateString('-' . $expirationDays . ' days')); + + $criteria = new Criteria(); + $criteria->addFilter( + new RangeFilter('lastOrderDate', + [ + // last order date is earlier than expiration date + RangeFilter::LTE => $expirationDate->format(\DATE_ATOM), + ] + )); + $criteria->setLimit(999); + + return $this->repeatDiscountRepository->search($criteria, Context::createDefaultContext())->getElements(); + } + + /** + * @param array $tags + * @return void + */ + private function removeCustomerTags(array $tags): void + { + $this->customerTagRepository->delete($tags, Context::createDefaultContext()); + } + + /** + * @param array $discounts + * @return void + */ + private function removeDiscounts(array $discounts): void + { + $this->repeatDiscountRepository->delete($discounts, Context::createDefaultContext()); + } +} \ No newline at end of file diff --git a/AtlDiscountExtension-main/src/Core/System/RepeatDiscount/RepeatDiscountCollection.php b/AtlDiscountExtension-main/src/Core/System/RepeatDiscount/RepeatDiscountCollection.php new file mode 100644 index 0000000..844ae2d --- /dev/null +++ b/AtlDiscountExtension-main/src/Core/System/RepeatDiscount/RepeatDiscountCollection.php @@ -0,0 +1,19 @@ +addFlags(new ApiAware(), new PrimaryKey(), new Required()), + (new FkField('customer_id', 'customerId', CustomerDefinition::class))->addFlags(new ApiAware(), new Required()), + (new DateTimeField('last_order_date', 'lastOrderDate'))->addFlags(new ApiAware(), new Required()), + new OneToOneAssociationField('customer', 'customer_id', 'id', CustomerDefinition::class, false) + ]); + } +} diff --git a/AtlDiscountExtension-main/src/Core/System/RepeatDiscount/RepeatDiscountEntity.php b/AtlDiscountExtension-main/src/Core/System/RepeatDiscount/RepeatDiscountEntity.php new file mode 100644 index 0000000..cf749e4 --- /dev/null +++ b/AtlDiscountExtension-main/src/Core/System/RepeatDiscount/RepeatDiscountEntity.php @@ -0,0 +1,75 @@ +customerId; + } + + /** + * @param string $customerId + */ + public function setCustomerId(string $customerId): void + { + $this->customerId = $customerId; + } + + /** + * @return \DateTimeInterface + */ + public function getLastOrderDate(): \DateTimeInterface + { + return $this->lastOrderDate; + } + + /** + * @param \DateTimeInterface $lastOrderDate + */ + public function setLastOrderDate(\DateTimeInterface $lastOrderDate): void + { + $this->lastOrderDate = $lastOrderDate; + } + + /** + * @return CustomerEntity + */ + public function getCustomer(): CustomerEntity + { + return $this->customer; + } + + /** + * @param CustomerEntity $customer + */ + public function setCustomer(CustomerEntity $customer): void + { + $this->customer = $customer; + } +} \ No newline at end of file diff --git a/AtlDiscountExtension-main/src/Extension/Checkout/Customer/CustomerExtension.php b/AtlDiscountExtension-main/src/Extension/Checkout/Customer/CustomerExtension.php new file mode 100644 index 0000000..5e0676c --- /dev/null +++ b/AtlDiscountExtension-main/src/Extension/Checkout/Customer/CustomerExtension.php @@ -0,0 +1,24 @@ +add( + (new OneToOneAssociationField('repeatDiscount', 'id', 'customer_id', RepeatDiscountDefinition::class)) + ); + } + + public function getDefinitionClass(): string + { + return CustomerDefinition::class; + } +} \ No newline at end of file diff --git a/AtlDiscountExtension-main/src/Migration/Migration1645524148SpwnRepeatDiscount.php b/AtlDiscountExtension-main/src/Migration/Migration1645524148SpwnRepeatDiscount.php new file mode 100644 index 0000000..a49e408 --- /dev/null +++ b/AtlDiscountExtension-main/src/Migration/Migration1645524148SpwnRepeatDiscount.php @@ -0,0 +1,36 @@ +executeStatement(' + CREATE TABLE IF NOT EXISTS `spwn_repeat_discount` ( + `id` BINARY(16) NOT NULL, + `customer_id` BINARY(16) NOT NULL, + `last_order_date` DATETIME(3) NOT NULL, + `created_at` DATETIME(3) NOT NULL, + `updated_at` DATETIME(3) NULL, + PRIMARY KEY (`id`), + CONSTRAINT `uniq.spwn_repeat_discount.customer_id` UNIQUE (`customer_id`), + CONSTRAINT `fk.spwn_repeat_discount.customer_id` FOREIGN KEY (`customer_id`) + REFERENCES `customer` (`id`) ON DELETE CASCADE ON UPDATE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + '); + } + + public function updateDestructive(Connection $connection): void + { + // implement update destructive + } +} diff --git a/AtlDiscountExtension-main/src/Resources/config/config.xml b/AtlDiscountExtension-main/src/Resources/config/config.xml new file mode 100644 index 0000000..add4433 --- /dev/null +++ b/AtlDiscountExtension-main/src/Resources/config/config.xml @@ -0,0 +1,37 @@ + + + + + Settings + Einstellungen + + + customField + custom_field + + + + + + minAmountDiscountableLineItems + + + 3 + + + + tag + tag + + + + + + expirationDays + + + 56 + + + \ No newline at end of file diff --git a/AtlDiscountExtension-main/src/Resources/config/plugin.png b/AtlDiscountExtension-main/src/Resources/config/plugin.png new file mode 100644 index 0000000..6f325b1 Binary files /dev/null and b/AtlDiscountExtension-main/src/Resources/config/plugin.png differ diff --git a/AtlDiscountExtension-main/src/Resources/config/services.xml b/AtlDiscountExtension-main/src/Resources/config/services.xml new file mode 100644 index 0000000..fb4b2f1 --- /dev/null +++ b/AtlDiscountExtension-main/src/Resources/config/services.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AtlDiscountExtension-main/src/Subscriber/StateMachineTransitionSubscriber.php b/AtlDiscountExtension-main/src/Subscriber/StateMachineTransitionSubscriber.php new file mode 100644 index 0000000..677ada9 --- /dev/null +++ b/AtlDiscountExtension-main/src/Subscriber/StateMachineTransitionSubscriber.php @@ -0,0 +1,198 @@ +systemConfigService = $systemConfigService; + $this->orderDeliveryRepository = $orderDeliveryRepository; + $this->customFieldRepository = $customFieldRepository; + $this->customerRepository = $customerRepository; + } + + /** + * @return string[] + */ + public static function getSubscribedEvents(): array + { + return [ + StateMachineTransitionEvent::class => 'onStateTransition' + ]; + } + + /** + * @param StateMachineTransitionEvent $event + * @return void + */ + public function onStateTransition(StateMachineTransitionEvent $event): void + { + // Early return if transition state is not 'shipped' + if ($event->getToPlace()->getTechnicalName() !== OrderDeliveryStates::STATE_SHIPPED) { + return; + } + + $orderDeliveryId = $event->getEntityId(); + $orderDelivery = $this->getOrderDelivery($orderDeliveryId, $event); + + // In case no order delivery could be found - return + if (empty($orderDelivery)) { + return; + } + + $amountDiscountableLineItems = $this->getAmountDiscountableLineItems($orderDelivery->getPositions(), $event); + $minAmountDiscountableLineItems = $this->systemConfigService->get('AtlDiscountExtension.config.minAmountDiscountableLineItems'); + + if ($amountDiscountableLineItems < $minAmountDiscountableLineItems) { + return; + } + + $customer = $orderDelivery->getOrder()->getOrderCustomer()->getCustomer(); + + // Tag the customer and trace timestamp in 'spwn_repeat_discount' table + $this->tagCustomer($customer, $event); + } + + /** + * @param string $orderDeliveryId + * @param StateMachineTransitionEvent $event + * @return OrderDeliveryEntity + */ + private function getOrderDelivery(string $orderDeliveryId, StateMachineTransitionEvent $event): OrderDeliveryEntity + { + $criteria = new Criteria(); + $criteria->addFilter(new EqualsFilter('id', $orderDeliveryId)); + $criteria->addAssociation('positions.orderLineItem'); + $criteria->addAssociation('order.orderCustomer.customer'); + + return $this->orderDeliveryRepository->search($criteria, $event->getContext())->first(); + } + + /** + * @param OrderDeliveryPositionCollection $positions + * @return int + */ + private function getAmountDiscountableLineItems(OrderDeliveryPositionCollection $positions, StateMachineTransitionEvent $event): int + { + $customFieldName = $this->getCustomFieldName($event); + + // In case no custom field was assigned in the plugin config - return + if ($customFieldName === '') { + return 0; + } + + $amountDiscountableLineItems = 0; + foreach($positions as $position) { + $customFields = $position->getOrderLineItem()->getPayload()['customFields']; + + // Checks if the custom field is set to true + if ($customFields[$customFieldName] === true) { + $amountDiscountableLineItems++; + } + } + + return $amountDiscountableLineItems; + } + + /** + * @param StateMachineTransitionEvent $event + * @return string + */ + private function getCustomFieldName(StateMachineTransitionEvent $event): string + { + $customFieldId = $this->systemConfigService->get('AtlDiscountExtension.config.customField'); + + $criteria = new Criteria(); + $criteria->addFilter(new EqualsFilter('id', $customFieldId)); + + /** @var CustomFieldEntity $customField */ + $customField = $this->customFieldRepository->search($criteria, $event->getContext())->first(); + + // In case no custom field was assigned in the plugin config - return + if (empty($customField)) { + return ''; + } + + return $customField->getName(); + } + + /** + * @param CustomerEntity $customer + * @param StateMachineTransitionEvent $event + * @return void + */ + private function tagCustomer(CustomerEntity $customer, StateMachineTransitionEvent $event): void + { + $tagId = $this->systemConfigService->get('AtlDiscountExtension.config.tag'); + + if (empty($tagId)) { + return; + } + + $update = [ + 'id' => $customer->getId(), + 'tags' => [ + [ + 'id' => $tagId + ] + ], + 'repeatDiscount' => [ + 'customerId' => $customer->getId(), + 'lastOrderDate' => new \DateTime() + ] + ]; + + /** @var RepeatDiscountEntity $repeatDiscount */ + $repeatDiscount = $customer->getExtensions()['repeatDiscount']; + + // If a discount is already applied, update its duration, else create one + if (!empty($repeatDiscount)) { + $repeatDiscountId = $repeatDiscount->getId(); + $update['repeatDiscount']['id'] = $repeatDiscountId; + } + + $this->customerRepository->update([$update], $event->getContext()); + } +} diff --git a/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/base.scss b/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/base.scss index 0bcd6f1..e82ca31 100644 --- a/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/base.scss +++ b/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/base.scss @@ -1,7 +1,10 @@ @import 'layout/header'; +@import 'layout/footer'; @import 'component/card'; @import 'component/cms-block'; @import 'component/cms-element'; +@import 'component/filter-multi-select'; @import 'component/product-box'; +@import 'page/content/breadcrumb'; @import 'page/checkout/cart'; @import 'page/product-detail/product-detail'; \ No newline at end of file diff --git a/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/component/_filter-multi-select.scss b/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/component/_filter-multi-select.scss new file mode 100644 index 0000000..97def6c --- /dev/null +++ b/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/component/_filter-multi-select.scss @@ -0,0 +1,24 @@ +.filter-panel-items-container { + display: block; +} + +.filter-panel-item { + margin-right: 0; +} + +.filter-multi-select-list { + display: flex; + justify-content: center; +} + +.filter-multi-select-list-item { + background-color: transparent; + border-bottom: none; + &:hover { + background-color: transparent; + } +} + +.filter-multi-select-item-label { + color: #222; +} \ No newline at end of file diff --git a/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/component/_product-box.scss b/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/component/_product-box.scss index bb3ae8b..e0463ed 100644 --- a/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/component/_product-box.scss +++ b/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/component/_product-box.scss @@ -2,6 +2,10 @@ &.highlight { background-color: #E9F4FC; } + .brandLogo { + max-width: 60px; + margin: 8px 0 0 0; + } .product-name { font-size: 18px; line-height: 20px; @@ -31,4 +35,12 @@ .product-cheapest-price { display: none; } +} + +.cms-block.easyfit { + .product-box { + .product-info { + min-height: 135px; + } + } } \ No newline at end of file diff --git a/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/layout/_footer.scss b/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/layout/_footer.scss new file mode 100644 index 0000000..d7a9bc1 --- /dev/null +++ b/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/layout/_footer.scss @@ -0,0 +1,99 @@ + +#collapseFooterCustom { + p { + margin-bottom: 5px; + img { + margin-bottom: 8px; + } + } +} + +.footer-newsletter { + .newsletter-inner-text { + font-size: 18px; + line-height: 24px; + } + .footer-newsletter-column-input-email { + border-bottom: 2px solid $sw-color-brand-primary; + margin: 0 15px; + padding: 0; + } + .form-control, + .input-group-append .btn { + border: none; + } + .form-control { + padding-top: 0; + padding-left: 0; + padding-bottom: 0; + font-size: 18px; + line-height: 24px; + } +} + +.footer-hotline-column { + .footer-contact-hotline { + margin-bottom: 8px; + a:not(.btn) { + margin-top: 16px; + margin-bottom: 0; + line-height: 15px; + } + } + .footer-contact-form { + margin-top: 0; + a { + color: #222; + text-decoration: underline; + &:hover { + color: #222; + text-decoration: none; + } + } + } +} + + +.footer-column-headline { + margin-bottom: 0; + &:before { + display: none; + } +} + +.footer-link-item { + a { + &:after { + top: 75%; + } + } +} + + +@media (min-width: 768px) { + .footer-link-item { + padding: 0; + } +} + +.social-icons { + display: flex; + justify-content: center; + margin-bottom: 10px; + .icon { + border: 2px solid $sw-color-brand-primary; + border-radius: 50%; + width: 40px; + height: 40px; + margin: 0 8px; + &.icon-facebook { + padding: 8px; + } + &.icon-instagram { + padding: 5px; + } + } + svg { + color: $sw-color-brand-primary; + } +} \ No newline at end of file diff --git a/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/layout/_header.scss b/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/layout/_header.scss index 0251020..0470c50 100644 --- a/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/layout/_header.scss +++ b/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/layout/_header.scss @@ -1,3 +1,8 @@ +.header-row { + padding-top: 10px; + border-bottom: 1px solid #B1C3D9; +} + .header-main { .header-cart-btn { .header-cart-total { @@ -51,4 +56,18 @@ line-height: 18px; text-transform: uppercase; padding: 0; + .main-navigation-link-text { + &:after { + height: 3px; + left: 0; + right: 0; + bottom: -18px; + } + } + &.active { + .main-navigation-link-text { + color: $sw-color-brand-primary; + } + } } + diff --git a/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/page/content/_breadcrumb.scss b/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/page/content/_breadcrumb.scss new file mode 100644 index 0000000..1c6a178 --- /dev/null +++ b/zenitPlatformAtmosSet1/src/Resources/app/storefront/src/scss/page/content/_breadcrumb.scss @@ -0,0 +1,13 @@ +.breadcrumb-wrap { + a { + &.is-active { + font-weight: 700; + border-bottom: 0; + } + } + .breadcrumb-placeholder { + svg { + color: #222; + } + } +} \ No newline at end of file diff --git a/zenitPlatformAtmosSet1/src/Resources/cms/blocks/swag-gallery-buybox-abnehmplan/preview.html b/zenitPlatformAtmosSet1/src/Resources/cms/blocks/swag-gallery-buybox-abnehmplan/preview.html deleted file mode 100644 index 9e572e3..0000000 --- a/zenitPlatformAtmosSet1/src/Resources/cms/blocks/swag-gallery-buybox-abnehmplan/preview.html +++ /dev/null @@ -1,9 +0,0 @@ -
-
-

Lorem ipsum dolor

-

Lorem ipsum dolor sit amet, consetetur sadipscing elitr.

-
- - - Preview image -
\ No newline at end of file diff --git a/zenitPlatformAtmosSet1/src/Resources/cms/blocks/swag-gallery-buybox-abnehmplan/styles.css b/zenitPlatformAtmosSet1/src/Resources/cms/blocks/swag-gallery-buybox-abnehmplan/styles.css deleted file mode 100644 index 7705d7d..0000000 --- a/zenitPlatformAtmosSet1/src/Resources/cms/blocks/swag-gallery-buybox-abnehmplan/styles.css +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Styling of your block preview in the CMS sidebar - */ - .sw-cms-preview-swag-image-text-reversed { - display: grid; - grid-template-columns: 1fr 1fr; - grid-column-gap: 20px; - padding: 15px; -} - -/* - * Styling of your block in the CMS editor - * Pattern: sw-cms-block-${block.name}-component - */ -.sw-cms-block-swag-image-text-reversed-component { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(195px, 1fr)); - grid-gap: 40px; -} - -/* - * Each slot will have an additional class - * Pattern: sw-cms-slot-${slot.name} - */ -.sw-cms-block-swag-image-text-reversed-component .sw-cms-slot-left { - -} - -/* - * Each slot will have an additional class - * Pattern: sw-cms-slot-${slot.name} - */ -.sw-cms-block-swag-image-text-reversed-component .sw-cms-slot-right { - -} \ No newline at end of file diff --git a/zenitPlatformAtmosSet1/src/Resources/views/storefront/component/listing/filter/filter-multi-select.html.twig b/zenitPlatformAtmosSet1/src/Resources/views/storefront/component/listing/filter/filter-multi-select.html.twig new file mode 100644 index 0000000..c898e7e --- /dev/null +++ b/zenitPlatformAtmosSet1/src/Resources/views/storefront/component/listing/filter/filter-multi-select.html.twig @@ -0,0 +1,56 @@ +{% sw_extends '@Storefront/storefront/component/listing/filter/filter-multi-select.html.twig' %} + +{% block component_filter_multi_select %} + +{% endblock %} \ No newline at end of file diff --git a/zenitPlatformAtmosSet1/src/Resources/views/storefront/component/product/card/box-standard.html.twig b/zenitPlatformAtmosSet1/src/Resources/views/storefront/component/product/card/box-standard.html.twig index 821be3f..bc5e051 100644 --- a/zenitPlatformAtmosSet1/src/Resources/views/storefront/component/product/card/box-standard.html.twig +++ b/zenitPlatformAtmosSet1/src/Resources/views/storefront/component/product/card/box-standard.html.twig @@ -107,6 +107,14 @@ {% block component_product_box_info %}
+ {% if product.customFields.custom_productteaser_logo is defined %} + {% set logoImageId = product.customFields.custom_productteaser_logo %} + {% set mediaCollection = searchMedia([logoImageId], context.context) %} + {% set logoImage = mediaCollection.get(logoImageId) %} + + {% endif %} {% block component_product_box_rating %} {% if theme_config('zen-product-listing-card-rating-position') is same as ('default') %} {{ parent() }} diff --git a/zenitPlatformAtmosSet1/src/Resources/views/storefront/layout/footer/footer.html.twig b/zenitPlatformAtmosSet1/src/Resources/views/storefront/layout/footer/footer.html.twig index a1116d7..abdd7c6 100644 --- a/zenitPlatformAtmosSet1/src/Resources/views/storefront/layout/footer/footer.html.twig +++ b/zenitPlatformAtmosSet1/src/Resources/views/storefront/layout/footer/footer.html.twig @@ -1,5 +1,9 @@ {% sw_extends '@Storefront/storefront/layout/footer/footer.html.twig' %} +{% block layout_footer_payment_shipping_logos %} +{% endblock %} + + {% block layout_footer_copyright %}