From f13fe38a907e1abbfc25dd2abee129faa4c7528c Mon Sep 17 00:00:00 2001 From: Jan Walther Date: Wed, 22 Mar 2023 11:29:48 +0100 Subject: [PATCH 01/19] make slug overwritable --- .../Pimcore/Slug/DataObjectSlugGenerator.php | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php index 3407fe4fb7..8d78da8d00 100644 --- a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php +++ b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php @@ -18,6 +18,7 @@ namespace CoreShop\Component\Pimcore\Slug; +use CoreShop\Component\Resource\Model\AbstractObject; use Pimcore\Model\DataObject\Data\UrlSlug; use Pimcore\Model\Site; use Pimcore\Tool; @@ -41,7 +42,10 @@ public function generateSlugs(SluggableInterface $sluggable): void new UrlSlug($fallbackSlug, 0), ]; $actualSlugs = []; + $inheritanceEnabled = \Pimcore\Model\DataObject\AbstractObject::getGetInheritedValues(); + \Pimcore\Model\DataObject\AbstractObject::setGetInheritedValues(false); $existingSlugs = $sluggable->getSlug($language); + \Pimcore\Model\DataObject\AbstractObject::setGetInheritedValues($inheritanceEnabled); foreach ($sites as $site) { $siteSlug = $this->generator->generateSlugsForSite($sluggable, $language, $site); @@ -61,11 +65,19 @@ public function generateSlugs(SluggableInterface $sluggable): void if ($existingSlug->getSlug() === $newSlug->getSlug()) { $actualSlugs[] = $existingSlug; } else { - /** - * @psalm-suppress InternalMethod - */ - $newSlug->setPreviousSlug($existingSlug->getSlug()); - $actualSlugs[] = $newSlug; + // $existingSlug is the slug to be saved from backend + $dbSlug = $sluggable->retrieveSlugData(['fieldname' => 'slug', 'ownertype' => 'object', 'position' => $language, 'siteId' => $site->getId()])[0]['slug'] ?? null; + if ($dbSlug === null) { + $dbSlug = $sluggable->retrieveSlugData(['fieldname' => 'slug', 'ownertype' => 'object', 'position' => $language])[0]['slug'] ?? null; // fallback slug + } + + if ($dbSlug && $dbSlug !== $existingSlug->getSlug()) { + $existingSlug->setPreviousSlug($dbSlug); + } elseif (!$dbSlug && !$existingSlug->getSlug()) { + $actualSlugs[] = $newSlug; + } else { + $actualSlugs[] = $existingSlug; + } } $found = true; From ac7236984e594838baff4abe24e2051d4ecc4198 Mon Sep 17 00:00:00 2001 From: Jan Walther Date: Wed, 22 Mar 2023 11:35:06 +0100 Subject: [PATCH 02/19] make slug overwritable --- .../Component/Pimcore/Slug/DataObjectSlugGenerator.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php index 8d78da8d00..065e884547 100644 --- a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php +++ b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php @@ -18,7 +18,7 @@ namespace CoreShop\Component\Pimcore\Slug; -use CoreShop\Component\Resource\Model\AbstractObject; +use Pimcore\Model\DataObject\AbstractObject; use Pimcore\Model\DataObject\Data\UrlSlug; use Pimcore\Model\Site; use Pimcore\Tool; @@ -42,10 +42,10 @@ public function generateSlugs(SluggableInterface $sluggable): void new UrlSlug($fallbackSlug, 0), ]; $actualSlugs = []; - $inheritanceEnabled = \Pimcore\Model\DataObject\AbstractObject::getGetInheritedValues(); - \Pimcore\Model\DataObject\AbstractObject::setGetInheritedValues(false); + $inheritanceEnabled = AbstractObject::getGetInheritedValues(); + AbstractObject::setGetInheritedValues(false); $existingSlugs = $sluggable->getSlug($language); - \Pimcore\Model\DataObject\AbstractObject::setGetInheritedValues($inheritanceEnabled); + AbstractObject::setGetInheritedValues($inheritanceEnabled); foreach ($sites as $site) { $siteSlug = $this->generator->generateSlugsForSite($sluggable, $language, $site); From 05f4e24711db05a80d6ce132bf8b64e713ee7ceb Mon Sep 17 00:00:00 2001 From: Jan Walther Date: Wed, 22 Mar 2023 11:45:13 +0100 Subject: [PATCH 03/19] use InheritanceHelper --- .../Component/Pimcore/Slug/DataObjectSlugGenerator.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php index 065e884547..b434b177c9 100644 --- a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php +++ b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php @@ -18,6 +18,7 @@ namespace CoreShop\Component\Pimcore\Slug; +use CoreShop\Component\Pimcore\DataObject\InheritanceHelper; use Pimcore\Model\DataObject\AbstractObject; use Pimcore\Model\DataObject\Data\UrlSlug; use Pimcore\Model\Site; @@ -42,10 +43,9 @@ public function generateSlugs(SluggableInterface $sluggable): void new UrlSlug($fallbackSlug, 0), ]; $actualSlugs = []; - $inheritanceEnabled = AbstractObject::getGetInheritedValues(); - AbstractObject::setGetInheritedValues(false); - $existingSlugs = $sluggable->getSlug($language); - AbstractObject::setGetInheritedValues($inheritanceEnabled); + $existingSlugs = InheritanceHelper::useInheritedValues(function() use ($sluggable, $language) { + return $sluggable->getSlug($language); + }, false); foreach ($sites as $site) { $siteSlug = $this->generator->generateSlugsForSite($sluggable, $language, $site); From b327227af1bc5f91986335c6cdf89ceb4c55d6e6 Mon Sep 17 00:00:00 2001 From: Blackbit Date: Thu, 23 Mar 2023 07:51:54 +0100 Subject: [PATCH 04/19] Update src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php Co-authored-by: Jacob Dreesen --- .../Component/Pimcore/Slug/DataObjectSlugGenerator.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php index b434b177c9..c74f6208a9 100644 --- a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php +++ b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php @@ -43,9 +43,10 @@ public function generateSlugs(SluggableInterface $sluggable): void new UrlSlug($fallbackSlug, 0), ]; $actualSlugs = []; - $existingSlugs = InheritanceHelper::useInheritedValues(function() use ($sluggable, $language) { - return $sluggable->getSlug($language); - }, false); + $existingSlugs = InheritanceHelper::useInheritedValues( + fn () => $sluggable->getSlug($language), + false, + ); foreach ($sites as $site) { $siteSlug = $this->generator->generateSlugsForSite($sluggable, $language, $site); From d475f35c0757ff0a1c3b019188de00726107be6b Mon Sep 17 00:00:00 2001 From: Jan Walther Date: Thu, 23 Mar 2023 07:56:37 +0100 Subject: [PATCH 05/19] fix PhpStan error --- .../Component/Pimcore/Slug/DataObjectSlugGenerator.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php index c74f6208a9..13414b6828 100644 --- a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php +++ b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php @@ -20,6 +20,7 @@ use CoreShop\Component\Pimcore\DataObject\InheritanceHelper; use Pimcore\Model\DataObject\AbstractObject; +use Pimcore\Model\DataObject\Concrete; use Pimcore\Model\DataObject\Data\UrlSlug; use Pimcore\Model\Site; use Pimcore\Tool; @@ -67,9 +68,12 @@ public function generateSlugs(SluggableInterface $sluggable): void $actualSlugs[] = $existingSlug; } else { // $existingSlug is the slug to be saved from backend - $dbSlug = $sluggable->retrieveSlugData(['fieldname' => 'slug', 'ownertype' => 'object', 'position' => $language, 'siteId' => $site->getId()])[0]['slug'] ?? null; - if ($dbSlug === null) { - $dbSlug = $sluggable->retrieveSlugData(['fieldname' => 'slug', 'ownertype' => 'object', 'position' => $language])[0]['slug'] ?? null; // fallback slug + $dbSlug = null; + if($sluggable instanceof Concrete) { + $dbSlug = $sluggable->retrieveSlugData(['fieldname' => 'slug', 'ownertype' => 'object', 'position' => $language, 'siteId' => $site->getId()])[0]['slug'] ?? null; + if ($dbSlug === null) { + $dbSlug = $sluggable->retrieveSlugData(['fieldname' => 'slug', 'ownertype' => 'object', 'position' => $language])[0]['slug'] ?? null; // fallback slug + } } if ($dbSlug && $dbSlug !== $existingSlug->getSlug()) { From 26767d266bb24f003c46282e9dae1c1dc37a342e Mon Sep 17 00:00:00 2001 From: Dominik Pfaffenbauer Date: Mon, 27 Mar 2023 07:43:54 +0200 Subject: [PATCH 06/19] [Shipping] don't include shipping total in amount shipping condition --- .../Shipping/Rule/Condition/AmountConditionChecker.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CoreShop/Component/Shipping/Rule/Condition/AmountConditionChecker.php b/src/CoreShop/Component/Shipping/Rule/Condition/AmountConditionChecker.php index 31d66d8864..88269f31f2 100644 --- a/src/CoreShop/Component/Shipping/Rule/Condition/AmountConditionChecker.php +++ b/src/CoreShop/Component/Shipping/Rule/Condition/AmountConditionChecker.php @@ -19,6 +19,7 @@ namespace CoreShop\Component\Shipping\Rule\Condition; use CoreShop\Component\Address\Model\AddressInterface; +use CoreShop\Component\Order\Model\AdjustmentInterface; use CoreShop\Component\Shipping\Model\CarrierInterface; use CoreShop\Component\Shipping\Model\ShippableInterface; @@ -30,7 +31,7 @@ public function isShippingRuleValid(CarrierInterface $carrier, ShippableInterfac $maxAmount = $configuration['maxAmount']; $gross = $configuration['gross'] ?? true; - $totalAmount = $shippable->getSubtotal($gross); + $totalAmount = min(0, $shippable->getSubtotal($gross) - $shippable->getAdjustmentsTotal(AdjustmentInterface::SHIPPING)); if ($minAmount > 0) { if ($totalAmount < $minAmount) { From 36f3070a1ee6e2798bd121ef0e92b07de0e8fb6a Mon Sep 17 00:00:00 2001 From: Dominik Pfaffenbauer Date: Fri, 7 Apr 2023 10:51:12 +0200 Subject: [PATCH 07/19] [Shipping] allow total amount to be used for shipping condition --- .../amount_total_condition.feature | 27 ++++++++++++++++ .../Behat/Context/Domain/CartContext.php | 1 + .../Behat/Context/Setup/ShippingContext.php | 32 +++++++++++++++++++ .../config/suites/domain/shipping.yml | 2 ++ .../Condition/AmountConfigurationType.php | 3 +- .../js/shippingrule/conditions/amount.js | 13 +++++++- .../Resources/translations/admin.de.yml | 1 + .../Resources/translations/admin.en.yml | 1 + .../Shipping/Model/ShippableInterface.php | 4 +++ .../Rule/Condition/AmountConditionChecker.php | 13 ++++++-- 10 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 features/domain/shipping/shipping_rules/amount_total_condition.feature diff --git a/features/domain/shipping/shipping_rules/amount_total_condition.feature b/features/domain/shipping/shipping_rules/amount_total_condition.feature new file mode 100644 index 0000000000..8551d3664a --- /dev/null +++ b/features/domain/shipping/shipping_rules/amount_total_condition.feature @@ -0,0 +1,27 @@ +@domain @shipping +Feature: Adding a new Shipping Rule + In order to calculate shipping + I'll create a new shipping rule + with an amount condition based on the total value of the cart + + Background: + Given the site operates on a store in "Austria" + And the site has a currency "Euro" with iso "EUR" + And I am in country "Austria" + And the site has a tax rate "AT" with "20%" rate + And the site has a tax rule group "AT" + And the tax rule group has a tax rule for country "Austria" with tax rate "AT" + And adding a cart price rule named "100% discount" + And the cart rule is active + And the cart rule is not a voucher rule + And the cart rule has a action discount-percent with 100% discount + And the site has a product "Shoe" priced at 10000 + And the product has the tax rule group "AT" + And I add the product "Shoe" to my cart + And the site has a carrier "Post" + + Scenario: Add a new amount shipping rule which is valid + Given adding a shipping rule named "amount" + And the shipping rule is active + And the shipping rule has a condition amount from total "0" to "1" + Then the shipping rule should be valid for my cart with carrier "Post" diff --git a/src/CoreShop/Behat/Context/Domain/CartContext.php b/src/CoreShop/Behat/Context/Domain/CartContext.php index 49138635c5..1d7fdedca6 100644 --- a/src/CoreShop/Behat/Context/Domain/CartContext.php +++ b/src/CoreShop/Behat/Context/Domain/CartContext.php @@ -355,6 +355,7 @@ public function cartShouldUseCarrier(CarrierInterface $carrier): void $cart = $this->cartContext->getCart(); Assert::isInstanceOf($cart, OrderInterface::class); + Assert::isInstanceOf($cart->getCarrier(), CarrierInterface::class); Assert::eq( $carrier->getId(), diff --git a/src/CoreShop/Behat/Context/Setup/ShippingContext.php b/src/CoreShop/Behat/Context/Setup/ShippingContext.php index 10ee3da3f1..f9a76509aa 100644 --- a/src/CoreShop/Behat/Context/Setup/ShippingContext.php +++ b/src/CoreShop/Behat/Context/Setup/ShippingContext.php @@ -241,6 +241,38 @@ public function theShippingRuleHasAAmountConditionWhichIsNet(ShippingRuleInterfa ])); } + /** + * @Given /^the (shipping rule "[^"]+") has a condition amount from total "([^"]+)" to "([^"]+)"$/ + * @Given /^the (shipping rule) has a condition amount from total "([^"]+)" to "([^"]+)"$/ + */ + public function theShippingRuleHasAAmountFromTotalCondition(ShippingRuleInterface $rule, $minAmount, $maxAmount): void + { + $this->assertConditionForm(AmountConfigurationType::class, 'amount'); + + $this->addCondition($rule, $this->createConditionWithForm('amount', [ + 'minAmount' => $minAmount, + 'maxAmount' => $maxAmount, + 'gross' => true, + 'useTotal' => true, + ])); + } + + /** + * @Given /^the (shipping rule "[^"]+") has a condition amount from total "([^"]+)" to "([^"]+)" which is net$/ + * @Given /^the (shipping rule) has a condition amount from total "([^"]+)" to "([^"]+)" which is net$/ + */ + public function theShippingRuleHasAAmountFromTotalConditionWhichIsNet(ShippingRuleInterface $rule, $minAmount, $maxAmount): void + { + $this->assertConditionForm(AmountConfigurationType::class, 'amount'); + + $this->addCondition($rule, $this->createConditionWithForm('amount', [ + 'minAmount' => $minAmount, + 'maxAmount' => $maxAmount, + 'gross' => false, + 'useTotal' => true, + ])); + } + /** * @Given /^the (shipping rule "[^"]+") has a condition postcode with "([^"]+)"$/ * @Given /^the (shipping rule) has a condition postcode with "([^"]+)"$/ diff --git a/src/CoreShop/Behat/Resources/config/suites/domain/shipping.yml b/src/CoreShop/Behat/Resources/config/suites/domain/shipping.yml index 6629ac8230..a2853b551e 100644 --- a/src/CoreShop/Behat/Resources/config/suites/domain/shipping.yml +++ b/src/CoreShop/Behat/Resources/config/suites/domain/shipping.yml @@ -23,6 +23,7 @@ default: - coreshop.behat.context.transform.tax_rule_group - coreshop.behat.context.transform.shipping - coreshop.behat.context.transform.cart + - coreshop.behat.context.transform.cart_price_rule - coreshop.behat.context.setup.product - coreshop.behat.context.setup.product_price_rule @@ -38,6 +39,7 @@ default: - coreshop.behat.context.setup.tax_rule_group - coreshop.behat.context.setup.shipping - coreshop.behat.context.setup.cart + - coreshop.behat.context.setup.cart_price_rule - coreshop.behat.context.domain.shipping - coreshop.behat.context.domain.cart diff --git a/src/CoreShop/Bundle/ShippingBundle/Form/Type/Rule/Condition/AmountConfigurationType.php b/src/CoreShop/Bundle/ShippingBundle/Form/Type/Rule/Condition/AmountConfigurationType.php index c6ed84e8d7..9b100b3162 100644 --- a/src/CoreShop/Bundle/ShippingBundle/Form/Type/Rule/Condition/AmountConfigurationType.php +++ b/src/CoreShop/Bundle/ShippingBundle/Form/Type/Rule/Condition/AmountConfigurationType.php @@ -52,7 +52,8 @@ public function buildForm(FormBuilderInterface $builder, array $options): void new Type(['type' => 'numeric', 'groups' => $this->validationGroups]), ], ]) - ->add('gross', CheckboxType::class, []) + ->add('gross', CheckboxType::class) + ->add('useTotal', CheckboxType::class) ; } diff --git a/src/CoreShop/Bundle/ShippingBundle/Resources/public/pimcore/js/shippingrule/conditions/amount.js b/src/CoreShop/Bundle/ShippingBundle/Resources/public/pimcore/js/shippingrule/conditions/amount.js index 4066622534..8d2341f83d 100644 --- a/src/CoreShop/Bundle/ShippingBundle/Resources/public/pimcore/js/shippingrule/conditions/amount.js +++ b/src/CoreShop/Bundle/ShippingBundle/Resources/public/pimcore/js/shippingrule/conditions/amount.js @@ -18,6 +18,7 @@ coreshop.shippingrule.conditions.amount = Class.create(coreshop.rules.conditions var minAmountValue = 0; var maxAmountValue = 0; var grossValue = true; + var useTotalValue = false; var me = this; if (this.data && this.data.minAmount) { @@ -32,6 +33,10 @@ coreshop.shippingrule.conditions.amount = Class.create(coreshop.rules.conditions grossValue = this.data.gross; } + if (this.data && this.data.hasOwnProperty('useTotal')) { + useTotalValue = this.data.useTotal; + } + var minAmount = new Ext.form.NumberField({ fieldLabel: t('coreshop_condition_amount_minAmount'), name: 'minAmount', @@ -54,9 +59,15 @@ coreshop.shippingrule.conditions.amount = Class.create(coreshop.rules.conditions value: grossValue }); + var useTotal = new Ext.form.Checkbox({ + fieldLabel: t('coreshop_condition_amount_use_total'), + name: 'useTotal', + value: useTotalValue + }); + this.form = Ext.create('Ext.form.Panel', { items: [ - minAmount, maxAmount, gross + minAmount, maxAmount, gross, useTotal ] }); diff --git a/src/CoreShop/Bundle/ShippingBundle/Resources/translations/admin.de.yml b/src/CoreShop/Bundle/ShippingBundle/Resources/translations/admin.de.yml index 272501cb69..435bf0c37b 100644 --- a/src/CoreShop/Bundle/ShippingBundle/Resources/translations/admin.de.yml +++ b/src/CoreShop/Bundle/ShippingBundle/Resources/translations/admin.de.yml @@ -31,6 +31,7 @@ coreshop_action_additionAmount: 'Aufschlag Menge' coreshop_action_additionPercent: 'Aufschlag Prozent' coreshop_shipping: 'Versand' coreshop_condition_amount_gross: 'Nutze Bruttowert' +coreshop_condition_amount_use_total: 'Nutze Gesamtbetrag' coreshop_shipping_tax_calc_strategy: 'Steuerberechnung' coreshop_shipping_tax_strategy_taxRule: 'Basierend auf Steuerregel' coreshop_shipping_tax_strategy_cartItems: 'Basierend auf Warenkorb-Artikeln' diff --git a/src/CoreShop/Bundle/ShippingBundle/Resources/translations/admin.en.yml b/src/CoreShop/Bundle/ShippingBundle/Resources/translations/admin.en.yml index 64ccf0b869..db4e1dcca3 100644 --- a/src/CoreShop/Bundle/ShippingBundle/Resources/translations/admin.en.yml +++ b/src/CoreShop/Bundle/ShippingBundle/Resources/translations/admin.en.yml @@ -30,6 +30,7 @@ coreshop_action_additionAmount: 'Addition Amount' coreshop_action_additionPercent: 'Addition Percent' coreshop_shipping: 'Shipping' coreshop_condition_amount_gross: 'Use Gross Value' +coreshop_condition_amount_use_total: 'Use Total Value' coreshop_shipping_tax_calc_strategy: 'Tax Calculation' coreshop_shipping_tax_strategy_taxRule: 'based on tax rule' coreshop_shipping_tax_strategy_cartItems: 'based on cart items' diff --git a/src/CoreShop/Component/Shipping/Model/ShippableInterface.php b/src/CoreShop/Component/Shipping/Model/ShippableInterface.php index f91c17b3b2..9490eb2f45 100644 --- a/src/CoreShop/Component/Shipping/Model/ShippableInterface.php +++ b/src/CoreShop/Component/Shipping/Model/ShippableInterface.php @@ -30,4 +30,8 @@ public function getWeight(): ?float; public function setWeight(?float $weight); public function getSubtotal(bool $withTax = true): int; + + public function getTotal(bool $withTax = true): int; + + public function getShipping(bool $withTax = true): int; } diff --git a/src/CoreShop/Component/Shipping/Rule/Condition/AmountConditionChecker.php b/src/CoreShop/Component/Shipping/Rule/Condition/AmountConditionChecker.php index 88269f31f2..08e17b09dd 100644 --- a/src/CoreShop/Component/Shipping/Rule/Condition/AmountConditionChecker.php +++ b/src/CoreShop/Component/Shipping/Rule/Condition/AmountConditionChecker.php @@ -19,7 +19,6 @@ namespace CoreShop\Component\Shipping\Rule\Condition; use CoreShop\Component\Address\Model\AddressInterface; -use CoreShop\Component\Order\Model\AdjustmentInterface; use CoreShop\Component\Shipping\Model\CarrierInterface; use CoreShop\Component\Shipping\Model\ShippableInterface; @@ -30,8 +29,18 @@ public function isShippingRuleValid(CarrierInterface $carrier, ShippableInterfac $minAmount = $configuration['minAmount']; $maxAmount = $configuration['maxAmount']; $gross = $configuration['gross'] ?? true; + $total = $configuration['useTotal'] ?? true; - $totalAmount = min(0, $shippable->getSubtotal($gross) - $shippable->getAdjustmentsTotal(AdjustmentInterface::SHIPPING)); + if ($total) { + $totalAmount = $shippable->getTotal($gross) - $shippable->getShipping($gross); + } + else { + $totalAmount = $shippable->getSubtotal($gross); + } + + if ($totalAmount < 0) { + $totalAmount = 0; + } if ($minAmount > 0) { if ($totalAmount < $minAmount) { From 7c936189d141d07b4968d1b8b9f11c83aed3b20a Mon Sep 17 00:00:00 2001 From: Dominik Pfaffenbauer Date: Tue, 11 Apr 2023 20:51:11 +0200 Subject: [PATCH 08/19] [Cache] disabling caching of StorageLists --- .../CoreShopStorageListExtension.php | 11 +++ .../EventListener/CacheListener.php | 84 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 src/CoreShop/Bundle/StorageListBundle/EventListener/CacheListener.php diff --git a/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/CoreShopStorageListExtension.php b/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/CoreShopStorageListExtension.php index 6b6711d144..393d84d5f6 100644 --- a/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/CoreShopStorageListExtension.php +++ b/src/CoreShop/Bundle/StorageListBundle/DependencyInjection/CoreShopStorageListExtension.php @@ -22,6 +22,7 @@ use CoreShop\Bundle\StorageListBundle\Core\EventListener\SessionStoreStorageListSubscriber; use CoreShop\Bundle\StorageListBundle\Core\EventListener\StorageListBlamerListener; use CoreShop\Bundle\StorageListBundle\DependencyInjection\Compiler\RegisterStorageListPass; +use CoreShop\Bundle\StorageListBundle\EventListener\CacheListener; use CoreShop\Bundle\StorageListBundle\EventListener\SessionSubscriber; use CoreShop\Component\Customer\Model\CustomerAwareInterface; use CoreShop\Component\StorageList\Context\CompositeStorageListContext; @@ -99,10 +100,20 @@ public function load(array $configs, ContainerBuilder $container): void new Reference($contextCompositeServiceName), $list['session']['key'], ]); + $sessionSubscriber->addTag('kernel.event_subscriber'); $container->setDefinition('coreshop.storage_list.session_subscriber.' . $name, $sessionSubscriber); + } + $cacheSubscriber = new Definition(CacheListener::class, [ + new Reference(PimcoreContextResolver::class), + new Reference($contextCompositeServiceName), + ]); + $cacheSubscriber->addTag('kernel.event_subscriber'); + + $container->setDefinition('coreshop.storage_list.cache_subscriber.' . $name, $cacheSubscriber); + if ($list['controller']['enabled']) { $class = $list['controller']['class']; diff --git a/src/CoreShop/Bundle/StorageListBundle/EventListener/CacheListener.php b/src/CoreShop/Bundle/StorageListBundle/EventListener/CacheListener.php new file mode 100644 index 0000000000..95548aaf16 --- /dev/null +++ b/src/CoreShop/Bundle/StorageListBundle/EventListener/CacheListener.php @@ -0,0 +1,84 @@ + ['onKernelResponse'], + ]; + } + + public function onKernelResponse(ResponseEvent $event): void + { + if ($this->pimcoreContext->matchesPimcoreContext($event->getRequest(), PimcoreContextResolver::CONTEXT_ADMIN)) { + return; + } + + if (!$event->isMainRequest()) { + return; + } + + if ($event->getRequest()->attributes->get('_route') === '_wdt') { + return; + } + + /** @var Request $request */ + $request = $event->getRequest(); + + if (!$request->hasSession()) { + return; + } + + try { + $list = $this->context->getStorageList(); + } catch (StorageListNotFoundException) { + return; + } + + if ($list->getId()) { + foreach ($list->getItems() as $item) { + if (!$item->getId()) { + continue; + } + + Cache::addIgnoredTagOnSave('object_'.$item->getId()); + } + + Cache::addIgnoredTagOnSave('object_'.$list->getId()); + } + } +} From 6e5a42ee728da40514bb80a842435b9a56b7d3ae Mon Sep 17 00:00:00 2001 From: Jan Walther Date: Thu, 13 Apr 2023 07:55:27 +0200 Subject: [PATCH 09/19] fix PhpStan error --- src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php index 13414b6828..15abea0b7b 100644 --- a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php +++ b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php @@ -70,7 +70,7 @@ public function generateSlugs(SluggableInterface $sluggable): void // $existingSlug is the slug to be saved from backend $dbSlug = null; if($sluggable instanceof Concrete) { - $dbSlug = $sluggable->retrieveSlugData(['fieldname' => 'slug', 'ownertype' => 'object', 'position' => $language, 'siteId' => $site->getId()])[0]['slug'] ?? null; + $dbSlug = $sluggable->retrieveSlugData(['fieldname' => 'slug', 'ownertype' => 'object', 'position' => $language, 'siteId' => $existingSlug->getSiteId()])[0]['slug'] ?? null; if ($dbSlug === null) { $dbSlug = $sluggable->retrieveSlugData(['fieldname' => 'slug', 'ownertype' => 'object', 'position' => $language])[0]['slug'] ?? null; // fallback slug } From 5521d3eb7d9c57e9cde2f019072869fe02920b61 Mon Sep 17 00:00:00 2001 From: Jan Walther Date: Thu, 13 Apr 2023 10:56:25 +0200 Subject: [PATCH 10/19] ignore "internal method" error --- src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php index 15abea0b7b..55ca0aad50 100644 --- a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php +++ b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php @@ -70,8 +70,10 @@ public function generateSlugs(SluggableInterface $sluggable): void // $existingSlug is the slug to be saved from backend $dbSlug = null; if($sluggable instanceof Concrete) { + /** @psalm-suppress InternalMethod */ $dbSlug = $sluggable->retrieveSlugData(['fieldname' => 'slug', 'ownertype' => 'object', 'position' => $language, 'siteId' => $existingSlug->getSiteId()])[0]['slug'] ?? null; if ($dbSlug === null) { + /** @psalm-suppress InternalMethod */ $dbSlug = $sluggable->retrieveSlugData(['fieldname' => 'slug', 'ownertype' => 'object', 'position' => $language])[0]['slug'] ?? null; // fallback slug } } From afe7cca5e903ca606d21ee2cba70d2fd65ca5fd7 Mon Sep 17 00:00:00 2001 From: Dominik Pfaffenbauer Date: Sat, 15 Apr 2023 10:12:34 +0200 Subject: [PATCH 11/19] [OrderBundle] remove transactional in CartManager to better deal with Deadlocks --- composer.json | 5 +- .../OrderBundle/Manager/CartManager.php | 78 +++++++++---------- .../OrderBundle/Resources/config/services.yml | 1 - .../Component/Order/Context/CartContext.php | 1 - 4 files changed, 42 insertions(+), 43 deletions(-) diff --git a/composer.json b/composer.json index 8ed090ce98..c1001fb135 100644 --- a/composer.json +++ b/composer.json @@ -161,6 +161,9 @@ } }, "config": { - "sort-packages": true + "sort-packages": true, + "allow-plugins": { + "phpstan/extension-installer": false + } } } diff --git a/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php b/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php index 56d994c3b4..5148f90814 100644 --- a/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php +++ b/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php @@ -26,7 +26,6 @@ use CoreShop\Component\Resource\Service\FolderCreationServiceInterface; use CoreShop\Component\StorageList\Model\StorageListInterface; use CoreShop\Component\StorageList\StorageListManagerInterface; -use Doctrine\DBAL\Connection; use Webmozart\Assert\Assert; final class CartManager implements CartManagerInterface, StorageListManagerInterface @@ -34,7 +33,6 @@ final class CartManager implements CartManagerInterface, StorageListManagerInter public function __construct( private CartProcessorInterface $cartProcessor, private FolderCreationServiceInterface $folderCreationService, - private Connection $connection, ) { } @@ -52,50 +50,50 @@ public function persistCart(OrderInterface $cart): void 'path' => 'cart', ]); - $this->connection->transactional(function () use ($cart, $cartsFolder) { - VersionHelper::useVersioning(function () use ($cart, $cartsFolder) { + VersionHelper::useVersioning(function () use ($cart, $cartsFolder) { + if (!$cart->getId()) { $tempItems = $cart->getItems(); - - if (!$cart->getId()) { - $cart->setItems([]); - - /** - * @psalm-suppress DocblockTypeContradiction - */ - if (!$cart->getParent()) { - $cart->setParent($cartsFolder); - } - - $cart->save(); - } + $cart->setItems([]); /** - * @var OrderItemInterface $item + * @psalm-suppress DocblockTypeContradiction */ - foreach ($tempItems as $index => $item) { - $item->setParent( - $this->folderCreationService->createFolderForResource( - $item, - ['prefix' => $cart->getFullPath()], - ), - ); - $item->setPublished(true); - $item->setKey($index + 1); - $item->save(); - } - - $cart->setItems($tempItems); - $this->cartProcessor->process($cart); - - /** - * @var OrderItemInterface $cartItem - */ - foreach ($cart->getItems() as $cartItem) { - $cartItem->save(); + if (!$cart->getParent()) { + $cart->setParent($cartsFolder); } $cart->save(); - }, false); - }); + $cart->setItems($tempItems); + } + + $items = array_values($cart->getObjectVar('items')); + + /** + * @var OrderItemInterface $item + */ + foreach ($items as $index => $item) { + $item->setParent( + $this->folderCreationService->createFolderForResource( + $item, + ['prefix' => $cart->getFullPath()], + ), + ); + //$item->setPath($cart->getFullPath()); + $item->setPublished(true); + $item->setKey((string)((int)$index + 1)); + $item->save(); + } + + $this->cartProcessor->process($cart); + + /** + * @var OrderItemInterface $cartItem + */ + foreach ($cart->getItems() as $cartItem) { + $cartItem->save(); + } + + $cart->save(); + }, false); } } diff --git a/src/CoreShop/Bundle/OrderBundle/Resources/config/services.yml b/src/CoreShop/Bundle/OrderBundle/Resources/config/services.yml index 8edd005b78..fa8ca7dc0e 100644 --- a/src/CoreShop/Bundle/OrderBundle/Resources/config/services.yml +++ b/src/CoreShop/Bundle/OrderBundle/Resources/config/services.yml @@ -31,7 +31,6 @@ services: arguments: - '@CoreShop\Component\Order\Processor\CartProcessorInterface' - '@CoreShop\Component\Resource\Service\FolderCreationServiceInterface' - - '@doctrine.dbal.default_connection' coreshop.cart_item.quantity_modifier: '@CoreShop\Component\StorageList\StorageListItemQuantityModifier' CoreShop\Component\StorageList\StorageListItemQuantityModifier: ~ diff --git a/src/CoreShop/Component/Order/Context/CartContext.php b/src/CoreShop/Component/Order/Context/CartContext.php index 790e894500..632068bd04 100644 --- a/src/CoreShop/Component/Order/Context/CartContext.php +++ b/src/CoreShop/Component/Order/Context/CartContext.php @@ -44,7 +44,6 @@ public function getCart(): OrderInterface * @var OrderInterface $cart */ $cart = $this->cartFactory->createNew(); - $cart->setKey(uniqid()); $cart->setPublished(true); $cart->setSaleState(OrderSaleStates::STATE_CART); $cart->setOrderState(OrderStates::STATE_INITIALIZED); From b8a501bd5f9f52ff9f5d32878861dd8480f88286 Mon Sep 17 00:00:00 2001 From: Sergiy Osipchuk Date: Tue, 18 Apr 2023 15:10:21 +0300 Subject: [PATCH 12/19] use shipping address of logged in customer for tax calculation --- .../Provider/ContextBasedDefaultTaxAddressProvider.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/CoreShop/Component/Core/Provider/ContextBasedDefaultTaxAddressProvider.php b/src/CoreShop/Component/Core/Provider/ContextBasedDefaultTaxAddressProvider.php index 288925e03c..1febc32429 100644 --- a/src/CoreShop/Component/Core/Provider/ContextBasedDefaultTaxAddressProvider.php +++ b/src/CoreShop/Component/Core/Provider/ContextBasedDefaultTaxAddressProvider.php @@ -20,6 +20,7 @@ use CoreShop\Component\Address\Context\CountryNotFoundException; use CoreShop\Component\Address\Model\AddressInterface; +use CoreShop\Component\Order\Model\OrderInterface; use CoreShop\Component\Resource\Factory\PimcoreFactoryInterface; class ContextBasedDefaultTaxAddressProvider implements DefaultTaxAddressProviderInterface @@ -31,6 +32,13 @@ public function __construct( public function getAddress(array $context = []): ?AddressInterface { + if (array_key_exists('cart', $context) && $context['cart'] instanceof OrderInterface) { + $shippingAddress = $context['cart']->getShippingAddress(); + if ( $shippingAddress instanceof AddressInterface ) { + return $shippingAddress; + } + } + $address = $this->addressFactory->createNew(); if (array_key_exists('country', $context)) { From bdb05b15c6f8d9c7ac2fd7fe6db2ac4249e7f395 Mon Sep 17 00:00:00 2001 From: Blackbit Date: Tue, 18 Apr 2023 14:33:04 +0200 Subject: [PATCH 13/19] Update ContextBasedDefaultTaxAddressProvider.php --- .../Core/Provider/ContextBasedDefaultTaxAddressProvider.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/CoreShop/Component/Core/Provider/ContextBasedDefaultTaxAddressProvider.php b/src/CoreShop/Component/Core/Provider/ContextBasedDefaultTaxAddressProvider.php index 1febc32429..d4679f0361 100644 --- a/src/CoreShop/Component/Core/Provider/ContextBasedDefaultTaxAddressProvider.php +++ b/src/CoreShop/Component/Core/Provider/ContextBasedDefaultTaxAddressProvider.php @@ -33,9 +33,9 @@ public function __construct( public function getAddress(array $context = []): ?AddressInterface { if (array_key_exists('cart', $context) && $context['cart'] instanceof OrderInterface) { - $shippingAddress = $context['cart']->getShippingAddress(); - if ( $shippingAddress instanceof AddressInterface ) { - return $shippingAddress; + $invoiceAddress = $context['cart']->getInvoiceAddress(); + if ( $invoiceAddress instanceof AddressInterface ) { + return $invoiceAddress; } } From 935a730a6435ce48bccf1426a2e4d76babd71f25 Mon Sep 17 00:00:00 2001 From: Dominik Pfaffenbauer Date: Wed, 19 Apr 2023 17:14:20 +0200 Subject: [PATCH 14/19] [Cache] array_values fallback to empty array if null --- src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php b/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php index 5148f90814..ba46cf6acc 100644 --- a/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php +++ b/src/CoreShop/Bundle/OrderBundle/Manager/CartManager.php @@ -66,7 +66,7 @@ public function persistCart(OrderInterface $cart): void $cart->setItems($tempItems); } - $items = array_values($cart->getObjectVar('items')); + $items = array_values($cart->getObjectVar('items') ?? []); /** * @var OrderItemInterface $item From e356026f09a50cd79ad36bd0006f238df4c1bed8 Mon Sep 17 00:00:00 2001 From: CoreShop Date: Mon, 24 Apr 2023 02:30:45 +0000 Subject: [PATCH 15/19] [CS] Refactor --- .../Behat/Context/Setup/CartPriceRuleContext.php | 1 - .../Migrations/Version20230418082816.php | 15 +++++++++++++++ .../ContextBasedDefaultTaxAddressProvider.php | 2 +- .../Condition/NotCombinableConditionChecker.php | 2 +- .../Pimcore/Slug/DataObjectSlugGenerator.php | 3 +-- .../Rule/Condition/AmountConditionChecker.php | 3 +-- 6 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/CoreShop/Behat/Context/Setup/CartPriceRuleContext.php b/src/CoreShop/Behat/Context/Setup/CartPriceRuleContext.php index e2f3f65399..e31745629e 100644 --- a/src/CoreShop/Behat/Context/Setup/CartPriceRuleContext.php +++ b/src/CoreShop/Behat/Context/Setup/CartPriceRuleContext.php @@ -119,7 +119,6 @@ public function addingACartPriceRule($ruleName): void $this->sharedStorage->set('cart-price-rule', $rule); } - /** * @Given /^the (cart rule "[^"]+") has priority "([^"]+)"$/ * @Given /^the (cart rule) has priority "([^"]+)"$/ diff --git a/src/CoreShop/Bundle/CoreBundle/Migrations/Version20230418082816.php b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20230418082816.php index 3932715f51..f68050521c 100644 --- a/src/CoreShop/Bundle/CoreBundle/Migrations/Version20230418082816.php +++ b/src/CoreShop/Bundle/CoreBundle/Migrations/Version20230418082816.php @@ -2,10 +2,25 @@ declare(strict_types=1); +/* + * CoreShop + * + * This source file is available under two different licenses: + * - GNU General Public License version 3 (GPLv3) + * - CoreShop Commercial License (CCL) + * Full copyright and license information is available in + * LICENSE.md which is distributed with this source code. + * + * @copyright Copyright (c) CoreShop GmbH (https://www.coreshop.org) + * @license https://www.coreshop.org/license GPLv3 and CCL + * + */ + namespace CoreShop\Bundle\CoreBundle\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; + final class Version20230418082816 extends AbstractMigration { public function getDescription(): string diff --git a/src/CoreShop/Component/Core/Provider/ContextBasedDefaultTaxAddressProvider.php b/src/CoreShop/Component/Core/Provider/ContextBasedDefaultTaxAddressProvider.php index d4679f0361..bebfaa5ab8 100644 --- a/src/CoreShop/Component/Core/Provider/ContextBasedDefaultTaxAddressProvider.php +++ b/src/CoreShop/Component/Core/Provider/ContextBasedDefaultTaxAddressProvider.php @@ -34,7 +34,7 @@ public function getAddress(array $context = []): ?AddressInterface { if (array_key_exists('cart', $context) && $context['cart'] instanceof OrderInterface) { $invoiceAddress = $context['cart']->getInvoiceAddress(); - if ( $invoiceAddress instanceof AddressInterface ) { + if ($invoiceAddress instanceof AddressInterface) { return $invoiceAddress; } } diff --git a/src/CoreShop/Component/Order/Cart/Rule/Condition/NotCombinableConditionChecker.php b/src/CoreShop/Component/Order/Cart/Rule/Condition/NotCombinableConditionChecker.php index a8e736214a..31efc8d7de 100644 --- a/src/CoreShop/Component/Order/Cart/Rule/Condition/NotCombinableConditionChecker.php +++ b/src/CoreShop/Component/Order/Cart/Rule/Condition/NotCombinableConditionChecker.php @@ -29,7 +29,7 @@ public function isCartRuleValid( OrderInterface $cart, CartPriceRuleInterface $cartPriceRule, ?CartPriceRuleVoucherCodeInterface $voucher, - array $configuration + array $configuration, ): bool { if (!$cart->hasPriceRules()) { return true; diff --git a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php index 55ca0aad50..9100f39ee0 100644 --- a/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php +++ b/src/CoreShop/Component/Pimcore/Slug/DataObjectSlugGenerator.php @@ -19,7 +19,6 @@ namespace CoreShop\Component\Pimcore\Slug; use CoreShop\Component\Pimcore\DataObject\InheritanceHelper; -use Pimcore\Model\DataObject\AbstractObject; use Pimcore\Model\DataObject\Concrete; use Pimcore\Model\DataObject\Data\UrlSlug; use Pimcore\Model\Site; @@ -69,7 +68,7 @@ public function generateSlugs(SluggableInterface $sluggable): void } else { // $existingSlug is the slug to be saved from backend $dbSlug = null; - if($sluggable instanceof Concrete) { + if ($sluggable instanceof Concrete) { /** @psalm-suppress InternalMethod */ $dbSlug = $sluggable->retrieveSlugData(['fieldname' => 'slug', 'ownertype' => 'object', 'position' => $language, 'siteId' => $existingSlug->getSiteId()])[0]['slug'] ?? null; if ($dbSlug === null) { diff --git a/src/CoreShop/Component/Shipping/Rule/Condition/AmountConditionChecker.php b/src/CoreShop/Component/Shipping/Rule/Condition/AmountConditionChecker.php index 08e17b09dd..012dba4f41 100644 --- a/src/CoreShop/Component/Shipping/Rule/Condition/AmountConditionChecker.php +++ b/src/CoreShop/Component/Shipping/Rule/Condition/AmountConditionChecker.php @@ -33,8 +33,7 @@ public function isShippingRuleValid(CarrierInterface $carrier, ShippableInterfac if ($total) { $totalAmount = $shippable->getTotal($gross) - $shippable->getShipping($gross); - } - else { + } else { $totalAmount = $shippable->getSubtotal($gross); } From ebfc4629fd0a3e40676350a12a0507288f1ea59a Mon Sep 17 00:00:00 2001 From: Dominik Pfaffenbauer Date: Mon, 24 Apr 2023 09:31:33 +0200 Subject: [PATCH 16/19] [Order] don't add CartItemPriceRule if not applicable --- .../Order/Cart/Rule/Action/CartItemActionProcessor.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/CoreShop/Component/Order/Cart/Rule/Action/CartItemActionProcessor.php b/src/CoreShop/Component/Order/Cart/Rule/Action/CartItemActionProcessor.php index 24bfef7e86..e92d5072de 100644 --- a/src/CoreShop/Component/Order/Cart/Rule/Action/CartItemActionProcessor.php +++ b/src/CoreShop/Component/Order/Cart/Rule/Action/CartItemActionProcessor.php @@ -95,8 +95,7 @@ public function applyRule(OrderInterface $cart, array $configuration, PriceRuleI if (!$result) { $item->removePriceRule($priceRuleItem); } - - if (!$existingPriceRule) { + else if (!$existingPriceRule) { $item->addPriceRule($priceRuleItem); } From 5ba3424c45fc02db735935597ae4801d3a0746d4 Mon Sep 17 00:00:00 2001 From: Dominik Pfaffenbauer Date: Tue, 25 Apr 2023 13:11:49 +0200 Subject: [PATCH 17/19] Update docs --- docs/00_Overview/00_CoreShop_Ecosystem.md | 9 - docs/00_Overview/index.md | 1 - .../00_Installation.md | 1 - .../01_Architecture_Overview.md | 0 .../02_Upgrade_Notes.md | 0 .../04_Difference_to_ecommerce_Framework.md | 0 .../img/architecture.png | Bin .../index.md | 0 docs/02_Bundles/Address_Bundle.md | 66 +- docs/02_Bundles/Configuration_Bundle.md | 11 + docs/02_Bundles/Core_Bundle.md | 12 +- docs/02_Bundles/Frontend_Bundle.md | 5 + docs/02_Bundles/Inventory_Bundle.md | 7 +- docs/02_Bundles/Locale_Bundle.md | 7 +- docs/02_Bundles/Messenger_Bundle.md | 26 + docs/02_Bundles/Notification_Bundle.md | 15 +- .../02_Bundles/OptimisticEntityLock_Bundle.md | 33 + docs/02_Bundles/Order_Bundle.md | 75 +- docs/02_Bundles/PayumPayment_Bundle.md | 3 + docs/02_Bundles/Payum_Bundle.md | 7 +- docs/02_Bundles/Pimcore_Bundle.md | 155 +++- .../ProductQuantityPriceRules_Bundle.md | 5 + docs/02_Bundles/Product_Bundle.md | 67 +- .../Product_Quantity_Price_Rules_Bundle.md | 6 - docs/02_Bundles/Rule_Bundle.md | 9 +- docs/02_Bundles/Shipping_Bundle.md | 51 +- .../StorageList_Bundle.md} | 16 +- docs/02_Bundles/Store_Bundle.md | 45 +- docs/02_Bundles/Taxation_Bundle.md | 61 +- docs/02_Bundles/Theme_Bundle.md | 80 ++ docs/02_Bundles/User_Bundle.md | 5 + docs/02_Bundles/Variant_Bundle.md | 63 ++ docs/02_Bundles/Wishlist_Bundle.md | 5 + docs/02_Bundles/Workflow_Bundle.md | 7 +- docs/02_Bundles/img/embedded_class_data.png | Bin 110858 -> 0 bytes docs/02_Bundles/img/embedded_class_tag.png | Bin 127914 -> 0 bytes docs/02_Bundles/img/messenger.png | Bin 0 -> 59455 bytes docs/02_Bundles/index.md | 16 +- docs/02_Components/Address_Component.md | 3 - docs/02_Components/Configuration_Component.md | 10 - docs/02_Components/Core_Component.md | 3 - docs/02_Components/Currency_Component.md | 3 - docs/02_Components/Customer_Component.md | 3 - docs/02_Components/Index_Component.md | 3 - docs/02_Components/Inventory_Component.md | 3 - docs/02_Components/Locale_Component.md | 3 - docs/02_Components/Notification_Component.md | 3 - docs/02_Components/Order_Component.md | 3 - docs/02_Components/Payment_Component.md | 3 - docs/02_Components/Pimcore_Component.md | 216 ------ docs/02_Components/Product_Component.md | 3 - .../Product_Quantity_Price_Rules_Component.md | 3 - docs/02_Components/Registry_Component.md | 3 - docs/02_Components/Resource_Component.md | 3 - docs/02_Components/Rule_Component.md | 8 - docs/02_Components/SEO_Component.md | 3 - docs/02_Components/Sequence_Component.md | 3 - docs/02_Components/Shipping_Component.md | 3 - docs/02_Components/Store_Component.md | 3 - docs/02_Components/Taxation_Component.md | 3 - docs/02_Components/Tracking_Component.md | 3 - docs/02_Components/index.md | 26 - docs/02_User_Documentation/01_Stores.md | 2 +- .../03_Price_Rules/01_Cart_Price_Rules.md | 5 +- .../03_Price_Rules/02_Product_Price_Rules.md | 4 +- .../03_Price_Rules/03_Specific_Price_Rules.md | 5 +- .../03_Price_Rules/04_Quantity_Price_Rules.md | 9 +- .../05_Shipping/01_Carriers.md | 25 +- .../05_Shipping/02_Shipping_Rules.md | 54 +- .../05_Shipping/index.md | 27 +- .../07_Catalog/01_Products.md | 4 +- .../07_Catalog/02_Product_Variants.md | 4 +- .../07_Catalog/03_Categories.md | 4 +- .../01_Currencies/02_Exchange_Rates.md | 3 - .../02_Localization/01_Currencies/index.md | 1 - .../03_Products/06_Units.md} | 2 +- ..._Definitions.md => 07_Unit_Definitions.md} | 0 docs/03_Development/03_Products/index.md | 3 +- .../04_Cart/03_Cart_Modifier.md | 2 +- .../06_Order/07_Quote/01_Quote_Creation.md | 1 - .../06_Order/07_Quote/02_Transformer.md | 1 - .../06_Order/07_Quote/03_Configuration.md | 1 - .../06_Order/07_Quote/04_Extend_Quote.md | 1 - .../03_Development/06_Order/07_Quote/index.md | 1 - docs/03_Development/06_Order/index.md | 1 - docs/config.json | 60 +- docs/generate-docs-local.sh | 1 - .../Bundles/Address_Bundle.html | 166 +++++ .../Bundles/Configuration_Bundle.html | 167 +++++ docs/generated-docs/Bundles/Core_Bundle.html | 161 ++++ .../Bundles/Currency_Bundle.html | 208 ++++++ .../Bundles/Customer_Bundle.html | 190 +++++ .../Bundles/Fixture_Bundle.html | 246 ++++++ .../Bundles/Frontend_Bundle.html | 161 ++++ docs/generated-docs/Bundles/Index_Bundle.html | 199 +++++ .../Bundles/Inventory_Bundle.html | 161 ++++ .../generated-docs/Bundles/Locale_Bundle.html | 161 ++++ docs/generated-docs/Bundles/Menu_Bundle.html | 225 ++++++ .../Bundles/Messenger_Bundle.html | 175 +++++ docs/generated-docs/Bundles/Money_Bundle.html | 178 +++++ .../Bundles/Notification_Bundle.html | 170 +++++ .../Bundles/OptimisticEntityLock_Bundle.html | 179 +++++ docs/generated-docs/Bundles/Order_Bundle.html | 161 ++++ .../Bundles/Payment_Bundle.html | 192 +++++ .../Bundles/PayumPayment_Bundle.html | 158 ++++ docs/generated-docs/Bundles/Payum_Bundle.html | 161 ++++ .../Bundles/Pimcore_Bundle.html | 422 +++++++++++ .../ProductQuantityPriceRules_Bundle.html | 161 ++++ .../Bundles/Product_Bundle.html | 161 ++++ .../Resource_Bundle/CustomEntities.html | 446 +++++++++++ .../Bundles/Resource_Bundle/Installation.html | 221 ++++++ .../Resource_Bundle/PimcoreEntities.html | 261 +++++++ .../Bundles/Resource_Bundle/index.html | 181 +++++ docs/generated-docs/Bundles/Rule_Bundle.html | 165 ++++ docs/generated-docs/Bundles/SEO_Bundle.html | 237 ++++++ .../Bundles/Sequence_Bundle.html | 189 +++++ .../Bundles/Shipping_Bundle.html | 161 ++++ .../Bundles/StorageList_Bundle.html | 215 ++++++ docs/generated-docs/Bundles/Store_Bundle.html | 161 ++++ .../Bundles/Taxation_Bundle.html | 161 ++++ docs/generated-docs/Bundles/Theme_Bundle.html | 218 ++++++ .../Bundles/Tracking_Bundle.html | 162 ++++ docs/generated-docs/Bundles/User_Bundle.html | 161 ++++ .../Bundles/Variant_Bundle.html | 218 ++++++ .../Bundles/Wishlist_Bundle.html | 161 ++++ .../Bundles/Workflow_Bundle.html | 161 ++++ docs/generated-docs/Bundles/index.html | 257 +++++++ .../generated-docs/Development/Cart/CRUD.html | 203 +++++ .../Development/Cart/Cart_Manager.html | 163 ++++ .../Development/Cart/Cart_Modifier.html | 166 +++++ .../Development/Cart/Cart_Processor.html | 212 ++++++ .../Development/Cart/Commands.html | 178 +++++ .../Development/Cart/Context.html | 202 +++++ .../Development/Cart/index.html | 181 +++++ .../Checkout/Checkout_Manager.html | 208 ++++++ .../Development/Checkout/Checkout_Step.html | 268 +++++++ .../Development/Checkout/index.html | 166 +++++ .../Development/Currency_Fractions/index.html | 192 +++++ .../Development/Customers/CRUD.html | 203 +++++ .../Customers/Company_Extension.html | 188 +++++ .../Development/Customers/Context.html | 169 +++++ .../Customers/Customer_Manager.html | 189 +++++ .../Customers/Registration_Types.html | 182 +++++ .../Development/Customers/index.html | 175 +++++ .../Development/Ecommerce_Tracking/index.html | 305 ++++++++ .../Development/Events/index.html | 544 ++++++++++++++ .../Extend_CoreShop_DataObjects.html | 169 +++++ .../Extend_CoreShop_Forms.html | 245 ++++++ .../Extend_CoreShop_Resources.html | 263 +++++++ .../Extending_Rule_Actions.html | 283 +++++++ .../Extending_Rule_Conditions.html | 280 +++++++ .../Filter/Custom_Filter.html | 219 ++++++ .../Index_and_Filters/Filter/index.html | 227 ++++++ .../Index_and_Filters/Index/Extension.html | 167 +++++ .../Index_and_Filters/Index/Interpreter.html | 224 ++++++ .../Index_and_Filters/Index/index.html | 213 ++++++ .../Development/Index_and_Filters/index.html | 166 +++++ .../Development/Inventory/index.html | 169 +++++ .../Localization/Countries/CRUD.html | 200 +++++ .../Localization/Countries/Context.html | 283 +++++++ .../Localization/Countries/index.html | 168 +++++ .../Localization/Currencies/CRUD.html | 200 +++++ .../Localization/Currencies/Context.html | 194 +++++ .../Localization/Currencies/index.html | 168 +++++ .../Development/Localization/States/CRUD.html | 200 +++++ .../Localization/States/index.html | 162 ++++ .../Localization/Taxes/Tax_Rate/CRUD.html | 200 +++++ .../Localization/Taxes/Tax_Rate/index.html | 165 ++++ .../Localization/Taxes/Tax_Rule/CRUD.html | 200 +++++ .../Taxes/Tax_Rule/Tax_Factory.html | 156 ++++ .../Localization/Taxes/Tax_Rule/index.html | 165 ++++ .../Development/Localization/Taxes/index.html | 168 +++++ .../Development/Localization/Zones/CRUD.html | 200 +++++ .../Development/Localization/Zones/index.html | 162 ++++ .../Development/Localization/index.html | 175 +++++ .../Notification_Rules/Custom_Actions.html | 162 ++++ .../Notification_Rules/Custom_Conditions.html | 162 ++++ .../Notification_Rules/Custom_Types.html | 166 +++++ .../Notification_Rules/Triggering.html | 173 +++++ .../Development/Notification_Rules/index.html | 703 ++++++++++++++++++ .../Development/Order/AdditionalData.html | 289 +++++++ .../Order/Invoice/Invoice_Creation.html | 178 +++++ .../Development/Order/Invoice/index.html | 158 ++++ .../Development/Order/OrderList/Action.html | 250 +++++++ .../Development/Order/OrderList/Filter.html | 203 +++++ .../Development/Order/Order_Creation.html | 164 ++++ .../Development/Order/Order_Workflow.html | 158 ++++ .../Development/Order/Purchasable.html | 210 ++++++ .../Order/Shipment/Shipment_Creation.html | 178 +++++ .../Development/Order/Shipment/index.html | 158 ++++ .../Development/Order/TemplateHelper.html | 161 ++++ .../Development/Order/Transformer.html | 201 +++++ .../Development/Order/index.html | 190 +++++ .../Development/Payment/Omnipay_Bridge.html | 282 +++++++ .../Development/Payment/Payment_Provider.html | 261 +++++++ .../Development/Payment/Payum_Providers.html | 158 ++++ .../Development/Payment/index.html | 246 ++++++ .../Development/Products/CRUD.html | 203 +++++ .../Development/Products/Configuration.html | 169 +++++ .../Multiple_Product_DataObjects.html | 295 ++++++++ .../Products/Price_Calculation.html | 255 +++++++ .../Products/Price_Rules/index.html | 202 +++++ .../Products/Unit_Definitions.html | 211 ++++++ .../Development/Products/Units.html | 185 +++++ .../Development/Products/index.html | 181 +++++ .../generated-docs/Development/SEO/index.html | 162 ++++ .../Development/Shipping/Carrier/CRUD.html | 200 +++++ .../Shipping/Carrier/Carrier_Discovery.html | 159 ++++ .../Shipping/Carrier/Price_Calculation.html | 162 ++++ .../Development/Shipping/Carrier/index.html | 169 +++++ .../Shipping/Shipping_Rules/index.html | 194 +++++ .../Development/Shipping/index.html | 166 +++++ .../State_Machine/Available_Workflows.html | 635 ++++++++++++++++ .../State_Machine/Create_Callbacks.html | 282 +++++++ .../State_Machine/Extend_Workflows.html | 262 +++++++ .../State_Machine/Things_To_Know.html | 180 +++++ .../Development/State_Machine/index.html | 212 ++++++ .../Development/Store_Front/Controllers.html | 198 +++++ .../Development/Store_Front/index.html | 164 ++++ .../Development/Stores/CRUD.html | 200 +++++ .../Development/Stores/Context.html | 266 +++++++ .../Development/Stores/Theme.html | 159 ++++ .../Development/Stores/index.html | 169 +++++ docs/generated-docs/Development/index.html | 192 +++++ .../Architecture_Overview.html | 189 +++++ .../Difference_to_ecommerce_Framework.html | 501 +++++++++++++ .../Getting_Started/Installation.html | 179 +++++ .../Getting_Started/Upgrade_Notes.html | 444 +++++++++++ .../generated-docs/Getting_Started/index.html | 178 +++++ .../User_Documentation/Automation/index.html | 194 +++++ .../User_Documentation/Cart/index.html | 169 +++++ .../Catalog/Categories.html | 158 ++++ .../Catalog/Product_Variants.html | 158 ++++ .../User_Documentation/Catalog/Products.html | 158 ++++ .../User_Documentation/Catalog/index.html | 168 +++++ .../User_Documentation/Geo_IP.html | 158 ++++ .../User_Documentation/Inventory/index.html | 201 +++++ .../Localization/Countries.html | 168 +++++ .../Localization/Currencies.html | 178 +++++ .../Localization/States.html | 165 ++++ .../Localization/TaxRules.html | 166 +++++ .../Localization/Taxes.html | 165 ++++ .../Localization/Zones.html | 164 ++++ .../Localization/index.html | 177 +++++ .../Order/Order_Comments.html | 164 ++++ .../Order/Order_Detail.html | 310 ++++++++ .../Order/Order_Workflow.html | 220 ++++++ .../User_Documentation/Order/Orders.html | 170 +++++ .../User_Documentation/Order/index.html | 171 +++++ .../Price_Rules/Actions.html | 291 ++++++++ .../Price_Rules/Cart_Price_Rules.html | 216 ++++++ .../Price_Rules/Conditions.html | 435 +++++++++++ .../Price_Rules/Product_Price_Rules.html | 210 ++++++ .../Price_Rules/Quantity_Price_Rules.html | 186 +++++ .../Price_Rules/Specific_Price_Rules.html | 201 +++++ .../Price_Rules/Vouchers.html | 264 +++++++ .../User_Documentation/Price_Rules/index.html | 213 ++++++ .../Reports/Abandoned_Carts.html | 257 +++++++ .../Reports/Carrier_Distribution.html | 221 ++++++ .../User_Documentation/Reports/Carts.html | 238 ++++++ .../Reports/Categories.html | 250 +++++++ .../User_Documentation/Reports/Customers.html | 242 ++++++ .../Reports/Payment_Distribution.html | 221 ++++++ .../User_Documentation/Reports/Products.html | 281 +++++++ .../User_Documentation/Reports/Sales.html | 242 ++++++ .../User_Documentation/Reports/Vouchers.html | 245 ++++++ .../User_Documentation/Reports/index.html | 186 +++++ .../User_Documentation/Settings.html | 230 ++++++ .../User_Documentation/Shipping/Carriers.html | 176 +++++ .../Shipping/Shipping_Rules.html | 201 +++++ .../User_Documentation/Shipping/index.html | 166 +++++ .../User_Documentation/Stores.html | 180 +++++ .../User_Documentation/index.html | 298 ++++++++ .../Bundles/Address_Bundle.html | 166 +++++ .../Bundles/Configuration_Bundle.html | 167 +++++ .../generated_docs/Bundles/Core_Bundle.html | 161 ++++ .../Bundles/Currency_Bundle.html | 208 ++++++ .../Bundles/Customer_Bundle.html | 190 +++++ .../Bundles/Fixture_Bundle.html | 246 ++++++ .../Bundles/Frontend_Bundle.html | 161 ++++ .../generated_docs/Bundles/Index_Bundle.html | 199 +++++ .../Bundles/Inventory_Bundle.html | 161 ++++ .../generated_docs/Bundles/Locale_Bundle.html | 161 ++++ .../generated_docs/Bundles/Menu_Bundle.html | 225 ++++++ .../Bundles/Messenger_Bundle.html | 175 +++++ .../generated_docs/Bundles/Money_Bundle.html | 178 +++++ .../Bundles/Notification_Bundle.html | 170 +++++ .../Bundles/OptimisticEntityLock_Bundle.html | 179 +++++ .../generated_docs/Bundles/Order_Bundle.html | 161 ++++ .../Bundles/Payment_Bundle.html | 192 +++++ .../Bundles/PayumPayment_Bundle.html | 158 ++++ .../generated_docs/Bundles/Payum_Bundle.html | 161 ++++ .../Bundles/Pimcore_Bundle.html | 422 +++++++++++ .../ProductQuantityPriceRules_Bundle.html | 161 ++++ .../Bundles/Product_Bundle.html | 161 ++++ .../Resource_Bundle/CustomEntities.html | 446 +++++++++++ .../Bundles/Resource_Bundle/Installation.html | 221 ++++++ .../Resource_Bundle/PimcoreEntities.html | 261 +++++++ .../Bundles/Resource_Bundle/index.html | 181 +++++ .../generated_docs/Bundles/Rule_Bundle.html | 165 ++++ .../generated_docs/Bundles/SEO_Bundle.html | 237 ++++++ .../Bundles/Sequence_Bundle.html | 189 +++++ .../Bundles/Shipping_Bundle.html | 161 ++++ .../Bundles/StorageList_Bundle.html | 215 ++++++ .../generated_docs/Bundles/Store_Bundle.html | 161 ++++ .../Bundles/Taxation_Bundle.html | 161 ++++ .../generated_docs/Bundles/Theme_Bundle.html | 218 ++++++ .../Bundles/Tracking_Bundle.html | 162 ++++ .../generated_docs/Bundles/User_Bundle.html | 161 ++++ .../Bundles/Variant_Bundle.html | 218 ++++++ .../Bundles/Wishlist_Bundle.html | 161 ++++ .../Bundles/Workflow_Bundle.html | 161 ++++ .../generated_docs/Bundles/index.html | 257 +++++++ .../generated_docs/Development/Cart/CRUD.html | 203 +++++ .../Development/Cart/Cart_Manager.html | 163 ++++ .../Development/Cart/Cart_Modifier.html | 166 +++++ .../Development/Cart/Cart_Processor.html | 212 ++++++ .../Development/Cart/Commands.html | 178 +++++ .../Development/Cart/Context.html | 202 +++++ .../Development/Cart/index.html | 181 +++++ .../Checkout/Checkout_Manager.html | 208 ++++++ .../Development/Checkout/Checkout_Step.html | 268 +++++++ .../Development/Checkout/index.html | 166 +++++ .../Development/Currency_Fractions/index.html | 192 +++++ .../Development/Customers/CRUD.html | 203 +++++ .../Customers/Company_Extension.html | 188 +++++ .../Development/Customers/Context.html | 169 +++++ .../Customers/Customer_Manager.html | 189 +++++ .../Customers/Registration_Types.html | 182 +++++ .../Development/Customers/index.html | 175 +++++ .../Development/Ecommerce_Tracking/index.html | 305 ++++++++ .../Development/Events/index.html | 544 ++++++++++++++ .../Extend_CoreShop_DataObjects.html | 169 +++++ .../Extend_CoreShop_Forms.html | 245 ++++++ .../Extend_CoreShop_Resources.html | 263 +++++++ .../Extending_Rule_Actions.html | 283 +++++++ .../Extending_Rule_Conditions.html | 280 +++++++ .../Filter/Custom_Filter.html | 219 ++++++ .../Index_and_Filters/Filter/index.html | 227 ++++++ .../Index_and_Filters/Index/Extension.html | 167 +++++ .../Index_and_Filters/Index/Interpreter.html | 224 ++++++ .../Index_and_Filters/Index/index.html | 213 ++++++ .../Development/Index_and_Filters/index.html | 166 +++++ .../Development/Inventory/index.html | 169 +++++ .../Localization/Countries/CRUD.html | 200 +++++ .../Localization/Countries/Context.html | 283 +++++++ .../Localization/Countries/index.html | 168 +++++ .../Localization/Currencies/CRUD.html | 200 +++++ .../Localization/Currencies/Context.html | 194 +++++ .../Localization/Currencies/index.html | 168 +++++ .../Development/Localization/States/CRUD.html | 200 +++++ .../Localization/States/index.html | 162 ++++ .../Localization/Taxes/Tax_Rate/CRUD.html | 200 +++++ .../Localization/Taxes/Tax_Rate/index.html | 165 ++++ .../Localization/Taxes/Tax_Rule/CRUD.html | 200 +++++ .../Taxes/Tax_Rule/Tax_Factory.html | 156 ++++ .../Localization/Taxes/Tax_Rule/index.html | 165 ++++ .../Development/Localization/Taxes/index.html | 168 +++++ .../Development/Localization/Zones/CRUD.html | 200 +++++ .../Development/Localization/Zones/index.html | 162 ++++ .../Development/Localization/index.html | 175 +++++ .../Notification_Rules/Custom_Actions.html | 162 ++++ .../Notification_Rules/Custom_Conditions.html | 162 ++++ .../Notification_Rules/Custom_Types.html | 166 +++++ .../Notification_Rules/Triggering.html | 173 +++++ .../Development/Notification_Rules/index.html | 703 ++++++++++++++++++ .../Development/Order/AdditionalData.html | 289 +++++++ .../Order/Invoice/Invoice_Creation.html | 178 +++++ .../Development/Order/Invoice/index.html | 158 ++++ .../Development/Order/OrderList/Action.html | 250 +++++++ .../Development/Order/OrderList/Filter.html | 203 +++++ .../Development/Order/Order_Creation.html | 164 ++++ .../Development/Order/Order_Workflow.html | 158 ++++ .../Development/Order/Purchasable.html | 210 ++++++ .../Order/Shipment/Shipment_Creation.html | 178 +++++ .../Development/Order/Shipment/index.html | 158 ++++ .../Development/Order/TemplateHelper.html | 161 ++++ .../Development/Order/Transformer.html | 201 +++++ .../Development/Order/index.html | 190 +++++ .../Development/Payment/Omnipay_Bridge.html | 282 +++++++ .../Development/Payment/Payment_Provider.html | 261 +++++++ .../Development/Payment/Payum_Providers.html | 158 ++++ .../Development/Payment/index.html | 246 ++++++ .../Development/Products/CRUD.html | 203 +++++ .../Development/Products/Configuration.html | 169 +++++ .../Multiple_Product_DataObjects.html | 295 ++++++++ .../Products/Price_Calculation.html | 255 +++++++ .../Products/Price_Rules/index.html | 202 +++++ .../Products/Unit_Definitions.html | 211 ++++++ .../Development/Products/Units.html | 185 +++++ .../Development/Products/index.html | 181 +++++ .../generated_docs/Development/SEO/index.html | 162 ++++ .../Development/Shipping/Carrier/CRUD.html | 200 +++++ .../Shipping/Carrier/Carrier_Discovery.html | 159 ++++ .../Shipping/Carrier/Price_Calculation.html | 162 ++++ .../Development/Shipping/Carrier/index.html | 169 +++++ .../Shipping/Shipping_Rules/index.html | 194 +++++ .../Development/Shipping/index.html | 166 +++++ .../State_Machine/Available_Workflows.html | 635 ++++++++++++++++ .../State_Machine/Create_Callbacks.html | 282 +++++++ .../State_Machine/Extend_Workflows.html | 262 +++++++ .../State_Machine/Things_To_Know.html | 180 +++++ .../Development/State_Machine/index.html | 212 ++++++ .../Development/Store_Front/Controllers.html | 198 +++++ .../Development/Store_Front/index.html | 164 ++++ .../Development/Stores/CRUD.html | 200 +++++ .../Development/Stores/Context.html | 266 +++++++ .../Development/Stores/Theme.html | 159 ++++ .../Development/Stores/index.html | 169 +++++ .../generated_docs/Development/index.html | 192 +++++ .../Architecture_Overview.html | 189 +++++ .../Difference_to_ecommerce_Framework.html | 501 +++++++++++++ .../Getting_Started/Installation.html | 179 +++++ .../Getting_Started/Upgrade_Notes.html | 444 +++++++++++ .../generated_docs/Getting_Started/index.html | 178 +++++ .../User_Documentation/Automation/index.html | 194 +++++ .../User_Documentation/Cart/index.html | 169 +++++ .../Catalog/Categories.html | 158 ++++ .../Catalog/Product_Variants.html | 158 ++++ .../User_Documentation/Catalog/Products.html | 158 ++++ .../User_Documentation/Catalog/index.html | 168 +++++ .../User_Documentation/Geo_IP.html | 158 ++++ .../User_Documentation/Inventory/index.html | 201 +++++ .../Localization/Countries.html | 168 +++++ .../Localization/Currencies.html | 178 +++++ .../Localization/States.html | 165 ++++ .../Localization/TaxRules.html | 166 +++++ .../Localization/Taxes.html | 165 ++++ .../Localization/Zones.html | 164 ++++ .../Localization/index.html | 177 +++++ .../Order/Order_Comments.html | 164 ++++ .../Order/Order_Detail.html | 310 ++++++++ .../Order/Order_Workflow.html | 220 ++++++ .../User_Documentation/Order/Orders.html | 170 +++++ .../User_Documentation/Order/index.html | 171 +++++ .../Price_Rules/Actions.html | 291 ++++++++ .../Price_Rules/Cart_Price_Rules.html | 216 ++++++ .../Price_Rules/Conditions.html | 435 +++++++++++ .../Price_Rules/Product_Price_Rules.html | 210 ++++++ .../Price_Rules/Quantity_Price_Rules.html | 186 +++++ .../Price_Rules/Specific_Price_Rules.html | 201 +++++ .../Price_Rules/Vouchers.html | 264 +++++++ .../User_Documentation/Price_Rules/index.html | 213 ++++++ .../Reports/Abandoned_Carts.html | 257 +++++++ .../Reports/Carrier_Distribution.html | 221 ++++++ .../User_Documentation/Reports/Carts.html | 238 ++++++ .../Reports/Categories.html | 250 +++++++ .../User_Documentation/Reports/Customers.html | 242 ++++++ .../Reports/Payment_Distribution.html | 221 ++++++ .../User_Documentation/Reports/Products.html | 281 +++++++ .../User_Documentation/Reports/Sales.html | 242 ++++++ .../User_Documentation/Reports/Vouchers.html | 245 ++++++ .../User_Documentation/Reports/index.html | 186 +++++ .../User_Documentation/Settings.html | 230 ++++++ .../User_Documentation/Shipping/Carriers.html | 176 +++++ .../Shipping/Shipping_Rules.html | 201 +++++ .../User_Documentation/Shipping/index.html | 166 +++++ .../User_Documentation/Stores.html | 180 +++++ .../User_Documentation/index.html | 298 ++++++++ docs/generated-docs/generated_docs/index.html | 193 +++++ docs/generated-docs/index.html | 193 +++++ .../generated-docs/themes/pimcore/config.json | 22 + .../themes/pimcore/css/pimcore-core.min.css | 5 + .../pimcore/css/pimcore-generic.min.css | 5 + .../themes/pimcore/fonts/robotoslab-bold.eot | Bin 0 -> 39370 bytes .../themes/pimcore/fonts/robotoslab-bold.svg | 688 +++++++++++++++++ .../themes/pimcore/fonts/robotoslab-bold.ttf | Bin 0 -> 39120 bytes .../themes/pimcore/fonts/robotoslab-bold.woff | Bin 0 -> 23812 bytes .../pimcore/fonts/robotoslab-bold.woff2 | Bin 0 -> 18720 bytes .../themes/pimcore/fonts/robotoslab-light.eot | Bin 0 -> 40646 bytes .../themes/pimcore/fonts/robotoslab-light.svg | 687 +++++++++++++++++ .../themes/pimcore/fonts/robotoslab-light.ttf | Bin 0 -> 40392 bytes .../pimcore/fonts/robotoslab-light.woff | Bin 0 -> 24224 bytes .../pimcore/fonts/robotoslab-light.woff2 | Bin 0 -> 19112 bytes .../pimcore/fonts/robotoslab-regular.eot | Bin 0 -> 39066 bytes .../pimcore/fonts/robotoslab-regular.svg | 687 +++++++++++++++++ .../pimcore/fonts/robotoslab-regular.ttf | Bin 0 -> 38804 bytes .../pimcore/fonts/robotoslab-regular.woff | Bin 0 -> 23624 bytes .../pimcore/fonts/robotoslab-regular.woff2 | Bin 0 -> 18620 bytes .../themes/pimcore/img/favicon.png | Bin 0 -> 2655 bytes .../themes/pimcore/img/logo-white.svg | 10 + .../themes/pimcore/js/build/pimcore.js | 340 +++++++++ .../themes/pimcore/js/build/pimcore.min.js | 1 + .../pimcore/js/source/html5shiv-3.7.3.min.js | 4 + .../themes/pimcore/js/source/pimcore.js | 29 + .../pimcore/js/source/pimcore_code_section.js | 126 ++++ .../js/source/pimcore_image_lightbox.js | 19 + .../themes/pimcore/js/source/pimcore_video.js | 63 ++ .../themes/pimcore/less/_boxes.less | 35 + .../themes/pimcore/less/_code.less | 70 ++ .../themes/pimcore/less/_highlight-style.less | 84 +++ .../themes/pimcore/less/_theme.less | 352 +++++++++ .../themes/pimcore/less/_variables.less | 8 + .../themes/pimcore/less/pimcore-core.less | 3 + .../themes/pimcore/less/pimcore-generic.less | 3 + .../themes/pimcore/templates/content.php | 49 ++ .../themes/pimcore/templates/home.php | 70 ++ .../pimcore/templates/layout/00_layout.php | 105 +++ .../pimcore/templates/layout/05_page.php | 105 +++ .../templates/partials/change_version.php | 52 ++ .../pimcore/templates/partials/disqus.php | 26 + .../pimcore/templates/partials/edit_on.php | 7 + .../templates/partials/navbar_content.php | 23 + .../templates/partials/version_info.php | 34 + .../tipuesearch/tipuesearch.css | 177 +++++ .../generated-docs/tipuesearch/tipuesearch.js | 374 ++++++++++ .../tipuesearch/tipuesearch_content.json | 1 + docs/index.md | 26 +- .../themes/common/less/_fonts.less | 0 .../themes/common/less/_print.less | 0 .../themes/common/less/_typography.less | 0 docs/{ => static}/themes/coreshop/config.json | 0 .../themes/coreshop/css/_variables.css | 0 .../themes/coreshop/css/theme-blue.min.css | 0 .../themes/coreshop/css/theme-coreshop.css | 0 .../coreshop/css/theme-coreshop.min.css | 0 .../themes/coreshop/img/coreshop_tag.png | Bin .../themes/coreshop/img/favicon.ico | Bin .../themes/coreshop/img/logo-full.svg | 0 .../themes/coreshop/js/bootstrap.min.js | 0 docs/{ => static}/themes/coreshop/js/daux.js | 0 .../themes/coreshop/js/highlight.pack.js | 0 .../themes/coreshop/js/jquery-1.11.3.min.js | 0 .../coreshop/js/pimcore_code_section.js | 0 .../themes/coreshop/less/_components.less | 0 .../themes/coreshop/less/_homepage.less | 0 .../themes/coreshop/less/_mixins.less | 0 .../themes/coreshop/less/_print.less | 0 .../themes/coreshop/less/_structure.less | 0 .../themes/coreshop/less/_typography.less | 0 .../themes/coreshop/less/_utilities.less | 0 .../themes/coreshop/less/_variables.less | 0 .../themes/coreshop/less/theme-coreshop.less | 0 .../themes/coreshop/less/theme.less | 0 .../themes/coreshop/templates/content.php | 0 .../themes/coreshop/templates/home.php | 0 .../coreshop/templates/layout/00_layout.php | 0 .../coreshop/templates/layout/05_page.php | 0 .../templates/partials/google_analytics.php | 0 .../templates/partials/navbar_content.php | 0 .../templates/partials/piwik_analytics.php | 0 docs/static/themes/pimcore/config.json | 22 + .../themes/pimcore/css/pimcore-core.min.css | 5 + .../pimcore/css/pimcore-generic.min.css | 5 + .../themes/pimcore/fonts/robotoslab-bold.eot | Bin 0 -> 39370 bytes .../themes/pimcore/fonts/robotoslab-bold.svg | 688 +++++++++++++++++ .../themes/pimcore/fonts/robotoslab-bold.ttf | Bin 0 -> 39120 bytes .../themes/pimcore/fonts/robotoslab-bold.woff | Bin 0 -> 23812 bytes .../pimcore/fonts/robotoslab-bold.woff2 | Bin 0 -> 18720 bytes .../themes/pimcore/fonts/robotoslab-light.eot | Bin 0 -> 40646 bytes .../themes/pimcore/fonts/robotoslab-light.svg | 687 +++++++++++++++++ .../themes/pimcore/fonts/robotoslab-light.ttf | Bin 0 -> 40392 bytes .../pimcore/fonts/robotoslab-light.woff | Bin 0 -> 24224 bytes .../pimcore/fonts/robotoslab-light.woff2 | Bin 0 -> 19112 bytes .../pimcore/fonts/robotoslab-regular.eot | Bin 0 -> 39066 bytes .../pimcore/fonts/robotoslab-regular.svg | 687 +++++++++++++++++ .../pimcore/fonts/robotoslab-regular.ttf | Bin 0 -> 38804 bytes .../pimcore/fonts/robotoslab-regular.woff | Bin 0 -> 23624 bytes .../pimcore/fonts/robotoslab-regular.woff2 | Bin 0 -> 18620 bytes .../pimcore/img/02_970x250_Billboard.jpg | Bin 0 -> 134175 bytes docs/static/themes/pimcore/img/favicon.png | Bin 0 -> 1955 bytes docs/static/themes/pimcore/img/logo-white.svg | 34 + .../static/themes/pimcore/js/build/pimcore.js | 340 +++++++++ .../themes/pimcore/js/build/pimcore.min.js | 1 + .../pimcore/js/source/html5shiv-3.7.3.min.js | 4 + .../themes/pimcore/js/source/pimcore.js | 29 + .../pimcore/js/source/pimcore_code_section.js | 126 ++++ .../js/source/pimcore_image_lightbox.js | 19 + .../themes/pimcore/js/source/pimcore_video.js | 63 ++ docs/static/themes/pimcore/less/_boxes.less | 35 + docs/static/themes/pimcore/less/_code.less | 70 ++ .../themes/pimcore/less/_highlight-style.less | 84 +++ docs/static/themes/pimcore/less/_theme.less | 352 +++++++++ .../themes/pimcore/less/_variables.less | 8 + .../themes/pimcore/less/pimcore-core.less | 3 + .../themes/pimcore/less/pimcore-generic.less | 3 + .../themes/pimcore/templates/content.php | 49 ++ docs/static/themes/pimcore/templates/home.php | 70 ++ .../pimcore/templates/layout/00_layout.php | 105 +++ .../pimcore/templates/layout/05_page.php | 105 +++ .../templates/partials/change_version.php | 52 ++ .../pimcore/templates/partials/disqus.php | 26 + .../pimcore/templates/partials/edit_on.php | 7 + .../templates/partials/navbar_content.php | 23 + .../templates/partials/version_info.php | 34 + docs/themes/common/less/vendor/bootstrap.less | 536 ------------- docs/themes/common/less/vendor/highlight.less | 77 -- docs/themes/common/less/vendor/normalize.less | 419 ----------- docs/themes/pimcore/config.json | 22 + docs/themes/pimcore/css/pimcore-core.min.css | 5 + .../pimcore/css/pimcore-generic.min.css | 5 + docs/themes/pimcore/fonts/robotoslab-bold.eot | Bin 0 -> 39370 bytes docs/themes/pimcore/fonts/robotoslab-bold.svg | 688 +++++++++++++++++ docs/themes/pimcore/fonts/robotoslab-bold.ttf | Bin 0 -> 39120 bytes .../themes/pimcore/fonts/robotoslab-bold.woff | Bin 0 -> 23812 bytes .../pimcore/fonts/robotoslab-bold.woff2 | Bin 0 -> 18720 bytes .../themes/pimcore/fonts/robotoslab-light.eot | Bin 0 -> 40646 bytes .../themes/pimcore/fonts/robotoslab-light.svg | 687 +++++++++++++++++ .../themes/pimcore/fonts/robotoslab-light.ttf | Bin 0 -> 40392 bytes .../pimcore/fonts/robotoslab-light.woff | Bin 0 -> 24224 bytes .../pimcore/fonts/robotoslab-light.woff2 | Bin 0 -> 19112 bytes .../pimcore/fonts/robotoslab-regular.eot | Bin 0 -> 39066 bytes .../pimcore/fonts/robotoslab-regular.svg | 687 +++++++++++++++++ .../pimcore/fonts/robotoslab-regular.ttf | Bin 0 -> 38804 bytes .../pimcore/fonts/robotoslab-regular.woff | Bin 0 -> 23624 bytes .../pimcore/fonts/robotoslab-regular.woff2 | Bin 0 -> 18620 bytes docs/themes/pimcore/img/favicon.png | Bin 0 -> 2655 bytes docs/themes/pimcore/img/logo-white.svg | 10 + docs/themes/pimcore/js/build/pimcore.js | 340 +++++++++ docs/themes/pimcore/js/build/pimcore.min.js | 1 + .../pimcore/js/source/html5shiv-3.7.3.min.js | 4 + docs/themes/pimcore/js/source/pimcore.js | 29 + .../pimcore/js/source/pimcore_code_section.js | 126 ++++ .../js/source/pimcore_image_lightbox.js | 19 + .../themes/pimcore/js/source/pimcore_video.js | 63 ++ docs/themes/pimcore/less/_boxes.less | 35 + docs/themes/pimcore/less/_code.less | 70 ++ .../themes/pimcore/less/_highlight-style.less | 84 +++ docs/themes/pimcore/less/_theme.less | 352 +++++++++ docs/themes/pimcore/less/_variables.less | 8 + docs/themes/pimcore/less/pimcore-core.less | 3 + docs/themes/pimcore/less/pimcore-generic.less | 3 + docs/themes/pimcore/templates/content.php | 49 ++ docs/themes/pimcore/templates/home.php | 70 ++ .../pimcore/templates/layout/00_layout.php | 105 +++ .../pimcore/templates/layout/05_page.php | 105 +++ .../templates/partials/change_version.php | 52 ++ .../pimcore/templates/partials/disqus.php | 26 + .../pimcore/templates/partials/edit_on.php | 7 + .../templates/partials/navbar_content.php | 23 + .../templates/partials/version_info.php | 34 + src/CoreShop/Bundle/AddressBundle/README.md | 2 +- .../Bundle/ConfigurationBundle/README.md | 2 +- src/CoreShop/Bundle/CoreBundle/README.md | 2 +- src/CoreShop/Bundle/CurrencyBundle/README.md | 2 +- src/CoreShop/Bundle/CustomerBundle/README.md | 2 +- src/CoreShop/Bundle/FixtureBundle/README.md | 2 +- src/CoreShop/Bundle/IndexBundle/README.md | 2 +- src/CoreShop/Bundle/InventoryBundle/README.md | 2 +- src/CoreShop/Bundle/LocaleBundle/README.md | 2 +- src/CoreShop/Bundle/MenuBundle/README.md | 2 +- src/CoreShop/Bundle/MessengerBundle/README.md | 2 +- src/CoreShop/Bundle/MoneyBundle/README.md | 2 +- .../Bundle/NotificationBundle/README.md | 2 +- .../OptimisticEntityLockBundle/README.md | 2 +- src/CoreShop/Bundle/OrderBundle/README.md | 2 +- src/CoreShop/Bundle/PaymentBundle/README.md | 2 +- src/CoreShop/Bundle/PayumBundle/README.md | 2 +- src/CoreShop/Bundle/PimcoreBundle/README.md | 2 +- src/CoreShop/Bundle/ProductBundle/README.md | 2 +- .../ProductQuantityPriceRulesBundle/README.md | 2 +- src/CoreShop/Bundle/ResourceBundle/README.md | 2 +- src/CoreShop/Bundle/RuleBundle/README.md | 2 +- src/CoreShop/Bundle/SEOBundle/README.md | 2 +- src/CoreShop/Bundle/SequenceBundle/README.md | 2 +- src/CoreShop/Bundle/ShippingBundle/README.md | 2 +- .../Bundle/StorageListBundle/README.md | 2 +- src/CoreShop/Bundle/StoreBundle/README.md | 2 +- src/CoreShop/Bundle/TaxationBundle/README.md | 2 +- src/CoreShop/Bundle/TestBundle/README.md | 2 +- src/CoreShop/Bundle/ThemeBundle/README.md | 2 +- src/CoreShop/Bundle/TrackingBundle/README.md | 2 +- src/CoreShop/Bundle/VariantBundle/README.md | 2 +- src/CoreShop/Bundle/WishlistBundle/README.md | 2 +- src/CoreShop/Bundle/WorkflowBundle/README.md | 2 +- src/CoreShop/Component/Address/README.md | 2 +- .../Component/Configuration/README.md | 2 +- src/CoreShop/Component/Core/README.md | 2 +- src/CoreShop/Component/Currency/README.md | 2 +- src/CoreShop/Component/Customer/README.md | 2 +- src/CoreShop/Component/Index/README.md | 2 +- src/CoreShop/Component/Inventory/README.md | 2 +- src/CoreShop/Component/Locale/README.md | 2 +- src/CoreShop/Component/Notification/README.md | 2 +- src/CoreShop/Component/Order/README.md | 2 +- src/CoreShop/Component/Payment/README.md | 2 +- src/CoreShop/Component/Pimcore/README.md | 2 +- src/CoreShop/Component/Product/README.md | 2 +- .../ProductQuantityPriceRules/README.md | 2 +- src/CoreShop/Component/Registry/README.md | 2 +- src/CoreShop/Component/Resource/README.md | 2 +- src/CoreShop/Component/Rule/README.md | 2 +- src/CoreShop/Component/SEO/README.md | 2 +- src/CoreShop/Component/Sequence/README.md | 2 +- src/CoreShop/Component/Shipping/README.md | 2 +- src/CoreShop/Component/StorageList/README.md | 2 +- src/CoreShop/Component/Store/README.md | 2 +- src/CoreShop/Component/Taxation/README.md | 2 +- src/CoreShop/Component/Tracking/README.md | 2 +- src/CoreShop/Component/Wishlist/README.md | 2 +- 690 files changed, 91085 insertions(+), 1899 deletions(-) delete mode 100644 docs/00_Overview/00_CoreShop_Ecosystem.md delete mode 100644 docs/00_Overview/index.md rename docs/{01_Gettings_Started => 01_Getting_Started}/00_Installation.md (88%) rename docs/{01_Gettings_Started => 01_Getting_Started}/01_Architecture_Overview.md (100%) rename docs/{01_Gettings_Started => 01_Getting_Started}/02_Upgrade_Notes.md (100%) rename docs/{01_Gettings_Started => 01_Getting_Started}/04_Difference_to_ecommerce_Framework.md (100%) rename docs/{01_Gettings_Started => 01_Getting_Started}/img/architecture.png (100%) rename docs/{01_Gettings_Started => 01_Getting_Started}/index.md (100%) create mode 100644 docs/02_Bundles/Frontend_Bundle.md create mode 100644 docs/02_Bundles/Messenger_Bundle.md create mode 100644 docs/02_Bundles/OptimisticEntityLock_Bundle.md create mode 100644 docs/02_Bundles/PayumPayment_Bundle.md create mode 100644 docs/02_Bundles/ProductQuantityPriceRules_Bundle.md delete mode 100644 docs/02_Bundles/Product_Quantity_Price_Rules_Bundle.md rename docs/{02_Components/StorageList_Component.md => 02_Bundles/StorageList_Bundle.md} (69%) create mode 100644 docs/02_Bundles/Theme_Bundle.md create mode 100644 docs/02_Bundles/User_Bundle.md create mode 100644 docs/02_Bundles/Variant_Bundle.md create mode 100644 docs/02_Bundles/Wishlist_Bundle.md delete mode 100644 docs/02_Bundles/img/embedded_class_data.png delete mode 100644 docs/02_Bundles/img/embedded_class_tag.png create mode 100644 docs/02_Bundles/img/messenger.png delete mode 100644 docs/02_Components/Address_Component.md delete mode 100644 docs/02_Components/Configuration_Component.md delete mode 100644 docs/02_Components/Core_Component.md delete mode 100644 docs/02_Components/Currency_Component.md delete mode 100644 docs/02_Components/Customer_Component.md delete mode 100644 docs/02_Components/Index_Component.md delete mode 100644 docs/02_Components/Inventory_Component.md delete mode 100644 docs/02_Components/Locale_Component.md delete mode 100644 docs/02_Components/Notification_Component.md delete mode 100644 docs/02_Components/Order_Component.md delete mode 100644 docs/02_Components/Payment_Component.md delete mode 100644 docs/02_Components/Pimcore_Component.md delete mode 100644 docs/02_Components/Product_Component.md delete mode 100644 docs/02_Components/Product_Quantity_Price_Rules_Component.md delete mode 100644 docs/02_Components/Registry_Component.md delete mode 100644 docs/02_Components/Resource_Component.md delete mode 100644 docs/02_Components/Rule_Component.md delete mode 100644 docs/02_Components/SEO_Component.md delete mode 100644 docs/02_Components/Sequence_Component.md delete mode 100644 docs/02_Components/Shipping_Component.md delete mode 100644 docs/02_Components/Store_Component.md delete mode 100644 docs/02_Components/Taxation_Component.md delete mode 100644 docs/02_Components/Tracking_Component.md delete mode 100644 docs/02_Components/index.md delete mode 100644 docs/03_Development/02_Localization/01_Currencies/02_Exchange_Rates.md rename docs/{02_Components/Product_Unit.md => 03_Development/03_Products/06_Units.md} (97%) rename docs/03_Development/03_Products/{06_Unit_Definitions.md => 07_Unit_Definitions.md} (100%) delete mode 100644 docs/03_Development/06_Order/07_Quote/01_Quote_Creation.md delete mode 100644 docs/03_Development/06_Order/07_Quote/02_Transformer.md delete mode 100644 docs/03_Development/06_Order/07_Quote/03_Configuration.md delete mode 100644 docs/03_Development/06_Order/07_Quote/04_Extend_Quote.md delete mode 100644 docs/03_Development/06_Order/07_Quote/index.md create mode 100644 docs/generated-docs/Bundles/Address_Bundle.html create mode 100644 docs/generated-docs/Bundles/Configuration_Bundle.html create mode 100644 docs/generated-docs/Bundles/Core_Bundle.html create mode 100644 docs/generated-docs/Bundles/Currency_Bundle.html create mode 100644 docs/generated-docs/Bundles/Customer_Bundle.html create mode 100644 docs/generated-docs/Bundles/Fixture_Bundle.html create mode 100644 docs/generated-docs/Bundles/Frontend_Bundle.html create mode 100644 docs/generated-docs/Bundles/Index_Bundle.html create mode 100644 docs/generated-docs/Bundles/Inventory_Bundle.html create mode 100644 docs/generated-docs/Bundles/Locale_Bundle.html create mode 100644 docs/generated-docs/Bundles/Menu_Bundle.html create mode 100644 docs/generated-docs/Bundles/Messenger_Bundle.html create mode 100644 docs/generated-docs/Bundles/Money_Bundle.html create mode 100644 docs/generated-docs/Bundles/Notification_Bundle.html create mode 100644 docs/generated-docs/Bundles/OptimisticEntityLock_Bundle.html create mode 100644 docs/generated-docs/Bundles/Order_Bundle.html create mode 100644 docs/generated-docs/Bundles/Payment_Bundle.html create mode 100644 docs/generated-docs/Bundles/PayumPayment_Bundle.html create mode 100644 docs/generated-docs/Bundles/Payum_Bundle.html create mode 100644 docs/generated-docs/Bundles/Pimcore_Bundle.html create mode 100644 docs/generated-docs/Bundles/ProductQuantityPriceRules_Bundle.html create mode 100644 docs/generated-docs/Bundles/Product_Bundle.html create mode 100644 docs/generated-docs/Bundles/Resource_Bundle/CustomEntities.html create mode 100644 docs/generated-docs/Bundles/Resource_Bundle/Installation.html create mode 100644 docs/generated-docs/Bundles/Resource_Bundle/PimcoreEntities.html create mode 100644 docs/generated-docs/Bundles/Resource_Bundle/index.html create mode 100644 docs/generated-docs/Bundles/Rule_Bundle.html create mode 100644 docs/generated-docs/Bundles/SEO_Bundle.html create mode 100644 docs/generated-docs/Bundles/Sequence_Bundle.html create mode 100644 docs/generated-docs/Bundles/Shipping_Bundle.html create mode 100644 docs/generated-docs/Bundles/StorageList_Bundle.html create mode 100644 docs/generated-docs/Bundles/Store_Bundle.html create mode 100644 docs/generated-docs/Bundles/Taxation_Bundle.html create mode 100644 docs/generated-docs/Bundles/Theme_Bundle.html create mode 100644 docs/generated-docs/Bundles/Tracking_Bundle.html create mode 100644 docs/generated-docs/Bundles/User_Bundle.html create mode 100644 docs/generated-docs/Bundles/Variant_Bundle.html create mode 100644 docs/generated-docs/Bundles/Wishlist_Bundle.html create mode 100644 docs/generated-docs/Bundles/Workflow_Bundle.html create mode 100644 docs/generated-docs/Bundles/index.html create mode 100644 docs/generated-docs/Development/Cart/CRUD.html create mode 100644 docs/generated-docs/Development/Cart/Cart_Manager.html create mode 100644 docs/generated-docs/Development/Cart/Cart_Modifier.html create mode 100644 docs/generated-docs/Development/Cart/Cart_Processor.html create mode 100644 docs/generated-docs/Development/Cart/Commands.html create mode 100644 docs/generated-docs/Development/Cart/Context.html create mode 100644 docs/generated-docs/Development/Cart/index.html create mode 100644 docs/generated-docs/Development/Checkout/Checkout_Manager.html create mode 100644 docs/generated-docs/Development/Checkout/Checkout_Step.html create mode 100644 docs/generated-docs/Development/Checkout/index.html create mode 100644 docs/generated-docs/Development/Currency_Fractions/index.html create mode 100644 docs/generated-docs/Development/Customers/CRUD.html create mode 100644 docs/generated-docs/Development/Customers/Company_Extension.html create mode 100644 docs/generated-docs/Development/Customers/Context.html create mode 100644 docs/generated-docs/Development/Customers/Customer_Manager.html create mode 100644 docs/generated-docs/Development/Customers/Registration_Types.html create mode 100644 docs/generated-docs/Development/Customers/index.html create mode 100644 docs/generated-docs/Development/Ecommerce_Tracking/index.html create mode 100644 docs/generated-docs/Development/Events/index.html create mode 100644 docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html create mode 100644 docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Forms.html create mode 100644 docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Resources.html create mode 100644 docs/generated-docs/Development/Extending_Guide/Extending_Rule_Actions.html create mode 100644 docs/generated-docs/Development/Extending_Guide/Extending_Rule_Conditions.html create mode 100644 docs/generated-docs/Development/Index_and_Filters/Filter/Custom_Filter.html create mode 100644 docs/generated-docs/Development/Index_and_Filters/Filter/index.html create mode 100644 docs/generated-docs/Development/Index_and_Filters/Index/Extension.html create mode 100644 docs/generated-docs/Development/Index_and_Filters/Index/Interpreter.html create mode 100644 docs/generated-docs/Development/Index_and_Filters/Index/index.html create mode 100644 docs/generated-docs/Development/Index_and_Filters/index.html create mode 100644 docs/generated-docs/Development/Inventory/index.html create mode 100644 docs/generated-docs/Development/Localization/Countries/CRUD.html create mode 100644 docs/generated-docs/Development/Localization/Countries/Context.html create mode 100644 docs/generated-docs/Development/Localization/Countries/index.html create mode 100644 docs/generated-docs/Development/Localization/Currencies/CRUD.html create mode 100644 docs/generated-docs/Development/Localization/Currencies/Context.html create mode 100644 docs/generated-docs/Development/Localization/Currencies/index.html create mode 100644 docs/generated-docs/Development/Localization/States/CRUD.html create mode 100644 docs/generated-docs/Development/Localization/States/index.html create mode 100644 docs/generated-docs/Development/Localization/Taxes/Tax_Rate/CRUD.html create mode 100644 docs/generated-docs/Development/Localization/Taxes/Tax_Rate/index.html create mode 100644 docs/generated-docs/Development/Localization/Taxes/Tax_Rule/CRUD.html create mode 100644 docs/generated-docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html create mode 100644 docs/generated-docs/Development/Localization/Taxes/Tax_Rule/index.html create mode 100644 docs/generated-docs/Development/Localization/Taxes/index.html create mode 100644 docs/generated-docs/Development/Localization/Zones/CRUD.html create mode 100644 docs/generated-docs/Development/Localization/Zones/index.html create mode 100644 docs/generated-docs/Development/Localization/index.html create mode 100644 docs/generated-docs/Development/Notification_Rules/Custom_Actions.html create mode 100644 docs/generated-docs/Development/Notification_Rules/Custom_Conditions.html create mode 100644 docs/generated-docs/Development/Notification_Rules/Custom_Types.html create mode 100644 docs/generated-docs/Development/Notification_Rules/Triggering.html create mode 100644 docs/generated-docs/Development/Notification_Rules/index.html create mode 100644 docs/generated-docs/Development/Order/AdditionalData.html create mode 100644 docs/generated-docs/Development/Order/Invoice/Invoice_Creation.html create mode 100644 docs/generated-docs/Development/Order/Invoice/index.html create mode 100644 docs/generated-docs/Development/Order/OrderList/Action.html create mode 100644 docs/generated-docs/Development/Order/OrderList/Filter.html create mode 100644 docs/generated-docs/Development/Order/Order_Creation.html create mode 100644 docs/generated-docs/Development/Order/Order_Workflow.html create mode 100644 docs/generated-docs/Development/Order/Purchasable.html create mode 100644 docs/generated-docs/Development/Order/Shipment/Shipment_Creation.html create mode 100644 docs/generated-docs/Development/Order/Shipment/index.html create mode 100644 docs/generated-docs/Development/Order/TemplateHelper.html create mode 100644 docs/generated-docs/Development/Order/Transformer.html create mode 100644 docs/generated-docs/Development/Order/index.html create mode 100644 docs/generated-docs/Development/Payment/Omnipay_Bridge.html create mode 100644 docs/generated-docs/Development/Payment/Payment_Provider.html create mode 100644 docs/generated-docs/Development/Payment/Payum_Providers.html create mode 100644 docs/generated-docs/Development/Payment/index.html create mode 100644 docs/generated-docs/Development/Products/CRUD.html create mode 100644 docs/generated-docs/Development/Products/Configuration.html create mode 100644 docs/generated-docs/Development/Products/Multiple_Product_DataObjects.html create mode 100644 docs/generated-docs/Development/Products/Price_Calculation.html create mode 100644 docs/generated-docs/Development/Products/Price_Rules/index.html create mode 100644 docs/generated-docs/Development/Products/Unit_Definitions.html create mode 100644 docs/generated-docs/Development/Products/Units.html create mode 100644 docs/generated-docs/Development/Products/index.html create mode 100644 docs/generated-docs/Development/SEO/index.html create mode 100644 docs/generated-docs/Development/Shipping/Carrier/CRUD.html create mode 100644 docs/generated-docs/Development/Shipping/Carrier/Carrier_Discovery.html create mode 100644 docs/generated-docs/Development/Shipping/Carrier/Price_Calculation.html create mode 100644 docs/generated-docs/Development/Shipping/Carrier/index.html create mode 100644 docs/generated-docs/Development/Shipping/Shipping_Rules/index.html create mode 100644 docs/generated-docs/Development/Shipping/index.html create mode 100644 docs/generated-docs/Development/State_Machine/Available_Workflows.html create mode 100644 docs/generated-docs/Development/State_Machine/Create_Callbacks.html create mode 100644 docs/generated-docs/Development/State_Machine/Extend_Workflows.html create mode 100644 docs/generated-docs/Development/State_Machine/Things_To_Know.html create mode 100644 docs/generated-docs/Development/State_Machine/index.html create mode 100644 docs/generated-docs/Development/Store_Front/Controllers.html create mode 100644 docs/generated-docs/Development/Store_Front/index.html create mode 100644 docs/generated-docs/Development/Stores/CRUD.html create mode 100644 docs/generated-docs/Development/Stores/Context.html create mode 100644 docs/generated-docs/Development/Stores/Theme.html create mode 100644 docs/generated-docs/Development/Stores/index.html create mode 100644 docs/generated-docs/Development/index.html create mode 100644 docs/generated-docs/Getting_Started/Architecture_Overview.html create mode 100644 docs/generated-docs/Getting_Started/Difference_to_ecommerce_Framework.html create mode 100644 docs/generated-docs/Getting_Started/Installation.html create mode 100644 docs/generated-docs/Getting_Started/Upgrade_Notes.html create mode 100644 docs/generated-docs/Getting_Started/index.html create mode 100644 docs/generated-docs/User_Documentation/Automation/index.html create mode 100644 docs/generated-docs/User_Documentation/Cart/index.html create mode 100644 docs/generated-docs/User_Documentation/Catalog/Categories.html create mode 100644 docs/generated-docs/User_Documentation/Catalog/Product_Variants.html create mode 100644 docs/generated-docs/User_Documentation/Catalog/Products.html create mode 100644 docs/generated-docs/User_Documentation/Catalog/index.html create mode 100644 docs/generated-docs/User_Documentation/Geo_IP.html create mode 100644 docs/generated-docs/User_Documentation/Inventory/index.html create mode 100644 docs/generated-docs/User_Documentation/Localization/Countries.html create mode 100644 docs/generated-docs/User_Documentation/Localization/Currencies.html create mode 100644 docs/generated-docs/User_Documentation/Localization/States.html create mode 100644 docs/generated-docs/User_Documentation/Localization/TaxRules.html create mode 100644 docs/generated-docs/User_Documentation/Localization/Taxes.html create mode 100644 docs/generated-docs/User_Documentation/Localization/Zones.html create mode 100644 docs/generated-docs/User_Documentation/Localization/index.html create mode 100644 docs/generated-docs/User_Documentation/Order/Order_Comments.html create mode 100644 docs/generated-docs/User_Documentation/Order/Order_Detail.html create mode 100644 docs/generated-docs/User_Documentation/Order/Order_Workflow.html create mode 100644 docs/generated-docs/User_Documentation/Order/Orders.html create mode 100644 docs/generated-docs/User_Documentation/Order/index.html create mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Actions.html create mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Cart_Price_Rules.html create mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Conditions.html create mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Product_Price_Rules.html create mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html create mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Specific_Price_Rules.html create mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Vouchers.html create mode 100644 docs/generated-docs/User_Documentation/Price_Rules/index.html create mode 100644 docs/generated-docs/User_Documentation/Reports/Abandoned_Carts.html create mode 100644 docs/generated-docs/User_Documentation/Reports/Carrier_Distribution.html create mode 100644 docs/generated-docs/User_Documentation/Reports/Carts.html create mode 100644 docs/generated-docs/User_Documentation/Reports/Categories.html create mode 100644 docs/generated-docs/User_Documentation/Reports/Customers.html create mode 100644 docs/generated-docs/User_Documentation/Reports/Payment_Distribution.html create mode 100644 docs/generated-docs/User_Documentation/Reports/Products.html create mode 100644 docs/generated-docs/User_Documentation/Reports/Sales.html create mode 100644 docs/generated-docs/User_Documentation/Reports/Vouchers.html create mode 100644 docs/generated-docs/User_Documentation/Reports/index.html create mode 100644 docs/generated-docs/User_Documentation/Settings.html create mode 100644 docs/generated-docs/User_Documentation/Shipping/Carriers.html create mode 100644 docs/generated-docs/User_Documentation/Shipping/Shipping_Rules.html create mode 100644 docs/generated-docs/User_Documentation/Shipping/index.html create mode 100644 docs/generated-docs/User_Documentation/Stores.html create mode 100644 docs/generated-docs/User_Documentation/index.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Address_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Configuration_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Core_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Currency_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Customer_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Fixture_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Frontend_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Index_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Inventory_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Locale_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Menu_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Messenger_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Money_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Notification_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/OptimisticEntityLock_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Order_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Payment_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/PayumPayment_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Payum_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Pimcore_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/ProductQuantityPriceRules_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Product_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Resource_Bundle/CustomEntities.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Resource_Bundle/Installation.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Resource_Bundle/PimcoreEntities.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Resource_Bundle/index.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Rule_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/SEO_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Sequence_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Shipping_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/StorageList_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Store_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Taxation_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Theme_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Tracking_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/User_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Variant_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Wishlist_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/Workflow_Bundle.html create mode 100644 docs/generated-docs/generated_docs/Bundles/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Cart/CRUD.html create mode 100644 docs/generated-docs/generated_docs/Development/Cart/Cart_Manager.html create mode 100644 docs/generated-docs/generated_docs/Development/Cart/Cart_Modifier.html create mode 100644 docs/generated-docs/generated_docs/Development/Cart/Cart_Processor.html create mode 100644 docs/generated-docs/generated_docs/Development/Cart/Commands.html create mode 100644 docs/generated-docs/generated_docs/Development/Cart/Context.html create mode 100644 docs/generated-docs/generated_docs/Development/Cart/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Checkout/Checkout_Manager.html create mode 100644 docs/generated-docs/generated_docs/Development/Checkout/Checkout_Step.html create mode 100644 docs/generated-docs/generated_docs/Development/Checkout/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Currency_Fractions/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Customers/CRUD.html create mode 100644 docs/generated-docs/generated_docs/Development/Customers/Company_Extension.html create mode 100644 docs/generated-docs/generated_docs/Development/Customers/Context.html create mode 100644 docs/generated-docs/generated_docs/Development/Customers/Customer_Manager.html create mode 100644 docs/generated-docs/generated_docs/Development/Customers/Registration_Types.html create mode 100644 docs/generated-docs/generated_docs/Development/Customers/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Ecommerce_Tracking/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Events/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html create mode 100644 docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Forms.html create mode 100644 docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Resources.html create mode 100644 docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Actions.html create mode 100644 docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Conditions.html create mode 100644 docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/Custom_Filter.html create mode 100644 docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Extension.html create mode 100644 docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Interpreter.html create mode 100644 docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Index_and_Filters/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Inventory/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Countries/CRUD.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Countries/Context.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Countries/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Currencies/CRUD.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Currencies/Context.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Currencies/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/States/CRUD.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/States/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/CRUD.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/CRUD.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Taxes/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Zones/CRUD.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/Zones/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Localization/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Actions.html create mode 100644 docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Conditions.html create mode 100644 docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Types.html create mode 100644 docs/generated-docs/generated_docs/Development/Notification_Rules/Triggering.html create mode 100644 docs/generated-docs/generated_docs/Development/Notification_Rules/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Order/AdditionalData.html create mode 100644 docs/generated-docs/generated_docs/Development/Order/Invoice/Invoice_Creation.html create mode 100644 docs/generated-docs/generated_docs/Development/Order/Invoice/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Order/OrderList/Action.html create mode 100644 docs/generated-docs/generated_docs/Development/Order/OrderList/Filter.html create mode 100644 docs/generated-docs/generated_docs/Development/Order/Order_Creation.html create mode 100644 docs/generated-docs/generated_docs/Development/Order/Order_Workflow.html create mode 100644 docs/generated-docs/generated_docs/Development/Order/Purchasable.html create mode 100644 docs/generated-docs/generated_docs/Development/Order/Shipment/Shipment_Creation.html create mode 100644 docs/generated-docs/generated_docs/Development/Order/Shipment/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Order/TemplateHelper.html create mode 100644 docs/generated-docs/generated_docs/Development/Order/Transformer.html create mode 100644 docs/generated-docs/generated_docs/Development/Order/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Payment/Omnipay_Bridge.html create mode 100644 docs/generated-docs/generated_docs/Development/Payment/Payment_Provider.html create mode 100644 docs/generated-docs/generated_docs/Development/Payment/Payum_Providers.html create mode 100644 docs/generated-docs/generated_docs/Development/Payment/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Products/CRUD.html create mode 100644 docs/generated-docs/generated_docs/Development/Products/Configuration.html create mode 100644 docs/generated-docs/generated_docs/Development/Products/Multiple_Product_DataObjects.html create mode 100644 docs/generated-docs/generated_docs/Development/Products/Price_Calculation.html create mode 100644 docs/generated-docs/generated_docs/Development/Products/Price_Rules/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Products/Unit_Definitions.html create mode 100644 docs/generated-docs/generated_docs/Development/Products/Units.html create mode 100644 docs/generated-docs/generated_docs/Development/Products/index.html create mode 100644 docs/generated-docs/generated_docs/Development/SEO/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Shipping/Carrier/CRUD.html create mode 100644 docs/generated-docs/generated_docs/Development/Shipping/Carrier/Carrier_Discovery.html create mode 100644 docs/generated-docs/generated_docs/Development/Shipping/Carrier/Price_Calculation.html create mode 100644 docs/generated-docs/generated_docs/Development/Shipping/Carrier/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Shipping/Shipping_Rules/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Shipping/index.html create mode 100644 docs/generated-docs/generated_docs/Development/State_Machine/Available_Workflows.html create mode 100644 docs/generated-docs/generated_docs/Development/State_Machine/Create_Callbacks.html create mode 100644 docs/generated-docs/generated_docs/Development/State_Machine/Extend_Workflows.html create mode 100644 docs/generated-docs/generated_docs/Development/State_Machine/Things_To_Know.html create mode 100644 docs/generated-docs/generated_docs/Development/State_Machine/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Store_Front/Controllers.html create mode 100644 docs/generated-docs/generated_docs/Development/Store_Front/index.html create mode 100644 docs/generated-docs/generated_docs/Development/Stores/CRUD.html create mode 100644 docs/generated-docs/generated_docs/Development/Stores/Context.html create mode 100644 docs/generated-docs/generated_docs/Development/Stores/Theme.html create mode 100644 docs/generated-docs/generated_docs/Development/Stores/index.html create mode 100644 docs/generated-docs/generated_docs/Development/index.html create mode 100644 docs/generated-docs/generated_docs/Getting_Started/Architecture_Overview.html create mode 100644 docs/generated-docs/generated_docs/Getting_Started/Difference_to_ecommerce_Framework.html create mode 100644 docs/generated-docs/generated_docs/Getting_Started/Installation.html create mode 100644 docs/generated-docs/generated_docs/Getting_Started/Upgrade_Notes.html create mode 100644 docs/generated-docs/generated_docs/Getting_Started/index.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Automation/index.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Cart/index.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Catalog/Categories.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Catalog/Product_Variants.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Catalog/Products.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Catalog/index.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Geo_IP.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Inventory/index.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/Countries.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/Currencies.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/States.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/TaxRules.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/Taxes.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/Zones.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/index.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Order/Order_Comments.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Order/Order_Detail.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Order/Order_Workflow.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Order/Orders.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Order/index.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Actions.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Cart_Price_Rules.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Conditions.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Product_Price_Rules.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Specific_Price_Rules.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Vouchers.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/index.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Abandoned_Carts.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Carrier_Distribution.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Carts.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Categories.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Customers.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Payment_Distribution.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Products.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Sales.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Vouchers.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/index.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Settings.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Shipping/Carriers.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Shipping/Shipping_Rules.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Shipping/index.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/Stores.html create mode 100644 docs/generated-docs/generated_docs/User_Documentation/index.html create mode 100644 docs/generated-docs/generated_docs/index.html create mode 100644 docs/generated-docs/index.html create mode 100644 docs/generated-docs/themes/pimcore/config.json create mode 100644 docs/generated-docs/themes/pimcore/css/pimcore-core.min.css create mode 100644 docs/generated-docs/themes/pimcore/css/pimcore-generic.min.css create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.eot create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.svg create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.ttf create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.woff create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.woff2 create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-light.eot create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-light.svg create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-light.ttf create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-light.woff create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-light.woff2 create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.eot create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.svg create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.ttf create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.woff create mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.woff2 create mode 100644 docs/generated-docs/themes/pimcore/img/favicon.png create mode 100644 docs/generated-docs/themes/pimcore/img/logo-white.svg create mode 100644 docs/generated-docs/themes/pimcore/js/build/pimcore.js create mode 100644 docs/generated-docs/themes/pimcore/js/build/pimcore.min.js create mode 100644 docs/generated-docs/themes/pimcore/js/source/html5shiv-3.7.3.min.js create mode 100644 docs/generated-docs/themes/pimcore/js/source/pimcore.js create mode 100644 docs/generated-docs/themes/pimcore/js/source/pimcore_code_section.js create mode 100644 docs/generated-docs/themes/pimcore/js/source/pimcore_image_lightbox.js create mode 100644 docs/generated-docs/themes/pimcore/js/source/pimcore_video.js create mode 100644 docs/generated-docs/themes/pimcore/less/_boxes.less create mode 100644 docs/generated-docs/themes/pimcore/less/_code.less create mode 100644 docs/generated-docs/themes/pimcore/less/_highlight-style.less create mode 100644 docs/generated-docs/themes/pimcore/less/_theme.less create mode 100644 docs/generated-docs/themes/pimcore/less/_variables.less create mode 100644 docs/generated-docs/themes/pimcore/less/pimcore-core.less create mode 100644 docs/generated-docs/themes/pimcore/less/pimcore-generic.less create mode 100644 docs/generated-docs/themes/pimcore/templates/content.php create mode 100644 docs/generated-docs/themes/pimcore/templates/home.php create mode 100644 docs/generated-docs/themes/pimcore/templates/layout/00_layout.php create mode 100644 docs/generated-docs/themes/pimcore/templates/layout/05_page.php create mode 100644 docs/generated-docs/themes/pimcore/templates/partials/change_version.php create mode 100644 docs/generated-docs/themes/pimcore/templates/partials/disqus.php create mode 100644 docs/generated-docs/themes/pimcore/templates/partials/edit_on.php create mode 100644 docs/generated-docs/themes/pimcore/templates/partials/navbar_content.php create mode 100644 docs/generated-docs/themes/pimcore/templates/partials/version_info.php create mode 100644 docs/generated-docs/tipuesearch/tipuesearch.css create mode 100644 docs/generated-docs/tipuesearch/tipuesearch.js create mode 100644 docs/generated-docs/tipuesearch/tipuesearch_content.json rename docs/{ => static}/themes/common/less/_fonts.less (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/common/less/_print.less (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/common/less/_typography.less (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/config.json (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/css/_variables.css (100%) rename docs/{ => static}/themes/coreshop/css/theme-blue.min.css (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/css/theme-coreshop.css (100%) rename docs/{ => static}/themes/coreshop/css/theme-coreshop.min.css (100%) rename docs/{ => static}/themes/coreshop/img/coreshop_tag.png (100%) rename docs/{ => static}/themes/coreshop/img/favicon.ico (100%) rename docs/{ => static}/themes/coreshop/img/logo-full.svg (100%) rename docs/{ => static}/themes/coreshop/js/bootstrap.min.js (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/js/daux.js (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/js/highlight.pack.js (100%) rename docs/{ => static}/themes/coreshop/js/jquery-1.11.3.min.js (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/js/pimcore_code_section.js (100%) rename docs/{ => static}/themes/coreshop/less/_components.less (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/less/_homepage.less (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/less/_mixins.less (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/less/_print.less (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/less/_structure.less (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/less/_typography.less (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/less/_utilities.less (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/less/_variables.less (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/less/theme-coreshop.less (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/less/theme.less (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/templates/content.php (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/templates/home.php (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/templates/layout/00_layout.php (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/templates/layout/05_page.php (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/templates/partials/google_analytics.php (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/templates/partials/navbar_content.php (100%) mode change 100755 => 100644 rename docs/{ => static}/themes/coreshop/templates/partials/piwik_analytics.php (100%) mode change 100755 => 100644 create mode 100644 docs/static/themes/pimcore/config.json create mode 100644 docs/static/themes/pimcore/css/pimcore-core.min.css create mode 100644 docs/static/themes/pimcore/css/pimcore-generic.min.css create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-bold.eot create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-bold.svg create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-bold.ttf create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-bold.woff create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-bold.woff2 create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-light.eot create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-light.svg create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-light.ttf create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-light.woff create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-light.woff2 create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-regular.eot create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-regular.svg create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-regular.ttf create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-regular.woff create mode 100644 docs/static/themes/pimcore/fonts/robotoslab-regular.woff2 create mode 100644 docs/static/themes/pimcore/img/02_970x250_Billboard.jpg create mode 100644 docs/static/themes/pimcore/img/favicon.png create mode 100644 docs/static/themes/pimcore/img/logo-white.svg create mode 100644 docs/static/themes/pimcore/js/build/pimcore.js create mode 100644 docs/static/themes/pimcore/js/build/pimcore.min.js create mode 100644 docs/static/themes/pimcore/js/source/html5shiv-3.7.3.min.js create mode 100644 docs/static/themes/pimcore/js/source/pimcore.js create mode 100644 docs/static/themes/pimcore/js/source/pimcore_code_section.js create mode 100644 docs/static/themes/pimcore/js/source/pimcore_image_lightbox.js create mode 100644 docs/static/themes/pimcore/js/source/pimcore_video.js create mode 100644 docs/static/themes/pimcore/less/_boxes.less create mode 100644 docs/static/themes/pimcore/less/_code.less create mode 100644 docs/static/themes/pimcore/less/_highlight-style.less create mode 100644 docs/static/themes/pimcore/less/_theme.less create mode 100644 docs/static/themes/pimcore/less/_variables.less create mode 100644 docs/static/themes/pimcore/less/pimcore-core.less create mode 100644 docs/static/themes/pimcore/less/pimcore-generic.less create mode 100644 docs/static/themes/pimcore/templates/content.php create mode 100644 docs/static/themes/pimcore/templates/home.php create mode 100644 docs/static/themes/pimcore/templates/layout/00_layout.php create mode 100644 docs/static/themes/pimcore/templates/layout/05_page.php create mode 100644 docs/static/themes/pimcore/templates/partials/change_version.php create mode 100644 docs/static/themes/pimcore/templates/partials/disqus.php create mode 100644 docs/static/themes/pimcore/templates/partials/edit_on.php create mode 100644 docs/static/themes/pimcore/templates/partials/navbar_content.php create mode 100644 docs/static/themes/pimcore/templates/partials/version_info.php delete mode 100644 docs/themes/common/less/vendor/bootstrap.less delete mode 100755 docs/themes/common/less/vendor/highlight.less delete mode 100755 docs/themes/common/less/vendor/normalize.less create mode 100755 docs/themes/pimcore/config.json create mode 100755 docs/themes/pimcore/css/pimcore-core.min.css create mode 100755 docs/themes/pimcore/css/pimcore-generic.min.css create mode 100755 docs/themes/pimcore/fonts/robotoslab-bold.eot create mode 100755 docs/themes/pimcore/fonts/robotoslab-bold.svg create mode 100755 docs/themes/pimcore/fonts/robotoslab-bold.ttf create mode 100755 docs/themes/pimcore/fonts/robotoslab-bold.woff create mode 100755 docs/themes/pimcore/fonts/robotoslab-bold.woff2 create mode 100755 docs/themes/pimcore/fonts/robotoslab-light.eot create mode 100755 docs/themes/pimcore/fonts/robotoslab-light.svg create mode 100755 docs/themes/pimcore/fonts/robotoslab-light.ttf create mode 100755 docs/themes/pimcore/fonts/robotoslab-light.woff create mode 100755 docs/themes/pimcore/fonts/robotoslab-light.woff2 create mode 100755 docs/themes/pimcore/fonts/robotoslab-regular.eot create mode 100755 docs/themes/pimcore/fonts/robotoslab-regular.svg create mode 100755 docs/themes/pimcore/fonts/robotoslab-regular.ttf create mode 100755 docs/themes/pimcore/fonts/robotoslab-regular.woff create mode 100755 docs/themes/pimcore/fonts/robotoslab-regular.woff2 create mode 100755 docs/themes/pimcore/img/favicon.png create mode 100755 docs/themes/pimcore/img/logo-white.svg create mode 100755 docs/themes/pimcore/js/build/pimcore.js create mode 100755 docs/themes/pimcore/js/build/pimcore.min.js create mode 100755 docs/themes/pimcore/js/source/html5shiv-3.7.3.min.js create mode 100755 docs/themes/pimcore/js/source/pimcore.js create mode 100755 docs/themes/pimcore/js/source/pimcore_code_section.js create mode 100755 docs/themes/pimcore/js/source/pimcore_image_lightbox.js create mode 100755 docs/themes/pimcore/js/source/pimcore_video.js create mode 100644 docs/themes/pimcore/less/_boxes.less create mode 100644 docs/themes/pimcore/less/_code.less create mode 100644 docs/themes/pimcore/less/_highlight-style.less create mode 100644 docs/themes/pimcore/less/_theme.less create mode 100644 docs/themes/pimcore/less/_variables.less create mode 100644 docs/themes/pimcore/less/pimcore-core.less create mode 100644 docs/themes/pimcore/less/pimcore-generic.less create mode 100755 docs/themes/pimcore/templates/content.php create mode 100755 docs/themes/pimcore/templates/home.php create mode 100755 docs/themes/pimcore/templates/layout/00_layout.php create mode 100755 docs/themes/pimcore/templates/layout/05_page.php create mode 100755 docs/themes/pimcore/templates/partials/change_version.php create mode 100755 docs/themes/pimcore/templates/partials/disqus.php create mode 100755 docs/themes/pimcore/templates/partials/edit_on.php create mode 100755 docs/themes/pimcore/templates/partials/navbar_content.php create mode 100755 docs/themes/pimcore/templates/partials/version_info.php diff --git a/docs/00_Overview/00_CoreShop_Ecosystem.md b/docs/00_Overview/00_CoreShop_Ecosystem.md deleted file mode 100644 index a861ba4081..0000000000 --- a/docs/00_Overview/00_CoreShop_Ecosystem.md +++ /dev/null @@ -1,9 +0,0 @@ -# CoreShop Ecosystem - -The following list of resources should show you where to get information about CoreShop and whats going on in the whole ecosystem. - -* [CoreShop Documentation](..) -* [CoreShop at Github](https://github.com/coreshop/CoreShop) -* [CoreShop at Packagist](https://packagist.org/packages/coreshop/core-shop) -* [CoreShop at Gitter](https://gitter.im/coreshop/coreshop) -* [Pimcore](https://www.pimcore.org) diff --git a/docs/00_Overview/index.md b/docs/00_Overview/index.md deleted file mode 100644 index 42731a980f..0000000000 --- a/docs/00_Overview/index.md +++ /dev/null @@ -1 +0,0 @@ -## CORESHOP Overview \ No newline at end of file diff --git a/docs/01_Gettings_Started/00_Installation.md b/docs/01_Getting_Started/00_Installation.md similarity index 88% rename from docs/01_Gettings_Started/00_Installation.md rename to docs/01_Getting_Started/00_Installation.md index 164003f8b1..514adaa3ba 100644 --- a/docs/01_Gettings_Started/00_Installation.md +++ b/docs/01_Getting_Started/00_Installation.md @@ -3,7 +3,6 @@ You need a running instance of Pimcore on your system before you can install CoreShop. You can setup your own example: - - Allow dev version to be installed: ```composer config "minimum-stability" "dev"``` and ```composer config "prefer-stable" "true"``` - Install with composer ```composer require coreshop/core-shop ^3.0``` - Run enable Bundle command ```php bin/console pimcore:bundle:enable CoreShopCoreBundle``` diff --git a/docs/01_Gettings_Started/01_Architecture_Overview.md b/docs/01_Getting_Started/01_Architecture_Overview.md similarity index 100% rename from docs/01_Gettings_Started/01_Architecture_Overview.md rename to docs/01_Getting_Started/01_Architecture_Overview.md diff --git a/docs/01_Gettings_Started/02_Upgrade_Notes.md b/docs/01_Getting_Started/02_Upgrade_Notes.md similarity index 100% rename from docs/01_Gettings_Started/02_Upgrade_Notes.md rename to docs/01_Getting_Started/02_Upgrade_Notes.md diff --git a/docs/01_Gettings_Started/04_Difference_to_ecommerce_Framework.md b/docs/01_Getting_Started/04_Difference_to_ecommerce_Framework.md similarity index 100% rename from docs/01_Gettings_Started/04_Difference_to_ecommerce_Framework.md rename to docs/01_Getting_Started/04_Difference_to_ecommerce_Framework.md diff --git a/docs/01_Gettings_Started/img/architecture.png b/docs/01_Getting_Started/img/architecture.png similarity index 100% rename from docs/01_Gettings_Started/img/architecture.png rename to docs/01_Getting_Started/img/architecture.png diff --git a/docs/01_Gettings_Started/index.md b/docs/01_Getting_Started/index.md similarity index 100% rename from docs/01_Gettings_Started/index.md rename to docs/01_Getting_Started/index.md diff --git a/docs/02_Bundles/Address_Bundle.md b/docs/02_Bundles/Address_Bundle.md index 80c9dabebd..0e9de8e078 100644 --- a/docs/02_Bundles/Address_Bundle.md +++ b/docs/02_Bundles/Address_Bundle.md @@ -1,70 +1,10 @@ # CoreShop Address Bundle -Address Bundle provides you with Models for Storing Countries, States, Zones and Addresses. As well as Context Resolvers -to find the visitors Country. - -## Installation -```bash -$ composer require coreshop/address-bundle:^3.0 -``` - -### Adding required bundles to kernel -You need to enable the bundle inside the kernel. - -```php -addBundles([ - new \CoreShop\Bundle\AddressBundle\CoreShopAddressBundle(), - ]); -} -``` - -### Updating database schema -Run the following command. - -```bash -$ php bin/console doctrine:schema:update --force -``` - -### Install Pimcore Entities - -```bash -$ php bin/console coreshop:resources:install -``` - -Learn more about overriding Pimcore Classes [here](../03_Development/01_Extending_Guide/03_Extend_CoreShop_DataObjects.md)) - -## Usage - -This Bundle integrates Address Component into Symfony and Doctrine - -The Address Bundle provides you with basic information needed for addressing: Countries, States, Zones and Address - -The Bundle also introduces an Address Formatter, which formats addresses in country based formats. - -## Doctrine Entities +CoreShop Address Bundle provides a basic set of data for Addressing Information like: - Country - - Zone - State + - Address -## Pimcore Entities - - Address (CoreShopAddress) - -## Pimcore UI - - - Country - - State - - Zone +> This Bundle can be used separately, but doesn't provide any detail information how to use it. -How to use? -```javascript -coreshop.global.resource.open('coreshop.address', 'country'); -coreshop.global.resource.open('coreshop.address', 'state'); -coreshop.global.resource.open('coreshop.address', 'zone'); -``` diff --git a/docs/02_Bundles/Configuration_Bundle.md b/docs/02_Bundles/Configuration_Bundle.md index 7b95ec7fb9..16687ce318 100644 --- a/docs/02_Bundles/Configuration_Bundle.md +++ b/docs/02_Bundles/Configuration_Bundle.md @@ -4,3 +4,14 @@ ```bash $ composer require coreshop/configuration-bundle:^3.0 ``` + +## Usage + +Configuration Component helps you store your configurations in database. + +```php + $service = new CoreShop\Component\Configuration\Service\ConfigurationService($doctrineEntityManager, $configRepo, $configFactory); + $service->set('key', 'value'); + + $service->get('key'); +``` \ No newline at end of file diff --git a/docs/02_Bundles/Core_Bundle.md b/docs/02_Bundles/Core_Bundle.md index 2f2001ba3a..2bf352a440 100644 --- a/docs/02_Bundles/Core_Bundle.md +++ b/docs/02_Bundles/Core_Bundle.md @@ -2,14 +2,4 @@ Core Bundle glues all independent CoreShop Bundles into one e-commerce suite and extends certain parts accordingly. -## Installation -```bash -$ composer require coreshop/core-shop:^3.0 -``` - -### Enable and Install -```bash -$ bin/console pimcore:bundle:enable CoreShopCoreBundle -$ bin/console coreshop:install -``` - +> This Bundle is not advised to be installed seperately! diff --git a/docs/02_Bundles/Frontend_Bundle.md b/docs/02_Bundles/Frontend_Bundle.md new file mode 100644 index 0000000000..f391a1d98d --- /dev/null +++ b/docs/02_Bundles/Frontend_Bundle.md @@ -0,0 +1,5 @@ +# CoreShop Frontend Bundle + +CoreShop FrontendBundle provides some FrontendControllers as well as a default Implementation for the Frontend. + +> This Bundle is not advised to be installed seperately! diff --git a/docs/02_Bundles/Inventory_Bundle.md b/docs/02_Bundles/Inventory_Bundle.md index 2ca2f69a4e..7a085a637b 100644 --- a/docs/02_Bundles/Inventory_Bundle.md +++ b/docs/02_Bundles/Inventory_Bundle.md @@ -1,6 +1,5 @@ # CoreShop Inventory Bundle -## Installation -```bash -$ composer require coreshop/inventory-bundle:^3.0 -``` +CoreShop Inventory Bundle provides a Basic implementation to handle Inventory for a Product. + +> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/02_Bundles/Locale_Bundle.md b/docs/02_Bundles/Locale_Bundle.md index e11f432ebd..a1169db88a 100644 --- a/docs/02_Bundles/Locale_Bundle.md +++ b/docs/02_Bundles/Locale_Bundle.md @@ -1,6 +1,5 @@ # CoreShop Locale Bundle -## Installation -```bash -$ composer require coreshop/locale-bundle:^3.0 -``` +CoreShop Locale Bundle provides a basic set of data for Locale Information. + +> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/02_Bundles/Messenger_Bundle.md b/docs/02_Bundles/Messenger_Bundle.md new file mode 100644 index 0000000000..455ce5a1b7 --- /dev/null +++ b/docs/02_Bundles/Messenger_Bundle.md @@ -0,0 +1,26 @@ +# CoreShop Messenger Bundle + +CoreShop Messenger Bundle provides you with a nice UI to see what Messenger Tasks are queued in which queues: + +![Messenger](img/messenger.png) + +## Installation +```bash +$ composer require coreshop/messenger-bundle:^3.0 +``` + +### Adding required bundles to kernel +You need to enable the bundle inside the kernel. + +```php +addBundles([ + new \CoreShop\Bundle\MessengerBundle\CoreShopMessengerBundle(), + ]); +} +``` \ No newline at end of file diff --git a/docs/02_Bundles/Notification_Bundle.md b/docs/02_Bundles/Notification_Bundle.md index 1d86ef8bbb..edb177da74 100644 --- a/docs/02_Bundles/Notification_Bundle.md +++ b/docs/02_Bundles/Notification_Bundle.md @@ -1,6 +1,15 @@ # CoreShop Notification Bundle -## Installation -```bash -$ composer require coreshop/notification-bundle:^3.0 +CoreShop Notification Bundle handles all communication between CoreShop and the outside world. It provides a basic set of data for Notifications like: + - Notification Rules + - Notification Rule Conditions + - Notification Rule Actions + +> This Bundle can be used separately, but doesn't provide any detail information how to use it. + +## Usage +Notifications run async in a Symfony messenger queue: + +``` +bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300 ``` diff --git a/docs/02_Bundles/OptimisticEntityLock_Bundle.md b/docs/02_Bundles/OptimisticEntityLock_Bundle.md new file mode 100644 index 0000000000..41e11429ec --- /dev/null +++ b/docs/02_Bundles/OptimisticEntityLock_Bundle.md @@ -0,0 +1,33 @@ +# CoreShop Optimistic Entity Lock Bundle + +The CoreShop Optimistic Entity Lock Bundle is a package for the CoreShop e-commerce framework, based on the Pimcore platform, designed to handle optimistic entity locking. This bundle helps prevent conflicts when multiple users try to edit the same entity concurrently by implementing an optimistic locking strategy. +![Messenger](img/messenger.png) + +## Installation +```bash +$ composer require optimistic-entity-lock-bundle +``` + +### Adding required bundles to kernel +You need to enable the bundle inside the kernel. + +```php +addBundles([ + new \CoreShop\Bundle\OptimisticEntityLockBundle\CoreShopOptimisticEntityLockBundle(), + ]); +} +``` + +## Usage + +Your Pimcore DataObject Class needs to implement the Interface `CoreShop\Bundle\OptimisticEntityLockBundle\Model\OptimisticLockedInterface`. + +You can therefore add the field `optimisticLockVersion` to your Pimcore Class Definition. + +From now on, everytime the DataObject gets saved, CoreShop compares the Versions and increases it before saving. If the version is different, someone else saved the entity before you and you get a exception. \ No newline at end of file diff --git a/docs/02_Bundles/Order_Bundle.md b/docs/02_Bundles/Order_Bundle.md index 7eb8b3e065..d77f80c8d4 100644 --- a/docs/02_Bundles/Order_Bundle.md +++ b/docs/02_Bundles/Order_Bundle.md @@ -1,76 +1,5 @@ # CoreShop Order Bundle -## Installation -```bash -$ composer require coreshop/order-bundle:^3.0 -``` +CoreShop Order Bundle provides a basic set of data for Orders. -### Adding required bundles to kernel -You need to enable the bundle inside the kernel - -```php -addBundles([ - new \CoreShop\Bundle\OrderBundle\CoreShopOrderBundle(), - ]); -} -``` - -### Updating database schema -Run the following command. - -```bash -$ php bin/console doctrine:schema:update --force -``` - -### Install Pimcore Entities - -```bash -$ php bin/console coreshop:resources:install -``` - -Learn more about overriding Pimcore Classes [here](../03_Development/01_Extending_Guide/03_Extend_CoreShop_DataObjects.md) - -## Usage - -This Bundle integrates Order Component into Symfony and Doctrine - -The Order Bundle provides you with basic information needed for ordering: Orders, Invoices, Shipments and Cart Rules - -## Doctrine Entities - - CartPriceRule - - CartPriceRuleVoucherCode - - State - -## Pimcore Entities - - Cart (CoreShopCart) - - CartItem (CoreShopCartItem) - - Order (CoreShopOrder) - - OrderItem (CoreShopOrderItem) - - OrderInvoice (CoreShopOrderInvoice) - - OrderInvoiceItem (CoreShopOrderInvoiceItem) - - OrderShipment (CoreShopOrderShipment) - - OrderShipmentItem (CoreShopOrderShipmentItem) - -## Cart Price Rule - -### Conditions -Learn more about adding new Conditions [here](../03_Development/01_Extending_Guide/04_Extending_Rule_Conditions.md) - -### Actions -Learn more about adding new Actions [here](../03_Development/01_Extending_Guide/04_Extending_Rule_Actions.md) - -## Pimcore UI - - - Order Grid - -How to use? - -```javascript -coreshop.global.resource.open('coreshop.order', 'orders'); -``` +> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/02_Bundles/PayumPayment_Bundle.md b/docs/02_Bundles/PayumPayment_Bundle.md new file mode 100644 index 0000000000..3a277c05a5 --- /dev/null +++ b/docs/02_Bundles/PayumPayment_Bundle.md @@ -0,0 +1,3 @@ +# CoreShop Payum Payment Bundle + +Integrates CoreShop Payment Bundle with Payum. \ No newline at end of file diff --git a/docs/02_Bundles/Payum_Bundle.md b/docs/02_Bundles/Payum_Bundle.md index 50cb7e3443..cf10d99944 100644 --- a/docs/02_Bundles/Payum_Bundle.md +++ b/docs/02_Bundles/Payum_Bundle.md @@ -1,6 +1,5 @@ # CoreShop Payum Bundle -## Installation -```bash -$ composer require coreshop/payum-bundle:^3.0 -``` +Handles the Payum Integration with CoreShop. This Bundle requires the Core and can only be used in the full installation. + +> This Bundle is not advised to be installed seperately! diff --git a/docs/02_Bundles/Pimcore_Bundle.md b/docs/02_Bundles/Pimcore_Bundle.md index 1c22e3a831..a27056f2cd 100644 --- a/docs/02_Bundles/Pimcore_Bundle.md +++ b/docs/02_Bundles/Pimcore_Bundle.md @@ -153,4 +153,157 @@ final class SlugEventListener implements EventSubscriberInterface $event->setSlug($event->getSlug() . '-bar'); } } -``` \ No newline at end of file +``` + + +### Data Object Features + +#### Class Converter and Data Migrate +Class converter is a small utility, which lets you migrate all Data from one class to another. Usage: + +```php + true, + 'parentClass' => 'AppBundle\Model\MyProduct' +]; + +//Copies $currentClassName Definition to $newClassName +//$options can overwrite some properties like parentClass +Migrate::migrateClass($currentClassName, $newClassName, $options); + +//This function migrates all data from $currentClassName to $newClassName +//It uses SQL Commands to increase performance of migration +Migrate::migrateData($currentClassName, $newClassName); +``` + +#### Class Installer +Class Installer helps you importing Classes/FieldCollections/ObjectBricks into Pimcore based of a JSON Definition: + +```php + +use CoreShop\Component\Pimcore\ClassInstaller; + +$installer = new ClassInstaller(); + +// For Bricks use +$installer->createBrick($pathToJson, $brickName); + +// For Classes use +$installer->createClass($pathToJson, $className, $updateExistingClass); + +// For FieldCollections use +$installer->createFieldCollection($pathToJson, $fcName); + +``` + +#### Class/Brick/Field Collection Updater +Definition Updaters help you in migrating your Pimcore Class/Bricks or Field Collection Definitions to be properly +migrated from Release to Release. + +To update a Pimcore class use it like this: + +```php +use CoreShop\Component\Pimcore\DataObject\ClassUpdate; + +$classUpdater = new ClassUpdate('Product'); + +//Your JSON Definition from Pimcore +$payment = [ + 'fieldtype' => 'coreShopSerializedData', + 'phpdocType' => 'array', + 'allowedTypes' => + [ + ], + 'maxItems' => 1, + 'name' => 'paymentSettings', + 'title' => 'Payment Settings', + 'tooltip' => '', + 'mandatory' => false, + 'noteditable' => true, + 'index' => false, + 'locked' => null, + 'style' => '', + 'permissions' => null, + 'datatype' => 'data', + 'columnType' => null, + 'queryColumnType' => null, + 'relationType' => false, + 'invisible' => false, + 'visibleGridView' => false, + 'visibleSearch' => false, +]; + +//Check if field exists +if (!$classUpdater->hasField('paymentSettings')) { + //If not insert field after a specific field and save the definition + $classUpdater->insertFieldAfter('paymentProvider', $payment); + $classUpdater->save(); +} + +``` + +Thats it, the same works for FieldCollections with the class `CoreShop\Component\Pimcore\DataObject\FieldCollectionDefinitionUpdate` +and for Bricks with the class `CoreShop\Component\Pimcore\DataObject\BrickDefinitionUpdate` + +#### Inheritance Helper +Inhertiance Helper is a small little but very useful helper class to enable Pimcore inheritance only with a closure function like this: + +```php + +use CoreShop\Component\Pimcore\DataObject\InheritanceHelper; + +$inheritedValue = InheritanceHelper::useInheritedValues(function() use($object) { + return $object->getValueInherited(); +}, true); + +``` + +#### Version Helper +Version Helper is a small little but very useful helper class to disabling or enablind Pimcore Versioning. + +```php + +use CoreShop\Component\Pimcore\DataObject\VersionHelper; + +VersionHelper::useVersioning(function() use($object) { + //Object will be saved without creating a new Version + $object->save(); +}, false); + +``` + +#### Unpublished Helper +Unpublsihed Helper is a small little but very useful helper class to get unpublished objects in Pimcore Frontend. + +```php + +use CoreShop\Component\Pimcore\DataObject\UnpublishedHelper; + +$allProducts = UnpublishedHelper::hideUnpublished(function() use($object) { + //Will return all products, even the unpbulished ones + return $object->getProducts(); +}, false); + +``` + +### Expression Language Features +CoreShop adds some features to the Symfony Expression language like: + +- PimcoreLanguageProvider: to get Pimcore Objects, Assets or Documents inside a Expression Language Query + +### Migration Features + +#### Pimcore Shared Translations +Helps you to install new Shared Translations during Migration: + +```php +use CoreShop\Component\Pimcore\Migration\SharedTranslation; + +SharedTranslation::add('key', 'en', 'value'); +``` diff --git a/docs/02_Bundles/ProductQuantityPriceRules_Bundle.md b/docs/02_Bundles/ProductQuantityPriceRules_Bundle.md new file mode 100644 index 0000000000..9c6dd6d431 --- /dev/null +++ b/docs/02_Bundles/ProductQuantityPriceRules_Bundle.md @@ -0,0 +1,5 @@ +# CoreShop Product Quantity Price Rules Bundle + +This Bundle implements the Quantity Price Rules for CoreShop. + +> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/02_Bundles/Product_Bundle.md b/docs/02_Bundles/Product_Bundle.md index 15ef0154ff..553453c972 100644 --- a/docs/02_Bundles/Product_Bundle.md +++ b/docs/02_Bundles/Product_Bundle.md @@ -1,68 +1,5 @@ # CoreShop Product Bundle - - Price Calculators - - Pimcore Core Extensions - - Doctrine Mappings - - Symfony Forms - - Product Price Rules - - Product Specific Price Rules +CoreShop Product Bundle is responsible for the Product Management. -## Installation -```bash -$ composer require coreshop/product-bundle:^3.0 -``` - -### Adding required bundles to kernel -You need to enable the bundle inside the kernel - -```php -addBundles([ - new \CoreShop\Bundle\ProductBundle\CoreShopProductBundle(), - ]); -} -``` - -### Updating database schema -Run the following command. - -```bash -$ php bin/console doctrine:schema:update --force -``` - -### Install Pimcore Entities - -```bash -$ php bin/console coreshop:resources:install -``` - -Learn more about overriding Pimcore Classes [here](../03_Development/01_Extending_Guide/03_Extend_CoreShop_DataObjects.md)) - -## Usage - -This Bundle integrates Product Component into Symfony and Doctrine - -The Product Bundle provides you with basic information needed for products: Product, Product Price Rule, Specific Price Rule and Price Calculators - -## Doctrine Entities - - ProductPriceRule - - ProductSpecificPriceRule - -## Pimcore Entities - - Product (CoreShopProduct) - - Category (CoreShopCategory) - -## Pimcore UI - - - Product Grid - -How to use? - -```javascript -coreshop.global.resource.open('coreshop.product', 'products'); -``` +> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/02_Bundles/Product_Quantity_Price_Rules_Bundle.md b/docs/02_Bundles/Product_Quantity_Price_Rules_Bundle.md deleted file mode 100644 index b63b777278..0000000000 --- a/docs/02_Bundles/Product_Quantity_Price_Rules_Bundle.md +++ /dev/null @@ -1,6 +0,0 @@ -# CoreShop Product Quantity Price Rules Bundle - -## Installation -```bash -$ composer require coreshop/product-quantity-price-rules-bundle:^3.0 -``` diff --git a/docs/02_Bundles/Rule_Bundle.md b/docs/02_Bundles/Rule_Bundle.md index 9e34c71b42..0b029e72b7 100644 --- a/docs/02_Bundles/Rule_Bundle.md +++ b/docs/02_Bundles/Rule_Bundle.md @@ -1,6 +1,7 @@ # CoreShop Rule Bundle -## Installation -```bash -$ composer require coreshop/rule-bundle:^3.0 -``` +CoreShop Rule Bundle is the base Bundle for all Rule Based Systems in CoreShop. It provides a basic set of data for Rules like: + - Rule Conditions + - Rule Actions + +> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/02_Bundles/Shipping_Bundle.md b/docs/02_Bundles/Shipping_Bundle.md index a04c0bc0b1..d02346691e 100644 --- a/docs/02_Bundles/Shipping_Bundle.md +++ b/docs/02_Bundles/Shipping_Bundle.md @@ -1,52 +1,5 @@ # CoreShop Shipping Bundle -## Installation -```bash -$ composer require coreshop/shipping-bundle:^3.0 -``` +CoreShop Shipping Bundle is responsible for Shipping Calculations. -### Adding required bundles to kernel -You need to enable the bundle inside the kernel - -```php -addBundles([ - new \CoreShop\Bundle\ShippingBundle\CoreShopShippingBundle(), - ]); -} -``` - -### Updating database schema -Run the following command. - -```bash -$ php bin/console doctrine:schema:update --force -``` - -## Usage - -This Bundle integrates Shipping Component into Symfony and Doctrine - -The Shipping Bundle provides you with basic information needed for shipping: Carriers, Shipping Rules, Rule Processors and Calculators - -## Doctrine Entities - - Carrier - - Shipping Rule - - Shipping Rule Group - -## Pimcore UI - - - Carrier - - Shipping Rule - -How to use? - -```javascript -coreshop.global.resource.open('coreshop.shipping', 'carrier'); -coreshop.global.resource.open('coreshop.shipping', 'shipping_rule'); -``` +> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/02_Components/StorageList_Component.md b/docs/02_Bundles/StorageList_Bundle.md similarity index 69% rename from docs/02_Components/StorageList_Component.md rename to docs/02_Bundles/StorageList_Bundle.md index 9874098a4f..5b2178bb96 100644 --- a/docs/02_Components/StorageList_Component.md +++ b/docs/02_Bundles/StorageList_Bundle.md @@ -1,13 +1,13 @@ -# CoreShop Storage List Component +# CoreShop Storage List Bundle Storage List Component helps you with Lists/Collections of Objects like a Cart, Wishlist or Compare List. ## Usage To use it you need to have 3 models: - - a Storage List: the collection ([```CoreShop\Component\StorageList\Model\StorageListInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageListInterface.php)) - - a Storage Item: the item within the collection which could store additional information (eg. prices for a cart) ([```CoreShop\Component\StorageList\Model\StorageListItemInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageListItemInterface.php)) - - a Storage Product: the actual product (eg. object) being stored inside the Item. ([```CoreShop\Component\StorageList\Model\StorageListProductInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageListProductInterface.php)) +- a Storage List: the collection ([```CoreShop\Component\StorageList\Model\StorageListInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageListInterface.php)) +- a Storage Item: the item within the collection which could store additional information (eg. prices for a cart) ([```CoreShop\Component\StorageList\Model\StorageListItemInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageListItemInterface.php)) +- a Storage Product: the actual product (eg. object) being stored inside the Item. ([```CoreShop\Component\StorageList\Model\StorageListProductInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageListProductInterface.php)) The component already provides you with a basic implementation of [```Storage List```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageList.php) and [```Storage Item```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/StorageList/Model/StorageItem.php). You need to implement the StorageListProduct yourself. @@ -19,10 +19,10 @@ For now, lets create a very basic Session based Wishlist: We need to have following things: - - A Factory class for the Wishlist - - A Factory class for the Wishlist Item - - A StorageListManager to get the current list (more like a repository actually) - - A StoreListModifier +- A Factory class for the Wishlist +- A Factory class for the Wishlist Item +- A StorageListManager to get the current list (more like a repository actually) +- A StoreListModifier CoreShop gives you Basic classes for these 4 things, we just need to instantiate them: diff --git a/docs/02_Bundles/Store_Bundle.md b/docs/02_Bundles/Store_Bundle.md index e9694e916c..561431063d 100644 --- a/docs/02_Bundles/Store_Bundle.md +++ b/docs/02_Bundles/Store_Bundle.md @@ -1,46 +1,5 @@ # CoreShop Store Bundle -## Installation -```bash -$ composer require coreshop/store-bundle:^3.0 -``` +CoreShop Store Bundle provides the abstraction of a Pimcore Website and a CoreShop Store. It handles the configuration for base-currencies and themes. -### Adding required bundles to kernel -You need to enable the bundle inside the kernel - -```php -addBundles([ - new \CoreShop\Bundle\StoreBundle\StoreBundle(), - ]); -} -``` - -### Updating database schema -Run the following command. - -```bash -$ php bin/console doctrine:schema:update --force -``` - -## Usage - -Nothing much to say here, adds a Store Model you can work with. It also adds Multi-theme Support. - -## Doctrine Entities - - Store - -## Pimcore UI - - - Store - -How to use? - -```javascript -coreshop.global.resource.open('coreshop.store', 'store'); -``` +> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/02_Bundles/Taxation_Bundle.md b/docs/02_Bundles/Taxation_Bundle.md index a1ea544504..7072a2fa78 100644 --- a/docs/02_Bundles/Taxation_Bundle.md +++ b/docs/02_Bundles/Taxation_Bundle.md @@ -1,62 +1,5 @@ # CoreShop Taxation Bundle -## Installation -```bash -$ composer require coreshop/taxation-bundle:^3.0 -``` +CoreShop Taxation Bundle is responsible for Tax Calculations. -### Adding required bundles to kernel -You need to enable the bundle inside the kernel - -```php -addBundles([ - new \CoreShop\Bundle\TaxationBundle\CoreShopTaxationBundle(), - ]); -} -``` - -### Updating database schema -Run the following command. - -```bash -$ php bin/console doctrine:schema:update --force -``` - -### Install Pimcore Entities - -```bash -$ php bin/console coreshop:resources:install -``` - -Learn more about overriding Pimcore Classes [here](../03_Development/01_Extending_Guide/03_Extend_CoreShop_DataObjects.md)) - - -## Usage - - -## Doctrine Entities - - Tax - - TaxRule - - TaxRuleGroup - -## Pimcore Entities - - TaxItem Fieldcollection (CoreShopTaxItem) - - -## Pimcore UI - - - Tax Item - - Tax Rule Group - -How to use? - -```javascript -coreshop.global.resource.open('coreshop.taxation', 'tax_item'); -coreshop.global.resource.open('coreshop.taxation', 'tax_rule_group'); -``` +> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/02_Bundles/Theme_Bundle.md b/docs/02_Bundles/Theme_Bundle.md new file mode 100644 index 0000000000..5ccb69273c --- /dev/null +++ b/docs/02_Bundles/Theme_Bundle.md @@ -0,0 +1,80 @@ +# CoreShop Theme Bundle + +CoreShop Theme Bundle provides you with a flexible and extensible way of having multiple themes in a Pimcore installation. + +## Installation +```bash +$ composer require coreshop/theme-bundle:^3.0 +``` + +### Adding required bundles to kernel +You need to enable the bundle inside the kernel. + +```php +addBundles([ + new \CoreShop\Bundle\ThemeBundle\CoreShopThemeBundle(), + ]); +} +``` + +## Configuration +Per Default, no Theme Resolver is enabled, you can enable on or multiples like: + +```yaml +core_shop_theme: + default_resolvers: + pimcore_site: true + pimcore_document_property: true +``` + +### Pimcore Site +Resolves the Theme based on the Key of the Root Document of a Pimcore Site. So if the Site's Root Document is called "demo" it tries to find a theme called the same. + +### Pimcore Document Property +Resolves the Theme based on a Document Property of the Site. The Property is called "theme". + +### Custom Resolvers +You can also add custom resolvers like: + +```php + This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/02_Bundles/Variant_Bundle.md b/docs/02_Bundles/Variant_Bundle.md new file mode 100644 index 0000000000..e6b85ccad2 --- /dev/null +++ b/docs/02_Bundles/Variant_Bundle.md @@ -0,0 +1,63 @@ +# CoreShop Variant Bundle + +CoreShop Variant Bundle allows you to manage different Variants of a Product. + +## Installation +```bash + composer require coreshop/variant-bundle +``` + +### Adding required bundles to kernel +You need to enable the bundle inside the kernel. + +```php +addBundles([ + new \CoreShop\Bundle\VariantBundle\CoreShopVariantBundle(), + ]); +} +``` + +## Abstract +Pimcore already supports variants. But it doesn't define what a Variant is, or how a variant differs from the Parent Product or other Variants. + +In classical e-commerce scenarios, you usually have different Variation Types like Size and Color with different Values like `XL` or `Red`. + +CoreShop describes these two types of entities as `Group` (`CoreShop\Component\Variant\Model\AttributeGroupInterface`) and `Value` (`CoreShop\Component\Variant\Model\AttributeValueInterface` + +The "Product" itself than is a sort-of abstract entity that is used to define what Attribute Groups are allowed. The Pimcore Variants then, need to have the values of thse Groups filled. + +Example: + + - AttributeGroup Color + -AttributeValue Red + -AttributeValue Blue + + - product (defines allowed groups for color) + - variant-red (defines the AttributeValue Red in attributes) + - variant-blue (defines the AttributeValue Blue in attributes) + +## Usage +CoreShop Variant Bundle does NOT come with a Installer for certain Resources it requires. That is on purpose and you need to manually install what you need. + +Per Default, it comes with 3 different Classes: + + - `CoreShopAttributeGroup` + - `CoreShopAttributeColor` + - `CoreShopAttributeValue` + +Whereas `Color` and `Value` are two Value types and `Group` is a Group type. + +You can manually import the classes from this dir ```vendor/coreshop/variant-bundle/Resources/install/pimcore/classes``` + +To create a "Product" Class, you need to implement the interface ```CoreShop\Component\Variant\Model\ProductVariantAwareInterface```. The Class requires you to have these fields: + + - attributes - ManyToManyObjectRelation for `CoreShopAttributeColor`/`CoreShopAttributeValue` + - allowedAttributeGroups - ManyToManyObjectRelation for `CoreShopAttributeGroup` + - mainVariant - ManyToOneRelation for `Product` (eg. your Class where you implemented the interface) + diff --git a/docs/02_Bundles/Wishlist_Bundle.md b/docs/02_Bundles/Wishlist_Bundle.md new file mode 100644 index 0000000000..aeb0f83443 --- /dev/null +++ b/docs/02_Bundles/Wishlist_Bundle.md @@ -0,0 +1,5 @@ +# CoreShop Order Bundle + +CoreShop Order Wishlist provides a basic set of data for Wishlists. It is based on StorageList Bundle and shows how that can be integrated into a Pimcore Project. + +> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/02_Bundles/Workflow_Bundle.md b/docs/02_Bundles/Workflow_Bundle.md index cdee25b991..f2a4e6a0f6 100644 --- a/docs/02_Bundles/Workflow_Bundle.md +++ b/docs/02_Bundles/Workflow_Bundle.md @@ -1,6 +1,5 @@ # CoreShop Workflow Bundle -## Installation -```bash -$ composer require coreshop/workflow-bundle:^3.0 -``` +CoreShop Workflow Bundle is a extension of Symfony Workflow and adds some configuration features to it. + +> This Bundle can be used separately, but doesn't provide any detail information how to use it. \ No newline at end of file diff --git a/docs/02_Bundles/img/embedded_class_data.png b/docs/02_Bundles/img/embedded_class_data.png deleted file mode 100644 index 7b2e1f50e43e15d09d4edf110c89a0b36bdafb16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110858 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

4P53Qit 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

W)aw(yH8s1%$nX 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 W=hP+iEAcE4@Z7v^W>BW@67vs~S-61! diff --git a/docs/02_Bundles/img/embedded_class_tag.png b/docs/02_Bundles/img/embedded_class_tag.png deleted file mode 100644 index 289b4805aa0c38784e9de39a27a8d1ba2a2421d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127914 zcmZ^K1yo$i(k>woAP_V_kl+MoaCevB?(XjHF2UU;xCM825ANzW7 zf`YQ*f`SCH_BO_5mPQZ|VquBNFp6kP*n<~iKQYw_Ams&Y{6G6aOj|${sK~*=1?`W}yzX|9dCz;0^|+VL zx#78y=`r~T12KZELH<1e9YPFKOenVlFY+)&^}{QLF9am4F9Nw`lxaM0W zlFQUmv307<{?q;Qn^O3y5Iqb8`IkMY%9Qx1D>z3-yFem12r)eD1r0(JX?vQH5u!T2 zgq3fptmA9(8Fb^FGUISaw?b|R5RgIR7?%(^y1&_oBYFj|WpCsfKHEM*CiKcVZ;{kC zlVj#{0l2vh;#TBXq#ug7+B)~X$Ltx_x-n#(8%aO`I#g2zv~PWA2j7(4(;WA|wjAb= zM1TaQ$_QJG>r1fSF<_8TBc|!`xR}3wCX;+2GEO1Bi_FxcU7^wqE+|1cXB@*A=NV1@ z)nlTXfI>M65YxaVAI%<$v&&oLvzNkVcG7+oJZ~-NwQw3Wgq=xJ>95o|aV` z7bn73i$2<3T4p<4auJW~eKEEOO`7YKy17c~heoM+6bK8UE~2AxZFptUQPa#o|K_3W zZ~Y5PTJITVavv_K0tpsonC~N$FFdLrEQv2d%m)(RcWn^(p?=6O{T~kRVn`|zzO!tl z5^9oeU&oOmxZHduWl)8T>gNisFF;509cE;I8Qz#Gn!pz7zN_6>U$PnPg&T80IeJZTnHF`8aBu%KjYsYCj2Bfu@67EbP4{3`Oqy% z2g&1W2kQ?+M$h9nk6|%{NadeLMzi;8%jF~g9PYPGh)3f4^Eb9Bu_7!wzmY7oBFqay zrvC)LN)Fy3&n(g>L7Uu3I!FawBULn(z=PiJi(e6ad$$VckR}3ax42xXG(W2Jglv6# z!1esp@&3LWuq6jYU>F#6NU#r!b}8f^qe=pYLU{;3Y+0r+CUNv9ESmn_quKcKhR`{ z^uZH^2hsznfuukL-jRIYOwr2Wcmh@ZePbla32})s2vLbTWY6`E4 zloK_e+91P(?T`q^p$w;fmX;v2B1nwG7Q+;e7P}ZStf5`>hEhsy>H)4E~t)(K5*C%6FxU};`$xwQ??~_DSGTBr+(a1N z=+YmhE{eQm^s{Yq@^j9`%w^olgT?8kA;nd)8&%$NFLRoE&C(9+4)FVU>Cb%c=jrBP z=Ts}~WOrHyiVKqps|sZuqW9g#Rn#46SSvnP=vOeR_bxM8VOn)KSKq0fVIrUha}xiM z8)@qLGBx%4awhgz@zC)o@&x-x_Go1ql*Q}YZnO*79GD3cy0aponHX{(Rv z%W2=zlhW7e0>)3r9*m#I-1qek*vHVu$}$!#r0HE)CmE_(FB)?+pwxHOnKat6s(5*w zU!xu~uRGP2)eF^>)p+XUYpxnc>doujEv(GPt7#iMtOV;XtJQ2~^skNmmi+smpD|Z! z3zleW)(ltlp64dkr41K!SuLw<@NGI5I+9Dq5R9$$w4J*+T-nN9OdTF}O%KTJxb`24 z;+qvpX9$aOgGAubFqLU=ZReegIaS#1o9Q&SwY(jV9OmqdT9sRPoMs$$T9jJ3U0Cg8 z?08RKmwTrLckQNk@{95h)F+(*eWMFyU1g&h!<;>>W6xpHl}M9C>n42*^Dgx^t@!hR zE}IY?fMk5X-dwc^=882 z#zVVba<;}m0AW+iX3SNLNv?9Pg#c%-sorQWVvrZ?J?sX?D_swp0QM9L1wIz08s;PY z2vsS0DZt(PX8F*9{+J$=lBDWsX=v$mdWd>K+M0wgur#nYxTa-Z=eRdbH9DJIK*QOt z>CNu(cDD`3IZQfS^^gT(cuoJ@ned(hUm-x=LY{0oZyI|B?&$KU2ui|Vu{#K%A~F$+TYyoo z;}>9t-a%zQl$=kICb&) z*9zHl(Ok-0#@ts6$9YTDna+7Ht9}kst)7;sTlbUed8GY^{aI@QE3q}8MWvCo-1+kl zIUJ2^rfd7F4;|Mpl{`AMItd%C!)7yn7xWv~ofpfNwQiI9Hqfj7WkE?nq(M3jwhfvu z-Nzx*_}?17S)DB#H(I?puR3?%wQ_2@%wkYr7-4=o)vT*6Ns-f(1$i%AX{ktHB;YPe zEz_*6sbH%v*NFN|-f`=U#EqUOcqFi%&n>pPT?~4yda>TOp4qVFxa9!54)7m&*UNwv zrlm~f)a;?0DNaB&B}1hHnX&BS(z!DDvd(!}^Cxpb3&8Bs!ra$swz>+u%H(+@{3y;< zuf7v8$pAM&VdC~`AUPW)_tW;lL-qw8JlniohFjZKV0TzMnHd>;T27&o6!G}*xEBpQ z4R;Yp#;J~@J`2>pot(y!*>E*OS=5+Gm^sYJXvgw=YTEkiWsZHl*)MAEE7GKBcBdEN zuE0XSZ$vWSQIliiXx;6u=6bJzDoRCK%ShX*!`P+bsO9W7zH|B2y=Jts>?ru-Ks3deeG`$Et_m{mgl%TggJ+I&hjs2< zz1zPjxixyJ^5{eUT76%Cd4lHC^5W)2;%*51aX8+$LUS>@KG&uL>@Z+*y%`R zd%iwXIvSh^jl*X;G!PK)vdk1!9aW{ia~RlI(drr6=o`_xTG@iZE(8RZD+jn}W#p(w z;A&-Q?ZDy6P4w3r9N_Yw+W;bhzg}^);3iU)k|hwdu{R=Mre&g~BjWi;KtRA{Z)nUR zFC_Bs>fm48M5d08wj2O}i;D}b3nQ(Ky$OJxot+&(#{ghppaH)@Y%RHn=L+pSv8gX0Aq-szPQ~M%E7CK6vOE=$W|ws_Y`v^Mw-2aff5FTAnR==XkbU zzvy1E;zZt%5mYIt`4VT{WT7X$G>7oQQDZPn@fUp}Y= z@BZIcF(TyWj?w^*XmLmqK1dQ-BEQWXf@WPHL5WIZWxciP%ai#A-{t*%?fH(xIB`ru z0*Pc2b!=cD)XAoSfq~J{bU|ENn)%uw`ahZ{2fX{Jvqw5~_oq!h$V35MVAu6ee%BO? z76R{}kh$dU_b|m?TMWRq*F^j8&g#ri1h)NseM8&*5%mv7q1sbZQ#Jbi;iXtm(E@*s z>#t@=Y^9NbTx1h*Wd9!Q4lFK*rx1tBF}b$3wmQh(!2wf72FVLA1o3O7-9hg=Ok~r! z(nQOZ2C15wn!1O?^mHoMZdnoHzw5#;oQQ9$EKjTkAC+-lgLyD7zYjrMqYEK0aVz=WAF;F?m(*XK3W2759DRbUwpiWo12@ ztq#EGj1;t5!k~CY#ARZk@=Q&NRV(Fr@$!;T%1#uHG`tOdFrqt}DT=PM*;rrPjf46# z%l~tYNcr}tG^5nK|D(`fq`xcg-L~;RQ|n2kjfDL)3~Rlk4avh)SL1r1x0IZ8rlRH1 zzPh^VTjS9IuN}khjNhrZU(tf}Ma% z?{C)OCqWEW`1J1@1F*uUQTbFg@L9~hd9c2wX9G05)$vog0kz4B+ZfDW++ zj+0fw|LvVb$FGtw+S6Y)#vLQrON&I|X9|zNB;J1FPwK&Z<#a>(79?uCk7`*!*Kl#gH5|SVcEF~l( zZ^gl?2=Z-hO<%Qrahh&b0i=4%jAK~IOP9&Eo%(ah`JJeQ-%knZ+r{jRYQY&A(Zgy1 zIv@OT+1(YRzH)w3(Y9-LrQ$a|uG8q7oRm49g`<#cq@6RiFib#gavy0pldEyr@aATT zcv`9U;tY!nFHNZa0P~RCva!i`u#&;Gn*sW%u~@WH+RNgAoyylY)XmUVCda)q9hj+4MI- z^5+iq21^PW^}1hh20;rd$+TLQckI0hPXBAvz+j@MBdPmdMw*&_yChj;vd=KuA@knxu>Ekq0rcbG z-T4|-w$Ed|cHa2UvdV<5-e8G#_uD$MX&C&8giLdm{=7Tl!Fie)>o|A-ZsoNVjZTNa z`rD>pW_F2L{5Sh&t40YbQuEysj||ZAt5ofbDAqvnr?Nm!Qyl-ueUZ+iG+h6JHtI=Om@ip zha*c!f@6qTSTzq^3||l`pDQs}yLkkmjN0@1OaJy6v6Om4Y>FxCfl!q^#Nlj7KIrBe zAlnOn;v7j>rBH+3l@Hhknra)+3QeQ8=P#-p2$eC@8UF)EVg#{InDBO}MLqo$MQG72F6-~P!$MaP+aC6^kjmP6c@Z7~>AiQ6mZtXX`?#-$Z z^p(JFTcB2J9Q0IufZ&HfbPx!K_EV`$xrL2}MhYKZA6c6PgV`qN%{mc)ut0&LJq<8fqiI|viol>j4W!Kihvla|a$MvrRd`I=S+6dS zlM$+_x;v9{0z#g){;^=IKspSgrhVf8I+&?Q@S^lD6!6zKa}b12`+Ndbzg-+34e2jY zQpzf;Z53zZU{!mEausTTL)C8oBsoWOdwrn;6{qw0tXne%Kuumhz@oB4{lGbmX-_>f zy~Lxja#|s173;$*tW@COl!6S`w<0t&qi!7^Nx5gjSrBk$(*L)JhoIQ%J?|??t?^{i zD4_NGBnSIr8fa&E!D;SnMB3WMXT7_-dl~*Diu3#zV0uMLalH=5x{2SzmmfEvNC_WC zJ1!t`AuG0QG?p%Sf*^_Lbk35Vp5C9nE2i@ko|bWhay)#Bi5hjOjRQ_){QqJ%aKV=f zB?q`Cp%P#~=;x5&s|G5qfL#qp4@)=U%bltHnHke|vncQ!v2wY$pflR2<3+(L-Ok@3 zr!VI09EGTa00);eQ-o%fMuY;Q-#dbqVRH4+Dr~DqfJa1}t~E6_G#uIL4KXT8qepox z3SW+Pj!33f%9}5!@wm5U&+WMcfj}hW4)o;|fL<+rtq1KkqzLHkFU< z-m&R~%6QzJR%f{nMtwC}Z*x zF(vckvE3<&Yy|9=?S;wx_7`b4px^VZd15)ysz%=$VFGBiS`IVRt2$p>?pAxs!xg{)Z7hq;oS zw>~zDmdVaLf8ecBe4$i2hZ6o{OnB}58OLW8&Ehcyw-HT_Tb6d8m#cnzuKL`EJMTJK zZUfP~ZnrqB$I5E8V^SfMz*5puY_tGV+G4sCdxO} z`8F9s5cNfbfxX_fdJV!P^{flbBVTU~67<4OesDCs8Vgpk;^X6oc=bpkFMQss)F*x6 zbxO3e$NjtTm7>0QI+ZR`Y(!vSf&HC8bgx-LQX2IwM^{`@3PUmt72lq*e>~q_2#N$B zAbtZmu^m`EtH>+{qde=a7{ul;%kB~ITYk0r^rUs!S&6hUgw50@#cnE=5L8F*FdN-W z8_47_1;2N3QADobn-*hK;y)Z24E_+n&<_DsGwx4}dk>l9xi`uW=Mww((Dzrl zi39BNmEJ*YJm9G`Cyhx?R;d^~=mz8Se;`R;s1fO|3b}j{=|P~7sA%$wnB`vtQAuob zwnRb6l?gBW|E?g`g$_s8+)ky99u@Xq&;HeX&MH{*i8zFuf5+8-FWU-(rO>=Awf+8g zo&LSN_YKT+R$-U^$us^#&wZ&-$?wafz7w2Zq<^2nzm;vnA%Xx!bk(T;n7026hfnGcGb_}hk4pak=%kAR zEOJIqpTys#{Ck=C2iT(0ocr0d|6726-6?`~@v@q1e+%( z8mDGgFFMp&>T;^n9$l&Nj&t|o;s*nEoDNPF+F!NrOWTb}FDsX)fPXpNW(ruGLCvPW z23rm_K-0F+GJ%dtj^yW@TVXg^@_z3quV;Az|FS{BYpzUXvc$by@fsEkq!kx)w9dS? zPn+#l_k7@e>&t9+od9pQ)KW+jSF}>ue~cZRv*7p5jY{NC^!j6@|F27t)6e|+fg@v^ zuxuMQM3o8AK3O&z;Ygjeb@`ng1c@yzDw{W`$#StyjT$53=5Sq#NWG2?lOCAy-{x!1 z=4X!9A+f!`cL0bjni(PSez_dPzgjZMRzpJh@`YR~jVTuKE5~1?;q~=(zQ)0cl$lwn zt-ZZ}bo4}1xa*oWxGT_I94f-S}x|m6KypVd1$Jhi$lK7C$iZABAD$ zO^S^CzJNzA`p+Qu$NFR~V4HppVhRD;5O6*lmnYh&6-j?h44tpFlCra_VY6COBXI$JF&210 zKtb;OaU~Tkql)N6OdU_T4~V$rf+2`=&)HsgYN_m*buR_+Xd&alx*Ax~imjA6aK1gX4 zTk);YlGx;G`Di?DDE3Z7TsB?wj(spufp+^`d(jV(2t$aWHwJJt&bpDHT%kUE*0@nAOpA+i zOGirAM;oX&khMCVWMBeuXU5fspvxstms`q1zlS39&?Z%(hgx-Lbg3^qz zx>;FSEr3wVi}w30C}?Q2%L}k$BufI?6(h9Sk~1=J-Oig2e#&I?*n{7YFg7kcU2UFm zw=@80&htQui;G_^pV&yKtEctGuXMioay?{=mKz~UUZi>_Gnpb=uc@S=hwBvN_P6{! zhW)F&M`$|%r{g=9!~gzlDaZ+y>kl;r4^CO+2X>Iwbd8ZD4RW`J#cGpX3y)CI>Z+#O z)i7BF+!m+P@z0awJ0t-*!n|&RzO$7^nLinUXr8Cyo8vjjizR;fljXV%cfu0bQIzE_0q>4Hx48u!z-C-7 z=okRuA0z7;+&zY8=MM8WD*<^aQAZ}Qa8psN-HxG@XWY20wHeR%kNJ&Iy- z{*R>RUyA}cub+ebgTF~qzy8$C=2~K09Ff=aU48CSyN3&nEnzu|09Fz(xHMD^nZEVs zl6s?cMK9{O0Cpc4E)_lf6o)jd0&H&}S&|-XBbWP4adkvudqPE)}`Wc1uy4!)74Sjl4lN=SCt9!z$LDx#zjn(PamX`;}weHH>(oCn%>fdXI zts12DuxQ`QgS_3SG__mUrKOd|>^>P?r<1PL6OpXN zB1{p{*=M-s;F>_bdps)29#PTpB1QZ5J%-+3fDK`bsd2}B{M+wxHHBv55ks7+s``_8 zs;Z$cUiv@+E*~J@iTKmwllV%5RmF;tTDOPCb^#i>dm=R6N(|p8qL?DQMMLX|xNK1=kJ1mBs3GcDP^i-4+PliJi)fGStfu7WTCEYY@D-8yiDfePg4g{P zYcoVi{+e|xUq!0MHdgN{4eveFuZRYgKC9e|7=oPDJoGb#iUx-CNH>jkjfc3`iX`8H z8<2dK}^g$w>GOloH4`j`i389G5Be^sZ$--KF? z#k^60q&F5e!N^AIHqv=E>o(;$JA4nsR{`iIQBQ!%4!Qko6fgakFOuy zmyD9Jl$y$epn&Tq1>aQZaIW03dQ`;3ej(s74QXmtItkujGuiSrKk0#U$?q0OV{kA5 zm(ko*6rE#EY(rh61ClS8*{IRKKwPPaRCYy@$ZXE1DOul(47Q zNt|Q;K)tsp3ZJb|DQ;_VcD44Hq;%hF$fS1D@}qGTH090YFq0% ziBDMDr9i12j)lpMK>sol*$Su$iY<8m1+r|>+-r zEh-`+feZh}h3NuGXdVBkzye=ih;EqlrA?_|U|%@h?v6m7``8DyIH1z>B>`6sVAtH< zaHu&D>WS?QjFjMm0HO&^Rn$;m(+pC-v})sS>zi2a5~COF&+{mF= zDM>BrBk}_ljM302FEo;)lyK0;-Z<0|Dsf&};h)$lkLXj-89eHTP^A6U~^!hc_;rQ-%r0*Z6 zsZZgncrg?tavw_wCH2&&Oqht?GIaAmnHy0O_Ti5I30Y0~Ks4j9dIQv={e`1g%8tS~r zVq8%Nx$_Y&A(qb}v9VHR63<@y?bYZs_m0KmrcJ|eW;nBEvx`?c+b|l4Xz!JLIbEb@ za(M|%I!uUXu(%g^bRP69dM+*wZ@h1k_*OUG$<7h?nHUM+p*3Mx_<7|8L}e_t(?y3q zK~rj7gDb}MO~*Q$iYnTQx*=2Ua0?u|8$0;cRo{$adsLcyiV>{V2Pr+XO$E~=e+GTut%^>yPh<+ho83!a@t4yKl( z7l?e`0}n_5qZ@QimR*5960Umb2MI2k<|;0o@z$m3pR z6gm0Y3n`%N?A*|Hw`?(Qc=i4RLQJ|1?L&7|jM!KLo5TKhnw(snQ$cNNSe>DuAfyTK zmW3v~6%e9zKh1*jM$mpFfug0e+2P=rPDs-{R2!TDqghi@sqfwz1$53@q1-(V5l5TK zeL8@tVhPnjp0P!&bBN|sAe9%kj-F=UCs0)i{L$)aDeS0l^5lEyWE3JdO;}d|a?(vy zo$ZW65Loaa#*2?`oQNA#ZlhUpW1nXDX%?3Co%B{C=?bI!hmk~4gc0cU$o?C#ur~fH zeskW7*rVghseY@2iXO{7t-IR1kWFHeQ`$%n&C_UlFMblmHGV8NTu8W;#(a+lMmtFu z7Wz(*#ytJ(opVu^w_Jp_UKI~n_e>?gu?6E+kjHq0iN@W{<(NQ?(;03#aMHC_c5U04 zO@c;u7En1>tgtr9dC{f-FlE=~39duvu9xt>XlYgHi)SJ|IxXm^!q zm72!)5}S=i)xxymD%_|VExVBE(ACA=IP1f{l&#txZ;-llqUvD!b{hz?GxcMFx1?-z z&Qkt)7(~pfGW@VGXdOdvL9m3;DHX!|1#WgT@VT{#h>DK39{Y)c89|+bprvJbheMaTQ*|$)fGNp5Wxb|KhC*^WlSf8Q=HTtzev+ z6EIz!_teAGa*VAOcterKUAX@ue&x-3o?>eB z3rf}^fa9jBg?@Op^)8FY^7GN&P^h21)qx}l(a-7}%k_=|2A2zY_D(aKdY_Edy9Gv; zTi!2^fuLUwe$>1z+RO7+v~NoOxB}48WP>9oBW31V-+xMZ8NAmE@TSxpSm+g<=4OE2 z3WT3)%AgP2;HwMxUC+Ap>uM7_&p5@rsPW>=p&~;+Sq!#nDW;RYQObYdzUH;L%yB!?VTf7YsvdAYx|;8_VrQ+w z;`E_CgLxu+M>>jeN4)X4X&*=KW{Nh=U~P+~_&e(da5<&w1^cE%QrRy~}>J>zsXm;D9ajelly@ zx6!DI7b)IPzIQ6>^ z(G~m0Td(c+>lQjBxw*MlJ`zLz4p0av0!UmBIbEX-sqUN4t!bz5c>OzxGf<}*PBIO$ zUfG)7k9+Q|HE*kIPNlcVjceYm;A0H8L0r@2=uP0mG@GCO%%6oUP*SKA)C)Oo1=dO# zV0og10N0n7y))GAsiVK5@Y@ot9&!fk#`09uqQbn#c(b;KMW)KANtS}4Bt#+d7ML>! z;Do9)-rQRh*;@!$DmWU%v$%a)nBXT|mKu3Ejy)T%T~gT&v>(-j?z!F9D=1--vn?Zk zOmEAtw9u4G5tQGU{}yM-SfuSz!Kb64vH1l|N0_bs7DFR&q(% zcV+Xq@hfEax_YwgdWp&hU)}0#WhoH|v6osF<@c(a+u@|xW28YyvdAfWT=HVvDhg+~ zasHrH`1+cHcn>nYQSb-pM3v|Ic#T6Cskq>l&3o+?@@B`RV{(-UQX9-jtEFpAyBCl6 z?9j|$wi8rUJquJSYFoy0L{=xM%#G;4sIWT~6A#nZFmCxOI8l|!FV`eWWd0HZehT6a zqM`f=m8Ff`4ib%y`H)L)VZSI4N!&3#E;*f-PQLo>%NO4<4AHNvFFRS3PkD$j@TqJw@R@UOg0 zai7$E#Kx)|_n$rDYuK2Xd@!(lD94Aon-+oQkVmIPp>UxDBOux-oQo|nRYzmjqVj?GA9SKt)W zfl4dgSD-&R&m3~d`pmUX? z;jGcVBg0F4C*^MHXLS_ov>ZQdN+;pQOrwycEr!Zly(Vn`-OY_q5rt?LiSrG4_Y8aH z*fZZfmvn@4!6v`Q08+8$Q3h&V^q1|MJL<6sm0~JRNXeBl<(OR#HYV!ag>sgTuv=2< zO6mgdDkz^1*FSlIv5Z%?R_<~1w{cK5C~ZZzy?xt>;jFH&C_5=%oUD#jb3pBaJprG? zK~r1nIdy`&VM{21ngdkj2xk$HN68#m>s@zypdTIP&}q~?LmA1~yy%{&mEyp(F*8wQ zz?m+{f5Tzdd!{^9wv~(@zM@uTenFe*xRzlM1x=J5HPZBMl4AEN5JrU)od`0zq&LKh zn*;_CxA;CEv8^#y=7Srpqydo4mki6^fav9&y$?2|hTRLnB{!boR!|I1WPirZdg>+S zLT6dxUjMF#686rBlKA<|dAlIBS;;nryy&VT9w4FxPSOKtJzS60a=L=;rMSmXbbUr? zr*g@gt#f5V7}0hjZhfFpYHx}d?Zk0i$E2vQCFj;Y_JeLFU+>3z?2-##v;pHF+SvR< zXQx`Nj0fl`cztFrg0dAW;Ks<-jTxa9SSIyZJp#V}5TneYqG z2_-*&6+2~l{Qmliks51C8h9@EnHl(y9D#>$1)~irq!r#*kb*RM?%+CI>e6z(#hzf| zaY4w)ROCI55NRDVyupK}sO!(NFW(fGDz1FFbMTVd%AqO>M-;HOlTnVrJCarXTn24y zWL&oN2(f}g%wbG?_@!<0z_k2WJ}WX=5UYz7uSXXCpM3;HdcPG#q6eH-Y3lf*WVhm! z{!5<`G_w&KB+1~b^C$P!QA!!*?lBue9zXlUk*{}RZ|S>xg!dLGltOObyTP9D6SWl~ z0C@ZSy629zt^=zjgtG%JQ~ixU%7nDF_P{W6@wK!WY2+x9arqjak*H@K_cip2x)~?#qCx15E=CFrAx*#ps@@%IvtFPM;F8_U@OQg?ADz+Narvb&7d6SrlSSQ+YeTw z7&ku0e2yl|u5*t_JyGg^f{|FIk^nIX0bn!ctW9QS_6jgoov`v$mi>d4XCx!EDJ?hX zqPuF{DkY??OqeKcYwQeG)b5eD^?l-JmE91(d;pm4cJ%eJ70?qiO`8S`+uL5t#SunY zfY0}EOp@C-e_^E+;WQbrnXQ16WQAE+j!PpNfv(hjz&g?wr#X$?F1F&&FI5}0VCJtG z7)#1HzYiyEYveICmd@IQuARNeO~!v#S>!g^ zBI>OlcV1X4&(ip@WXc^>szk$}?OqE4rJhxBrwelHqgxK0g&yW! zL1KO%k*j$HM~ARWn5W8MoJ=v77W7uQYP2*3H6+1LAV;F;X{j3}Aowb+#bN9EYO1&h zx|Ynl#VTr~bx!qQhGD?G6V$n9gRWt%voV?vR8g*6i~b#%K}{dX`h2&4)*ik<+PPXF z)T(!t?aew;XPrz@RZ>*WC{#$LHi4z zk2HVSLdw#4o$MqsqdZVq_j{Q?zO$-;R%+9iYyM@=xk@m|h-SE!N*uS9Rki=<-Yi}y zlM+6~RVd12v0<4=42)b|JPM}7)9cYeFAg(j;uYmu8iJa_*MGXCBwMTdiM@OC zY_7rDk3dsa-OeKTA!yZg;0;~nbNeyWlScf?sGmQOKA?|AVYy_M*!pS|Kg8&6u(y4xo+FF={HhDf z8)jc6S(c~#GnamYmM0=1%+Jd;-w@K2hq5*bYsugaOy|&ZM}r!-v&2 znkTvTszJxxx0BDy@$kbt=`aUm$0F?3<`}pjQQGh?Ib59|j%E3YxlkZ6glhUj7M9zP zmCbAp(cE++ky{hWnVJPjk8FOjc``gR^ld#3ht=3DRZImNrp z+cGXNmsbeJP81tx6IH*Kufg9&CM@y_NWpH77~g^HnWx~v>E%*e)!SXRqq2*>ysXN> zbuO(4ZSP)MWDglYfW!2`#vw~fMfFUWk*jM{udGlY8MgRV=HY;PKW-1C9K6i<4;%_u z)uAIJ76&f_UIEcDXW%A(Cf`z9Rk0K9``Toz_%X}nx{~5jW*;B2m2{d7Q9R810jV3e z0`5C}aTP#{#tYr0$Aeu#vHOwL%V4DyKmTpT%jOE7w^F?OX3#DB@MB(bM}Ts#x~pMz zTl3>r3s_gB=sJrRTJ@VJGWSGkjus)7z9i84vNxrK8>)#!4PtF#7t(dJFw%Qx9L%EwPGiudPeYClt%!@8%dnA=imUu?|YS~sB&OzJeb;-kc z#hP}aw;j(TfxA*|5OU`$u*l9;jL=&iw|GGL0cod~^7{-O>>yCR7Yc$dqloaE!E=n3 zEAL%%cxXuVZ?POo*o3$EYD$q|gFl3smW8g-*lFCJKmEvZGpy5Q#7>wU6VpTyn|&C|K3 zozL|*4L}yXnWC>tB*0H@=O>XImySetRI_*UkxjuGL3xc8EK?i4^#5EjTb6UCI5m4o%NP@bv=&fMS_9VX3k22 zGoScMcdO8Ft0%}^!h@?KWbm^9H24nz=03%!jhNJ`IVO%m!hv6VTFN{Dzk)yENPzR^ zhy{M+4PMXAOQopzD>#MO8)e2=0l7T$U&on@HxP$!KV2}ahIY+BJQ|vpH3yY>DhLLv z$pBu$L`hsGX~jKuy@%IY)a)CrV(UUK;#b>Sp#@TQ4NqE30~(m8@=)^(TiumHepq_P z-rYPI-``)U&0^YPN=)}I^*hZ|b zS%iCE!O2uUV{}s6nKj_iAUEQvKk+s^%MUKH6mvYrfy8sh`6!eYG=TX>RlxxmEu~G+7*4RU1GTE%R`FoT%olh%T zlZ|3U{49fSCs@CG-pkz&!vCnW8aq0#kYgX$mRlC$*+x332gCZ3bZpyMjb=3!Qic_` zxKU!hx#SCw$!5nc8KgnxzYhQy8;8EdKtbGsw8}(R=$K;yJiMgw-zo!n6L8#bJ zS2iXRn_WJ*I79bWwYh&>w9=K!SX$_$(HJdcoiL-;hsK4k~v?7u4F&cW$k${X&H8L~$n$u0mifP|KLcTQ`+id_p zyp1xgf+6Vdxl6+lADh=-wEe_4@r&zr2UTBH7`v^;Gw~i9sv{2}%Le&<#I~#==V{dr zj^U>{>Pl_l#CnBw2M^r9AIgev1xF^Yp^ea6U;DAv-$aIV>~6=5mSB)1Z~Dqe4-V}v z&zIHwE1MMC)EkiRV|0h*jEXk02#a@?%EOqluG?uD8v$n=1F+Q}A5|nQ#FRZd)6h@m zRCMOx{4Wi0S&^dY2@-UYwny@hS%0Ed08st)al+fcH!|Ck(sO~zXq_}IV^ z`%w+CUJW2Z%<;k$^Cn^~=;j7W1k)&R-k5?MT#hiu1 zgI1jp7`NuMQl6t#s7kv{pS)dY#=x7XZUco1qa8n1_g+vYo`u;Mtxb3YGq5$Ws0vEM z7zk{!@?xewLD44=@?wm9#p1cXpR_ArR#oX5vGl(9HdXdPc!?C>$ zE2mQcSO3Z(K*I4sxEnsEUxgpn#*Xkio#@CUvo9#w^-7FTzLr?o>C4%@U>i-iN@Icl zCoa+C#!Q)HANDK#|IqanP*HAs--@7w(xG%pgGzUYbazNg3DVsu-AYSHGtv#x4bt7+ z-SzG9yzl$nd(XLR&6*YlsTkGflhET^}^dtx1mm>jC2|a=Uo&CYy+o(c*L`_m=rGGQTmRRqc{Cs zjIba*)5x8L!9V;9Cl;^(ayiJzve^)K-S+bipWJM53eA4M=2yqM-C9kJ!s>$?fe46h zYoo+ztzw|A>W0@dR(xVhq3N#f(-`z52L+jY9KT|r_kn9Sb9@qJGWimQLFO7m5D9f@q7=dePI}~IoejU8ECaYzd7kA{s}EuUgSXMVj$y0k z;nQ_3yndZHlonX3>xe5GFF_oFFxn_vm7mpV00oBeqrsxSgE>MwD!DZc9c&z9b#XQ0q!m&9w5>`ogZ)Fg)n}VpCk&KUu7@eg9y5W!V$G_qCQ|?2! zJvE(JRBKQzg%Fr*n3U8S6PV8|X*O7P8Kq(HB&)8qm4h_XYpysNibddbV<_c5rOuA^ zIUh7^2LxJ+I9dILg-{|asFA3){m`}Lf7qc}t1P1f>A8LW*_xA~YDbIDGog+c|2KzZ z`fN)=CTgZ_{A<}{D3DSLme?b1Vy9=6K=plk2b$NfH8v+NkDBF0wCi{F+oR~McUqr! zE6k)M7Hu3qNA;pvN%CWK6W#}_-79eP#2TS^%HH}U_J)xZ5hy$6x%0HT!0Rw?AY2x_ z!p~u|ZAjLkNO=rfRKQi+yDa2fO3xtce7{!pF+HR8tt%P&RGq#IBzhoZ?GH`^7iJB+ zQNs4k_`g6zRY|-K+db|O2eG$lR#w=x(!4|vwC`2>MxNO3%C1~*{6ZV|fI+Q%U2Z=C znf9#Y7J{O5sHD`}tRJ zE%aw^8Vb36eBB(Gl>FhxCm*2S;DfAJjKw6z66@dJ6To9b4*swv|MPvIZ>8}bP@;(xosx=x(uc(c5m}{jZa()6xwLgDl4;>5bRc9@5t+)ce zCMK#xLt}i&y?cm%U3ePF6}h{Qk6s{jYTwL<3?!pL>X>5H0-*zMhVwXpbG&$`yNu)y zsO#_FogI+Da261uqxVmbifDk?)o@mKR`|zXgBL4!J5^<5!qw=okB*O*$6h~1w~qdG zw9;wR`lJ8)K_+5NWu5zX6Qw9-ICSOCXXP8N8G@PdHWYEbTl*)068s{a{j4Qafk%~ zs0iD}X#nO={LXybqPwdvcIH!!x|_SZ*3X^~#p6=$K>*Mz*bG{^5lL}z6o923 zgTzqHe|>Rqu$xyxh%m|yQ{!A?v)YCB?dphPzpY>|MOZDtON~Yn>1(^A zIR2*F_pe8qoJ)Q$o;VcImP4uuKo%F>8i>*>gu+8^zcU_(!gnjj`e~MGBgHYbVhZ%7 z$pL!zhtxOH$B!SEnolqkyn&YCocAgwR>gD=vR`$(eOLg9g=ianGJ# zM+G@f{jV0l*~JB0?OHT!e(WRI#R(lx#gM9SE zg>ttvFX;bu3;v&Z4Up?*IE@YjebK(1WpJi`0T+Wfp2O$6*hEdk{w&i%UR5~U<+v^14Z_PK<6&oP?w-q`7BAU%nJC6AfB1w#KMB&}dg}E$akQ%_1 zj_xfXIP4TvAqvtl)^3vSnFhd|A}t{W{1$_MaflBX#oy*9D$G?IR*BGoCcqIODp9*| z;G)>*x2JNe8!sWb<1SBtbx6m{Ta0nOx#?CD@wa_HeI30^)ga&W_C2+8DZ@K$qC0D; z%3bbAiuVZ4rJk-THKMSP{5V?Gp5Nbvite5Rx@*5emB>Ichrt{hpbcN0&saf`)6vn< z`g0L+0HqTm(*8kk(nl=5VQ;cT2u3;M)2IN4&LN_&D$b|vkaw{{RIY#nwVLL6KScOJ zWNgg?Jr@xsl`wmvsi8q)q2pdFoREj6GeT_UVErEs3nSw1be?6DW-FUO-kpWtY8>WY-<}Mv0lZ52c~nwTK|{%+C0r7>bLly}P|&h0 z-yJ!Qj??$~z@I|!N{kJs(S4~rnyJp~uT1CbYZ!LM3KBlyfet|{=39fzsl|rnEp_g3 zKzmi%z!sV>fizxAyq5Y(Y|s%};^P19W`z?$iPanAj6E!huV$Thmbwak*;sxlpxk80N|*$tnS856;k`O}t(T$@tAFf)`6jYzttV*G(cH z&dp_*LiyXi@CbpOT#mj)Rc0Y?*zgX=|Ji8PVR2~nYztS&)Du|<6gl6D!dKYNXsg`U zcM0G`@W#p(Q>DK~VA+<%Sy2SG0Zexs;Xr=kjg#k`-H5b}I7Q#X#eyf;jKAA>kZ{}F zobQd}>xsG>n65Gi%8-k7@5u8y?5fQTZjTk%N4sUxCjed-g4}6-m}=a{-{?2Re@=nf zW=BMwS5>FE*6+IZ;D$i7d_G=lZ_YEbTx!%?eh7#1X4Lm*Tw)>(K<$r|ap?z$kwau< zWhY2+xN9RL;LC*1_hwWbLn6h$!D_K^HoVi%8&aQlGT z3*||FM0vX#D?t}-=@&C3p3aK#vG}#^=2%%^@O{9sU zv2l&XHYfT2@US&^y318~5k?Gqc&`uojBelZt^YkIOM~9LB4b2*ua1Q4LA-bPm0&CB|w{MufR45 zG?Zgu4?TP5X|~I@qC!-r9Q!Rr7UM)JofkIgl}_fd&t+GfUudu3j+gJW9I5Qz1h~;A zFuFpxVa^ZcdbrSCK?p_c9gUz=(5c$pT9AlKLP8=!2(P2*gk^GwiiCtjTlyu_#wk?( zlm`73lK3wpc(+pL`rgp?xTgy8Eg7^a7@hyBiUK9T+`z|r^t4TPdYSxfe*RA^A%}$U zd!+zdM=AAR>0kU~XzVeGuQku{F;TGKepg5%As`$=YJE?{|1Sh-M+cE99U=CgFm(;R zOIjj2G?!p`p(>)<`IxMReY)fb!De~XbZfrR{_~g`R68V|U*D{j{B@3muuvzH7*P-} z^_iegmW&tCx43A28;N}3w9uH)Li}#!8l9CGg)HTmfaR?%26Hk;$-Biz^gdTEuKDh% z!};nMJZ}}KQEUfPtFqGKll|QFy9Y4YnrfHF(oZ-B{T}_5cSy*3IjU!ybYMfTSdIiX zI!2LvZO@THRr+UCrD@q{lTl)|v#YB30!vX$Y`GoJD*r=<)vpno5yO>vD$}`qZ&(+s zRPn4IDYnu?R^uCz_^Cb@VXca1tg@}FVdupj6@b-#}u&-G8v$9rAG zc1xzi!NK~hOGUqL%YmouVpGrbrL7vBKy$S7l6VqlaplrxgA&0(W>}Q`@sMK~Ilr^L z{noT}s8)&QIU#!AOaIy8?pNP@x??KEKE*J-@3y)6iuTT7@~Svs)TlGY)~qSZ>Pn>) z84|6<#@K!S9Ccw=_>5qSv5|lQ?SYrAW_Oa~&0lfD1Yqs;o)sgAfm?5lj4G~_F;Tl$ zM`6*&j*xazW=P0Q^_ht`_9xdT3^t-PTQ9FYY7ZVOZ!I>D@;#Z6aW1ZfxQ6Z<;T92A zD;>HKu33sb-wPs*U%TGm-)2K6GoUc9&xTW%oLjg`XB zx|h{{qZI9#N)a||=@0SaKEpUHA&kxy#!pj5I;G-{g^y=Fi$^4spQ__Z*(0fm_pvK? z9dPQZo%Gq;b|ETSz@{(=)FpP5ZV-(xoS}Nj&EH6@ z?XvMXQeSVq60i|=hBK6{7fih8)GQ4rh}o@XKl-%I$wnL(cKe}+Y6X&VShB z-ta@$j2;kAJ-&}dok>=7NuwFDAE-Q>E!S!D_k)B5dq*d)=<%do(!u|5;!}pGD}Bt= zYrQ^?Jf}~jmSv1t&PJRYZTji*;{geK#wOF??=q)3zyhOs)^1wA5b1QZpIQ%t-X~wpCF(yIOicn z>(z}~9AZ>GLv`l6ZUB9EW)X_xgzzSZ5NC&R&WOLa$8#@%!O*;MTs#VsuWI`d~Ef*9&yYcKJ7mJWZ00L%3+dq zp9dEWWd0OxXCyzE#R?s~G54j>5P&MG5WDzaR(A)*>!5FMFf<|>J-kjGF7pmtb$Z$p z9Umbn+UL+cd*WClitTuuWieMP5>CYTx~Asp0K)fhsqKty#ZanyVsZ+OeIT4rBQhQq z78WH{%rl{U``jyb6 z-y2urSE*~bTKs*Q{pns6H#y;4T0+XJux$B}4)oD#?~20exXh#O<7391EE8I+3&-(# zWx=(5`qohCB%?%$#^mJGG+AnTCe88P@Tj2%&27#ZlupTyk!j5NI3GrSuv*Y*mCKdJ zTBE;wNe*-#;_%~EKDJ~hNaV;A$KgA#bi4qPG(@z=nPTA*PQFjk3HN7jnx}umsc2l8 zhzI@@PKs(vJ&zyL$J_p>_&q4hQ>8c-a9PD4P6o>Ij&5$R0F{o`bhf&r|NhtlkaN4f z3q8vQjg7Uf4vJ}wSaT_}LAOBy?z!hGjGCU^K6)9?jbm^2i`bVqnl_Ff&d$4H!o9CJ z9{KXPuinD!{kTm@BjZ_hq8VhO_`R0PtfN)O!| z8K&@OG(n%&l+6ml3VIFVm5FTg@mtz5lR*`I39%Hn+Mw6UwVJMY7E}6UZZGh7>m@qn zQhiBsa9Z&6P#eCyTh+Juky_&(k;-E@H(kNnq6)Z^zc4Ir{UrO9dmHA9wYi!LSSO~G*xS?KHzO>T!<8ze8=)O3<%mhZw z*UwP!Be@Q0CHYR@4#0u5Fjyy7F^Ts{nCp|w8P9(uPWYJ|VUMbbaQ#M2Xn81?V? z(^k8Fndx%Oe&6=9#b|BP_h+ZVD8)1!rKsDD8S&0N34-GP_d2XpjHT>*` zCghG(G+ir{8UqUy(}`-Jm#17<{^Ao^k*{WN@TB5!x(Cme4x?^XOUVUMSp4Lr;yW8T zzAcPt&B}JG1ivhDQzbqnji>9bg>lBAb9EP}PDt5VS-Ea+u^Z-dtcb46n{}6WHfXD6 zZ3>W|sh2vHAft4v5bF1jVw`+V2(22JK0gv;GTQv9cYLAixs`MI0*^ITk}-wKetX?k zQd#!i6Hsjd6PPYlM+ZuHF33FtR9^8JR!gH0^xE^?DSDi+mn09xI`r?ilX<@$H8RV& zYdcJ>`M7{LicaMLy(H9tGK(#Rvo>DEL}t^%`tjEia&nP`wBc}8m3@VDrs?%<#nsCa zM|m0DXrWVhK#}Y`Ri~rkt?`^DW&AUA%utxWf=n%g&iQM7N_aC8OSN>qsaD{)B z?pu~vT&EufxeKY?29DknWq&DVM`6DZC-&+VWi8(`K5ItSDWw8b~Y8adSL} zjrPJ2`sP7S1oq)|$ncGDA);(w+%KaOqgBte=>7SIHHgs8>UHxKn@Kjoc(HaJR8=oT zG&o0ghv>@Lx#peeF*yQKFAAP^iCYa2gcL8XyLVA$R73rAvB##{OW-)4ZS{p%fyBaa zc(s6nn3x~wgD2yyW^t`qG~qy@I-evNg@(3AJC=`@5@7XzLrmLAPpy9@QCs`D`NdG= zccD09+i#6|2r8Xw4K8uB%zMT=Tj_)?CLhGY@rOFA_pkBn*at}M>1HQG6=6^W$)n_M z2I_w7BxT3Ys7fmb>x?(6EF%h&J8f7hviS-HJRcLAuCy#T-5=A0m>3&&sp@)suWx$2 z=^`&Lud!Ntlj>^6Q9PDB)dXM91UT235TZ-R%}M#<)OR8qC`^KpyRC5^_gi8FFmRRX z5=ys1!5>h$7zx>Ajz^`pQ+Zs=f3r$!vpKG9o!mJt^n5zI-<~c?>eWuD_7kRe)0-ma zet4+KbjM9Zx()6yDRk%8Q9GU9o>fI;LS$@2xS0+l=b1RtQL08 z0dlDt3QCi!pl*=PXMXso%>sU*FozI5b~Sc!v+m=`4{27CBrwabzW#NyVpnA7!9OV zmN8d7WFLRj%Bx*o=t@M^4qqz~1&@$?Su|}t%JLjpmmY>#@im~3zN)WV9+gV!RL*c~ zT@3cGe?t`*v>zB8 zsx-e~K*&=R16mWsJT;`Gq_8@;@I)-nbqp+H6H=O|CpuLZ+FFtxladr?HY~9}8@0#h zw5Z0W`%K31@$l-(XM74((CIlcKC>E3YEBe=7wCJ6+LyA0O(yN~LKu4zOZ+&mhv3f!&0Dk51kydtzSH2025Itj%10rXn1n z^MW%Zsj8`*x1lfyx3Z25UG!(R#o;Vzw=XyO|EY&>khFz$*0o1TDVevEK zfojla*Vv1MhLlhqY5|i5y|7XsKmj?OQ>0of=CyQ%(`eRv47>;`U3&wccV!fL zamftSwx8F)K2z}!^e>kaea?sR+aiHj~jn?>)FZdCxl%I5B z1GV+uXM)csNM$(v^>IN@2j6_9)lT>tle2o+?X)#h(_k^#IJ13Z)C8#&B4DX5^K7Xv z%U1vB(Y2Vtj`gERfg#1y!8IG*)iK!o&hGB+VJM>4e~SL{Zfz7%t);sfqF^9 zVjhD_GhHOFPPmB;&5V4{LeIs7`mpB(FM@P12BcVVz{3b=pzf{beuUrCmJ2x{A>)245}Q@trOvQjAayRPj%Wx3K@ecD>tynlR$x-roIQSntT zQ;#pwdgx``#yb7C`4@4U_WV`vPt3Cul+QYw2Bo1TosL~s;rMblErog{*HXb#T<68l zN4a<;sW0kcT|S~llg5c*3C4uHL%CRfh~P5A`N3Q8mW;f<_PO``uJ;#Kut^-M2PA7> z&RQE1A~zP`j|m}nF@fskzL3GV=E}{ld!~Zw15y)^fgk;qfopx^uknW{_Go|oqt`a} zK0V6~TbZ*m#xq|oY{b9xcQp%_?yP7-rvBxzt(x-qS5D>vN=liWo?-)p;qRvRoY8X^ z<`ch{NRk4cc1Klb(exj!)p&$m_N7qVy~)tlBzNq6+U-$c8Jq83fN# zmh58Fq}PCWCNF!?FFQMtKg$?~%Qn7tNNAQ>A8pM9*wxzZWhMIUh_8wTsnE84$hWGO zygn><5u3HQx0^Tj4ZT47)Ms44tqc$GbHo*tI}|2r!Ebxz_lr0bVxPo{j*p(v5RFfe zQ+n=R_DqMNruJrRnL?a(zbmi7Vgs0maaZSC;uM!SB&SgV7~8S)*r?ibNu_BY&GQK)#&qXs$eX zB_!jlQ{yp|^w%h1bvmBEL~VLwZoog?NSd@-bCVByk*P#_`w?rsT4vZ?qiZX&S!5hi z=(8A-8Wpq#>5AVAnY+s;7iyygg+6le z_DUEWS`!wwlrF)A1oMOj^ZpLJ+tB)a7k|e6WhchyPl``ARJyo|G6juOP4c| zPxLiOxHdn@zsvJDaNMQ5I?Sm+Fz{7OB&lj6_uzC+T2+GE*{_!=6FaZt3h%cLRFKf; z$p$BKb<%+3wl1vJtPJ zcn1Qa!Mw|fwDz+y^KUN{`wWb`7RRBG5pnyM450G+NbGSyKbDS(8}uWq<3q$albvniI13t1>i#+ zsUd79XYaNRYCaALrcgfb`;aNRF_`>=P0I7Nu6sqJv)jtq!7f625oT-bQ#^WiO_C#{^VTudok}7{MBF#<^ zotU5MF@pFr>I@%d5n(#wFJE3LVZvg<-He#rXrelKH4M4&%F#_mlG4x+D+^Hj_=qPU zdy_||-flP^F_gtj%}p5!m3ALo26NeN^ffp(mRXcGacs;MYKwAKmAH^0PG$bU8OB4~ zvfnKbBR4tFcz?g@5ZpA7o3!;CRgcAPQrpaaoI=tg_KT)?<@h|C(SK1EE;CZMNq(Lynkb&+_|kxu~+gS6dsf$`+0wH zi_eU6%MOcY-0x^*^h<;q+_B+f*Bfz$sM$s7^+4rZZ`UYY5Ia2$zMk-lT@Ea*j#o)anhFgx|Pp+&iYy&FnF_k-Y0mM0d`| zd8qpJC>bq#qxaD2$wfyn<38E-nBX@^V}GaQb|Yv2d^fxPy0L7BN86(ucGUlSR#$#O zY`w8?Cif^V(UxY-qIuk6DlvJ(hPLm93iZU@{5mjNt>DLVqR9mo94nw^chk7bf*65< zXKiz)YSlPy;QbZins%kIHmOk61)2T%kwfY1U0!5~Bu!2+C$)?6TVX~r(LPa7iq!92z)1?qdF#v76*!M6=;}681`!C{h zHmag=_UjY`X{xY-O%+HdzVKD11nGQDUfNFBR31g@iTEr_(an}Bqq%qK`w(A|bRT^e zh%7lcKtnyetx$M#Ijo1((D%d#!d8N?9IKrEF3oCAR3nS=M2W3$hTHAz)#i$cN?#-) z!oEm?{0)+6WV`A8n_msKq%L}m_p?GfXID&=J2fIx5zI;#p}Wa~_Gqux88oo-V;-g2 z$;2^t_w%vju++606(moiEXsMBI>fThHjLF zmWtVcD`A6`#TFlbB& zy?Kv_Z|*#nIP09;XYCHqb_dma0QZxK=IsQHS}H}@fsem6jNRR6?tV&XYdvCoUDd80 zeY{P6b-8n}mT@xu{w&L-vVo18O#V=awgHxV?6h=XGB53nd;dn3n3YB_o85qd&GY$? z4wl3e>B}RuAWUv7`pGPtAm%(bvxT%Bq^yHi!4<1z5bUmuxB`6pq<9CdfYYY=sDrJ~ zh;Q49if!uknYs}m}7Zrwa*a{j~s&7Hon{d>-p^@BBzq(F({R}&3Ghdlr#|$?w zv{|1jJe-r-TU>~G%e?Z(cg%Id_*0hH_9NfD#@Nm)QtfjHK^^&oc#N%nFbg_4L#1^A zSG-uG%-88F!vl3Pv|!OJmLet8pN)=^?OE&yVBfHj1e0#rD8)9$p-#+RNBDQA?P4);~%WYS+3r_|VMrXd#%+;f&Xv9zj~LbBU_{|@ zSPXO?sDOF!1&fjEuiCu8BgvK#pQJ|zdRz6L%?`Tk3(M|AQC3ICMhDPK=7%wg0a!}( zMo3LfO>}ZH9Z;x0Q=_{|ah#8`9pDfHD$XnRl~8K{AWr4F+qu)tEe`!F5n`{wcN*3h zi#&8G7mSpYId(FAt%dBmC?8-(@h#l0YS7d120#7P?EWI0-sT5cjaB+qwn`cN{DRk? zZUv=LCuK%*tmkt$qaD!ThA9!pQ(4Sc%n4^UAD1d_IM>KiE6Lzpy*#@-T7imT0+)jD z!K3wRk2{xdK-3Y$`jUrYQq|4h1$>{rvtHyk1zfqAJdj#Px3vjFS|)&Y$6AyaVH8lf zgDQ5;4lwo%3}uRCOT^KLZ24?JHgwuii!{CG6vu?|12=dU7yc*o^A~7W*o?a8 zGSF{HF2{=Cq?+>ODDi>UT8;H!a_^&GSrYT9Zi^d~|lV)u57O*FyA2$&ocx z@NJo;DL=03uNlvwBqA*dYr{IBXj4gyiT<3!8K`nv;9b?Mcbnq+15V}!LN<%uRDYq4%etzltrN|TLQMv(~%P^3esX1u8$pShiW->v; zEgloa+G}?g3##%T){%eORk9(yco7G_ctO`&E0248-XE1vwSWE zUI|Y#xXuOsjO3rW_ScL9&%6k+YHh0ef-I)dN)z(=1}V7S!Cm}4gbD}%7w0UHPXhaP z64cC;nJ3r#lfoF+UJZjT4uw>O#gqb&`%H&r8eMV$x~18I{)jYjhpDdnXoYG%R7Kg6 z2|b{iqQtojP?3}gIxcygb`rwLB$mejOIg*x0Y#cZp^#921=5ys48MBdXwwTt!-0<2 zFaQLxw~ue?X5w;_D)+c2F)18259o|zb=1a7|MM6Yk&h4ZhW@)1U(x_k>Eq>(t^GV5WFlA~actImrr&jc38?ms6z^ThCZ(5LCLteP|CG8sM12a29amxd00AN|t+(6SmqceAQ7s)PN*uScNR76nDArg~hP zQuL5aBee@T9?Tc{(akLYIAP(sT|di2?v7wSr2@6C`wcZ9VG7Vws&FUrUPQA1-b-0E?^19I0As)#h7rgq)h%aru9;h-{kpNA^-F+V z&c*P(bS`cz_@_ny>t{jDtLs=`WGboU!O6bc%x%9eyQt7U{gVLB33gMI>q!T zAIp^&5@8lt?pLH`Zbi?7SH{=!qZ~|GgJe+)hzF*oz(^~PVi#kaw4k&x z3tI}AP^LmNHD=Ay(s;2Il*?mmviW4f%TBtCr1mxU?W$#9L@}E2`BCMI zB?~aLQ03@uplU@1Y>r|;Bq~29a^gT35vK!Vk}R)!z2KI)k_*{H9Lg`&lrM%iZE=S* zN(^wH7-s3oUoY4E$2CL$xfskJjG)_bq0?!Mk-T=PRX~;ztDvZ;?LQf{e=%(i$xBoQ zTE{9Pv+{=oaP#i3%#27lpD&}6{`|mXGN6>_mpUMFy$Cdmm6cxl(H00u37x+D(w@{` ze2-3Q%;~WE(ZSZzfETq!ZUf2xXz%$-W<-5Gw<=9$N?OH>Go{*eS>DQL7CORta;E;|I<_#NpDjiun&VQ+)p#i zdw{ct-W8b;xl7x7k;SM7Q~5+fOo?O;rM;H1>DGqAMK2wk8r9jj%ORW@S#mR77O4F$ z=et|z4c5;K-nx{1nybxI>YOSwnW^nhWRX0Z$d<&ZS{aY+Xcg6dEo||9|7*$^o0%2K z+Huu_M;TY)G-{DQ7HN_D4u;(x#g6^XO3;1nN;nrLKolqJ7&k_HiNRntaAz$2b+P~Y z?5$4>wk*}RS|OSVx!L|*)P)L{K=d(xv>u2`QyrO2{?ubw0IP`V$OLryC3bxnRrr`E zmIT{I)lE_Wke5z=D>5k3XK5CgMijumgO^Y9xX!~J8LR1ks$#gi(A1QOGE80tbRRo9 zcUHS&pxA3OtZpD4SycuOr~;Kx?hlw)folGvQo{E3d(&h6vIphBqXR436DSm~0SQV~ zQwud}n`R%lVh(*433wBr$=R5$n z&z%d%%$s1hQ$7c1Ia=!KWvO1dqa5}?L$!Z>EZSkfzg0n^Q(K#BrR$?5F~fo9^)Dgo zR502fP9r}~b5Tsa?s|vVd9gpNvrLOs_<3zB+4*F>8|dw2B9pbiM!i?VDgiVB&^aYi z4Wo6xf4INkQ!oD*g&s&OH3!iAKD-R|hk`>MfxP%u=|uCQ9r z5%H2vW|z;F-M-(`DdAi$Hyw%n=qGrNS}SLG53uTtKW$d$92bfdkfKzAPKdV!e&TZ2 zWEH%*YxaE>HwZMU$xU9uJdv6p7Q#$qh(|$2;W>?@9mDX!QD7Nj^rIWSZNWda2Nf4F zRR5!%hI7&|stka;hYf1s@Ayt63fs$$>hY5dP&@`9Bi zg6`om3lyAq2pK2}B<@(QVn;5RiELtiOWeYuSfZEB)l_morRE@a06U}fFw^|YRzVp? z#Cy}KcyU2}~ z|G72D)q>#T^UZJooKHC85R$Fv>DRGc6|M4Xr|HgW2i<9&tIYlQ;s&F0Z+JMNw#2bF zqJn}x6;qZ(f~hH+aFlf?OIFwqvz#l){{Z?1$5bo~G!JW*rs~0jx}Xgs<1p$J4ioPA z)nuFw+JcdgLFZ55`8(~1-x{!~u(U1;epy5f_-9<_as_C7UNi>V%b1p<(QNzz{4R=H)KK_nQ%bPGHhGbW}4vczkO5>mA99u zo4~0?sa>Af5Yls!pyp?Q7Ji&RR$9OCLLtw<#FYKq=*-s=NQqvD;Iqf>t0p9|S;d1W z3x|Cpg6}?Zb#)bH&*C5M&Y$}QPYClEs}Xf;ZS?j?B<)$_jgHE^TZq!0dj+$TN1>lz zU;&Xu=3bS6qxgA#woIU^2UOx8oGO^?8-VZ@z2I?E#LtEI->%*#ke^?XfG3-6dg-v! zad4NT^t|y|_IUdDXr~SB(i`!_`s*>5vAv*P&G!v~5AN%x+%(itnZo;;9Y$pu(1~sNHqD|2&12 zLTNH<=WB-2_Rx5<&-IPhy;j0gN=hoWZogI%nuyivR9kHTffUb`rh!TMz zC=KW|eK#~VmH-Y1M&Ow8xihpEx^z%q z!nBjR_21dVE9GOFaJ9z9Ds7Ez(99T&ceM7Zc3H{tQoQJpio6VQsU~RrAw*W?zRUj- zsX#&9o4^=i;O z6UzM}Cm|6S9vO+F3aA99n=Y{*&)w@8_TAfy1SeOO}JUghX^~EM}fU_Lon~wEw(c0p2(QX2_v(8^;wl&)rDXtlM%b zJB3RP0sJo+VDt!VPh!s6>>MX2SQ>u^*ohYS`}wIQjq+yv`c0{bXLfa-a|J{>d zMAOst75$3k>*u!2!fJoJq6Ki#=VZLO15so>N;e2#zgaB0 zK8P(3dHYhD8*F*Yuh6bt&5V7@m6xTh6nzmTz*s$Y+0u-QfOSg!*j0pp0W%vVmV%N} z($20t{VCLvjrb>QvZx}--DEH@CR8cf-EN!6ix}bH+>7w|`<&W`g~2`YSNb)SnQBY) zJ;?Q0L{@LfsN!4grJD%JSw45blJlWX$-elw9@w94$^uMjjV+s zNBlSLI4nINp9{F|uz&t9clEIq_z36BR)ha`5dxCwqmXU*QZ9$x$SO+dD5Ks4NgbV3 z`rY5Z<$xh^=5xGvYJgU0;cjOjI*oSayiV0EAv*>-=hzIEt`V`9oYLBsvwzJfDjgVI zwDfY({M z#|tVczqWvh}-Q;6|jX76BHD*!_fV=!AaM`fJapvDe|!wnwWr&z$r z*T-mtn&bdlC)lg1CycFfETtqNoXRU*l*{Zfy|8&$OVVXOk_=g z^)-6@{r!#AHzt#CsjqJYfK?7*o_uD2?wtxmM;mHo1nN^BDI5J)fRK9(>T}(PORWtx zNB=I^5UT+rK;kx)&8CuX_;5NkFoEZ8=&MwWuP5w$C4+>}JxLL56=Y0;Heb8?7CL`H z(Hszc2O8PtV`Cd`vd8<`@=MMie#$9$UaO-MIg1B>@J{9jXVxevLq=-Xo+-}@mxCQE z555>`nmNFAz>O0E_S{~OTG0b~Y`)vgUe$0@(~U2-ZnE`lVcCGq8BS0by=EnB2Ht-Z zL@7jxsr(?zStIFs$)i@NE7n06(M|Tre&nxY8(a6xOVTreDKC@{K8k}UtV?1EC%a^8 z^CyXm1JOyY#=Bf|-&o8$B_i3&hck$0H#i62bXkEV6$WrwkIhre=>fD+#!aL%6R7Gg z0t$-iT?456`Y4fPZ8CrS%@2(u?CIHg&By7k0A*NNyBzA;l`i0`MDqgw9vCsQh`Buu z2@6v;CLtK_4l<+~M{cDRdvc$OzU$b6#nC*f3RUUQp z!p|u2GDZ86<0O`t($3_WJM_AZTVh-#D zUq=g6W!;NGAl3uI3F^y2f$KS-F+~fOv^^d+3ohE$>5Nqq!Yv-F1r_kIskpWn4!^v; z-7bJAP3r@zCn(*)y|SaT(;VlFBWSR`|0!)>wnzweCABB?;7hX%`k4>TZ9C>|A;H-) z4GD=a5+}EyLNRK>Ae;@_1_g~3kdel6KAk^#8&`9S834K30H?7(#7?#KTHWe>Xw?|R zXJZEe;JMc*L3=%sYn|)!vTzM3l4OB`alSd_?BWTu-VfB;l%^><+U!ZEkznwL-*f_V z&9f#VkeXEK6crTO6VEqcZO;6}DL>`79lr}r z?iAATXB=(FGtDAsI2+g8?tQkM`OCQP>-Wa;uvbi?6`nvULL#>X2g~h9$UPn${XL-O z`$L$roP^*h=@`_o%neHPR63Er@VYcMK)1{PU1UN`-3jhuIh` z2E?fir^AxlNHZg{eDu9xu|pvYwc>BmpoYi$^(QiM#wVRbp1F)HmoQU+ia&n>*|($s~P$7CPFYh;(fHX~v^8vWDdA>V!CIO;%tQ(fjz* z?A}!=p-WDJfWcVc=TczT0E$-BdYiybB#K(`2bDJ=jMBya+}OqfsNkEpg{ww`V&Mo2 zi(5QNMxiQ1$7fm(RSy6>7kyFk2YJ|+%d8LP8}f;Ql$~CB4N`K`d3C|Hnvfulk|`kG z-GX+2gq-5Dhbtn#Td1lBU<#0eMh@2KASjiuA0G1KO`|#cp9%!=pvEl*nnMRVE@`CE zF6|miU!6%P_Y||)-vBiUB=`p^BS;xIW?pkPz4RGK^O;nQ46_k|WbDsuC)WLd``L&g zh`emB))FLv54LhX_jd8p#mj47ey6)L%8`#}zPNLI|8dNeW5Cla(f)oDwf+)AF{r#< ze5E)0S!)8U+tl^tO2in3d-YZjtXqxHC>AN!hs$HX++t8$%v0|F9neK%yNyIjeRxW! z>vNdB4pwslRD2#m_fr1?T6Bk(BEL_bH?L+L`tM<2$%+;R;KJ?q z?@i8MT;oME-}8y2(zam*Ng21&gi=)&zlhR6{f?TAC}fAu`;4Sg=(mr6+BG<0r*F!PmDJkjhZfW@K zGxc@mnfc>=*J7?z8W`uj~30kw*$fV=uZo*HE5G)vk{(F(#q8i`?XC^LP=|WVs+@N+-M=Tk{32ak=q)HU5Gbwk)Kdd1Tv6 zcK6>(N4^&J{y4fZAxwu)>oJ)Y6pSj2H+8dN0M4;xbYHE({i{b8mf;%VTxJDC`oUKo zkj(q!s1I0>d=aV4pq4_H!28B7(n-`fePaLI=Z17z;7ll&j4x74{Ak!Wibq7IWj@f6 z{OgcucDz1L`(oKd1`H&R_K=B=-r&fh8GkZA`-e=)ZnESOw=tG;j15t*`2!)#E}U&Z47- zT!=}F>5RxjI{BI+`#z`}eokMXy5tOMa@l5G1V+!koJ1n8f|TeR7IybC(4U;T@mldA)sfzA5QyJ zA(iD%0wj%@%xSyP6Ui_L_M<#iiDIa}KzGsUn4C`f za>#X4*`;tPjt74T@8GiK>NBb)y{-%262ejOGjJy8>g$c+{(aU#s)7XXv+u+7;v&%Z zL2#Ug{g)>A38J#fukBz8nrpPvVMdaMGbFOFZ`Azpu4gu*i+>9)N(KwL9eR$Bxc+Be z=SqnWg1opgzO@|CGtYHzCwfT6zCL6S2Qt2YA9-vVlq}dtzD(w;*(h~x?<$Nl_rp-KKP&oA=xBb%FvY~zKQkQ;~ck4{FL9W1EF>dP+1w?lc*p9Hi-f~ z->idduV<#?%!=j2UnAt6J#Z5r7F5S4Qq8Zu_6A&XGamqw#|K~g-Q$owMLzmmAjp9pU1eu(y-!2>tsksE# z{l34)iQ9+VW2-0qw(#snf5K0FUR=3aaiW*%tR~0!@HAM1FO6x5O=BO@#;=YHg7n6` zwz$X%+$rg5GKoh<`{GmOU;NY1uG~s7pIH4PlDp^bodDfAEl>jB8&R=5-LADY@j3&jD&@(2R5@hT@z%$Cb$fiU z8B#zRt2?JK0<^eP^*%-GJ-J6TJV8vJkRDqC3i9%OFGOaMFe72JLXZX~w3n-l#orP7 zV&pguWS$0ywPCvV_L)M4b{kGLsK&|Cni;XXw+BGFqQ@fD_Z+1RQ>YpF456?1duhxK zEMoFb>%+`9>ZfDoW?K@gZ|`O1S@H0&j>SefN6Bix&)E|HJRnLLQ}Zb0Jho{H3`vy+ zi&g6HB?qb?!WTjHe8}i<(ontKpkmNC(Q-_{CTM6CzKbXdbrJGrAVwvgDD^c;tnb^h6~ zk){%H_72p<84TwX7TncH3UL<+(@a>XMW$3Aq6Ez!k%;c1U;CIe*HpW4+q6DJV-m{V90m^&N`MMHZCGM@Z4OEnfC(pnS^n-&#?@|`$4)2ruDWBuAXz( z=ka((*p@H;8B(5$v%1bkHmLrcaXTMf^aNA^wTU6m`Sa`X5D9r4id75jx5rB)R6HQh0A*#& z0L_~|eH&gskf}4$Prf7X1=^xQI5}PY z+i#9O`u=x@JQHK71t*+#L8gK_TULH2a^0S7$olQtGUR;QLb#X3xNDCYN7VLEm4Z&Q z@D;;#PDmUHxzvF!w(GG~J^3PHP8d}D5X(QHT%3ntKPoNzQdrIbQ6g#6*N9)FfxHyw z=ukm;&`7gZ=7|2{C47vXAXZtZBcUCImDvwJ45+Gb9B-O8*|*PqNbDlr+Qjx~Z>|#4 z9Zk(6f2m8t1YThv20)7<;1!5F#mc_|Ahc&G^C<3B$_NGr6Q5>(;LA;&2{x!ik~fv> zC{#8eG<2-4vM33jC9mvFDiT~|#jKL{WoeS1t2>1WFOpX+PRz^+_kwRWC--0;vrT!O zbmiaXJ_4^`k?I&DlIO8dH-W+TzXK}*8`K}W1oL~Laqnpi_Y}UgN&iot}OV(^uIg=Y3{)gCy)3p$^Sc1{yJKIdqE>kN+VD73$mjuIe}Y`3b;h0 zIl3?LU+5K6Qc+FRR8O)Fg>(%(d-+PqDL3!wa|X4^pTx8Wc5$_n)&E9r`fb2g5AP`i zPU8x_4f&#|qr*crzVw&8Yoj0LR+Fbim^ju}R=eUji^Ll$d8sI$=Qp2|k)_HPNuePH zLg_4fm0{EW70^D$fc)mc82Zq^efhsE1bFEG=LwB7R~RtLLqH=wwvFBS+tcwU76|_G zs{j~EFp1c_Es)RTFo~S3I;ya{%3`4u$*^8Qr1;h|zOPM&Ung?-aFBtr)sGtOzpgLp zxkn15F#uEE%hyW2Nie95Oj`WrhZRP|b2ZBP(oP%T6-B?)8H$_1p_Hd2<#f8cv+8`j zF6Rim{`A0%2*&&ac5pF(SVNl(YX3LI&#%FMD5k0`VgS$2al52b4~&ctmqPg^fbWEw z>&d9~S8QdPTUf|4!29(9%nzIV0sp@kFz}K9!prH7<^KY1+2I7KT*w**2{ulaTK7hI zC11V5HknM1jDO2ZHsn7=n_Q1dv33xqykN4}?l0fu=IRKeh&6lMyKn3a-dO@k{6rUV4Pjto6~@FWVlZKYyc&Q6mT3Mi>b5 zw#lsl_yLOfo5Fx79>7-e082m61@F~&z`>3<1B=7U>N#TSgzef^qj2!{fbXEq#U zI=`(jj>gD^B*IdlYry8Fc9VTlVZWnVb9LB51!kQ(Ak168=Tj+gIg612Dc=gqN+6;@ z&2~`Kn5qXB7EPy+opK?JH4X+^(YIIUN0}h1TEZ|eFfj6+MT4UK?ldisZd#voKK!Lr z`{lu+35EBhTkLr}m`Tx4Yrmzjeu;xg$Ovh=D*dBrdJ{H_*n%?nZZcQ7sE{3oxOBvl z(Txs{8k*|q;f3qn;*mF$3vPpo{}XHq!A^Vk^`)@5uv23tR5J=*BMHp42PEh9`^+H;swfsIZB6IvMs=?{;`+S z5W)6YI-+b26mW%FtZ_b3^qtOqm->OS5M}%{l|ra zKhiwD`-KZ9gmB=0Ki2QROtS)yccA#q0+I#LW`O_b85qRSe1t-w7(~flV9Sk?g2Tth z2jnkoI)!~MH>2d_vF;<%KgSmz2?0W5&ha~-lo={uYisNOnvR#ZL8N0P1>BnzF9Fca zN-hh9KIU9BoF3xie~Bwd{nrgfLS8WW1&HhJ=_zY41Bre^zZ{Jh>m5Pm6o*H>auLx< zx$%_$KaNH+s8KQi+Kx8sERJN%({K}xtZnrA5|lGErjjr)2$bfp!op;8#=iJ@i;7@# ztje@`+(TG~QCwd|KAA}J{eA%p8@M>$&~;7-{`Cw0^>sfYticv%%7el3#+v|+uM)Oz zG=J0~tx@RO_ZX@CZ+~W^BxbG?0*_BD%981CB)B~s$DtZehfN3_A zr_3bNR-E|n3*;LQ?6BJ&BBWOgC~M%fZ>$WteeUZG{T+9}C*)(G)Qu5uB#ZOGDj2sx zd~l)#?tdiUS37cS=Hut2f}#juZm75of7MFAz5w(P*ijnk`X5JWL}cVj#h6AUj42>e z2=lV_Ma3tVlcOG{ERmQ5!Q14(PzOiE!47N&yN#FTcGGdlj{kese!wgzwFL2v&YnUA zR#sMrU=-K`_`S;jWijp*3nu8M2<0KCS1yc#-4&SC<5gkJDnShx5%X%?`wuT_fnwN5 z6J;a#hjWH#EnF*kS(e z#z;yu#{!<3ibYX}cj_R5(+M8|VDmv^qRseQhIkP^?^; zDwLWmjt-DSWb-87mA&tyeD>@Ou($aVN2ioe12&HDe)l(^FwDwC(?UQ*IG0kMsLwZ= zL|Z&?dv<2xgko_E_)dqxdbv!ES*uPWvEzibE#}Zp(3-;zg*5c$HBMst^{CUdlhw;@ zz>|+Y)W}nMI@eFN448~cZyTH{j0?W?-{Y+U+yzMh44yFla@ePcAOVa7+fd%B#0UB_;P8eD zjy43+L~5;A=u-M<{5R@$A>g`aW#y5$(6*3d7K3?+k8BnkLfLo%ei6mM?E8zozV)@3X{#m7)fZ6%Xo z(Q@5v0x7|P|qkg?;Qv;rrA)vC@7%xe8 zs-EYMyBG`-i? z?{2!i-h-O~cHpX_B1?CMj@&`k`b!~nC2p}-chu&6-Gi*Yn?Az1dIN*K-iRuLN9_ z!-3ADzke8BV|8S74mmoq2W`-eI6# zfDSvz8>OE9pJls{Qwn@^lXVllW+fJZ4#k8@j)l2JSjTT&p!6K zuJg5I%@j?Z91FnDzqki%uRX+6-v^~w^4+9#asYHy5$*@JvKkq<_AgEZLAo$rI55Jd zdyj|7)=1i}SfHxtZ*^8$rPmz+w^ZT*NFEMI8ISqN5F$glYCpDn8-IP`LKaNu$%_hi zk8i8k;iYXk`csqfjQ|IEuj?az#QVzXcF`9M?OsTTl;F9L9~4{ldD**$rB4W~Z%Ay) z`@l6ae8qP4nPZ1=$fC&;ieS2|#(1y$aFT8!`^H7CA{rc3T3hb(Ghlhmr9(=9REokO z_IM6tMvL+#x4=4&craPRMYWss~f_nddzZ6xv8}CJyjUqa>H> zgkSf7(8uk` zKq>sd*5}>G`w^p^)h$s8XDfVfQWHHi`OSm*jA~T0^y9Y2bu7ijC~kfWsjuaHs6?2- zo-BQ>#h^9@_*s3F6xOyUjwnfG1o^nL zT5LMOihZ|mt_V8vf-r4--^4JV%nP!?6Rld7HLNTxuQDS_Zo9UBk<(fkTjQdDhK&+#_N$S$x>kjZ9~ z0SG_TCw_lKs2g}FE&nFX5?-AYgK295qDJBPhE{;ld^Wij%PwQx4IZoJ|*KHZ{WNBG`gnQ1y%%vcvbF_Mtt`DY57`FEA-zO1WD0pxH7p^#2jK;DCcq@vF2#vkM z;z#-rVNyD6Q>ZdCq8UW1*b;G*W|2e0+x>b=bMuG*K;4Y$&N~&xyAU%=KEC9GiH9r? z$LK$*cf)< zOY=nJVDT9-x^yfFys(NXnIA$G*31r#8(haQdPV4?}7z9 zs7)|B3mC4T|-2X1fhUo}l|}_sHtqNpHrlcaKkq1xNtfSt%10r^94TD%~8EjV3Pw$jnYTfbIJ8j>goKV7OHcm-Cnr&ZsBe#jyzWYJaogT?;o zeGx^(hO?>@Fu2RRvHh0Wbi@|wURznQ&UTzEUgUo(;uals7A?yn!pK3P&~Y6_@wrBu zH6^nF5h3-FO;c@22^_m<(eR1=0>>ZS%RCJKiZQ9wcezI!DDF{z{d214Ec);e6s2%d zDdi()*4FCTuGLyCa8$OWogMHF~0B*ltF z-D$ugf2;)xQaV?n4SR?uX}h47AToFFRSH}y7V=sfB%SqkeAn0!RQP zF_49s5%uW1O$*;@P#1A8Hk?1sHglnRJ9@td*$_f&H<*B_iw>gqJus&sun3v<9QV#9 zd#a#~YAGmak4O#8Wev2Uerb8j?~QBeda;oe&EFx$4?*ptb#q`Mjn>T4Z$((7o+W`a zlCC!&s~yugkq8l?F22ywDRI}+vhup);`(AZx=?iV5Z)?Ybih^b#w{8 z5edz>0Eeg|{~3vhM34uUwbR1gqXt_}0zyby*eVoD+Gd2n#j*(-V>Yzn?>56~)^N45P0mnBI0Bht1vEDJbODDB0Mx;FfA(HE0icvY`v||4mg~MJbnmfdv6p<_fMNS=(b;SaGA|5#c z7sQ9FLk5pqCK$^aD1Md*Pu9=FWWv9CR1!QQo)MSdjp>eA6|4r;C;vDI6Cqu+#JeuQ#*^{ zO$EIRbbPklL~<`w6$BIM^A(^M^4T^%h=lotSriS^(#Ivb4Q?hGXwok;@a2bWYf0Q> zv_ftOVz+2mk80+Fw_e2CX>fcgn%iD8d6y;AibhV|;RI-S3hE3*+V}5%qf0ZALk(AT zVuVQaT?^*7Gz@nRRwd#gvb?&~B8F6#3tA2jn$Dvx^mIGlIr4<)CssK=4)SPBXrv}P zPA&XAGj|s<(o1ho9*wg%c)43ABib(LEvn95rjk=6*W`(9JXQeU#dESu472w~292vn z0nV2`E1ZX4lN}{SO7qecRlgR!77i4qd$Ou5pA-Al)nc6gkNyxI1q^;#tg|>|U?t7I z5NWKj%LWZCBDPXVb79}beIjybMFDdwYQQ2zgm|D5G~c7k2TEz;9gfcnkC72iR%-x8 z9TL4Q$n`g3Ta!rYt5%SiqZR~`Y*iicTW@~(MM%YRQEGowp_M)#uGtUgc@vG*qw5LZ zE_m&iSxk#+PzR_G>l{Cky5HqpZPZh^G}Ixa3ZnxoPh3<_9G70-Q^d*qF@v8T4nE@C zywqS(A-=9gQz}D_SV!3iZA1-M+85qoqxLoA8j14~2y)Vl<;G!WCM1V97)UDETwl0G zZP|h)E`W++3_Hh{2GoPOeH$(nw;K+;QAtdJ9~^NSjvtdUiu(9uFCKg-XO;I%KM5bc z4CpG#E{;5@XJ!SPY)^9fAJg5B)IhJr6R!Q6OdcNHLo4^-eku|a69co{fPmuuL2JuKbZGgjk>lX`*1bLTng8h1TbF2y7?G-r=38&dRuYY(fZz9 z;*8PnvXd8=e}`HzlT4$OW&3Q24LbIr(LY(N?aL{FxR90t()Z z>-?m7&B`Y@x9oGD=RZKFnsZ7iqHq>B{EX}>4&2MWHLTMY$Sv+e?D9G@V|Po5a0a!M zp9e+ZAv9JJ!Dq|8{2=PL){|&9{l@m*bNITy5V-xwkEaze*V{q6e;#0gcha0;E$U}> zizK=yj}Gn``9W1#+&Nz!d_Y9WHu7GA9=6a0X8SFN3Qm8Ny{iqE_rwiIW{uf|MJ}{X z#LQ|{u3&93toX+;BK@YND2!$7XEt6eh-4f444!72;vssDE;ClFpO)9rLi(0uj+fgF z8UynOs4*Uj4qD+{f{vdd%?NT^uIFl;%8yi8ZsbM0*z{~pfNwzBLy38vRAyXvb%U9H>ud6KRI8RfDOmGT z#)|A@Tc}0%@FD5FTQms>-D$JJ5cYxxWO(7~`-2rVvXQ8w>vATK_MT<9>r7qTyNjbk zK56CZz$Az$qFH^r-bv@e`MJn0BujVBe?41gdIMD#H}>2x$_prjRI)JM0Gi zkEuun$~~$-Dk9mXTJ_@7O9~-==67$zP$)Lm(ndw+fQnqKr-w#0dm@sISbIVYUtmr6 zsrcDSidY2Wv9!9Vm{I7M@6Wfubl^FNY>2etX!SdlQ}C~^SrP)X8ElqgPh1d%Af2S8 z&1l;#bwD*_ZWIiSXhVaiK~&P3tg$hmBG}+VcO5Iz@ev^m;V+z1Y%d$~mKb%xH5*ff%4Ph!}7X znuJ*C=);vjLrlbH9?y@Bqz_8B2<3RVRt9z*tSSZT_p8i7@!+Mi0Abu0or^TOE1HGj zbcmu*7gFrel@?eKf9WfJkL+IO4k|gyrX<-UqMIm7@7F?{men>S#!JT7@d zLLBB?{j}-SE~%TDChx#cJc2)9hf@bN5`m|Y-rn%an}O!1r);vnT9%=7k$HFx2XVgWl?oR@wqIy;sQjjgYg=htdab;Z~XOtxFJjXKK&I3`t@}ZBD`pB zdR8}X1(8t*3k&+q2h7j&W1Nu6TKk<`rLa~BmGO?DRq-B?)VKNVKI@Fzy02_CMI)~X z68e9AoBw+)D~$xN*siQiURysi7CUaKxYQFb63ixQp=i$TQ ze$szwyaclF^Z|B7x48vYSGe2t1(H%^+W)PYzt8!xk_2RtG<}+0Up`yXK|$ZaR_tkf z##8{qkbopLXGDy<3MN4*8{nfCcXqisUmGo5;dTC5ZlnJnz(LqYVc4*N?4lbe32#Is zekYu6U_KRL6!}nLG%R**56p{1?F4&`LDJsx>gsRaIt@%Bu4FUl8^KVxwu9qiTf3wR zlH_~CVE&r&8smF1lK$bMgB-XmE1&M*oY3|uO|B`&O<0-#aie78U|1ZCUh@{noGHxr zPxMo@shPN6^xyWN`5!)YIoX|g2R;Th801&L()PG)*GWOndl;zr#1F10?PK+QF48`-8)O?hOFK=0N*E_i14QgaZA2_5AfmEHuy^d~J(v z_^*dEiW&R@mCHR2p8t3cfdd#Dj7M$aKb5aYnBW&$**~`Z7cU44&0~LY<5PpV)cG5? z=_9Z0*E5WrHu6+V{4!~6X_*>o_cqing^Y0AamfDjai9Q~dDj=kW6P`WHoC&kJzR3j zHd;xM=~EOY_KJv7;>CF{N*9gK1TRe3V->KUqYlE3?zB_Zyk=bzIc93n~- zww!>PQ_TOekatVy^T`%&h<6bXHg|)#cy+x6dT?k4J`x%MUT-trMRMt4=TpH2w*c?d z15_~cR^^n7N}{k}N?AB~0N1>MOSk?X(=9{|&=11d?%97ai?P9A46~#D`7ISWb%-b5 zWBFAfEEyCZe?z`TsWC(8T(EKlU+&H4bNOy@_i1Zp;o33&cYK-^BWny#q!Va>nN2v5 z{E5S)oZ#FX%76Qe>gVhD7gCuhzyL>~0*orvPuKwxeZJsFvfLF;ArGwC@VRWW8C1)= zDoM8Bf#UJ0Mg4&%Rhe`TI77 zK%BWbH8yUJJ3#a&gz_s*$0LOl_7zuch}g#|poWGgQvbx0)7-!ye4`oi{;Pzwb%=s= zR}_IF>$0T={i{9|rtov42V5t1P+r11Hd)HKFm6HZdJpY9SI{?-=QW<+4H~u`pjS(y$poD}YPg%Z$+|-62#1ceqFecqvNpUF{1yf?+Xs zGLSVV>(+6tJovY5Rp2{B%j)vZOfHWw19CTR_c!tAtK&F~q(u57<@W>|!GoozMa&Zw z^h(D1VvUx?EXAzGNlhadR5@$OKnO~*iaDPL7f2MAR^<-ms~Ru+m)4-S9*FG z7&Z_p-|LJF${g8L&vYxW^fE30fh)_~&#wn2tON+VO=4h_sE7oaG4i0EL89HK093DW zr6?Sb#I5^d>BRC%r=~gHVM3aT^<1>qGJ+%y`h@9d8W3^w$Gq5o-|D zOUD8k%k7&QpZpKE2H;wQu6egsS&nQlA|jexv5j6*%}1&9QntDzPS;xm|5kJi`l(>* zk>tgIl~_v=Dg_*aDqSa~L}szD_3;^t{|oZ3$hxphH6Yi^@jSS2K~w{o*>n|FfThmr zdSQz_Y76}7#GBl%qYN`#Pqu(aa0w$U%n8~>50!W?e6bAk2gK|URb2q+`MkB@2==OV zKj#{B*h-x`{srlm&kuFffr`{vwZ=L#fKJ#OuVbp#F0b5d>c{r36=AskYGZm@+H&u+ z0W7sZ^Rc2@%%kzz;D0x!_|2f_@1M*eBf;!1TNK`hJmx19mC?Tj}qNsSnv>H;J7G}n@UJaK6QFfAsC0n%}3pY{k z&x!i)-{*2^q`wSRS|o4@Gu{|!MmiY;`}Qa;WWZ9Y8pkZD<45Q3_PhUA+y2fBhN!{E zZsMg}+G)=O>i_(bDbMsmur&zo^d(vmv-cMUq@M2Q-i0py$PXi#)3cpiW_aakwR5~P zZfVU1I3%CAo%$S`&5aE*kj?`4mA;k0i+3ovj8XhIXTlXLtE;&>N8^GcF(FYxSa`?_ zSy_ZR(Y|jlJ;r^ww9W(x$mDUuHJ}7K%vfL8v#{&|8YC(q__!^W87rx?l7A@|ljsJ` zu9KM`tHp02PR{u?VIh)TZy21BLAH$Vh-^NczhgfLI0nx~TJ`w(-y{`(6jZlEkJP-61FAy%2+-uRbUQ;10hrpe zJ5x7`424vbmX#@PE&-lHYDdXWuQ=8B!pp-jgD&K8;m55vFtWf9;esFe5tNjW->tqL za4{srg=QGA#!g=_A}3#PrN*MB!@hL2W#NF!%=8+|U&aPMgn) z$z6wqLHvV*+1T?Gad$d=Fw?15S(g_G5_0T%a*AWNXXC^>5ANIAg{@Jmm$5PmxCMgBse$g+xgR=^3HOe^V9ONWm)6G*Th_3 zfq7WWo$zitr&J;{r9qS(h{HDg6PfGz$7UR874`M_?4K1+BpX}IFw|D|S3*~Zk$)&00(ra$i{r&Bbe}1+<-g=${)H4Aa1(t%tDEImQ(}N{~tXZKm zVxeE|pFPE&4@kgg;1H(spm+DbenG-lAp8x{QKUP~=g&3@uu|a6PeA-iRPWz36890A z7xV65{ENHi?~O{-eK^sOGddIqoa@7_Dw4?Zh`W^Dd%^&WHT}8(G-eI-8w|Bl3DY09QbHNJkgiRH?)sPm7x zP>Lx=S8s0=Xljdaae?#zn_lU7v(4)t``}ObZx#FZ2Ti(V;_S+)*6#_ELP{d7rIxhVQ>K^6y`j2l}u|z5qaOZ z{OJGm0$}7X>S~QCaswpBmBdr`lzsgVn7^Ct-z6<}y|jn9J|sA@Xu@7J)51O-mk(L-JI(8QW&6kCF~-s44fZY^RFV>- z(bhHkmu~)r5ZY6;Evh~Os&AfOxAZSM16R)cUmF>3r#Co_a?)nM-WEWV!IriAO0;W4|Z zmW(d?HOsO8ql}7Dh^Uplj-1yh+ePUQD^#MZ{^JP@l zd-FZ_eJ-0+_w(v`Z>0SZ(IOMwNj}9PMQ47N;$JPHAa7lsaGxPneuPJl8EjKgFjf6# z*6sA&`4}`WLn@H+ZT;d0N1bCo){_-&y6Z!6>o`5V_a+}sYWD<6O$I;e=1}X^lZ8B7 z|KP!6dm0U*(KlCnK)LVHj1db=u7P4tY}R4vAz6ZujA+zdwYz`{Rl?# z$Qqc8vii}GkgT{ne!Egk!@0%=f#p(yNz2|G@JxP_)5E(E&VBx?!1A}vP67ouvEzSe zodbSi>}VT-HyKhIQPk+}#F_CJV>eyaVS4nksUmAB`!F zi3-3+c--0W2bFULY@AlA$C>CP6+mHRvyHJH3i#B7w80?3xR_P{n+j0)Ow+p(1HZW~ zu%;!0gZ%wVfcx|G`@T4R@Hb@`R1zwHpp_3Clg(>^YswU$=;^^|gzip6fgcf}zy35k zl94XZ;}_4#*U6S*RiSAZ&+>5Qs|?mNR$ctK)~oG`hid?fB8R5~ENNV4c3*-u=eor&-f(AUm23 zy@&vOKaqzdV@*5Y4;k33_Lcx+m)RM-D&?h)U^8F?WrYK?nuFQDF}UAcz0hujKOF@* z%wqjra$YG%|>f?%mdzJ-8_eizrneL6OOsicGCysb=*R zyZ?Sip+_{GVkzL3KKOu?@MbR$bQC4G4PEQ@gc;DApF3H%+};kpXPJNdT;MZ$La__ zFi9lA z(ZwtlJOuQXL?x2e1|O=-iQm-)7G0O5DgOv8g-0G&rg=BA^X=?1d}+6Kt^~(8X@1Sn z>Qd3Zv#(AQcu=YBi2gNQ#pz&#K} ztA1P5)|R6Dj|Hj#zD0MZmV%Mf&vlVkW}B8KIeK{qU;X4|jt`jYs|NH-9tfw#>M;27NljzFF&oDVhgo+xSyPB(QQZA=cA zyA51y0lb@aq;N-~xw_j7@i}eASa$ky6{!8(HGL;CmJ@TBeex3F zR9FjeZR;dIpqdB%OjtbQ=qfMM)zjII-~@+15LZZfo(z`ib?bZ$#ASa$6}Cjrs$B8+ z>tMdi+34xNt_E9mL$n@`Ijs{;A`N;z?c}eCqhZQYKO_re^7;GrDR7A173=cGVWwcFo2%VINRZK z?B?nux*b0qjA#cci2$2;5dTTAI1T1lX6J`1Kfr{VW9KFk6rtllmt@#<{WBg6=|(|@ z@R~&>7{g5f=cD}BpIMc_w<9nGMnI+@3c|zY(YH@eO@PGOD#2th!F0U1#rF}BvDbr# z$Wzy#xUSUs8W0AkuA`*@h#D_yx-ka1i){8^mfo@gwnOPH7`G6Wfyu15>6qxh-5QT0 z8G%-1)_MevhP2@J<6!&#_Me2$-Upe@HO_#?1`|)U!O4!=g^1T_1cX{Zs)=1b#*P3F zt)4ixJZxI|cCnDhM!ZhP#h~A> zJWM4LSa@u}0l1SE$XE)Vv`(X8u&@65`27A_;M;HK_-vr%MsTWmbZjHhyBAUl!9}vC zD0UCClz_WhVjHajw{*7U0npM+`rv990_4t8-BN(;!9#r3c3>o-4Jdi#06|a%qr?Ir zLjF-{_723TgmbSo!bTNj_KAVb{y)Hn;HbI)MqUY8esu+4*!$y)6k#1~(@6$||M8b3 zu6ix4W5CKx8=TQL(v=*M8zTRh}7mS)YTrK^j;-1rn5qI<4XiWoA#X^%_^@#Wsm}TldUV!=A z{~VHJs=3tfj`-@Y4{TM7fefVf0KhUPIpMpo} zRnN12)8Q{}IyKgbIDCuG+mjyiICPntS-;$0fv!O{;9Hf17EYwHNp=urfl|sw-HJ8* z6Ev^~hCGb}+c&dN-k-4r8V!@6ZqQfOaLmMhsyYI`LEZbvSo^iAUtWJsfQU|NTM{NB z<1pZ5Q+K$2*qz?+&VUt+n;kfpr|{Kt?zc0UvOqgN0ib*X*pL!)Zr1J6>_ZWV1yJ$F zpxOpWG`2_g$A0Pr=bHfcWpiG?M?}c^gWP98hNLb9;voYZV-mDpUNZu#d28OQ{Whz~ zShSXh+I=KE?9!FMgKiq>9Y>F48(CMl&N&cyaT!cKt(w+xzdnhF= zS)W`-#j#YNI{+hFwFSq30Web=0|g=@FmHP^&thprwmGktt5#FGu-V!tDvJ`Rs(ds5 zc!5ry@ER1!n`$yx;d9ki>AV2pc>(6n?AU3;00S@vK?&>u^UApj-J=9;EIybf-4RqU z#XlE2{{17XR7a24pTHh>{Pue8mh%8bZZkrX@gQ!7p0N@M^T{}Pnu*r99L!uzdktGE|eUayWaX!z^~fk=PeIDW9dZ2qbi#?x+n(kB>FG zyVy%Y3cWuGUFhh@6Jf>;m{mcKegG(a#*82LKo9RB zNdQdz9_$>nQQxgVfsw^Pt%qvKK)(jdo#{ua{II7H^J0Um-K}lGCot$(xSgUYc4h7r zMiqWexQkDqV@aJkIp2ciQ6~_lnz*1dJFI>-*aqTKz)`sD9lasvMMuC*BVNSsgsPi9 z+6Pk4I(4$Q)P!&jTe_XEi^iL7HMnqoIp_YWBE&V|Fd8FbEF$`6&*Eyk<)`@^!bfHf zvmQi5tfNh9RW~CJ5#>0pjOGbJT2p=A1y%xp@Z66eqyUKXI%`%FEj5e2;G9%K20Y*3 zZ8!srzKTzTt;h}U$Vsr45^e%On=_AR?QZGoUdfyC%d3GkRM>%M6Mi8cM_u^b^FoVx zG2y~sg?cwaV+*hS(?ZUT8~{ ztE)G~?j~YxhdOu*C}hi$jp3pPPAUVgC{mC*Kp-TaX2|mTtl~aZ#Tq9H#}b#n1FT@T zMY4fQV;zBZ#!tC;`X^61uv3^6bE5!XxRo>Ac&u<|RRdT_L^G;S61{mANQ9LGI+P3$ zWjfM$b77JW;p2X4ZK0+;LL#i!>LaT9WMCfm6EZHNX$F5pp*R=iwblETuJE?LV5m=g zkmI!=i|e%MwvK=C*TN8vZpZ>G6~|p!dE5<9^~@0@2~_4__Lmo=SADT8Z4U1}oeX(U zXhV5O_z4kRBtF)R_M4E2o@8Xz3covkKijBlR#vYGqB=NcV%v; zoE#qw(~`E=7eSl^{eWbd=~!W+2}MH$+yT@WDmHQ=^qP>(I12MK;Nh6uUW_$O7Y1!- zcg3OiBeu80y1rySSG8L5(>kEz4N}KJ+Ldg0+D_*#JGHfz>~61v%ivH6XgZu^y>m<> zR-h49&s_q5eDI0o?xb{|k5H^04E{gv-aD-3{{I6fMFW*ed#5ByG)_D1v=gPR(B9g6 z(N?5rQH}a-1o=#`dz<&f7j)5bxZDZ&inm-J)h6VdcLZa zoXK=q7{ODa>Kz>(@K2e?f1Dxmyi9MkiRS^i5)%p`0jwBNXXwFaCmW5ySQ@e8}tOUe}C;hxM)VK%Z`eYHUOS}2+60O zo{xI226BgUugsj^r>kZ>{M)}<<;u!1JSALtkbQWymQ_){{en@6v$BS_<6nnZ8YrXl2iq~XzNwVKPZoU}IjyMd6(pbahc48-uR z8br91*?+&xp<9%r2m6nRH-AuHp97PQ4N&(v-aAWAXI-~u{(i6rAsw>^YsmvC?1nH( zV-O(}3cD_1-_8WzK7?P>iA)A$h)aI1h88jtnsHc9ag9SA9RxCnHn-*R8vxkf5ivG0 zvIL0wZe)We3<?9wVUH^r`%fSItxAtGd? zuYcU@T~#Kmz+*Sr&JHj5vC@+Z^+>)1xP`Cs)apKk{Gl%p7ds+VP`R_gF=;n>`gdcI z5qMzN^au1J-OvKWX~$$b{+#~MSWvIjtK*~l6sEi1n5CF|NSD$jXv2`~Y@MYF$lp7n z$v35|e|F6nUi0=GXvTXZ86_>ji^&H%5o)kO-D*kdhXQQ|-uZkG?iVis{4Cf?;M>Gi z!mTD@yw{SL7PSRI^WO$Tf(fD;!I&&%!3xJ~nOfYV*H4ga9b5;UcO%q76Np5=WOVoC z>)-bs8XpVng89&NQ%3BJrc8uT@>*&@U2iub&~Vu*WphIyHmK{ENQpcQPH=o#x=1Z`#T<)T5nac!?$#4|5F~ z>SOmhV7->!OZpV@D1IA#2$e{PKjJ$HM)o(b2BMy%d_4YhH;gB(=ZF$)`b&6iMIm8% z6Ebl71uPaDp#;vrr)cu|N+5p*nn2>H- zo!{ZxyBl4)4&nXYyW27)u=GQ+ztT$-MCsQGEU&XQFwT~*_EZEbzL zF8S|skO7BeUW%(ldUqo2>E*4<)pM~itjML$2(L2JQ83rZ?~F%d6P4ozWXTyUFKpN+ zs4{p&*#|9|!y*i)t@QU1s^4nFpV$%p9oc)BqB z6b$hRlAYB$uc{JOq92G)c0rvK6c09lw_cFqV@l4={^DK9c$2Zpl|2})_Z#4rKbJVq z&2}noa|Q5lX)$NNgn zV*xg==-Gob%A`pcBqPPCOV62dB#OK!k0``e_G-57S6fwAi8f>mh52%^q(rls*pn&0 zHOg;8>pO9#b@|FQXGLw6sLxtm6P1Iu+PR#aDmeu(X%t(aZ>T#ok-Xgzs(ZnGyD8>V z$M#E*u)LBS%a?Y05krZyC7&yW_CLn^Q38jFDWB^@EZ3ZQBqNk_Nx{|wqx5aF7d}>mKR&*f(?p#_rGDw2Zy^0-*VeKtu}I!hm#aD#{6J% z_`K3UZIg#g(;%*z0nev%m;aQFp4X4>1>iDg{vJh3=r0!SkOVhxj#W_wZoqR0#y*|H z49yH}qQy(-V(=myN$R}ZK^mhgk^{0h*H}vcqO*%Uh9staz0>4rv;kQt*@osbSFkFi*d;XE+4TzpP-CQKM8O7gxtlt3|Q16 zy4FZ+1*r*(gpSr}aFUc-fWO~~H@EC~(c9BRDj_!{j45F(nd^q{&A@0E_BNim`L&_u zquqoJ{q_|qNTn*}Wlw-xZ7GI$^%1FR8zsAb3+E##NYkucO-rT3Vh~b2BQ>Omm-E(C z9Tsvh+3?hmSNccs<;#VvpuY=1;`wl&vvZ%_y!o4;;At#u2&^Q}|LCKLWlgkH7Eh|Xi&{f`5TOC2;oZqED7qW80!p|B_UQ^J zUpjAY26JfK52x+A0zu;aq-b$unC~pIGseh00nUpg@HDAP38Q1Jt+bj49a|@?Ld^nL z#ro_-IE;DvhMc;$;Ymo`tV;Z>W$wUudw4nJcC46Oy;K6CrhX;X;AU6q;#*tO>x&x| zL6}ipzgS+eqgm(k@yW#_JM)m!`-mfQ4$pO`f@WzrhUX*PBt2FKsyv79jVf{8H`Jb3 zOZY@I3%RTAum?5qymSv|wrmTToRCoXqVFN{R#3KasTd^$V>mRnrkK(eq4nNap&$h5jE1HclN*_&76| z=M&%rUyt$k5sk}6xvJB$x2b$!!svf`Bc4WdBy)m(cl}=PlPHt=Mei1owSaNgjT37! z3{n(Q2OyO@x>w*tt8$H|mgPjY?^BbyOiYq{bFdb=?G2?Lh83Oo^a_?5&W$i7R=F4D zVotJZb+^3u@c2>;X-cCPOD}KC5ALk;mqG$BqYWw<*&W2I3& zCnh!;Qb%IgsJ#>4;B8=AwNb0Ew3^LW#AQ&?C)DxkcMV1!Q48o8+E#j>dJw7z(j6yG zz(ezooLD$g^MH+$F+^=BiSYf-kR;toMLIXB?!BN5O^*XoTFf&o^g&|n#G|zW>=CUI zpPq_UI%KS47U>_R1p51>YzJAjw=KxRaiUv7+%hG=MKtHftPx@adxUityrpV}TwN<5 z2NVYBE3()j3SubDmDonrX z+-p@>>=ba*YuDC0aO20A^An!ie0kzDOS3J839%s;nZ;kCd^b6heaZ`|tt31)4Tp+xdYMN#$Awdy{x1|bSJntb zl}+_kmhtIgKMVNj<%~c2{P<$Iro_@q5eO~7sBm=)kh0xQuTtW%|0ZVvyP*|mQ#+F| zZ7G%Bbj{440?*5Yv-jO*mIGblor^yR~`rm=QB>+kJU= zmUHBd-LM?@8}AhF6WpO1cK~bkHi}|X;}i?q@_yB&pU_mKIqvw=p(~$sUIZeKl=vdi zv%9ntZ`(7C{qNQly-jy41X)>CjhxtO!Y#CbdV5lyyb-jzt3Uz?ebzi8FMFUB!OpT* z>CJlgPQZT<6C&R)*x%OMRQ!;;4DEo0s{x`{Tbx$nEL)f14JMom$;R#@_6~)t4IbrrP;zeh1=BbKKde^}oR^LCoCoZy3K# z)c0sE{pAzc(VGUxp@Uc1lv)lzF0)@15XH~kj`JA>?XfGbV4C33dp`S4Yh9q~nYwUL-ChR&P=k5=t8LVii*XF{9J* z5;%X448$XmNd-`RQJH2^J`m7s^z7;Jz429qNG^NVAoYloo6KHmcm*HFGJ(<^mKrzDi9%dShME3uy_b(KutM6X#`_2dQL^P$z>YZxM_@G`aY zKR^*8wwpi@(TGT4cMZ7q(sa_`s?pG3f^m2wmLijf;6sVwHr2rAWKkO-Oq^&d5q1TB2Vuw-P1xgmRo>6>DkR1028L^;|d6|^^xLVqh<~>4bEjG zz)Dj?*ro8oqy!Lm^&g_yN7dhM84HNo4*9^0+5i{P1PGUq!rrgI;Ahzm*JM|y&1+54 z0lwA&kS9?e>1qOZ<^&*a*PhE9Yl64cU9oexLG`%_(Dn$MfTU|7VrZmkn?uYVq_wI;cps`-e^PlGBvVpYe2IXf!D&h&t z0QH|ZABYODCE)}c!EJCkIF{C^Z60Jy2P={eO*n)3vs53i741fZw#H*-i;YazgbMh`LXoXm+!y+;&3t z4EWU!dMqiKETwg}LGhgy%iEGCl&X)2}PUaFtkm zOJaV+hW15Y+RH-aP%?zcCq)M95bw|j-oC$B8&l1IE3Y8dt2v9z{Ahk)O+CyE7Ra8! zV-)AB9IG!Oa(n6vH-l!nb8BxmCz!!Q<>*L{m<Mh)=! z1dgWCv2sqGf{&m`y$J&+U)@{N=jI(R`OMo-H$^euqxKu`02a9v`oeIrZ#DJ6cihQD}yf=r0{>lS$F z*Q=Z)Y{pf-{6OL2#|NiEuV$#%gLiF6oeH{Ssx%=_`Hp43CFeoUu8NIGj@p_QH)NS3 zHMl((z3e^$nZH&klpJP)1TD?L!lpuG0HR$Z!s^P>F|nMQ2}ZaU+l(aiof;{|e^t+4 z1!P_fK7pM^rhYm`H)32JyudF0WUoAC57%sVb2VUdTt@4GJDP^swV;vC{UcaQtf1W4 zrziv2Wd$p0?xv4Q1Cevo*8-Tpg`V*%Ifm8ZAq-5P!Pa1c6iSJ&2#AlyfitgF>E5`s zDhCJ3)^b5QMO|Lv+N^qH-i4eiMu? z)4&VnAo~d|+H;D-n0&}TOfH+T|#OjUVGXJQ6JtbKkn zi${HR3d!DK`47~$_r-ZUgAGPGJ}lI$2zs&Ev8O`L*(-B{gZkdvj+lZGSnDitLao^T zR&7UMJOPG0`?UG3AN~$Bs(Co2#btaOS5&>hPwE8iAgWZDJqi~&=ND9*Wg5}COpn#x zCDp98Q!WK?sS^#lVrYR9dWZyKT`O~0s1hN1bz1lSxU|bk0~W2{ad;vzN%W00OU&p6 zd}ei&d}Ah9G0t6oQ%5$}=$ne*hkDrEWs?87dXZ%ad(Jhe!7Vfq8Z7S^wwg@EV@fpc zHX07ARBP{9!HUjiZfVIJ7e`nkM9o`3RB>AF{=4sl%^AjI*~hxbFX5lU83a?yOfxLc z8c(=t!r_tI#9Tw0eOA|)6tgy$9`re|NH#~3*(?%OPE<@Z3b~KtJtsDR5idZc(CZd) z`F;u8xP==~)Fu~RM;RmLy%UgnwR8_@71tC0A29-g|7?X_*`lQ~xWa!ur1yvzs`TQ6 z7z|EESL z<(Ktn>FXHjXUs|Ky#@%eEw6SaHr-9BO8HnLButt)KUpd~TXy`eC?^K2seXL13 z*bI&&P&nT;vvnubSJIX8t$O)%VB7Yq`1%9t3>j7(Fzsp9c>!6UEu+<(AfT7) z+_p{hfaozmX~TUg?F&o@d;uNG8kWQGh38{kUxV~NHgQU#&z}ggy?Fbh?HYz=0q+K3 zF1~L#DXSDWekTb6Ktbg<;S@QMMvcYLa^ehy7|76!8)ej`iwW5ys(r-|Gi#a2HW~^F zlK=ZgN18cbEpP$^iQ5xB`z&PU9b^#1k9z}6^+qz89Ejvx=njkBuHwogWAP*CF?g?3 z;kLPvd~%TECNv9%bE$CZ{(2{@;F~Kj+3G2A zw1~9_k*kYwtW2}K01F_A7^jC)?KOHbXIKKKL&-SCdNRHS8i#SCW!2N4($Y%etTZFr zupnD0id0@*y4+pdvT|^E%3X@8>tQUo3Gz3ICA;k!P721_K;JXBbNOUXVMiy_P-tG zkrlW%6%FpcN<(V*-+sw)AAaqVSk!twsdTE_LC-)ts>`3Dn{H_QC%)rw+m7>@ZTOYSvJOjsND z0$H#!%#aR*;TZDV-5vON(KC8qL`0RutaI%PXQW!P`d>9fzDtTgS-5%~Qm>f-fzX5W zTXlEl64G}j|H|1jU}5~>%`IILN$hg~t#JVm0Vowjebw}s`}rqeV3C6Z;`c+o%!&!v zjRf4#+y!JkEc%(pkHsJHR?u1%+-f?>aV0ejo{3P2EZT$2^ip25sBcqRBpcCnl^3-%Y~CvCrQ{9%Na>9CaEC0N0eHF!=wW3_Bl|4AY%h0aiUkoTWj%z zK&u;^3t~?y392G zmsP0aU`e-t)POsq)nacnS;;J8n6R=ArHXlR-qFuSvBzbQJ>_o zD9`p8>C{$1S=0lfZ>*H=%AFOiQaD=^PdE59ah86>Gx*pF2`ycBgVx|L3JnOy{*Uw$ zZk{$FxXmWE*%(%T2o+eyrBfNSGSybMgTolpiOO!QVV1ext_~#AfI8?0p|#R zbI66@0|Et+e|}03_|gzTYXRL`A=Ec*7^Skn13XJJjL&`4?ju);D?cEP@jw%OEPhjF zF)#(b<%FSjIPD~bL-}mch$`IHh&V_e2>4u~xw0=n2qg^h(0k1LQaivYUs8c+r;+4w zB!sY;kY3ahI%vm~WbZeC;G?Q%K&|5#OT03ad!zO+2Nbc&SATTof2&PfKN4^XTsM`Q z;)OJ~WCkDop-h?wWs>#aQ9D9Ap?z%<+c+S)KUoxCUbuGW4`5E#5H_FdyNY^6R2~G$ znP6M|-X|RP1Cn+UzMP33m)@17bFI4^eR?>6y?I*=hz?|_4}v!DG|jH>3yerVoxT1> z3#f@qcz>KPh)v?e#ue~W$Wh%yGcKH+;Xc)Sf>zM>2Y^A-uL(CX8Y@;DQtyy0IgD>L6{xQnMZE9tkD=G-P2$}!vgC=BZ$zpKOsoxybFL_)4&l~(_m3%Zh3!OnAZ2?F~7%nq5{Ic zv%Nv@p%?eu02g?*#8=KTGdxl?(9|-y{P?44`;sac0(RUy(>y4R!mv+0`*oK4q8W&K zBp#4nw1~K)a=?Tv5c4Arx>m$NTmb9c50L9>MFz^{KsD#%PL5I2)m!L3% zNGAd@b}5Ke<#U5B!upA`JU@7ZvWvLv^yK}Z!?F>8ug_stt?k2;m;B# zcMMy&HMG*x_LDb6ILd5a+3yQka6r-ez|ZK+Q~%}qI<%n7X3;S!9^5+^kYCWvc9q%{q!r)45YdWNTyCyY%XM4=mBLJJ zKg;cJw59i#x`=|X^rG8@XI|6*W?x=Z2wX_F9q}a-ATl{=Bl*X4r9i>d3UbGCaMh2;0cK!@rnrlb-^5&Y4sc(@wu$L93P<|Ue)$*Q z?h9hw2<2VkiZ3d`P3oVT;#{v#qYl%M+r8-asi>8xmWb$-hpR>#hJ(Fwt0KyXh9>A8 z(5!DaMMg14TOENj??lT#9LmN^Vs6WZA|_|D+LdKI1Soso_K))CF$Taz9&1IZM`kz8 zDFH6Q0J_Tv&idjC;wj`mTfZHd;UqT;u#A*EiLh*k4! z<&PWk0mS~1}HnaA$ML)tOkMpdcf4mJerTs)i!b2>1&+{!SysnEk*A5E8ISM1E zh^8!oCYf(MK4Y+;K6XSp^o1>W3R|rKO-G5xEv2}|PSLi$;`hb9r#gg_lBoHS&NrNJ zHpqyyi7mafeu;S~m(|?shd(9}FrLx?;~7}{!>4PH%^pp6qz8;|bLv!IW0n=ztV$BLC6-y^*Hvq69U0sx}{tCsbA*z&;H zVF#@8Y^^XxU+E11dd2-L@`H83fv>(J6E<`g#hZvskCQhS1kkgtw!W@bcNiS)V2PwP z|7Fp#kv60^pbjOmY)@B}0Ot z?I|-H#ia>1p+eDoRU#{7Y)tkW{Eo)0dkdVw2fRMKPtFCLEdgU_L+IL;2H?Y_^J#n_?PRDl* zsUc84oyhM2B=Y&}{Ux6}9CdNF)s?GiLjymjfI}?%QvmOzS0Mh+F+egrc#NvWf9WiW zD6?#ZK_U=8=~27F>k3UBv%5cp8LkzvFbdOTKI>xXCY*L#j>mVLL}?4O z1$Ub`*_pW=SW~$yJSH>Jroq7W212cRz%WIz{-nkgfyLNVqb|4uVo-F95qNiNX4!~4 z_t&7}3bs;qQTXA|ZMwgAj&z7eb?B-DASq4~wuQ4-v;pz~YSjdgVtj$2wJ zMkpgrYaYJmLne>C7t-hkA@?ZpSy)gQLG-TEkeB5^S@CeD)bd#QcmESh!+g)_Bjj~c zx2)U9$xmT%SCZt&nMHN4J^aLxKGi6OKR+m4IUmTNeC$$PJv@?Mkpka)XN8 zOzB&Z-LppjqplgNo2WvgA6n;C|uaj4em zH1{X5-6u5nPLw}BlG|i3E!y4}l@z!W74XW|3T-PhLS#-`5+jN`za-Z$+(rQpo!i>y zqHqgi$4Eh@d+KDG%>G$L|Gy2qK6$*ha#tmcQvoEm7! z&y=m5(REMfF4 zEy$U!6)qVMNjyG;eb#(RjqB(^*1o$Z+Oam_M(dY3ivAw881%e}V7I(D=JU3lN7U`D z``%l%#g(XQ{~a+7ARhu|uOkJw1{P{&2`@xR&%V{=cbUHA2ZWEn`kuKMtS?Eks=rb?!6yWMd zB?b_;R|97??oG7R8wZXNU9gWxtgacLowNYip8Cv7CCk#9k^ljSt~Dp;(AE z9J!YrO^t;`uR)4j#z-pM>Hbpwm$zU|t`bY*>Ui*zi`<^i zU6YnN?qO{r`$eK6f+%ENx(47lM%7O+XDtB2>nuG}PWm1kE2y>DN-xS%diAY=DH5{^ zhkmEjISk<6iK@sz8mYjVwE~ByTvQ82>CI{DLz+Vi~Z#k`BTS}HCheK`?6EeT@roRnD#vtWJ8p1k+L0!43AjwR^r7%Eq6 zK}HeZu2~$)8l?Yqn8$FB)j91ES>l(Oa$q}4Jh*u3PU*qcoomoB1bMda3*MqY>=+`& zmY8=e{`@I56{;`g4k;V2-Xbu)3$|@H(#~>96FZ+QRT_Ec1{)>LYJFU682?EYGFY8B ztyhwV*j%7zIJtO`3r6Qxy2bYI`1DAB_GiAPFe-$^L~opms{;JV3Za%7a^rQN$*}@z zslelhJu<^4IPKzPD0Fuq+!DelmXV&`c@)Xi)y{S1`Wv)&y3jtiL{^avg|KV^q&j(^ zJ8QH{a(M_oh|jQJ#T;3n#d&J|14XA)c?wv15U`Iqq8OwPGr;Nc?xZujC?~~^3;}lV z*0leO_s);Ba9W{G?rTjZ`X^JAnT?R6{PE zbMF}S?JKE@c1*3vj^|?zuK_8^heNZ(ZaI|oB&Y7U)LCpk-Lsi%tGzab0DJ_}Rybgq zs|LFce%j9hXueaqwHPV_hKh!Dh-#@#cjPhs{LJU{Nv8+hhn?ObU@4+3hkS8OE2hW? zxZi*;Idx9f;-@+nMTjjCY;dByxt2OvXOGdQLST(!mBp>1+Kn+vBv(f{dR*)N8R~4?#l78 z{>)zrN6d%CY}eO-Ks)$dfnopH!r7i7N?Fjt!69ZVNmSl#H4D0=Fiq#v?FqmPv7>OK{fvi5=Fb@xbpXyTO&>Clr0 zyE^@F2r_{f^vwmg)9TDrf=iEik$w%JHhg)t|3+-*F|(W!u`9aA*owvNI`mSlC zL$3ACvnBG8u?;Xz4LcUXrpM0yCV-Nb5Y|QW5c4nJ5^9Z_J>se7>JvsLFR)(DJ~2%G zV_<5R@~I46-wdiG{2HaXPi4r1hFViSO0j+kgogj&o~}j3jKBU46_Lgr2FDpFqHjB1 zY3jVzFAqy}4>@_xd|&=(E!oe3oee2njTX(MmAdpPM>s^jLb_Li>fIm>IJsd= zNg-c=T%BUgU49xJ55!964a?GjfCArN5lI%T5Vb;mu`ZqA>xw9n*1I_Ak^8m>7Fbab z6#|(wJ0{iVR}FQ`7~zygiQXAH!lu!~v+v)!ue5gK+|O%)#10+c#ioIWbnqJn{i_wK zPHvRtRFy+04r{CL9~2}L)|O!q(ZAhh>6J1A?;d>7)loVzoUGDnmjRD_kp@x_yznyF1-?-^XGU=iSnQ? z#3W^aAHbI{X$off^C2yxQt&M6Jqs^hXKtB0PkvFNGK90k%r~*rf6Pc$2D2GDGKUJ?|QSB-u2qcjUtoSM4oz zeyy;w+~DA?Yv*P6$>PhuWl{TsmKl(p%MT61UuVRht)KC4eIxWdc0iVT!gHtU*jPsz z(;fxYoG(qUs}Hhuhi0}Oxl_wWX7`ke3W!osh}mrhee%r}rV(|t--iCK?Q5{}WOpHU zo>)YlTjDq+;e@zqe$!A6<+(C62G|+V(3}tzYF!i(8i`PoC4h+5U-1&esE&zbxQ(vMIIzvC|9Ra{&r!PIm{r!uQ4FCzCkgSccn1 zjqKQ|(nSy#-pXc~Wh4DIVy@EZ3&#_2`C*Nhvv)J`4AH8brj+66p>rt|^^16IC|9q5 zi|RrdK#?Rl!&2MTK8F^8#vTx`TNZu8RpxK_5p*_{PoX$!qdGbO<{ID_5P(LeW&}3H_n43#-UY3-!d-LG92h z*x8l+MDSXWK4_tyavW}%jRbpYiUl)mWP3ey;+?^Ar1#Q3y^5+AMxO%HYJav^a|RSH zw?dK8F0kE}YBWMzg;3$ie~rGtO^rZEgCWRk9o9;JjK%k7hXP=2-{Md3(c-xzlmx52 z;r9c4L;_JrXr%R72PRx5Y$l)9hyy54Dc~7IL{|L8yCH7+&wM&dZJ$X^zDoJIHtGyBGEUoj!+wha9NuCLSH1y^{*$EQZ95=|<43`yQIwn9AmtE_ zx#WU>9Gl%nWH>=fm?I-r-}Cj50MSu-&j8uo!E(D9 z9K>U;?XtfC)?ZEVApqdoYD*KUE;?C$<@svv!8jsyqFhUxRYBlb02r z&sZ`=kJozy>FpS;CC?I1Tpyn!DW5pGgZIQ^zaGIq z$O^Oo7Uh>dk_q46welaR`{x%7F+KrY+Z6x%qd)%yEe|(N+qd4A_kIqizw6CDQWrV@ z;_3d^|NSob)}j2wdFZUD{_BwY!|mDA!A-V(G*hdz`Z&D+RY!=!%_j4nEbcQJlPrIw z-((Pw`Yyi{uuFU%-*ouAtFbl#Ig%V;1TMzOvA?8qIN1pi0YrNGaUF;5cU`@132+ML zf>(Pj-T!_NZ5Ix{5M-?_4ISro9w^I6Aup67dQRxs;>^%~PQMJ*9Lv^?Fjrtyps@=^ zLRd~I#B@WQvx0jlxXT&(PCj^s!R>8a#>a^`aw>Lr+~Y+(-O3iC8g}5Eo=uwSdQB+s zdUpiQFe|78I|_Jo2#@8pIa7$*29;9Z+q&X$A^G(FuB-R{`a!){6pwg)^FY`a4pger zcAZ{H{(D-xIEj_;FT*qmu$j7{z-G`I5k>W7fjZ?b#|#W9%8&7RuxV+8oIXNswmCdf z`H;5J4Z6`RKsvAG8cBDNFq(oy@fy%`|2Wr=+e79sE)E1}I`Cmj zuD*w6^xc&17PQ7QH3VFF2M--C68-N2&Q;|(lpiaTJ{1Ex>A$Tk_?U{kQJV$#0p<{md_k)l9%cP43E zdN80N=FHU)Yu_OcXrFzTAjt_S2-D5iABycuoDk$1$+-YQXzp=ZL70}(>fiq&nr;Ah zwm?WgGs@`>_?abKEbE!&*DzgZ%m5wdknvonz%mzdFS>cVbd6yS_BPDig9`q0WWZb$ z;bZP`inht+V$=Z2WcBRYcV0J){^WCKkvL5$F030IZRDP16*O$5xCUsNk+PKIolp}- zkAfsH0$$g9SkP&O$RWe&#Y7n{sC{`Q?u+HS1H`O7Ru_aX>XmbP@A=hDp{=yv2BDHM zg2A(gK)+H59~{nP3Qh~PaHrDzpbhSITwDFiBhblBgMu>;e!7$w00USFH$c%DG=*#q zEdZMFE8v6)4xcP!mzf}@k!y`=D_k4V!R=eRXWAII!TB<3iRd8`3666|@hDXqVxG!2 z{`GM*kp)ux>w*HwbGx&T*snBre)?rhmlR&aiajYoJev-~7WMHnG}p0LvN=n}nO?tg z|Gotu>HTgQS?nC3DFv!0J9TUv8`07yqQ)F)Jq97)VzRUTB2gx|`Q2uz%pQYk#O^rf zAW>|?V}JoP*Iof&ntl99rAXTXBK&F>mlQ7rCP&ZnEg;S~ccskJPExVIKw)g#s$-~3 zLF3@NEbrrOYUqDo&LCI~LSfE_d#z88FuM|wJ3-D(lkNv*oC)IMt!h^wG<0(}RQGH) zPmvDP_9ii{kW(H|(F2g?{BTH%pJBBZcGQ2L^aX6Esq`ktwagqapd4uyn8zP;2&+ytJq|o}FfR1KHcJ}rb0Ts7EyiusKwoE!)7p3__1|Q-rVsP!r9y(l` zAw>$Q37)n~ZAa}`RS$&{n&o|pbJU(+YOon76JWSZ#;M!Avp!1r`aRiuOaf_bK*NRc zMCXBAz}a`vVd)=*#ztfUX3x{y6K~;!nW^SiL+@v|_$|L80)9>e9iaA~9}IzYhUb#B=)!z==^oxyrs8${#}&0-DqBfZUm7oG zrp(Gy>DVF}5$pI7s-FIvE*LPL=5jyvqU<2|e2zzR9rd)V%F~A+8FHluPU(PA9nrZZ zUP++sdZ2keiBxXV-?cd#9C|`(_aqk3)Y+hwE{>xJBe8%p{TgJ7@{{kmWRe`jhJ9*o z$;2^~GO_Z+^yq@SohLybZMfl|ueM}?Y5v07s>Q|ISXKn#AJdSb=#Un42Xs~QaVc(z zBJNJlILVs};ekC8AkK>074a-qz~MIAWGf*bX}2cQkcwe#9g={!l<;tYZe5l(^4;>1 zjmcMfZbfZ$Uj|!3k|5sbpJQie8u#6Tqtli|M1|lro;V>J{RBSmp68Xm6_|^N@Ru}3 z%w_%=hxvUU>6eT(56Ro#K^|`caGmdpi)V{Qk8=RpWRW`V2_~!=L~#{yPPA;eiYa|1 zuyz7*vy8OENjg&W_VK+uN&Gqz(vmsIU>1ttIY}IO))xzIwCp9GV{4lu% z(@YMi*PUvQ@ndhOJxN|_P~Ak;EOes5-5rawy zNFu;m=001@R+HGyf@PvS1iDp6v9uz#haAXcg34Cf^<1aj0v#rjQ^J|mH5l`mJ6?yu z@*Y0l$027y-TA>Bn9oZEy{bLCRsEMOcXXB^#-omS-G9?QB7G1EL}|`T-bk3>?aP{; zrm}J=ZN3n(5%3?ilkYep>!Oyh(IYn!wx*S?!IpcqmkmTeC72R%HC_DlrR7OT1>(>z zb4ll1$QJ2yS1q%M;;g%KUo=#3Z!n_u5U^zqIw`Stb^i8re z>qH;!6zsS72 z=(ugG1O3u~#ql2-FjY}vF{KFm2^sZ4qA%qe8zU~JihDgS%zeU{Px35xZuof{s{W@t zmXd{TY#ep!CAq}4O3_`8f~53nVnOF$Eqrwq|nlmDr`qFXL|~O_;Zxz-9Z8G@(bdQV9=%&pc?cW2-cRZtTM5-$c1@ zdUcMjtiC#7Tq989?(nV?wWZ*B%@Ox#nLvTWl0^DVHVRj)IL+AepBd{eLGy*BNxVw* zbgPEkuX1pPay;|UzYc!ToJ%5_b61WN`f}edyf`t7rbFu7ya85w$5el5p@Q1&F10p$ zc`_CvJAKcUtDB%rPI$NkUKV%p&ncXA*5@X78Hq-tCC)QBQnJyO=3X!W$Ya+%?K2mI zA!QFDmKyWH;m1b8OU%)uMK!MSJ>2nPkw*PchSTfNpmpeh9!~cI6T83Vd0+n!LuYNi z*Dgc8N3bFk1I}lYyfvO$9$p7|?L!4;FIen1jTla{ueKH0xiKocPo(sPmiPskFByI5 zCjQaQFba>1Q`gt@|IzRM610R~+jB#hC=DU3jS*S?Y`5G9REoWB!PV|!?x8cvFQHnY zAh}@@MFyI(Y4eS!5!v!{On`}W<{HalswB>bvdZ}{hvYuQ7l8#gY-fg#N_wQE(o>s7 zdOc>p!m7D@yzm-Kx6I1-wN@eG1_8EAgUl^St7&3&?Su6kKJjv%dekmccXn)Kz|!TC zx1U3Rm|uwxs?bo9>OwYOOO(7D^O7#CZ?%3%SSQ$0FSBvV5&y=k|4dYJ#n>Y@Vvp^+ zUOxIc3$yqgpq5p|rIRJ4Wq!mpOht6E-;1j?Mru_#D9RSNP7q~dt^UIou!Bz;>{sGgW+}D zD~K(3q>i&L*${KGwCn_`qWk?LJvnL~Q^Vag?_KAH{M9W&pW2TEoqnIc%@8#?O0n1+ z)2~#0jq417J@>!V32ib3ueC!)ZwW2F{P6SJ3P*XeR1dgK zo#W8TF)W%b`L~0PDKZ52G|af=*R@|FkPOS+DmedUhN}IuojM>1zzFnBck=Uy9Fe>; z1oT!gx!H`=&5c=5X!qY;mNd6jBMB9^t>L~4kf{vhg6ma#g?u9+9d4YFKF8@jv>}m) z2p&1w=4_TCGH#5C5N^v&p+9@s&QF8L9Lr=6GlIDlSd>XJ=lDi}IA47O^^5!N>iv(a zl_Y4lWv=!9)fNXu!}^|MPV4U`2%q8g3;t3p zd=C~b*qVjm3V`S?A0$IU&ZL0@c=#n^Q1@mj3ik;;N8W0t;`BbBn;S8ppo6jaDdH&L zJV(N>0~8kmq}k2NQH{co+CLj%N9Dmb-4-McfDZ7nGTDCN$__48+ zXQE7BK?XJhlcqgqiOZoAMLzRIki^#2^z;FhIfY~Qc<6eA;QzkScSJhVYp+d9Z3Zhu zda@^Dk7Co!ikwz^+psTfH4FafhofnO_?3`qO$a89%T`;H|CkUwF=cQ7=i67DD5Lpg ztZD*T^4aV#%3TwzhW7#MWG`Jndbc~9V9b6g;1a13xy){lq=<<`mm$JC2b2hC(ge;F z({mQ9W~AULpXl|~_<~r^fIB{sX>m6wn4`&L*5_=*q{%+AabV3s%(;f&%Nz?khYmVF$jUFu#r@$RJXboc|r$|Um=Z-|@01aqpZRvO9 zzGnc(mhcOcu-1iOuLOnqc&_#-KqayuIVbpx_9spo1cCJvPZ#ii9c7*GG^4%7NOPR@ z)O1^%^|C^MKEVB4k=IQ3xsfNLz?p@=LAU z6l!E`jrtv;wjvdH<};yw`%cKwj<~_h4k1JSH6+bU;j}!akw9CkWZ!NDXkys>dl&^b z)ASL?v6V?u9BaC<1F=oe8d-v&tusx9KK27?s>RSELNtJfD_r3m;1fZJcJ0Lj#22(8 z@KE5;!>NB-&p*Ey3IkSEkl7MrqPkCzT^(sR2bEbjPqtiXwkNPMo3nDfK?*PYMG_$=4_Eobd$y-M<|{0L?kT{S zWyc(EIbp?P)>a1-lrabceX0FSSD|Tq!se0qKB09$XZv5b$^J`~02>HdoI*(1#%}@Z zoh&+=);|qbp+>F4ezYz7b}N#&(|2cz3r?QZB9a9>LfY4o<{GSkxRVj8uT7dCz2~&L z^h|;Rgwt0+Z0N|sQ=pNdZWq(^10df+U9eJT+(~y7%VP0JzN5a|#HrXC`5BtJ3;-ao zCpVGxG%_1EVJzRO?c+8^vwkMq0h5`O?` z7LU-Vht3!F;DzM*4c7MiPT>7H9t*W8Hh}Zkx5=>Oro{1mikFjabx`f>W z%gJyGTlEnel?Zo;pn-G0qf7|Xo{MTq9mme@6i-ZXnRu9l4|Dy4ZkS$?q_^3G#4lh; zQ7E+N1rPgB&vl6MK<42WGOLKSDtpgbMcW$s?6ixm2gp_TBIFRrTT|CAP$#YHo{6}} z^MS9BU@`;k%4%FfWP^OVz@fxD`{ysxfc^6;5)I*Z6P9sjub!w1ml}4h=)N@#TY>CH zqSnqA#qFne2&BW9U6kZUVC>MGZ4=c)p>Sy%poL;8?ZN@KS3<1k9>|$yPAw1GfOOb# z%4i$g;+5v>q|&=SvQ#N-x3`^xq8i>Q+qVA^-H|BjSrTsPND=|kY2|SxCly9{ONa)ttjgb3sm&7G6Nb)@Qft>JIRY+0mYw^o?%-b^k!BIZG?Da! zaxiy+*YV+tBF}lh?!*PCCB98)i4A`Z30*@eMAD47r4kA4%>Qvq@qrq7SGBjy)j>S^ zjBb%_f}j?dzeA-38J1+In$XkeBCl;XcUY4#eNBIq7zc2KCvIQp62$ zD>M&^OmpXd28F+2rpR7|9YhnnF4mB%96xCm*7Mg_{2&IfnujqaZ<_i3RC-n=1}?oP zkUDE_)B!u{096421;EoqOOQeI6`C9@oKbmSv?#?A(L**BC*B(Sv5ymN$Dp2l4`AxC zH9|Prj)jqgWf>Z^_VE#dSW@1~Zs`Xa^>W4tEe|9Aos|Z;>g6N#(-}YV9WWDdrkSyE z#`-x+BS^HIGVuhG^}%~;-3=D|bR#;gIuSv4EJh&>x0O=m1k{b`$)F)J-DS~g>U95q z5mLXNZSe=h5MB0OHMKby8RQXw&;JNv51@sKJ{`bZvI)DYNQGxYU+@*&3kgFGjkL~M z5Z9>Z0F4;($4+pXP)3}iQA6e6ntMi-tiyi6k_|`}f9OOZ}4Kw_2d0DAZaC@NOe ze+K%D>Og7)FSk}go1FyXL0Qe}vPFMMzJenSEOa3OnYMXMD;+yxA9S+2d2}KQSErrg zc|jLgBd6;)Q8h2X9jjay%JcO9xMugo?`q{T?sPidn7yYXYqx_d46}5KH65sN+PA?w zD z70HQbs@bTqT=4qeycEub|3C0j@Ah<7;MFBF?zehe-HQFZRefkn_w$Q!TpqIxqOKd=TJtL;eHp z_!{t*0-QnK;3u;8(}d4_20rf`7(fnhOziiM|EfO_F%NvJV9a~bFaIx@a>{kZkhW3( zLP9+rVYfP=M0R;!$}G*=lTkTNw&(t`@V^8lpg>gUacJiAAvC_&m0}5++UpQ?BN3v% z+$eG_MGB8i(QfuWFbpN6in>PCcCh{db3v!VqZmnBhE-uB33|}&<$;5}VM2LNMs@4% zd89Ot7G3f`d{_Jt`$X~KB^U2?Sj|~ zvkWRlRckF^h~|9p7E%Huq=DHzX4gVr)QiLsV~bVBb3G<8-a5PGfNT!<=UNZ#ek~&zMK(q(fnMyhp@l}?pxI(PNw-`Fg+Zq;*lc0AWqlKzb84F2hp zQUO8fq-vKU2N)wIcGleIk3T&BMDg9nn-`V@UU$L59T5=M4)C*%y?1DqK5!75Nc;c* z&qV7X5yn~8(oe1ez3T893{{ANOz{$34UzS@ch)eR8;E#h(;d$3qR*o>}D4$va zyWrVA?yDLH6fL}H?dph~YVg>KtZ*Vy)ObYR0NQT7eGVrDaxf@OodAKeR(gwgHNx4~ zGvXjfC&&1{NGDEvboq-+g!L$O;2lHm!$V4QG@>3wO>#@roq{*DKktA&aK#yCfa5K$ z#?3=}ulLX2QdnUHSGwBlz-PQ#mE+SIsj-)LFG*r;zAQ{&o2(K2Mr>?1hgSpgj7PdZ_}AEKYyL z>LMiI=3~i?4`;6+y6RUsgBKgpDQnnEw}MpKIie;csOCJz(w}wmH7S6 ze8=(Onq-?O>IhYM&pkeCZBX$Aq)LVHbmMbf8t;ZuEYIKa%|KQx!ZOb3HwDYrpC}

a@=iu&|G=tL}i9 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 diff --git a/docs/02_Bundles/img/messenger.png b/docs/02_Bundles/img/messenger.png new file mode 100644 index 0000000000000000000000000000000000000000..7e2cce0609eeb1a8b160652b4019e25dd8410511 GIT binary patch literal 59455 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 literal 0 HcmV?d00001 diff --git a/docs/02_Bundles/index.md b/docs/02_Bundles/index.md index 74a298f869..c7f25c4b94 100644 --- a/docs/02_Bundles/index.md +++ b/docs/02_Bundles/index.md @@ -1,6 +1,6 @@ # CoreShop Bundles -CoreShop provides several Components which are supposed to be independent. +CoreShop is a set of Bundles that provide different functionality. Each Bundle is supposed to be independent and can be used without the other Bundles. Glued together, they provide a full e-commerce solution. - [Address Bundle](./Address_Bundle.md) - [Configuration Bundle](./Configuration_Bundle.md) @@ -8,19 +8,31 @@ CoreShop provides several Components which are supposed to be independent. - [Currency Bundle](./Currency_Bundle.md) - [Customer Bundle](./Customer_Bundle.md) - [Fixture Bundle](./Fixture_Bundle.md) + - [Frontend Bundle](./Frontend_Bundle.md) - [Index Bundle](./Index_Bundle.md) - [Inventory Bundle](./Inventory_Bundle.md) - [Locale Bundle](./Locale_Bundle.md) - [Money Bundle](./Money_Bundle.md) + - [Messenger Bundle](./Messenger_Bundle.md) ! + - [Money Bundle](./Money_Bundle.md) ! + - [Notification Bundle](./Notification_Bundle.md) ! + - [Optimistic Entity Lock Bundle](./OptimisticEntityLock_Bundle.md) ! - [Order Bundle](./Order_Bundle.md) - [Payment Bundle](./Payment_Bundle.md) + - [Payum Payment Bundle](./PayumPayment_Bundle.md) ! - [Product Bundle](./Product_Bundle.md) - - [Resource Bundle](./Product_Bundle.md) + - [Product Quantity Price Rules Bundle](./ProductQuantityPriceRules_Bundle.md) + - [Resource Bundle](./Resource_Bundle) - [Rule Bundle](./Rule_Bundle.md) - [SEO Bundle](./SEO_Bundle.md) - [Sequence Bundle](./Sequence_Bundle.md) - [Shipping Bundle](./Shipping_Bundle.md) + - [Storage List Bundle](./StorageList_Bundle.md) - [Store Bundle](./Store_Bundle.md) - [Taxation Bundle](./Taxation_Bundle.md) + - [Theme Bundle](./Theme_Bundle.md) - [Tracking Bundle](./Tracking_Bundle.md) + - [User Bundle](./User_Bundle.md) + - [Variant Bundle](./Variant_Bundle.md) + - [Wishlist Bundle](./Wishlist_Bundle.md) - [Workflow Bundle](./Workflow_Bundle.md) \ No newline at end of file diff --git a/docs/02_Components/Address_Component.md b/docs/02_Components/Address_Component.md deleted file mode 100644 index 06046780e8..0000000000 --- a/docs/02_Components/Address_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Address Component - -Address Component holds Address Information and takes care about formatting addresses, as well as determining which Country the User comes from. \ No newline at end of file diff --git a/docs/02_Components/Configuration_Component.md b/docs/02_Components/Configuration_Component.md deleted file mode 100644 index bff96d2af0..0000000000 --- a/docs/02_Components/Configuration_Component.md +++ /dev/null @@ -1,10 +0,0 @@ -# CoreShop Configuration Component - -Configuration Component helps you store your configurations in database. - -```php - $service = new CoreShop\Component\Configuration\Service\ConfigurationService($doctrineEntityManager, $configRepo, $configFactory); - $service->set('key', 'value'); - - $service->get('key'); -``` \ No newline at end of file diff --git a/docs/02_Components/Core_Component.md b/docs/02_Components/Core_Component.md deleted file mode 100644 index 5ea5892af4..0000000000 --- a/docs/02_Components/Core_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Core Component - -The Core Component marries all other Components into one e-commerce suite. \ No newline at end of file diff --git a/docs/02_Components/Currency_Component.md b/docs/02_Components/Currency_Component.md deleted file mode 100644 index 321468cee2..0000000000 --- a/docs/02_Components/Currency_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Currency Component - -Currency Component takes care about Currency, Currency Conversion and Formatting, as well as determining which Currency is the current one. \ No newline at end of file diff --git a/docs/02_Components/Customer_Component.md b/docs/02_Components/Customer_Component.md deleted file mode 100644 index a232ea281b..0000000000 --- a/docs/02_Components/Customer_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Customer Component - -Customer Component takes care about Customer Models. \ No newline at end of file diff --git a/docs/02_Components/Index_Component.md b/docs/02_Components/Index_Component.md deleted file mode 100644 index 128319f1c4..0000000000 --- a/docs/02_Components/Index_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Index Component - -Index Component takes care about storing Meta-Informations for Indexes and Filters. \ No newline at end of file diff --git a/docs/02_Components/Inventory_Component.md b/docs/02_Components/Inventory_Component.md deleted file mode 100644 index 043f412920..0000000000 --- a/docs/02_Components/Inventory_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Inventory Component - -Inventory Component takes care about Stock Information. \ No newline at end of file diff --git a/docs/02_Components/Locale_Component.md b/docs/02_Components/Locale_Component.md deleted file mode 100644 index 00387cc15f..0000000000 --- a/docs/02_Components/Locale_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Locale Component - -Locale Component is a small wrapper around Pimcore's way of handling Locales. \ No newline at end of file diff --git a/docs/02_Components/Notification_Component.md b/docs/02_Components/Notification_Component.md deleted file mode 100644 index 241bb7b0f1..0000000000 --- a/docs/02_Components/Notification_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Notification Component - -TBD \ No newline at end of file diff --git a/docs/02_Components/Order_Component.md b/docs/02_Components/Order_Component.md deleted file mode 100644 index c63498be7d..0000000000 --- a/docs/02_Components/Order_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Order Component - -Order Component takes care about Cart, Orders and Qoutes. All of this three share one Interface "ProposalInterface"/"ProposalItemInterface". \ No newline at end of file diff --git a/docs/02_Components/Payment_Component.md b/docs/02_Components/Payment_Component.md deleted file mode 100644 index 4536f08027..0000000000 --- a/docs/02_Components/Payment_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Payment Component - -Payment Component takes care about Payment Informations. \ No newline at end of file diff --git a/docs/02_Components/Pimcore_Component.md b/docs/02_Components/Pimcore_Component.md deleted file mode 100644 index f88fa7123c..0000000000 --- a/docs/02_Components/Pimcore_Component.md +++ /dev/null @@ -1,216 +0,0 @@ -# CoreShop Pimcore Component - -## Features - -### Data Object Features - -#### Class Converter and Data Migrate -Class converter is a small utility, which lets you migrate all Data from one class to another. Usage: - -```php - true, - 'parentClass' => 'AppBundle\Model\MyProduct' -]; - -//Copies $currentClassName Definition to $newClassName -//$options can overwrite some properties like parentClass -Migrate::migrateClass($currentClassName, $newClassName, $options); - -//This function migrates all data from $currentClassName to $newClassName -//It uses SQL Commands to increase performance of migration -Migrate::migrateData($currentClassName, $newClassName); -``` - -#### Class Installer -Class Installer helps you importing Classes/FieldCollections/ObjectBricks into Pimcore based of a JSON Definition: - -```php - -use CoreShop\Component\Pimcore\ClassInstaller; - -$installer = new ClassInstaller(); - -// For Bricks use -$installer->createBrick($pathToJson, $brickName); - -// For Classes use -$installer->createClass($pathToJson, $className, $updateExistingClass); - -// For FieldCollections use -$installer->createFieldCollection($pathToJson, $fcName); - -``` - -#### Class/Brick/Field Collection Updater -Definition Updaters help you in migrating your Pimcore Class/Bricks or Field Collection Definitions to be properly -migrated from Release to Release. - -To update a Pimcore class use it like this: - -```php -use CoreShop\Component\Pimcore\DataObject\ClassUpdate; - -$classUpdater = new ClassUpdate('Product'); - -//Your JSON Definition from Pimcore -$payment = [ - 'fieldtype' => 'coreShopSerializedData', - 'phpdocType' => 'array', - 'allowedTypes' => - [ - ], - 'maxItems' => 1, - 'name' => 'paymentSettings', - 'title' => 'Payment Settings', - 'tooltip' => '', - 'mandatory' => false, - 'noteditable' => true, - 'index' => false, - 'locked' => null, - 'style' => '', - 'permissions' => null, - 'datatype' => 'data', - 'columnType' => null, - 'queryColumnType' => null, - 'relationType' => false, - 'invisible' => false, - 'visibleGridView' => false, - 'visibleSearch' => false, -]; - -//Check if field exists -if (!$classUpdater->hasField('paymentSettings')) { - //If not insert field after a specific field and save the definition - $classUpdater->insertFieldAfter('paymentProvider', $payment); - $classUpdater->save(); -} - -``` - -Thats it, the same works for FieldCollections with the class `CoreShop\Component\Pimcore\DataObject\FieldCollectionDefinitionUpdate` -and for Bricks with the class `CoreShop\Component\Pimcore\DataObject\BrickDefinitionUpdate` - -#### Inheritance Helper -Inhertiance Helper is a small little but very useful helper class to enable Pimcore inheritance only with a closure function like this: - -```php - -use CoreShop\Component\Pimcore\DataObject\InheritanceHelper; - -$inheritedValue = InheritanceHelper::useInheritedValues(function() use($object) { - return $object->getValueInherited(); -}, true); - -``` - -#### Version Helper -Version Helper is a small little but very useful helper class to disabling or enablind Pimcore Versioning. - -```php - -use CoreShop\Component\Pimcore\DataObject\VersionHelper; - -VersionHelper::useVersioning(function() use($object) { - //Object will be saved without creating a new Version - $object->save(); -}, false); - -``` - -#### Unpublished Helper -Unpublsihed Helper is a small little but very useful helper class to get unpublished objects in Pimcore Frontend. - -```php - -use CoreShop\Component\Pimcore\DataObject\UnpublishedHelper; - -$allProducts = UnpublishedHelper::hideUnpublished(function() use($object) { - //Will return all products, even the unpbulished ones - return $object->getProducts(); -}, false); - -``` - -### Expression Language Features -CoreShop adds some features to the Symfony Expression language like: - - - PimcoreLanguageProvider: to get Pimcore Objects, Assets or Documents inside a Expression Language Query - -### Migration Features - -#### Pimcore Shared Translations -Helps you to install new Shared Translations during Migration: - -```php -use CoreShop\Component\Pimcore\Migration\SharedTranslation; - -SharedTranslation::add('key', 'en', 'value'); -``` - -### Twig Features -CoreShop adds a lot of additional twig functions to make a developers live even more enjoyable :) - -#### Asset Helper Tests - -These tests let you test if a certain object is a Pimcore Asset or one of its subtypes: - - - asset - - asset_archive - - asset_audio - - asset_document - - asset_folder - - asset_image - - asset_text - - asset_unknown - - asset_video - -```twig -{% if image is asset_image %} - {# Process Image #} -{% endif %} -``` - -#### Document Helper Tests -These tests let you test if a certain object is a Pimcore Document or one of its subtypes: - - - document - - document_email - - document_folder - - document_hardlink - - document_newsletter - - document_page - - document_link - - document_page_snippet - - document_print - - document_print_container - - document_print_page - - document_snippet - -```twig -{% if document is document_page %} - {# Process Document #} -{% endif %} -``` - -#### Document Helper Class -These tests let you test if a certain object is a Pimcore DataObject or a DataObject of a specific class. - - - object - - object_class($className) - -```twig -{% if product is object %} - {# product is of any DataObject Tyoe #} -{% endif %} - -{% if product is object_class('Product') %} - {# product is of a Product DataObject #} -{% endif %} -``` diff --git a/docs/02_Components/Product_Component.md b/docs/02_Components/Product_Component.md deleted file mode 100644 index b07c46ab6c..0000000000 --- a/docs/02_Components/Product_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Product Component - -Product Component takes care about Product Models, as well as Product Price Rules, Specific Product Rules and Price Calculators. \ No newline at end of file diff --git a/docs/02_Components/Product_Quantity_Price_Rules_Component.md b/docs/02_Components/Product_Quantity_Price_Rules_Component.md deleted file mode 100644 index b987deb882..0000000000 --- a/docs/02_Components/Product_Quantity_Price_Rules_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Product Quantity Price Rules Component - -Component for Quantity Price Rules. diff --git a/docs/02_Components/Registry_Component.md b/docs/02_Components/Registry_Component.md deleted file mode 100644 index 39deee569f..0000000000 --- a/docs/02_Components/Registry_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Registry Component - -Registry Component takes care about Service Registries and Prioritized Service Registration which are used basically everywhere in CoreShop. \ No newline at end of file diff --git a/docs/02_Components/Resource_Component.md b/docs/02_Components/Resource_Component.md deleted file mode 100644 index e03f7f2fe3..0000000000 --- a/docs/02_Components/Resource_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Resource Component - -Resource Component is the heart of CoreShops Models \ No newline at end of file diff --git a/docs/02_Components/Rule_Component.md b/docs/02_Components/Rule_Component.md deleted file mode 100644 index bebcf7424a..0000000000 --- a/docs/02_Components/Rule_Component.md +++ /dev/null @@ -1,8 +0,0 @@ -# CoreShop Rule Component - -Rule Component is the base-component for all Rule related stuff in CoreShop. For example: - - CoreShop Cart Price Rules - - Product Price Rule - - Product Specific Price Rule - - Shipping Rule - - Mail Rule \ No newline at end of file diff --git a/docs/02_Components/SEO_Component.md b/docs/02_Components/SEO_Component.md deleted file mode 100644 index 150b8562eb..0000000000 --- a/docs/02_Components/SEO_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop SEO Component - -Inventory Component takes care about SEO. \ No newline at end of file diff --git a/docs/02_Components/Sequence_Component.md b/docs/02_Components/Sequence_Component.md deleted file mode 100644 index a5dd08de3a..0000000000 --- a/docs/02_Components/Sequence_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Sequence Component - -Sequence Component creates new Numbers for Orders/Quotes/Invoices etc. \ No newline at end of file diff --git a/docs/02_Components/Shipping_Component.md b/docs/02_Components/Shipping_Component.md deleted file mode 100644 index 0d75cc6f4e..0000000000 --- a/docs/02_Components/Shipping_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Shipping Component - -Shipping Component takes care about Shipping Rules and Carriers \ No newline at end of file diff --git a/docs/02_Components/Store_Component.md b/docs/02_Components/Store_Component.md deleted file mode 100644 index afabd4362f..0000000000 --- a/docs/02_Components/Store_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Store Component - -Store Component takes care about Stores and determines which Store the User is in. \ No newline at end of file diff --git a/docs/02_Components/Taxation_Component.md b/docs/02_Components/Taxation_Component.md deleted file mode 100644 index 64a2534813..0000000000 --- a/docs/02_Components/Taxation_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Taxation Component - -Taxation Component takes about Taxes and calculating them. \ No newline at end of file diff --git a/docs/02_Components/Tracking_Component.md b/docs/02_Components/Tracking_Component.md deleted file mode 100644 index 0b6478c696..0000000000 --- a/docs/02_Components/Tracking_Component.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Tracking Component - -TBD \ No newline at end of file diff --git a/docs/02_Components/index.md b/docs/02_Components/index.md deleted file mode 100644 index 68d9d1cafe..0000000000 --- a/docs/02_Components/index.md +++ /dev/null @@ -1,26 +0,0 @@ -# CoreShop Components - -CoreShop provides several Components which are supposed to be independent. - - - [Address](./Address_Component.md) - - [Configuration](./Configuration_Component.md) - - [Core](./Core_Component.md) - - [Currency](./Currency_Component.md) - - [Customer](./Customer_Component.md) - - [Index](./Index_Component.md) - - [Inventory](./Inventory_Component.md) - - [Locale](./Locale_Component.md) - - [Notification](./Notification_Component.md) - - [Order](./Order_Component.md) - - [Payment](./Payment_Component.md) - - [Pimcore](./Pimcore_Component.md) - - [Product](./Product_Component.md) - - [Registry](./Registry_Component.md) - - [Resource](./Resource_Component.md) - - [Rule](./Rule_Component.md) - - [Sequence](./Sequence_Component.md) - - [Storage List](./StorageList_Component.md) - - [Shipping](./Shipping_Component.md) - - [Store](./Store_Component.md) - - [Taxation](./Taxation_Component.md) - - [Tracking](./Tracking_Component.md) \ No newline at end of file diff --git a/docs/02_User_Documentation/01_Stores.md b/docs/02_User_Documentation/01_Stores.md index 4a4512bc4b..0500f9d0e3 100644 --- a/docs/02_User_Documentation/01_Stores.md +++ b/docs/02_User_Documentation/01_Stores.md @@ -8,7 +8,7 @@ By default a store is connected with a pimcore Site. This is CoreShops default behaviour. One store for your default page, which is also your default store. If you have multiple Domains it's possible to add a store to each domain. -> **Tip:** Learn more about pimcore multi sites: [https://www.pimcore.org/docs/latest/MVC/Routing_and_URLs/Working_with_Sites.html](https://www.pimcore.org/docs/latest/MVC/Routing_and_URLs/Working_with_Sites.html) +> **Tip:** Learn more about pimcore multi sites: [Pimcore Sites](https://pimcore.com/docs/pimcore/current/Development_Documentation/MVC/Routing_and_URLs/Working_with_Sites.html) ## Custom Store Locator Sometimes you have just one site installation but you want do use different Stores. diff --git a/docs/02_User_Documentation/03_Price_Rules/01_Cart_Price_Rules.md b/docs/02_User_Documentation/03_Price_Rules/01_Cart_Price_Rules.md index 95e1aa7bfb..013798adb4 100644 --- a/docs/02_User_Documentation/03_Price_Rules/01_Cart_Price_Rules.md +++ b/docs/02_User_Documentation/03_Price_Rules/01_Cart_Price_Rules.md @@ -1,7 +1,6 @@ -# CoreShop Cart Price Rules +# CoreShop Cart Price Rules Documentation -Cart Price Rules are applied as discount on your cart. -Cart Price Rules can also be used with voucher codes. +Cart price rules in CoreShop provide a flexible way to offer discounts and promotions in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions, such as cart subtotal, specific products, customer groups, or other criteria. This documentation will guide you through creating and managing cart price rules in CoreShop. ![Cart Price Rules](img/cart-pricerule.png) diff --git a/docs/02_User_Documentation/03_Price_Rules/02_Product_Price_Rules.md b/docs/02_User_Documentation/03_Price_Rules/02_Product_Price_Rules.md index 1dc1bb2539..67f9cf6cf4 100644 --- a/docs/02_User_Documentation/03_Price_Rules/02_Product_Price_Rules.md +++ b/docs/02_User_Documentation/03_Price_Rules/02_Product_Price_Rules.md @@ -1,6 +1,6 @@ -# CoreShop Product Price Rules +# CoreShop Product Price Rules Documentation -Product Price Rules are applied directly on products and the "discounted" price will be stored directly in the order. +Product price rules in CoreShop offer a flexible way to provide discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions and can apply to specific products, categories, or customer groups. This documentation will guide you through creating and managing product price rules in CoreShop. ![Cart Price Rules](img/product-pricerule.png) diff --git a/docs/02_User_Documentation/03_Price_Rules/03_Specific_Price_Rules.md b/docs/02_User_Documentation/03_Price_Rules/03_Specific_Price_Rules.md index acca99e580..9f6cb01cfe 100644 --- a/docs/02_User_Documentation/03_Price_Rules/03_Specific_Price_Rules.md +++ b/docs/02_User_Documentation/03_Price_Rules/03_Specific_Price_Rules.md @@ -1,7 +1,6 @@ -# CoreShop Specific Price Rules +# CoreShop Specific Price Rules Documentation -Specific Prices are basically the same as Product Price Rules, but are configured directly on the -product and therefore are only applied on that product. +Specific price rules in CoreShop provide a flexible way to create targeted discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules apply directly to individual products or variants and can be based on customer groups, currencies, or countries. This documentation will guide you through creating and managing specific price rules in CoreShop. ![Specific Price Rules](img/specific-price-rules.png) diff --git a/docs/02_User_Documentation/03_Price_Rules/04_Quantity_Price_Rules.md b/docs/02_User_Documentation/03_Price_Rules/04_Quantity_Price_Rules.md index 6095b8d424..f5c19e9da0 100644 --- a/docs/02_User_Documentation/03_Price_Rules/04_Quantity_Price_Rules.md +++ b/docs/02_User_Documentation/03_Price_Rules/04_Quantity_Price_Rules.md @@ -1,11 +1,6 @@ -# CoreShop Quantity Price Rules +# CoreShop Quantity Price Rules Documentation -Quantity Price Rules are configured directly on the product and therefore are only applied -on that product. The settings are different to specific price rules. Calculation Behaviour -means the property on which the amount is determined. This is volume per default. - -Quantity price rules are only applied to the price in context of a cart. In other cases the -price calculator ignores them. +CoreShop Quantity Price Rules provide a flexible way to offer volume-based discounts for products in your e-commerce store built on the Pimcore platform. These rules apply to specific products and offer tiered pricing depending on the quantity purchased. This documentation will guide you through creating and managing quantity price rules in CoreShop. ![Specific Price Rules](img/quantity-price-rules.png) diff --git a/docs/02_User_Documentation/05_Shipping/01_Carriers.md b/docs/02_User_Documentation/05_Shipping/01_Carriers.md index f87f5c14cb..c9ef0dabc5 100644 --- a/docs/02_User_Documentation/05_Shipping/01_Carriers.md +++ b/docs/02_User_Documentation/05_Shipping/01_Carriers.md @@ -1 +1,24 @@ -# TODO \ No newline at end of file +# CoreShop Carriers Documentation + +CoreShop Carriers are an essential part of the shipping process in the CoreShop e-commerce framework, built on the Pimcore platform. Carriers represent shipping providers (e.g., UPS, FedEx, or DHL) and are responsible for delivering orders to customers. This documentation will guide you through the process of creating and managing carriers in CoreShop. + +## Creating a Carrier + +To create a carrier, follow these steps: + + - Log in to the CoreShop admin interface. + - Navigate to the "Shipping" tab and click on "Carriers." + - Click the "Add new" button to create a new carrier. + - Enter a name for the carrier and configure the other available options as needed. + +## Carrier Options + +When creating a carrier, you can configure various options to customize its behavior: + + - Name: A descriptive name for the carrier (e.g., UPS, FedEx, or DHL). + - Tracking Url: A string value that indicates the tracking url + - Tax Rule Group: The tax rule group applied to shipping costs for this carrier. If you want to apply taxes to shipping costs, you'll need to create a tax rule group and assign it to the carrier. + - Shipping Rules: The shipping rules associated with this carrier. Shipping rules define shipping costs based on various conditions such as weight, price, dimensions, and destination. You can assign multiple shipping rules to a carrier, and the system will evaluate them in order of priority to determine the final shipping cost. + +## Summary +CoreShop Carriers provide a robust way to manage shipping providers and their associated services. By creating carriers and configuring their options, you can offer customers a range of shipping choices based on factors such as delivery time and cost. Combined with shipping rules, carriers give you the flexibility to create a tailored shipping experience for your e-commerce store. \ No newline at end of file diff --git a/docs/02_User_Documentation/05_Shipping/02_Shipping_Rules.md b/docs/02_User_Documentation/05_Shipping/02_Shipping_Rules.md index f87f5c14cb..47da42f5dd 100644 --- a/docs/02_User_Documentation/05_Shipping/02_Shipping_Rules.md +++ b/docs/02_User_Documentation/05_Shipping/02_Shipping_Rules.md @@ -1 +1,53 @@ -# TODO \ No newline at end of file +# CoreShop Shipping Rules Documentation + +CoreShop Shipping Rules is a powerful feature within the CoreShop e-commerce framework built on the Pimcore platform. It allows you to create flexible and customizable shipping rules that define shipping costs based on various conditions such as weight, price, dimensions, and shipping destination. + +## Overview + +Shipping rules in CoreShop can be composed of conditions and actions. Conditions determine whether a rule should be applied, while actions define the changes to the shipping costs. + +CoreShop provides a user-friendly interface for creating and managing shipping rules. You can create multiple rules, each with different conditions and actions, to cover various scenarios. + +## Creating Shipping Rules + + - Navigate to the "Shipping" tab and click on "Shipping Rules." + - Click the "Add new" button to create a new shipping rule. + - Enter a name for the rule and configure the other available options as needed. + +## Configuring Conditions + +Conditions determine whether the shipping rule should be applied to an order. You can create multiple conditions for a single rule, and all conditions must be met for the rule to be applied. CoreShop offers several types of conditions, including: + + - Weight: Based on the total weight of the order. + - Price: Based on the total price of the order. + - Dimension: Based on the dimensions (length, width, and height) of the order. + - Quantity: Based on the total quantity of items in the order. + - Countries: Based on the shipping destination country. + - Zones: Based on the shipping destination zone (a group of countries). + +To add a condition to your shipping rule: + + - Click the "Add Condition" button in the "Conditions" section of the shipping rule. + - Choose the desired condition type from the dropdown menu. + - Configure the condition parameters as needed. + +For example, if you want to apply a shipping rule only to orders with a total weight of over 10kg, you would add a weight condition and set the minimum weight to 10kg. + +## Configuring Actions +Actions define the changes to the shipping costs when a rule is applied. You can create multiple actions for a single rule. CoreShop offers several types of actions, including: + + - Discount Amount: Apply a fixed discount amount to the shipping cost. + - Discount Percentage: Apply a percentage discount to the shipping cost. + - Add Amount: Add a fixed amount to the shipping cost. + - Add Percentage: Add a percentage amount to the shipping cost. + +To add an action to your shipping rule: + + - Click the "Add Action" button in the "Actions" section of the shipping rule. + - Choose the desired action type from the dropdown menu. + - Configure the action parameters as needed. + +For example, if you want to apply a 20% discount to the shipping cost when the rule is applied, you would add a discount percentage action and set the percentage value to 20. + +# Summary +CoreShop Shipping Rules offer a powerful and flexible way to define and manage shipping costs for your e-commerce store. By creating various conditions and actions, you can customize shipping costs based on factors such as weight, price, dimensions, and destination. This allows you to cater to different customer needs and provide more accurate shipping estimates. \ No newline at end of file diff --git a/docs/02_User_Documentation/05_Shipping/index.md b/docs/02_User_Documentation/05_Shipping/index.md index 3ea6374d6b..c50fa16054 100644 --- a/docs/02_User_Documentation/05_Shipping/index.md +++ b/docs/02_User_Documentation/05_Shipping/index.md @@ -1,27 +1,6 @@ # CoreShop Shipping -## Until Build 87 +CoreShop provides a comprehensive shipping management system that allows you to define and configure various aspects of shipping, such as carriers, shipping rules, and carrier services. -Shipping prices have been calculated using Ranges. Ranges can be defined by price or weight. Prices are defined using a Zone and a Range. For example (Range is defined as the total cart weight): - -| Range | 0-100 | 100-400 | 400-1000 | 1000-10000 | -|---|---|---|---|---| -| Europe | 10 | 20 | 30 | 35 | -| America | 20 | 30 | 50 | 80 | -| Asia | 20 | 40 | 50 | 100 | - -The shipping for Europe with a cart-weight of 150kg would be 20. - -![Carriers](img/carriers.png) - -## Since Build 88 - -Since Build 88 CoreShop uses "Shipping Rules". Within shipping rules you can define which conditions must be true for which actions. So for example: - -Carrier "A" only delivers to Europe and only with a max-weight of 100kg. The price is 5€ + 10% fee. - -Your Rule would now look like this: -![Condition](img/example1-conditions.png) - -Your Action would look like this: -![Condition](img/example2-action.png) +* [Carriers](./01_Carriers.md) +* [Shipping Rules](./02_Shipping_Rules.md) \ No newline at end of file diff --git a/docs/02_User_Documentation/07_Catalog/01_Products.md b/docs/02_User_Documentation/07_Catalog/01_Products.md index f87f5c14cb..8ee93715a7 100644 --- a/docs/02_User_Documentation/07_Catalog/01_Products.md +++ b/docs/02_User_Documentation/07_Catalog/01_Products.md @@ -1 +1,3 @@ -# TODO \ No newline at end of file +# CoreShop Products Documentation + +Products are the core of any e-commerce store built on the Pimcore platform. CoreShop provides a flexible and feature-rich system for managing products, including product variants, attributes, images, and more. \ No newline at end of file diff --git a/docs/02_User_Documentation/07_Catalog/02_Product_Variants.md b/docs/02_User_Documentation/07_Catalog/02_Product_Variants.md index f87f5c14cb..74a21e3037 100644 --- a/docs/02_User_Documentation/07_Catalog/02_Product_Variants.md +++ b/docs/02_User_Documentation/07_Catalog/02_Product_Variants.md @@ -1 +1,3 @@ -# TODO \ No newline at end of file +# Product Variants + +CoreShop has the Variant Bundle to handle Variants, see [here](../../02_Bundles/Variant_Bundle.md). \ No newline at end of file diff --git a/docs/02_User_Documentation/07_Catalog/03_Categories.md b/docs/02_User_Documentation/07_Catalog/03_Categories.md index f87f5c14cb..a1aa2e5963 100644 --- a/docs/02_User_Documentation/07_Catalog/03_Categories.md +++ b/docs/02_User_Documentation/07_Catalog/03_Categories.md @@ -1 +1,3 @@ -# TODO \ No newline at end of file +# CoreShop Categories Documentation + +Categories in CoreShop provide a way to organize and structure the products in your e-commerce store built on the Pimcore platform. Using categories, you can create a hierarchical navigation system that allows customers to browse and find products easily. \ No newline at end of file diff --git a/docs/03_Development/02_Localization/01_Currencies/02_Exchange_Rates.md b/docs/03_Development/02_Localization/01_Currencies/02_Exchange_Rates.md deleted file mode 100644 index d920bcf9b6..0000000000 --- a/docs/03_Development/02_Localization/01_Currencies/02_Exchange_Rates.md +++ /dev/null @@ -1,3 +0,0 @@ -# CoreShop Exchange Rates - -TODO \ No newline at end of file diff --git a/docs/03_Development/02_Localization/01_Currencies/index.md b/docs/03_Development/02_Localization/01_Currencies/index.md index 888c9ead4e..1277d81063 100644 --- a/docs/03_Development/02_Localization/01_Currencies/index.md +++ b/docs/03_Development/02_Localization/01_Currencies/index.md @@ -3,5 +3,4 @@ > CoreShop is a multi-currency able eCommerce Framework. Therefore it is possible to create and use different currencies. 1. [Create, Update, Read, Delete](./01_CRUD.md) -2. [Exchange Rates](./02_Exchange_Rates.md) 2. [Currency Context](./03_Context.md) \ No newline at end of file diff --git a/docs/02_Components/Product_Unit.md b/docs/03_Development/03_Products/06_Units.md similarity index 97% rename from docs/02_Components/Product_Unit.md rename to docs/03_Development/03_Products/06_Units.md index 0956a1430d..7a5f3e4a46 100644 --- a/docs/02_Components/Product_Unit.md +++ b/docs/03_Development/03_Products/06_Units.md @@ -1,4 +1,4 @@ -# CoreShop Product Unit Definitions +# CoreShop Product Units Units for Products can be defined globally in the Pimcore Backend on CoreShopMenu > Product > Product Units. diff --git a/docs/03_Development/03_Products/06_Unit_Definitions.md b/docs/03_Development/03_Products/07_Unit_Definitions.md similarity index 100% rename from docs/03_Development/03_Products/06_Unit_Definitions.md rename to docs/03_Development/03_Products/07_Unit_Definitions.md diff --git a/docs/03_Development/03_Products/index.md b/docs/03_Development/03_Products/index.md index 63b54e85e5..39e6cfff29 100644 --- a/docs/03_Development/03_Products/index.md +++ b/docs/03_Development/03_Products/index.md @@ -7,4 +7,5 @@ This guide should lead you through how CoreShop handles Product information and 3. [Price Rules](./03_Price_Rules) 4. [Configuration](./04_Configuration.md) 5. [Multiple Product DataObjects](./05_Multiple_Product_DataObjects.md) - 6. [Product Unit Definitions](./06_Unit_Definitions.md) + 6. [Product Units](./06_Units.md) + 6. [Product Unit Definitions](./07_Unit_Definitions.md) diff --git a/docs/03_Development/04_Cart/03_Cart_Modifier.md b/docs/03_Development/04_Cart/03_Cart_Modifier.md index 52a41e588a..269d719a7d 100644 --- a/docs/03_Development/04_Cart/03_Cart_Modifier.md +++ b/docs/03_Development/04_Cart/03_Cart_Modifier.md @@ -9,4 +9,4 @@ CoreShop provides you with a helper service to modify the cart. It handles follo The Modifier implements the interface [```CoreShop\Component\Order\Cart\CartModifierInterface```](https://github.com/coreshop/CoreShop/blob/master/src/CoreShop/Component/Order/Cart/CartModifierInterface.php) and is implemented by the service ```coreshop.cart.modifier``` -The Cart Modifier itself, uses the [Storage List Component](../../02_Components/StorageList_Component.md) \ No newline at end of file +The Cart Modifier itself, uses the [Storage List Component](../../03_Bundles/StorageList_Bundle.md) \ No newline at end of file diff --git a/docs/03_Development/06_Order/07_Quote/01_Quote_Creation.md b/docs/03_Development/06_Order/07_Quote/01_Quote_Creation.md deleted file mode 100644 index 30404ce4c5..0000000000 --- a/docs/03_Development/06_Order/07_Quote/01_Quote_Creation.md +++ /dev/null @@ -1 +0,0 @@ -TODO \ No newline at end of file diff --git a/docs/03_Development/06_Order/07_Quote/02_Transformer.md b/docs/03_Development/06_Order/07_Quote/02_Transformer.md deleted file mode 100644 index 30404ce4c5..0000000000 --- a/docs/03_Development/06_Order/07_Quote/02_Transformer.md +++ /dev/null @@ -1 +0,0 @@ -TODO \ No newline at end of file diff --git a/docs/03_Development/06_Order/07_Quote/03_Configuration.md b/docs/03_Development/06_Order/07_Quote/03_Configuration.md deleted file mode 100644 index 30404ce4c5..0000000000 --- a/docs/03_Development/06_Order/07_Quote/03_Configuration.md +++ /dev/null @@ -1 +0,0 @@ -TODO \ No newline at end of file diff --git a/docs/03_Development/06_Order/07_Quote/04_Extend_Quote.md b/docs/03_Development/06_Order/07_Quote/04_Extend_Quote.md deleted file mode 100644 index 30404ce4c5..0000000000 --- a/docs/03_Development/06_Order/07_Quote/04_Extend_Quote.md +++ /dev/null @@ -1 +0,0 @@ -TODO \ No newline at end of file diff --git a/docs/03_Development/06_Order/07_Quote/index.md b/docs/03_Development/06_Order/07_Quote/index.md deleted file mode 100644 index 30404ce4c5..0000000000 --- a/docs/03_Development/06_Order/07_Quote/index.md +++ /dev/null @@ -1 +0,0 @@ -TODO \ No newline at end of file diff --git a/docs/03_Development/06_Order/index.md b/docs/03_Development/06_Order/index.md index cda520d0ba..280d4243fc 100644 --- a/docs/03_Development/06_Order/index.md +++ b/docs/03_Development/06_Order/index.md @@ -6,7 +6,6 @@ This guide should lead you through how CoreShop handles Orders. - [Order Workflow](./03_Order_Workflow.md) - [Invoice](./05_Invoice) - [Shipment](./06_Shipment) - - [Quote](./07_Quote) - [Template/Twig Helper](./08_TemplateHelper.md) - [Extend Order with additional data](./09_AdditionalData.md) diff --git a/docs/config.json b/docs/config.json index aed7b35a8c..e47535ae64 100644 --- a/docs/config.json +++ b/docs/config.json @@ -1,19 +1,57 @@ { "title" : "CoreShop 3.0.x - Pimcore eCommerce - Documentation", + "sub_title": "", "tagline" : "CoreShop 3.0.x - Pimcore eCommerce", - "repo": "coreshop/core-shop", - "html": { - "theme": "coreshop-blue", - "edit_on_github" : "coreshop/CoreShop/edit/master/docs" - }, - "themes_directory" : "themes", - "links": { - "Website": "https://www.coreshop.org" - }, - "breadcrumbs": false, - "google_analytics": "UA-75356862-4", + "author": "", + "languages": [], + "format": "html", + "processor": "", "ignore": { "files": ["generate-api.sh", "generate-docs.sh", "generate-docs-local.sh", "config.json", "composer.json", "composer.lock"], "folders": ["vendor", "themes", "generated_docs", "img"] + }, + "timezone": "Europe/Vienna", + "live": { + "clean_urls": true + }, + "html": { + "ribbon_text": "", + "theme": "pimcore-core", + "breadcrumbs": true, + "breadcrumb_separator": "Chevrons", + "toggle_code": false, + "date_modified": false, + "float": false, + "search": true, + "inherit_index": true, + "repo": "pimcore/pimcore", + "twitter": false, + "links": { + "Website": "https://www.coreshop.org", + "Github": "https://github.com/coreshop/CoreShop" + }, + "google_analytics": "UA-75356862-4", + "banner": { + + }, + "linked_docs": { + "pimcore": { + "title": "Pimcore", + "description": "Picmore Docs", + "link": "https://pimcore.com/docs/", + "css_classes": "enterprise", + "ribbon_text": "Pimcore" + } + }, + "edit_on_github": "coreshop/CoreShop/edit/master/doc", + "disqus": { + "include": false, + "url_prefix": "https://coreshop.org/docs/latest/" + }, + "version_info": { + "include": true, + "source_url": "https://github.com/coreshop/CoreShop/commit/{commit_hash}", + "source_name": "coreshop/CoreShop@{short_commit_hash}" + } } } diff --git a/docs/generate-docs-local.sh b/docs/generate-docs-local.sh index 9a5cc212d1..6e2d3d515b 100644 --- a/docs/generate-docs-local.sh +++ b/docs/generate-docs-local.sh @@ -1,4 +1,3 @@ echo "Generate CoreShop Docs" -lessc themes/coreshop/less/theme-coreshop.less themes/coreshop/css/theme-coreshop.min.css -x /opt/homebrew/opt/php@7.4/bin/php vendor/bin/daux generate --destination=generated-docs -s . diff --git a/docs/generated-docs/Bundles/Address_Bundle.html b/docs/generated-docs/Bundles/Address_Bundle.html new file mode 100644 index 0000000000..6a062154d7 --- /dev/null +++ b/docs/generated-docs/Bundles/Address_Bundle.html @@ -0,0 +1,166 @@ + + + + + + + Address Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +

+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Address Bundle

+

CoreShop Address Bundle provides a basic set of data for Addressing Information like:

+
    +
  • Country
  • +
  • State
  • +
  • Address
  • +
+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Configuration_Bundle.html b/docs/generated-docs/Bundles/Configuration_Bundle.html new file mode 100644 index 0000000000..b7618e99de --- /dev/null +++ b/docs/generated-docs/Bundles/Configuration_Bundle.html @@ -0,0 +1,167 @@ + + + + + + + Configuration Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Configuration Bundle

+

Installation

+
$ composer require coreshop/configuration-bundle:^3.0
+
+

Usage

+

Configuration Component helps you store your configurations in database.

+
    $service = new CoreShop\Component\Configuration\Service\ConfigurationService($doctrineEntityManager, $configRepo, $configFactory);
+    $service->set('key', 'value');
+
+    $service->get('key');
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Core_Bundle.html b/docs/generated-docs/Bundles/Core_Bundle.html new file mode 100644 index 0000000000..3fa93009f6 --- /dev/null +++ b/docs/generated-docs/Bundles/Core_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Core Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Core Bundle

+

Core Bundle glues all independent CoreShop Bundles into one e-commerce suite and extends certain parts accordingly.

+
+

This Bundle is not advised to be installed seperately!

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Currency_Bundle.html b/docs/generated-docs/Bundles/Currency_Bundle.html new file mode 100644 index 0000000000..a72c1ccfe9 --- /dev/null +++ b/docs/generated-docs/Bundles/Currency_Bundle.html @@ -0,0 +1,208 @@ + + + + + + + Currency Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Currency Bundle

+

Currency Bundle provides you with Models for persisting Currencies and resolving Currency Contexts.

+
    +
  • Symfony Profiler
  • +
  • Pimcore Core Extensions
  • +
  • Doctrine Mappings
  • +
  • Symfony Forms
  • +
  • Money Formatter
  • +
  • Twig Extensions +
      +
    • Currency Formatting
    • +
    • Currency Conversion
    • +
    • Currency Code to Symbol
    • +
    +
  • +
+

Installation

+
$ composer require coreshop/currency-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\CurrencyBundle\CoreShopCurrencyBundle(),
+    ]);
+}
+
+

Updating database schema

+

Run the following command.

+
$ php bin/console doctrine:schema:update --force
+
+

Usage

+

This Bundle integrates Currency Component into Symfony and Doctrine

+

The Currency Bundle provides you with basic information needed for Currencies: Currency, Exchange Rates, Conversion and Formatting

+

Doctrine Entities

+
    +
  • Currency
  • +
+

Pimcore UI

+
    +
  • Currency
  • +
  • Exchange Rate
  • +
+

How to use?

+
coreshop.global.resource.open('coreshop.currency', 'currency');
+coreshop.global.resource.open('coreshop.currency', 'exchange_rate');
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Customer_Bundle.html b/docs/generated-docs/Bundles/Customer_Bundle.html new file mode 100644 index 0000000000..6a5c89c5e4 --- /dev/null +++ b/docs/generated-docs/Bundles/Customer_Bundle.html @@ -0,0 +1,190 @@ + + + + + + + Customer Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Customer Bundle

+

Installation

+
$ composer require coreshop/customer-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\CustomerBundle\CoreShopCustomerBundle(),
+    ]);
+}
+
+

Updating database schema

+

Run the following command.

+
$ php bin/console doctrine:schema:update --force
+
+

Install Pimcore Entities

+
$ php bin/console coreshop:resources:install
+
+

Learn more about overriding Pimcore Classes here)

+

Usage

+

This Bundle integrates Customer Component into Symfony and Doctrine

+

The Customer Bundle provides you with basic information needed for a Customer: Customer and CustomerGroup

+

The Bundle also introduces an Customer Context, which helps you determine the current Customer.

+

Pimcore Entities

+
    +
  • Customer (CoreShopCustomer)
  • +
  • CustomerGroup (CoreShopCustomerGroup)
  • +
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Fixture_Bundle.html b/docs/generated-docs/Bundles/Fixture_Bundle.html new file mode 100644 index 0000000000..ef17dac419 --- /dev/null +++ b/docs/generated-docs/Bundles/Fixture_Bundle.html @@ -0,0 +1,246 @@ + + + + + + + Fixture Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Fixture Bundle

+

Fixture Bundle allows us to Install certain data needed for runtime of CoreShop or for the Demo.

+

Installation

+
$ composer require coreshop/fixture-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\FixtureBundle\CoreShopFixtureBundle(),
+    ]);
+}
+
+

Updating database schema

+

Run the following command.

+
$ php bin/console doctrine:schema:update --force
+
+

Creating a new Fixture

+

Create a new File in your Bundle within the Namespace Fixtures\Data\Application for app fixtures and Fixtures\Data\Demo for Demo fixtures. The FixtureBundle +will automatically recognize your fixtures.

+
<?php
+
+namespace CoreShop\Bundle\CoreBundle\Fixtures\Application;
+
+use CoreShop\Bundle\FixtureBundle\Fixture\VersionedFixtureInterface;
+use Doctrine\Common\DataFixtures\AbstractFixture;
+use Doctrine\Common\Persistence\ObjectManager;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+class ConfigurationFixture extends AbstractFixture implements ContainerAwareInterface, VersionedFixtureInterface
+{
+    /**
+     * @var ContainerInterface
+     */
+    private $container;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getVersion()
+    {
+        return '2.0';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setContainer(ContainerInterface $container = null)
+    {
+        $this->container = $container;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load(ObjectManager $manager)
+    {
+        $configurations = [
+            'system.guest.checkout' => true,
+            'system.category.list.mode' => 'list',
+            'system.category.list.per_page' => [12, 24, 36],
+            'system.category.list.per_page.default' => 12,
+            'system.category.grid.per_page' => [5, 10, 15, 20, 25],
+            'system.category.grid.per_page.default' => 10,
+            'system.category.variant_mode' => 'hide',
+            'system.order.prefix' => 'O',
+            'system.order.suffix' => '',
+            'system.quote.prefix' => 'Q',
+            'system.quote.suffix' => '',
+            'system.invoice.prefix' => 'IN',
+            'system.invoice.suffix' => '',
+            'system.invoice.wkhtml' => '-T 40mm -B 15mm -L 10mm -R 10mm --header-spacing 5 --footer-spacing 5',
+            'system.shipment.prefix' => 'SH',
+            'system.shipment.suffix' => '',
+            'system.shipment.wkhtml' => '-T 40mm -B 15mm -L 10mm -R 10mm --header-spacing 5 --footer-spacing 5',
+        ];
+
+        foreach ($configurations as $key => $value) {
+            $this->container->get('coreshop.configuration.service')->set($key, $value);
+        }
+    }
+}
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Frontend_Bundle.html b/docs/generated-docs/Bundles/Frontend_Bundle.html new file mode 100644 index 0000000000..6c261bf208 --- /dev/null +++ b/docs/generated-docs/Bundles/Frontend_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Frontend Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Frontend Bundle

+

CoreShop FrontendBundle provides some FrontendControllers as well as a default Implementation for the Frontend.

+
+

This Bundle is not advised to be installed seperately!

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Index_Bundle.html b/docs/generated-docs/Bundles/Index_Bundle.html new file mode 100644 index 0000000000..2d778f94af --- /dev/null +++ b/docs/generated-docs/Bundles/Index_Bundle.html @@ -0,0 +1,199 @@ + + + + + + + Index Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Index Bundle

+

Installation

+
$ composer require coreshop/index-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\IndexBundle\CoreShopIndexBundle(),
+    ]);
+}
+
+

Updating database schema

+

Run the following command.

+
$ php bin/console doctrine:schema:update --force
+
+

Usage

+

This Bundle integrates Index Component into Symfony and Doctrine

+

The Index Bundle provides you with basic information needed for a Indexing Pimcore Models: Index, Filters and Conditions

+

It also provides you with ListingServices and FilterServices

+

Get Listing from Index

+

How to get a Listing from an Index?

+
$filter = $this->get('coreshop.repository.filter')->find(1); //Get Filter by ID 1
+$filteredList = $this->get('coreshop.factory.filter.list')->createList($filter, $request->request);
+$filteredList->setVariantMode(ListingInterface::VARIANT_MODE_HIDE);
+$filteredList->setCategory($category);
+$this->get('coreshop.filter.processor')->processConditions($filter, $filteredList, $request->query);
+$filteredList->load();
+
+

Pimcore UI

+
    +
  • Index Configuration
  • +
  • Filter Configuration
  • +
+

How to use?

+
coreshop.global.resource.open('coreshop.index', 'index');
+coreshop.global.resource.open('coreshop.index', 'filter');
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Inventory_Bundle.html b/docs/generated-docs/Bundles/Inventory_Bundle.html new file mode 100644 index 0000000000..a29fceebdd --- /dev/null +++ b/docs/generated-docs/Bundles/Inventory_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Inventory Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Inventory Bundle

+

CoreShop Inventory Bundle provides a Basic implementation to handle Inventory for a Product.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Locale_Bundle.html b/docs/generated-docs/Bundles/Locale_Bundle.html new file mode 100644 index 0000000000..4209e2d1f1 --- /dev/null +++ b/docs/generated-docs/Bundles/Locale_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Locale Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Locale Bundle

+

CoreShop Locale Bundle provides a basic set of data for Locale Information.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Menu_Bundle.html b/docs/generated-docs/Bundles/Menu_Bundle.html new file mode 100644 index 0000000000..c5fabef061 --- /dev/null +++ b/docs/generated-docs/Bundles/Menu_Bundle.html @@ -0,0 +1,225 @@ + + + + + + + Menu Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Menu Bundle

+

Menu Bundle makes it easy creating Pimcore Menus based on permissions.

+

Installation

+
$ composer require coreshop/menu-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\MenuBundle\CoreShopMenuBundle(),
+    ]);
+}
+
+

Usage

+

Create a new Menu by creating a new Class, let's call it MyMenuBuilder

+

+namespace AppBundle\Menu;
+
+use CoreShop\Bundle\MenuBundle\Builder\MenuBuilderInterface;
+use Knp\Menu\FactoryInterface;
+use Knp\Menu\ItemInterface;
+
+class MyMenuBuilder implements MenuBuilderInterface
+{
+    public function buildMenu(ItemInterface $menuItem, FactoryInterface $factory, string $type) 
+    {
+        //Create a new direct sub-menu item
+        $menuItem
+            ->addChild('my-menu-item')
+            ->setLabel('my-menu-item')
+            ->setAttribute('permission', 'my_menu_item')
+            ->setAttribute('iconCls', 'pimcore_icon_delete')
+        ;
+    }
+}
+
+

You then need to register your class to the symfony container:

+
    app.my_menu:
+        class: AppBundle\Menu\MyMenuBuilder
+        tags:
+            - { name: coreshop.menu, type: my_menu, menu: my_menu }
+
+
+

Where the menu attribute defines your unique identifier for your menu. You can also register multiple Builders +for your Menu with the same menu attribute, this will load them one after another.

+

Now, lets do the ExtJs Javascript part. In your Bundle. I assume you already have a working Bundle for that. In your +Bundle.php file, add this file to the jsPaths array:

+
'/admin/coreshop/coreshop.my_menu/menu.js'
+
+

Where my_menu here again is your defined identifier. This will load a basic helper file that will build your menu. +Now, let's actually build the menu.

+

You should already have a startup.js somehwere in your Bundle. In there, you can instantiate the menu by calling:

+
new coreshop.menu.coreshop.my_menu();
+
+

That will build the menu automatically for you.

+

In order now to do something when a menu-item is clicked, you can attach to the event that is fired:

+
pimcore.eventDispatcher.registerTarget('coreshopMenuOpen', new (Class.create({
+    coreshopMenuOpen: function(type, item) {
+        if (item.id === 'my-menu-item') {
+            alert('My Menu Item has been clicked');
+        }
+    }
+})));
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Messenger_Bundle.html b/docs/generated-docs/Bundles/Messenger_Bundle.html new file mode 100644 index 0000000000..6d5e772043 --- /dev/null +++ b/docs/generated-docs/Bundles/Messenger_Bundle.html @@ -0,0 +1,175 @@ + + + + + + + Messenger Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Messenger Bundle

+

CoreShop Messenger Bundle provides you with a nice UI to see what Messenger Tasks are queued in which queues:

+

Messenger

+

Installation

+
$ composer require coreshop/messenger-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\MessengerBundle\CoreShopMessengerBundle(),
+    ]);
+}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Money_Bundle.html b/docs/generated-docs/Bundles/Money_Bundle.html new file mode 100644 index 0000000000..1c174d8a06 --- /dev/null +++ b/docs/generated-docs/Bundles/Money_Bundle.html @@ -0,0 +1,178 @@ + + + + + + + Money Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Money Bundle

+

Installation

+
$ composer require coreshop/money-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\MoneyBundle\CoreShopMoneyBundle(),
+    ]);
+}
+
+

Usage

+

Money Bundle adds a new core-extension to pimcore which allows you to store currency values as integer.

+

You also get a Twig Extension to format money values.

+
{{ value|coreshop_format_money('€', 'de'); }}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Notification_Bundle.html b/docs/generated-docs/Bundles/Notification_Bundle.html new file mode 100644 index 0000000000..2e742a9a08 --- /dev/null +++ b/docs/generated-docs/Bundles/Notification_Bundle.html @@ -0,0 +1,170 @@ + + + + + + + Notification Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Notification Bundle

+

CoreShop Notification Bundle handles all communication between CoreShop and the outside world. It provides a basic set of data for Notifications like:

+
    +
  • Notification Rules
  • +
  • Notification Rule Conditions
  • +
  • Notification Rule Actions
  • +
+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+

Usage

+

Notifications run async in a Symfony messenger queue:

+
bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/OptimisticEntityLock_Bundle.html b/docs/generated-docs/Bundles/OptimisticEntityLock_Bundle.html new file mode 100644 index 0000000000..33fff358bb --- /dev/null +++ b/docs/generated-docs/Bundles/OptimisticEntityLock_Bundle.html @@ -0,0 +1,179 @@ + + + + + + + OptimisticEntityLock Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Optimistic Entity Lock Bundle

+

The CoreShop Optimistic Entity Lock Bundle is a package for the CoreShop e-commerce framework, based on the Pimcore platform, designed to handle optimistic entity locking. This bundle helps prevent conflicts when multiple users try to edit the same entity concurrently by implementing an optimistic locking strategy. +Messenger

+

Installation

+
$ composer require optimistic-entity-lock-bundle
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\OptimisticEntityLockBundle\CoreShopOptimisticEntityLockBundle(),
+    ]);
+}
+
+

Usage

+

Your Pimcore DataObject Class needs to implement the Interface CoreShop\Bundle\OptimisticEntityLockBundle\Model\OptimisticLockedInterface.

+

You can therefore add the field optimisticLockVersion to your Pimcore Class Definition.

+

From now on, everytime the DataObject gets saved, CoreShop compares the Versions and increases it before saving. If the version is different, someone else saved the entity before you and you get a exception.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Order_Bundle.html b/docs/generated-docs/Bundles/Order_Bundle.html new file mode 100644 index 0000000000..9eac334ac1 --- /dev/null +++ b/docs/generated-docs/Bundles/Order_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Order Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Order Bundle

+

CoreShop Order Bundle provides a basic set of data for Orders.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Payment_Bundle.html b/docs/generated-docs/Bundles/Payment_Bundle.html new file mode 100644 index 0000000000..d46e10cbeb --- /dev/null +++ b/docs/generated-docs/Bundles/Payment_Bundle.html @@ -0,0 +1,192 @@ + + + + + + + Payment Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Payment Bundle

+

Installation

+
$ composer require coreshop/payment-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\PaymentBundle\CoreShopPaymentBundle(),
+    ]);
+}
+
+

Updating database schema

+

Run the following command.

+
$ php bin/console doctrine:schema:update --force
+
+

Usage

+

This Bundle integrates Payment Component into Symfony and Doctrine

+

The Payment Bundle provides you with basic information needed for payment: Payment

+

The Bundle also introduces an Address Formatter, which formats addresses in country based formats.

+

Doctrine Entities

+
    +
  • Payment
  • +
+

Pimcore UI

+
    +
  • Payment Provider
  • +
+

How to use?

+
coreshop.global.resource.open('coreshop.payment', 'payment_provider');
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/PayumPayment_Bundle.html b/docs/generated-docs/Bundles/PayumPayment_Bundle.html new file mode 100644 index 0000000000..24ba9550ce --- /dev/null +++ b/docs/generated-docs/Bundles/PayumPayment_Bundle.html @@ -0,0 +1,158 @@ + + + + + + + PayumPayment Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Payum_Bundle.html b/docs/generated-docs/Bundles/Payum_Bundle.html new file mode 100644 index 0000000000..549c8f3013 --- /dev/null +++ b/docs/generated-docs/Bundles/Payum_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Payum Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Payum Bundle

+

Handles the Payum Integration with CoreShop. This Bundle requires the Core and can only be used in the full installation.

+
+

This Bundle is not advised to be installed seperately!

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Pimcore_Bundle.html b/docs/generated-docs/Bundles/Pimcore_Bundle.html new file mode 100644 index 0000000000..c865befffa --- /dev/null +++ b/docs/generated-docs/Bundles/Pimcore_Bundle.html @@ -0,0 +1,422 @@ + + + + + + + Pimcore Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Pimcore Bundle

+

Installation

+
$ composer require coreshop/pimcore-bundle:^3.0
+
+

Activating Bundle

+

You need to enable the bundle inside the kernel or with the Pimcore Extension Manager.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\PimcoreBundle\CoreShopPimcoreBundle()
+    ]);
+}
+
+

Usage

+

The CoreShopPimcoreBundle integrates the CoreShop Pimcore Component into Symfony automatically registers a lot of services for you.

+

JS/CSS Resource Loading

+

With Pimcore, every bundle needs to take care about loading static assets themselve. PimcoreBundle helps you out here, follow these steps to use it:

+
    +
  • Create a DependencyInjection Extension class like:
  • +
+
<?php
+
+namespace AppBundle\DependencyInjection;
+
+use CoreShop\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractModelExtension;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
+
+class AppExtension extends AbstractModelExtension
+{
+    public function load(array $config, ContainerBuilder $container)
+    {
+        $config = $this->processConfiguration($this->getConfiguration([], $container), $config);
+
+        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
+        $loader->load('services.yml');
+
+        $this->registerPimcoreResources('coreshop', $config['pimcore_admin'], $container);
+    }
+}
+
+
    +
  • Create a DependencyInjection Configuration class like:
  • +
+
<?php
+
+namespace AppBundle\DependencyInjection;
+
+use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
+use Symfony\Component\Config\Definition\Builder\TreeBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+final class Configuration implements ConfigurationInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('app');
+
+        $this->addPimcoreResourcesSection($rootNode);
+
+        return $treeBuilder;
+    }
+
+    /**
+     * @param ArrayNodeDefinition $node
+     */
+    private function addPimcoreResourcesSection(ArrayNodeDefinition $node)
+    {
+        $node->children()
+            ->arrayNode('pimcore_admin')
+                ->addDefaultsIfNotSet()
+                ->children()
+                    ->arrayNode('js')
+                        ->addDefaultsIfNotSet()
+                        ->ignoreExtraKeys(false)
+                        ->children()
+                            ->scalarNode('test')->defaultValue('/bundles/app/pimcore/js/test.js')->end()
+                        ->end()
+                    ->end()
+                    ->arrayNode('css')
+                        ->addDefaultsIfNotSet()
+                        ->ignoreExtraKeys(false)
+                        ->children()
+                            ->scalarNode('test')->defaultValue('/bundles/app/pimcore/css/pimcore.css')->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ->end();
+    }
+}
+
+
+
    +
  • That's it, PimcoreBundle now takes care about loading your resources and also bundles them in non DEV-Mode.
  • +
+

DataObject Extensions

+

Serialized Data

+

This extension allows you to store SerializedData inside a Pimcore DataObject.

+

Slug

+

Pimcore comes with quite useful objects slugs. But it doesn't come with a Slug Generator. CoreShop for the rescue. In Order to use it, +your class needs to implement CoreShop\Component\Pimcore\Slug\SluggableInterface and CoreShop automatically generates slugs for you.

+

Extensions / Influence the slug generation

+

If you want to change the generated slug or prefix it, you can use the CoreShop\Component\Pimcore\Event\SlugGenerationEvent Event.

+
<?php
+
+declare(strict_types=1);
+
+namespace App\EventListener;
+
+use CoreShop\Component\Pimcore\Event\SlugGenerationEvent;
+use Pimcore\Model\DataObject\PressRelease;
+use Pimcore\Model\Document;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+final class SlugEventListener implements EventSubscriberInterface
+{
+    public static function getSubscribedEvents()
+    {
+        return [
+            SlugGenerationEvent::class => 'onGenerate',
+        ];
+    }
+
+    public function onGenerate(SlugGenerationEvent $event): void
+    {
+        $event->setSlug($event->getSlug() . '-bar');
+    }
+}
+
+

Data Object Features

+

Class Converter and Data Migrate

+

Class converter is a small utility, which lets you migrate all Data from one class to another. Usage:

+
<?php
+
+use CoreShop\Component\Pimcore\Migrate;
+
+$currentClassName = 'Product';
+$newClassName = 'NewProduct';
+$options = [
+    'delete_existing_class' => true,
+    'parentClass' => 'AppBundle\Model\MyProduct'
+];
+
+//Copies $currentClassName Definition to $newClassName
+//$options can overwrite some properties like parentClass
+Migrate::migrateClass($currentClassName, $newClassName, $options);
+
+//This function migrates all data from $currentClassName to $newClassName
+//It uses SQL Commands to increase performance of migration
+Migrate::migrateData($currentClassName, $newClassName);
+
+

Class Installer

+

Class Installer helps you importing Classes/FieldCollections/ObjectBricks into Pimcore based of a JSON Definition:

+

+use CoreShop\Component\Pimcore\ClassInstaller;
+
+$installer = new ClassInstaller();
+
+// For Bricks use
+$installer->createBrick($pathToJson, $brickName);
+
+// For Classes use
+$installer->createClass($pathToJson, $className, $updateExistingClass);
+
+// For FieldCollections use
+$installer->createFieldCollection($pathToJson, $fcName);
+
+
+

Class/Brick/Field Collection Updater

+

Definition Updaters help you in migrating your Pimcore Class/Bricks or Field Collection Definitions to be properly +migrated from Release to Release.

+

To update a Pimcore class use it like this:

+
use CoreShop\Component\Pimcore\DataObject\ClassUpdate;
+
+$classUpdater = new ClassUpdate('Product');
+
+//Your JSON Definition from Pimcore
+$payment = [
+    'fieldtype' => 'coreShopSerializedData',
+    'phpdocType' => 'array',
+    'allowedTypes' =>
+        [
+        ],
+    'maxItems' => 1,
+    'name' => 'paymentSettings',
+    'title' => 'Payment Settings',
+    'tooltip' => '',
+    'mandatory' => false,
+    'noteditable' => true,
+    'index' => false,
+    'locked' => null,
+    'style' => '',
+    'permissions' => null,
+    'datatype' => 'data',
+    'columnType' => null,
+    'queryColumnType' => null,
+    'relationType' => false,
+    'invisible' => false,
+    'visibleGridView' => false,
+    'visibleSearch' => false,
+];
+
+//Check if field exists
+if (!$classUpdater->hasField('paymentSettings')) {
+    //If not insert field after a specific field and save the definition
+    $classUpdater->insertFieldAfter('paymentProvider', $payment);
+    $classUpdater->save();
+}
+
+
+

Thats it, the same works for FieldCollections with the class CoreShop\Component\Pimcore\DataObject\FieldCollectionDefinitionUpdate +and for Bricks with the class CoreShop\Component\Pimcore\DataObject\BrickDefinitionUpdate

+

Inheritance Helper

+

Inhertiance Helper is a small little but very useful helper class to enable Pimcore inheritance only with a closure function like this:

+

+use CoreShop\Component\Pimcore\DataObject\InheritanceHelper;
+
+$inheritedValue = InheritanceHelper::useInheritedValues(function() use($object) {
+    return $object->getValueInherited();
+}, true);
+
+
+

Version Helper

+

Version Helper is a small little but very useful helper class to disabling or enablind Pimcore Versioning.

+

+use CoreShop\Component\Pimcore\DataObject\VersionHelper;
+
+VersionHelper::useVersioning(function() use($object) {
+    //Object will be saved without creating a new Version
+    $object->save();
+}, false);
+
+
+

Unpublished Helper

+

Unpublsihed Helper is a small little but very useful helper class to get unpublished objects in Pimcore Frontend.

+

+use CoreShop\Component\Pimcore\DataObject\UnpublishedHelper;
+
+$allProducts = UnpublishedHelper::hideUnpublished(function() use($object) {
+    //Will return all products, even the unpbulished ones
+    return $object->getProducts();
+}, false);
+
+
+

Expression Language Features

+

CoreShop adds some features to the Symfony Expression language like:

+
    +
  • PimcoreLanguageProvider: to get Pimcore Objects, Assets or Documents inside a Expression Language Query
  • +
+

Migration Features

+

Pimcore Shared Translations

+

Helps you to install new Shared Translations during Migration:

+
use CoreShop\Component\Pimcore\Migration\SharedTranslation;
+
+SharedTranslation::add('key', 'en', 'value');
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/ProductQuantityPriceRules_Bundle.html b/docs/generated-docs/Bundles/ProductQuantityPriceRules_Bundle.html new file mode 100644 index 0000000000..50c91e7b13 --- /dev/null +++ b/docs/generated-docs/Bundles/ProductQuantityPriceRules_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + ProductQuantityPriceRules Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Quantity Price Rules Bundle

+

This Bundle implements the Quantity Price Rules for CoreShop.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Product_Bundle.html b/docs/generated-docs/Bundles/Product_Bundle.html new file mode 100644 index 0000000000..20a1925877 --- /dev/null +++ b/docs/generated-docs/Bundles/Product_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Product Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Bundle

+

CoreShop Product Bundle is responsible for the Product Management.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Resource_Bundle/CustomEntities.html b/docs/generated-docs/Bundles/Resource_Bundle/CustomEntities.html new file mode 100644 index 0000000000..7abe1b63c2 --- /dev/null +++ b/docs/generated-docs/Bundles/Resource_Bundle/CustomEntities.html @@ -0,0 +1,446 @@ + + + + + + + CustomEntities - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Adding a new custom entity

+

Create Translatable Entity

+

First of all, we need to create our Entity Class. In this case, we create a Translatable Entity.

+
<?php
+
+//AppBundle/Model/CustomEntityInterface.php
+
+interface CustomEntityInterface extends ResourceInterface, TranslatableInterface {
+    public function getName($language = null);
+
+    public function setName($name, $language = null);
+}
+
+
<?php
+
+//AppBundle/Model/CustomEntity.php
+
+class CustomEntity implements CustomEntityInterface {
+    use TranslatableTrait {
+        __construct as private initializeTranslationsCollection;
+    }
+
+    protected $id;
+    protected $name;
+
+    public function __construct()
+    {
+        $this->initializeTranslationsCollection();
+    }
+
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    public function getName($language = null)
+    {
+        return $this->getTranslation($language)->getName();
+    }
+
+    public function setName($name, $language = null)
+    {
+        $this->getTranslation($language, false)->setName($name);
+
+        return $this;
+    }
+
+    protected function createTranslation()
+    {
+        return new CustomEntityTranslation();
+    }
+}
+
+

Since our Entity is Translatable, we need to add our Translation Entity as well.

+
<?php
+
+//AppBundle/Model/CustomEntityTranslationInterface.php
+
+interface CustomEntityTranslationInterface extends ResourceInterface, TimestampableInterface
+{
+    /**
+     * @return string
+     */
+    public function getName();
+
+    /**
+     * @param string $name
+     */
+    public function setName($name);
+}
+
+
<?php
+
+//AppBundle/Model/CustomEntityTranslation.php
+
+class CustomEntityTranslation extends AbstractTranslation implements CustomEntityTranslationInterface
+{
+    protected $id;
+    protected $name;
+
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+}
+
+

Create Doctrine Configuration

+
# AppBundle/Resources/config/doctrine/model/CustomEntity.orm.yml
+
+AppBundle\Model\CustomEntity:
+  type: mappedSuperclass
+  table: app_custom_entity
+  fields:
+    id:
+      type: integer
+      column: id
+      id: true
+      generator:
+        strategy: AUTO
+
+

Our Translation Doctrine definition:

+
# AppBundle/Resources/config/doctrine/model/CustomEntityTranslation.orm.yml
+
+AppBundle\Model\CustomEntityTranslation:
+  type: mappedSuperclass
+  table: app_custom_entity_translation
+  fields:
+    id:
+      type: integer
+      column: id
+      id: true
+      generator:
+        strategy: AUTO
+    name:
+      type: string
+      column: name
+
+

Create DI Configuration

+
<?php
+
+//AppBundle/DependencyInjection/Configuration.php
+
+namespace CoreShop\Bundle\AddressBundle\DependencyInjection;
+
+final class Configuration implements ConfigurationInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('app');
+
+        $rootNode
+            ->children()
+                ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end()
+            ->end()
+        ;
+        $this->addModelsSection($rootNode);
+
+        return $treeBuilder;
+    }
+
+    /**
+     * @param ArrayNodeDefinition $node
+     */
+    private function addModelsSection(ArrayNodeDefinition $node)
+    {
+        $node
+            ->children()
+                ->arrayNode('resources')
+                    ->addDefaultsIfNotSet()
+                    ->children()
+                        ->arrayNode('custom_entity')
+                            ->addDefaultsIfNotSet()
+                            ->children()
+                                ->variableNode('options')->end()
+                                ->scalarNode('permission')->defaultValue('custom_entity')->cannotBeOverwritten()->end()
+                                ->arrayNode('classes')
+                                    ->addDefaultsIfNotSet()
+                                    ->children()
+                                        ->scalarNode('model')->defaultValue(CustomEntity::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('interface')->defaultValue(CustomEntityInterface::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('admin_controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('factory')->defaultValue(TranslatableFactory::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('repository')->defaultValue(CustomEntityRepository::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('form')->defaultValue(CustomEntityType::class)->cannotBeEmpty()->end()
+                                    ->end()
+                                ->end()
+                                ->arrayNode('translation')
+                                    ->addDefaultsIfNotSet()
+                                    ->children()
+                                        ->variableNode('options')->end()
+                                        ->arrayNode('classes')
+                                            ->addDefaultsIfNotSet()
+                                            ->children()
+                                                ->scalarNode('model')->defaultValue(CustomEntityTranslation::class)->cannotBeEmpty()->end()
+                                                ->scalarNode('interface')->defaultValue(CustomEntityTranslationInterface::class)->cannotBeEmpty()->end()
+                                                ->scalarNode('controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end()
+                                                ->scalarNode('repository')->cannotBeEmpty()->end()
+                                                ->scalarNode('factory')->defaultValue(Factory::class)->end()
+                                                ->scalarNode('form')->defaultValue(CustomEntityTranslationType::class)->cannotBeEmpty()->end()
+                                            ->end()
+                                        ->end()
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+}
+
+
<?php
+
+//AppBundle/DependencyInjection/AppExtension.php
+
+final class AppExtension extends AbstractModelExtension
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function load(array $config, ContainerBuilder $container)
+    {
+        $config = $this->processConfiguration($this->getConfiguration([], $container), $config);
+        //'app' is the application name
+        $this->registerResources('app', $config['driver'], $config['resources'], $container);
+    }
+}
+
+
+
<?php
+
+//AppBundle/DependencyInjection/AppExtension.php
+
+final class AppBundle extends AbstractResourceBundle
+{
+    public function getSupportedDrivers()
+    {
+        return [
+            CoreShopResourceBundle::DRIVER_DOCTRINE_ORM,
+        ];
+    }
+
+    protected function getModelNamespace()
+    {
+        return 'AppBundle\Model';
+    }
+}
+
+
+

Create Serialization Definition if you want to serialize your Entity

+
# AppBundle/Resources/config/serializer/Model.CustomEntity.yml
+
+AppBundle\Model\CustomEntity:
+  exclusion_policy: ALL
+  xml_root_name: custom_entity
+  properties:
+    id:
+      expose: true
+      type: integer
+      groups: [List, Detailed]
+    translations:
+      expose: true
+      type: array
+      groups: [Detailed]
+  virtual_properties:
+    getName:
+      serialized_name: name
+      groups: [List, Detailed]
+
+
# AppBundle/Resources/config/serializer/Model.CustomEntityTranslation.yml
+
+AppBundle\Model\CustomEntityTranslation:
+  exclusion_policy: ALL
+  xml_root_name: custom_entity_translation
+  properties:
+    name:
+      expose: true
+      type: string
+      groups: [Detailed]
+
+

Create Routes to ResourceController

+
# AppBundle/Resources/config/pimcore/routing.yml
+
+app_custom_entity:
+  type: coreshop.resources
+  resource: |
+    alias: app.custom_entity
+
+
+

This will create all CRUD routes: (app is the application name specified in AppExtension.php)

+

GET: /admin/app/custom_entity/list +GET: /admin/app/custom_entity/get +POST: /admin/app/custom_entity/add +POST: /admin/app/custom_entity/save +DELETE: /admin/app/custom_entity/delete

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Resource_Bundle/Installation.html b/docs/generated-docs/Bundles/Resource_Bundle/Installation.html new file mode 100644 index 0000000000..956481aa17 --- /dev/null +++ b/docs/generated-docs/Bundles/Resource_Bundle/Installation.html @@ -0,0 +1,221 @@ + + + + + + + Installation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Adding new files that needs to be installed

+

Resource Bundles takes care about installing your resources. It can handle following types: +- Object Classes +- Field Collection Classes +- Objectbrick Classes +- Routes +- Permissions +- SQL Files

+

Object Classes, Field Collections and Objectbrick Classes

+

To install object classes, you need to configure your classes inside your Bundle and register them to Resource Bundle. (as described here)

+

Routes, SQL and Permissions

+

To install routes, permissions or execute sql files, configure them in your Bundle likes this:

+
<?php
+
+namespace AppBundle\DependencyInjection;
+
+final class Configuration implements ConfigurationInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('AppBundle');
+
+        $this->addPimcoreResourcesSection($rootNode);
+
+        return $treeBuilder;
+    }
+
+    private function addPimcoreResourcesSection(ArrayNodeDefinition $node)
+    {
+        $node->children()
+            ->arrayNode('pimcore_admin')
+                ->addDefaultsIfNotSet()
+                ->children()
+                    ->arrayNode('install')
+                        ->addDefaultsIfNotSet()
+                        ->children()
+                            ->scalarNode('routes')->defaultValue(['@AppBundle/Resources/install/pimcore/routes.yml'])->end()
+                            ->scalarNode('sql')->defaultValue(['@AppBundle/Resources/install/pimcore/data.sql'])->end()
+                        ->end()
+                    ->end()
+                    ->scalarNode('permissions')
+                        ->cannotBeOverwritten()
+                        ->defaultValue(['name_of_permission'])
+                    ->end()
+                ->end()
+            ->end()
+        ->end();
+    }
+}
+
+
+

Routes Example File

+
yeah_route:
+  pattern: "/(\\w+)\\/yeah-route/"
+  reverse: "/%_locale/yeah\-route"
+  module: AppBundle
+  controller: "@app.frontend.controller.controller"
+  action: doSomething
+  variables: _locale
+  priority: 2
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Resource_Bundle/PimcoreEntities.html b/docs/generated-docs/Bundles/Resource_Bundle/PimcoreEntities.html new file mode 100644 index 0000000000..cde008ece6 --- /dev/null +++ b/docs/generated-docs/Bundles/Resource_Bundle/PimcoreEntities.html @@ -0,0 +1,261 @@ + + + + + + + PimcoreEntities - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Adding a new Pimcore Entity with automated installation

+
    +
  1. Add a new Pimcore Class in Pimcore.
  2. +
  3. Add a Parent Class to your Pimcore Entity
  4. +
  5. Export Class Definition to AppBundle/Resources/install/pimcore/classes/PimcoreEntity.json +
  6. +
+

Create Parent Class

+
<?php
+//AppBundle/Model/PimcoreEntityInterface.php
+
+interface PimcoreEntityInterface extends ResourceInterface
+    public function getName($language = null);
+
+    public function setName($name, $language = null);
+}
+
+
<?php
+//AppBundle/Model/PimcoreEntity.php
+
+class PimcoreEntity extends AbstractPimcoreModel implements PimcoreEntityInterface, PimcoreModelInterface {
+    public function getName($language = null) {
+        throw new ImplementedByPimcoreException(__CLASS__, __METHOD__);
+    }
+
+    public function setName($name, $language = null) {
+        throw new ImplementedByPimcoreException(__CLASS__, __METHOD__);
+    }
+}
+
+

Create Dependency Injection Configuration

+
<?php
+//AppBundle/DependencyInjection/Configuration.php
+
+namespace AppBundle\DependencyInjection;
+
+final class Configuration implements ConfigurationInterface
+{
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('app_custom');
+
+        $this->addModelsSection($rootNode);
+
+        return $treeBuilder;
+    }
+
+    private function addModelsSection(ArrayNodeDefinition $node)
+    {
+        $node
+            ->children()
+                ->arrayNode('pimcore')
+                    ->addDefaultsIfNotSet()
+                    ->children()
+                        ->arrayNode('pimcore_entity')
+                            ->addDefaultsIfNotSet()
+                            ->children()
+                                ->variableNode('PimcoreEntity')->end()
+                                ->arrayNode('options')
+                                    ->scalarNode('path')->defaultValue('path/within/pimcore')->end()
+                                    ->scalarNode('permission')->defaultValue('pimcore_entity')->cannotBeOverwritten()->end()
+                                    ->addDefaultsIfNotSet()
+                                    ->children()
+                                        ->scalarNode('model')->defaultValue('Pimcore\Model\Object\PimcoreEntity')->cannotBeEmpty()->end()
+                                        ->scalarNode('interface')->defaultValue(PimcoreEntity::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('factory')->defaultValue(PimcoreFactory::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('repository')->cannotBeEmpty()->end()
+                                        ->scalarNode('admin_controller')->cannotBeEmpty()->end()
+                                        ->scalarNode('install_file')->defaultValue('@AppBundle/Resources/install/pimcore/classes/PimcoreEntity.json')->end()
+                                        ->scalarNode('type')->defaultValue(CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT)->cannotBeOverwritten(true)->end()
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+}
+
+
<?php
+//AppBundle/DependencyInjection/AppBundleExtension.php
+
+namespace AppBundle\DependencyInjection;
+
+final class AppBundleExtension extends AbstractModelExtension
+{
+    public function load(array $config, ContainerBuilder $container)
+    {
+        $this->registerPimcoreModels('app', $config['pimcore'], $container);
+    }
+}
+
+
+

Use your Pimcore Entity

+

You can either use Pimcore Listing Classes like:

+
$list = new Pimcore\Model\Object\PimcoreEntity\Listing();
+
+

or use automated generated Factory/Repository Classes

+
$pimcoreEntityObject = $container->get('app.repository.pimcore_entity')->findBy($id);
+
+$list = $container->get('app.repository.pimcore_entity')->getList();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Resource_Bundle/index.html b/docs/generated-docs/Bundles/Resource_Bundle/index.html new file mode 100644 index 0000000000..7737fcdbb6 --- /dev/null +++ b/docs/generated-docs/Bundles/Resource_Bundle/index.html @@ -0,0 +1,181 @@ + + + + + + + Resource Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Resource Bundle

+

Resource Bundle is the Heart of CoreShops Model. It handles saving/deleting/updating/creating of CoreShop Models. It handles +Doctrine ORM Mappings and Translations. As well as Routing, Event Dispatching, Serialization and CRUD.

+

Resource Bundle also takes care about installation of Pimcore Class Definitions, Object Brick Definitions, Field Collection Definitions, +Static Routes and SQL.

+

You can use Resource Bundle as base for all your Custom Pimcore Entities.

+

Installation

+
$ composer require coreshop/resource-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \JMS\SerializerBundle\JMSSerializerBundle(),
+        new \CoreShop\Bundle\ResourceBundle\CoreShopResourceBundle(),
+        new \Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle(),
+        new \Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle()
+    ]);
+}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Rule_Bundle.html b/docs/generated-docs/Bundles/Rule_Bundle.html new file mode 100644 index 0000000000..aa43e87b40 --- /dev/null +++ b/docs/generated-docs/Bundles/Rule_Bundle.html @@ -0,0 +1,165 @@ + + + + + + + Rule Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Rule Bundle

+

CoreShop Rule Bundle is the base Bundle for all Rule Based Systems in CoreShop. It provides a basic set of data for Rules like:

+
    +
  • Rule Conditions
  • +
  • Rule Actions
  • +
+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/SEO_Bundle.html b/docs/generated-docs/Bundles/SEO_Bundle.html new file mode 100644 index 0000000000..38f8cf6104 --- /dev/null +++ b/docs/generated-docs/Bundles/SEO_Bundle.html @@ -0,0 +1,237 @@ + + + + + + + SEO Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop SEO Bundle

+

Installation

+
$ composer require coreshop/seo-bundle:^3.0
+
+

Activating Bundle

+

You need to enable the bundle inside the kernel or with the Pimcore Extension Manager.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\SEOBundle\CoreShopSEOBundle()
+    ]);
+}
+
+

Usage

+

The SEO Bundle provides you with services to make SEO more manageable. It depends on Pimcore's HeadLink and HeadMeta Helper.

+

There are multiple ways of making use of this bundle:

+
    +
  • Implement SEO interfaces provided with this bundle
  • +
  • Implement Custom Extractors and add them to the SEOMetadata Model
  • +
+

To update the SEO Information, you need to use the service coreshop.seo.presentation:

+

+//From a Controller
+$this->get('coreshop.seo.presentation')->updateSeoMetadata($object);
+
+

Implement SEO Interfaces

+

SEO Bundle comes with 3 SEO Aware interfaces you can take advantage of:

+
    +
  • +CoreShop\Component\SEO\Model\SEOAwareInterface for meta-title and meta-description
  • +
  • +CoreShop\Component\SEO\Model\SEOImageAwareInterface for og-image attribute
  • +
  • +CoreShop\Component\SEO\Model\SEOImageAwareInterface for og-title, og-type and pg-description attribute
  • +
+

Implement SEO Extractors

+

To add a new Extractor, you need to implement the interface CoreShop\Component\SEO\Extractor\ExtractorInterface and register your class with the tag coreshop.seo.extractor:

+

Example

+

Let's implement a custom extractor for our Product class with a Video.

+
<?php
+//src/AppBundle/SEO/Extractor/ProductVideoExtractor.php
+
+namespace AppBundle\SEO\Extractor;
+
+use Pimcore\Model\DataObject\Product;
+use Pimcore\Tool;
+
+final class ProductVideoExtractor implements ExtractorInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($object)
+    {
+        return $object instanceof Product && $object->getVideoUrl();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function updateMetadata($object, SEOMetadataInterface $seoMetadata)
+    {
+        /**
+         * @var $object Product
+         */
+        $seoMetadata->addExtraProperty('og:video', Tool::getHostUrl() . $object->getVideoUrl());
+    }
+}
+
+

Now we need to register the service

+
# src/AppBundle/Resources/config/services.yml
+services:
+    AppBundle\SEO\Extractor:
+        tags:
+            - { name: coreshop.seo.extractor, type: product_video }
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Sequence_Bundle.html b/docs/generated-docs/Bundles/Sequence_Bundle.html new file mode 100644 index 0000000000..98ab9cf686 --- /dev/null +++ b/docs/generated-docs/Bundles/Sequence_Bundle.html @@ -0,0 +1,189 @@ + + + + + + + Sequence Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Sequence Bundle

+

Installation

+
$ composer require coreshop/sequence-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\SequenceBundle\CoreShopSequenceBundle(),
+    ]);
+}
+
+

Updating database schema

+

Run the following command.

+
$ php bin/console doctrine:schema:update --force
+
+

Usage

+

This Bundle integrates Sequence Component into Symfony and Doctrine

+

The sequence Bundle provides you with basic information needed for sequence generation.

+

Doctrine Entities

+
    +
  • Sequence
  • +
+

Get a new Sequence

+

+$container->get('coreshop.sequence.generator')->getNextSequenceForType('my_sequence');
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Shipping_Bundle.html b/docs/generated-docs/Bundles/Shipping_Bundle.html new file mode 100644 index 0000000000..5b09c7e467 --- /dev/null +++ b/docs/generated-docs/Bundles/Shipping_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Shipping Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Shipping Bundle

+

CoreShop Shipping Bundle is responsible for Shipping Calculations.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/StorageList_Bundle.html b/docs/generated-docs/Bundles/StorageList_Bundle.html new file mode 100644 index 0000000000..fba098228f --- /dev/null +++ b/docs/generated-docs/Bundles/StorageList_Bundle.html @@ -0,0 +1,215 @@ + + + + + + + StorageList Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Storage List Bundle

+

Storage List Component helps you with Lists/Collections of Objects like a Cart, Wishlist or Compare List.

+

Usage

+

To use it you need to have 3 models:

+ +

The component already provides you with a basic implementation of Storage List and Storage Item. +You need to implement the StorageListProduct yourself.

+

To now mutate lists, the component gives you a Storage List Modifier, which takes care about creating and persisting the List.

+

Basic usage, Wishist example

+

For now, lets create a very basic Session based Wishlist:

+

We need to have following things:

+
    +
  • A Factory class for the Wishlist
  • +
  • A Factory class for the Wishlist Item
  • +
  • A StorageListManager to get the current list (more like a repository actually)
  • +
  • A StoreListModifier
  • +
+

CoreShop gives you Basic classes for these 4 things, we just need to instantiate them:

+

+use Symfony\Component\HttpFoundation\Session\Session;
+
+use CoreShop\Component\StorageList\Model\StorageList;
+use CoreShop\Component\StorageList\Model\StorageListItem;
+use CoreShop\Component\Resource\Factory\Factory;
+use CoreShop\Component\StorageList\SessionStorageManager;
+use CoreShop\Component\StorageList\SessionStorageListModifier;
+
+$session = new Session();
+$session->start();
+
+$wishlistFactory = new Factory(StorageList::class);
+$wishlistItemFactory = new Factory(StorageListItem::class);
+
+$wishlistManager = new SessionStorageManager($session, 'wishlist', $wishlistFactory);
+$wishlistModifier = new SessionStorageListModifier($wishlistItemFactory, $wishlistManager);
+
+//Now we can start putting data into our List
+$list = $wishlistManager->getStorageList();
+
+//Fetch our Product which implements CoreShop\Component\StorageList\Model\StorageListProductInterface
+$product = $productRepository->find(1);
+
+
+$listItem = $wishlistItemFactory->createNew();
+$listItem->setProduct($product);
+$listItem->setQuantity($quantity);
+
+//Lets add our Product
+$wishlistModifier->addToList($list, $listItem);
+
+//If we now want to remove it, we can either use the $listItem, or the Product
+//To do that with our item, we simply call
+$wishlistModifier->removeFromList($list, $listItem);
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Store_Bundle.html b/docs/generated-docs/Bundles/Store_Bundle.html new file mode 100644 index 0000000000..6208737954 --- /dev/null +++ b/docs/generated-docs/Bundles/Store_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Store Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Store Bundle

+

CoreShop Store Bundle provides the abstraction of a Pimcore Website and a CoreShop Store. It handles the configuration for base-currencies and themes.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Taxation_Bundle.html b/docs/generated-docs/Bundles/Taxation_Bundle.html new file mode 100644 index 0000000000..e6538df789 --- /dev/null +++ b/docs/generated-docs/Bundles/Taxation_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Taxation Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Taxation Bundle

+

CoreShop Taxation Bundle is responsible for Tax Calculations.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Theme_Bundle.html b/docs/generated-docs/Bundles/Theme_Bundle.html new file mode 100644 index 0000000000..469c376522 --- /dev/null +++ b/docs/generated-docs/Bundles/Theme_Bundle.html @@ -0,0 +1,218 @@ + + + + + + + Theme Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Theme Bundle

+

CoreShop Theme Bundle provides you with a flexible and extensible way of having multiple themes in a Pimcore installation.

+

Installation

+
$ composer require coreshop/theme-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\ThemeBundle\CoreShopThemeBundle(),
+    ]);
+}
+
+

Configuration

+

Per Default, no Theme Resolver is enabled, you can enable on or multiples like:

+
core_shop_theme:
+    default_resolvers:
+      pimcore_site: true
+      pimcore_document_property: true
+
+

Pimcore Site

+

Resolves the Theme based on the Key of the Root Document of a Pimcore Site. So if the Site's Root Document is called "demo" it tries to find a theme called the same.

+

Pimcore Document Property

+

Resolves the Theme based on a Document Property of the Site. The Property is called "theme".

+

Custom Resolvers

+

You can also add custom resolvers like:

+
<?php
+
+declare(strict_types=1);
+
+namespace App\Theme;
+
+use CoreShop\Bundle\ThemeBundle\Service\ThemeNotResolvedException;
+use CoreShop\Bundle\ThemeBundle\Service\ThemeResolverInterface;
+use CoreShop\Component\Store\Context\StoreNotFoundException;
+
+final class CustomThemeResolver implements ThemeResolverInterface
+{
+    public function resolveTheme(): string
+    {
+        if(rand() === 1) {
+            // if you cannot resolve the theme, throw an exception
+            throw new ThemeNotResolvedException();
+        }
+    
+        return "custom/custom";
+    }
+}
+
+

You also need to Register the Theme Resolver:

+
services:
+  App\Theme\CustomThemeResolver:
+    tags:
+      - { name: coreshop.theme.resolver, type: custom, priority: 20 }
+
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Tracking_Bundle.html b/docs/generated-docs/Bundles/Tracking_Bundle.html new file mode 100644 index 0000000000..f532a2c90a --- /dev/null +++ b/docs/generated-docs/Bundles/Tracking_Bundle.html @@ -0,0 +1,162 @@ + + + + + + + Tracking Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/User_Bundle.html b/docs/generated-docs/Bundles/User_Bundle.html new file mode 100644 index 0000000000..846a41f1e1 --- /dev/null +++ b/docs/generated-docs/Bundles/User_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + User Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop User Bundle

+

CoreShop User Bundle is responsible for the User Management.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Variant_Bundle.html b/docs/generated-docs/Bundles/Variant_Bundle.html new file mode 100644 index 0000000000..2f88d67ea0 --- /dev/null +++ b/docs/generated-docs/Bundles/Variant_Bundle.html @@ -0,0 +1,218 @@ + + + + + + + Variant Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Variant Bundle

+

CoreShop Variant Bundle allows you to manage different Variants of a Product.

+

Installation

+
  composer require coreshop/variant-bundle
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\VariantBundle\CoreShopVariantBundle(),
+    ]);
+}
+
+

Abstract

+

Pimcore already supports variants. But it doesn't define what a Variant is, or how a variant differs from the Parent Product or other Variants.

+

In classical e-commerce scenarios, you usually have different Variation Types like Size and Color with different Values like XL or Red.

+

CoreShop describes these two types of entities as Group (CoreShop\Component\Variant\Model\AttributeGroupInterface) and Value (CoreShop\Component\Variant\Model\AttributeValueInterface

+

The "Product" itself than is a sort-of abstract entity that is used to define what Attribute Groups are allowed. The Pimcore Variants then, need to have the values of thse Groups filled.

+

Example:

+
    +
  • +

    AttributeGroup Color +-AttributeValue Red +-AttributeValue Blue

    +
  • +
  • +

    product (defines allowed groups for color)

    +
      +
    • variant-red (defines the AttributeValue Red in attributes)
    • +
    • variant-blue (defines the AttributeValue Blue in attributes)
    • +
    +
  • +
+

Usage

+

CoreShop Variant Bundle does NOT come with a Installer for certain Resources it requires. That is on purpose and you need to manually install what you need.

+

Per Default, it comes with 3 different Classes:

+
    +
  • +CoreShopAttributeGroup +
  • +
  • +CoreShopAttributeColor +
  • +
  • +CoreShopAttributeValue +
  • +
+

Whereas Color and Value are two Value types and Group is a Group type.

+

You can manually import the classes from this dir vendor/coreshop/variant-bundle/Resources/install/pimcore/classes

+

To create a "Product" Class, you need to implement the interface CoreShop\Component\Variant\Model\ProductVariantAwareInterface. The Class requires you to have these fields:

+
    +
  • attributes - ManyToManyObjectRelation for CoreShopAttributeColor/CoreShopAttributeValue +
  • +
  • allowedAttributeGroups - ManyToManyObjectRelation for CoreShopAttributeGroup +
  • +
  • mainVariant - ManyToOneRelation for Product (eg. your Class where you implemented the interface)
  • +
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Wishlist_Bundle.html b/docs/generated-docs/Bundles/Wishlist_Bundle.html new file mode 100644 index 0000000000..0be7558ad0 --- /dev/null +++ b/docs/generated-docs/Bundles/Wishlist_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Wishlist Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Order Bundle

+

CoreShop Order Wishlist provides a basic set of data for Wishlists. It is based on StorageList Bundle and shows how that can be integrated into a Pimcore Project.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/Workflow_Bundle.html b/docs/generated-docs/Bundles/Workflow_Bundle.html new file mode 100644 index 0000000000..027f58ef1c --- /dev/null +++ b/docs/generated-docs/Bundles/Workflow_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Workflow Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Workflow Bundle

+

CoreShop Workflow Bundle is a extension of Symfony Workflow and adds some configuration features to it.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Bundles/index.html b/docs/generated-docs/Bundles/index.html new file mode 100644 index 0000000000..b6c03436cf --- /dev/null +++ b/docs/generated-docs/Bundles/index.html @@ -0,0 +1,257 @@ + + + + + + + Bundles - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Bundles

+

CoreShop is a set of Bundles that provide different functionality. Each Bundle is supposed to be independent and can be used without the other Bundles. Glued together, they provide a full e-commerce solution.

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Cart/CRUD.html b/docs/generated-docs/Development/Cart/CRUD.html new file mode 100644 index 0000000000..239c9b96e0 --- /dev/null +++ b/docs/generated-docs/Development/Cart/CRUD.html @@ -0,0 +1,203 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart

+

CoreShop uses Pimcore Data Objects to persist Cart Information. But, it adds a little wrapper around it to be mire +dynamic and configurable. It uses a Factory and Repository Pattern to do that.

+

Create

+

If you want to create a new Cart, we need to get our Factory Service for that:

+
$factory = $container->get('coreshop.factory.cart');
+$cart = $factory->createNew();
+
+

No we have a new Cart and we can set all needed values.

+

If you now want to save it, just call the save function

+
$cart->save();
+
+

Read

+

To get carts, you need to use the Repository Service CoreShop provides you.

+
$repository = $container->get('coreshop.repository.cart');
+
+
+// Query by ID
+$cartWithIdOne = $repository->findById(1);
+
+// Get a Listing how you know it from Pimcore
+$list = $repository->getList();
+$list->setCondition("total > 100");
+$carts = $list->getObjects();
+
+
+

Update

+

Update works the same as you are used to in Pimcore

+
$repository = $container->get('coreshop.repository.cart');
+
+
+// Query by ID
+$cartWithIdOne = $repository->findById(1);
+
+// Change values
+$cartWithIdOne->setCustomer($customer);
+$cartWithIdOne->save();
+
+

Delete

+

Delete works the same as you are used to in Pimcore

+
$repository = $container->get('coreshop.repository.cart');
+
+
+// Query by ID
+$cartWithIdOne = $repository->findById(1);
+$cartWithIdOne->delete();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Cart/Cart_Manager.html b/docs/generated-docs/Development/Cart/Cart_Manager.html new file mode 100644 index 0000000000..701316b56b --- /dev/null +++ b/docs/generated-docs/Development/Cart/Cart_Manager.html @@ -0,0 +1,163 @@ + + + + + + + Cart Manager - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Cart/Cart_Modifier.html b/docs/generated-docs/Development/Cart/Cart_Modifier.html new file mode 100644 index 0000000000..1ea2b147ca --- /dev/null +++ b/docs/generated-docs/Development/Cart/Cart_Modifier.html @@ -0,0 +1,166 @@ + + + + + + + Cart Modifier - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Cart/Cart_Processor.html b/docs/generated-docs/Development/Cart/Cart_Processor.html new file mode 100644 index 0000000000..6be7400d14 --- /dev/null +++ b/docs/generated-docs/Development/Cart/Cart_Processor.html @@ -0,0 +1,212 @@ + + + + + + + Cart Processor - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart Processor

+

The Cart Processor takes care about refreshing the state and prices of carts for you. Everytime the persistCart function of the Cart-Manager is called +on a Cart, it gets triggered and re-calculates the cart.

+

Following Processors are implemented by default:

+ +

These Processors calculate all necessary prices of the cart. If you need to extend the Cart and change calculations, you need +to create a new Processor.

+

Creating a Cart Processor

+

A Cart Processor needs to implement the Interface CoreShop\Component\Order\Processor\CartProcessorInterface and registered +into the container with the tag coreshop.cart_processor and a priority attribute.

+

Example of a Cart Processor

+

For example, we create a Cart Processor, which calculates a custom field in our Cart.

+
<?php
+
+namespace AppBundle\CoreShop\Order\Cart\Processor;
+
+use CoreShop\Component\Order\Model\OrderInterface;
+use CoreShop\Component\Order\Processor\CartProcessorInterface;
+
+final class CustomCartProcessor implements CartProcessorInterface
+{
+    public function process(OrderInterface $cart): void
+    {
+        $cart->setCustomField(uniqid());
+    }
+}
+
+

We now only need to register the class:

+
app.coreshop.cart.processor.custom:
+    class: AppBundle\CoreShop\Order\Cart\Processor\CustomCartProcessor
+    tags:
+      - { name: coreshop.cart_processor, priority: 200 }
+
+

On every Cart Update, our service now gets called a the custom field gets a new unique id.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Cart/Commands.html b/docs/generated-docs/Development/Cart/Commands.html new file mode 100644 index 0000000000..5df9e7a9ad --- /dev/null +++ b/docs/generated-docs/Development/Cart/Commands.html @@ -0,0 +1,178 @@ + + + + + + + Commands - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart Commands

+

Expire Abandoned Carts

+
# Delete only anonymous carts
+$ bin/console coreshop:cart:expire --anonymous
+
+# Delete only user carts
+$ bin/console coreshop:cart:expire --user
+
+# Delete carts older than 20 days
+$ bin/console coreshop:cart:expire --days=20
+
+

Expire Abandoned Carts via Maintenance Mode

+

By default, this feature is disabled. +If you want to swipe abandoned carts by default you need to define a expiration date:

+
core_shop_order:
+    expiration:
+        cart:
+            days: 20
+            anonymous: true
+            customer: true
+
+

Read more about automation here.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Cart/Context.html b/docs/generated-docs/Development/Cart/Context.html new file mode 100644 index 0000000000..eb01edc02b --- /dev/null +++ b/docs/generated-docs/Development/Cart/Context.html @@ -0,0 +1,202 @@ + + + + + + + Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart Context

+

For CoreShop to determine the current cart it uses a concept called context and context resolver.

+

The Cart Context implements the Interface CoreShop\Component\Order\Context\CartContextInterface and is implemented in the Service +coreshop.context.cart:

+

Getting the current Cart

+

If you want to get the current cart, you simply use the service:

+
$cartContext = $container->get('coreshop.context.cart');
+
+// Get current cart, if none exists, it creates a new one
+$cart = $cartContext->getCart();
+
+
+

Context

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePriorityDescription
FixedCartContext-100Used for testing purposes or for backend order creation
SessionAndStoreBasedCartContext-555Search for a valid session cart in given store context
CustomerAndStoreBasedCartContext-777Search for a cart based on a customer. Note: This context only triggers after a user has been successfully logged in. It searches for the last available cart a user may has left.
CartContext-999If all other context classes failed finally this context will create a fresh cart
+

Create a Custom Resolver

+

To register your context, you need to use the tag: coreshop.context.cart with an optional priority attribute.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Cart/index.html b/docs/generated-docs/Development/Cart/index.html new file mode 100644 index 0000000000..9e1c41ae35 --- /dev/null +++ b/docs/generated-docs/Development/Cart/index.html @@ -0,0 +1,181 @@ + + + + + + + Cart - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Checkout/Checkout_Manager.html b/docs/generated-docs/Development/Checkout/Checkout_Manager.html new file mode 100644 index 0000000000..0e3abfcd84 --- /dev/null +++ b/docs/generated-docs/Development/Checkout/Checkout_Manager.html @@ -0,0 +1,208 @@ + + + + + + + Checkout Manager - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Checkout Manager

+

CoreShop Checkout

+

CoreShop uses a CheckoutManager to handle Checkout steps. The default installation comes with following Steps:

+
    +
  • Cart
  • +
  • Customer
  • +
  • Address
  • +
  • Shipping
  • +
  • Payment
  • +
  • Summary
  • +
+

Create a Custom CheckoutManager

+

If you want to modify the Checkout Manager, you have two options:

+
    +
  • Create a total different Checkout Manager configuration
  • +
  • Modify the default configuration
  • +
+

Create a total different Checkout Manager

+
# app/config/config.yml
+core_shop_core:
+    checkout_manager: my_custom_manager
+    checkout:
+      my_custom_manager:
+        steps:
+          customer:
+            step: coreshop.checkout.step.customer
+            priority: 10
+          address:
+            step: coreshop.checkout.step.address
+            priority: 20
+          shipping:
+            step: coreshop.checkout.step.shipping
+            priority: 30
+          payment:
+            step: coreshop.checkout.step.payment
+            priority: 40
+          summary:
+            step: coreshop.checkout.step.summary
+            priority: 50
+
+

Modify the default configuration

+
# app/config/config.yml
+core_shop_core:
+    checkout:
+        default:
+            steps:
+              payment: false                                              # disables the payment step
+              shipping: false                                             # disables the shipping step
+              payment_shipping:                                           # adds a new PaymentShiping Step
+                  step: app_bundle.coreshop.checkout.payment_shipping     # This is your service-id, the service needs to implement CoreShop\Component\Order\Checkout\CheckoutStepInterface
+                  priority: 40                                            # Priority of this step
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Checkout/Checkout_Step.html b/docs/generated-docs/Development/Checkout/Checkout_Step.html new file mode 100644 index 0000000000..a90aa87df0 --- /dev/null +++ b/docs/generated-docs/Development/Checkout/Checkout_Step.html @@ -0,0 +1,268 @@ + + + + + + + Checkout Step - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Checkout Step

+

If you want to implement a custom checkout step, you need to implement the interface CoreShop\Component\Order\Checkout\CheckoutStepInterface +and register your step into your Cart Manager:

+
# app/config/config.yml
+core_shop_core:
+    checkout:
+        default:
+            steps:
+              custom:
+                  step: app.coreshop.checkout.custom
+                  priority: 50
+
+

The Checkout Controller takes care about handling +the Checkout for you then.

+

Optional Checkout Step

+

If you have an optional checkout step - depending on the cart, your Checkout Step can implement the interface CoreShop\Component\Order\Checkout\OptionalCheckoutStepInterface.

+

You need to implement the function isRequired(OrderInterface $cart)

+

Optional Checkout Step Example

+
<?php
+
+namespace CoreShop\Bundle\CoreBundle\Checkout\Step;
+
+use CoreShop\Bundle\CoreBundle\Form\Type\Checkout\PaymentType;
+use CoreShop\Component\Order\Checkout\CheckoutException;
+use CoreShop\Component\Order\Checkout\CheckoutStepInterface;
+use CoreShop\Component\Order\Checkout\OptionalCheckoutStepInterface;
+use CoreShop\Component\Order\Checkout\ValidationCheckoutStepInterface;
+use CoreShop\Component\Order\Manager\CartManagerInterface;
+use CoreShop\Component\Order\Model\OrderInterface;
+use CoreShop\Component\Payment\Model\PaymentProviderInterface;
+use CoreShop\Component\Store\Context\StoreContextInterface;
+use Symfony\Component\Form\FormFactoryInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+class PaymentCheckoutStep implements CheckoutStepInterface, OptionalCheckoutStepInterface, ValidationCheckoutStepInterface
+{
+    private FormFactoryInterface $formFactory;
+    private StoreContextInterface $storeContext;
+    private CartManagerInterface $cartManager;
+
+    public function __construct(
+        FormFactoryInterface $formFactory,
+        StoreContextInterface $storeContext,
+        CartManagerInterface $cartManager
+    )
+    {
+        $this->formFactory = $formFactory;
+        $this->storeContext = $storeContext;
+        $this->cartManager = $cartManager;
+    }
+
+    public function getIdentifier(): string
+    {
+        return 'payment';
+    }
+
+    public function doAutoForward(OrderInterface $cart): bool
+    {
+        return $cart->getTotal() > 0;
+    }
+
+    public function doAutoForward(OrderInterface $cart): bool
+    {
+        return false;
+    }
+
+    public function validate(OrderInterface $cart): bool
+    {
+        return $cart->hasItems() && $cart->getPaymentProvider() instanceof PaymentProviderInterface;
+    }
+
+    public function commitStep(OrderInterface $cart, Request $request): bool
+    {
+        $form = $this->createForm($request, $cart);
+
+        if ($form->isSubmitted()) {
+            if ($form->isValid()) {
+                $cart = $form->getData();
+
+                $this->cartManager->persistCart($cart);
+
+                return true;
+            } else {
+                throw new CheckoutException('Payment Form is invalid', 'coreshop.ui.error.coreshop_checkout_payment_form_invalid');
+            }
+        }
+
+        return false;
+    }
+
+    public function prepareStep(OrderInterface $cart, Request $request): array
+    {
+        return [
+            'form' => $this->createForm($request, $cart)->createView(),
+        ];
+    }
+
+    private function createForm(Request $request, OrderInterface $cart)
+    {
+        $form = $this->formFactory->createNamed('', PaymentType::class, $cart, [
+            'payment_subject' => $cart
+        ]);
+
+        if ($request->isMethod('post')) {
+            $form = $form->handleRequest($request);
+        }
+
+        return $form;
+    }
+}
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Checkout/index.html b/docs/generated-docs/Development/Checkout/index.html new file mode 100644 index 0000000000..6c84796c4b --- /dev/null +++ b/docs/generated-docs/Development/Checkout/index.html @@ -0,0 +1,166 @@ + + + + + + + Checkout - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Currency_Fractions/index.html b/docs/generated-docs/Development/Currency_Fractions/index.html new file mode 100644 index 0000000000..6e0acdc14b --- /dev/null +++ b/docs/generated-docs/Development/Currency_Fractions/index.html @@ -0,0 +1,192 @@ + + + + + + + Currency Fractions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Fraction Digits

+

CoreShop allows you working with more than 2 digits for Currency Values. The default configuration looks like this:

+
core_shop_currency:
+    money_decimal_precision: 2
+    money_decimal_factor: 100
+
+
+

money_decimal_precision: 2

+
+

Having a global precision of 2

+
+

money_decimal_factor: 100

+
+

Displaying Currency with a factor of 100 (in Pimcore Backend).

+
+

WARNING If you change these settings in an existing Installation with Orders/Products etc. you also have to create +a migration to change all the values from a precision of 2 to your new setting.

+
+

In order to handle payment values with a precision of for example 4, we introduced a new Order Property called paymentTotal. +Within a Payment, you cannot deal with a precision > 2, since a currency only has eg. 100 Cents. Therefore, we round the total +Cart/Order value to a precision of 2 into the paymentTotal Value.

+

For example:

+

Your Cart/Order is "€ 1.000,5498", your payment total then is: "€ 1.000,55".

+

If you want to display the payment total in your cart, you can use this template:

+
{% if currency.convertAndFormat(cart.total) != currency.convertAndFormat(cart.paymentTotal, 2, 100) %}
+<tr>
+    <td class="text-right" colspan="3">	
+        <strong>{{ 'coreshop.ui.payment_total'|trans }}:</strong>
+    </td>
+    <td colspan="2" class="text-right cart-total-payment-price">
+        {{ currency.convertAndFormat(cart.paymentTotal, 2, 100) }}
+    </td>
+</tr>
+{% endif %}
+
+

c

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Customers/CRUD.html b/docs/generated-docs/Development/Customers/CRUD.html new file mode 100644 index 0000000000..5fd1d5d5a8 --- /dev/null +++ b/docs/generated-docs/Development/Customers/CRUD.html @@ -0,0 +1,203 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Custom

+

CoreShop uses Pimcore Data Objects to persist Customer Information. But, it adds a little wrapper around it to be mire +dynamic and configurable. It uses a Factory and Repository Pattern to do that.

+

Create

+

If you want to create a new Custom, we need to get our Factory Service for that:

+
$customerFactory = $container->get('coreshop.factory.customer');
+$customer = $customerFactory->createNew();
+
+

No we have our customer and we can set all needed values.

+

If you now want to save it, just call the save function

+
$customer->save();
+
+

Read

+

To get customers, you need to use the Repository Service CoreShop provides you.

+
$repository = $container->get('coreshop.repository.customer');
+
+
+// Query by ID
+$customerWithIdOne = $repository->findById(1);
+
+// Get a Listing how you know it from Pimcore
+$list = $repository->getList();
+$list->setCondition("active = 1");
+$customers = $list->getObjects();
+
+
+

Update

+

Update works the same as you are used to in Pimcore

+
$repository = $container->get('coreshop.repository.customer');
+
+
+// Query by ID
+$customerWithIdOne = $repository->findById(1);
+
+// Change values
+$customerWithIdOne->setName('test');
+$customerWithIdOne->save();
+
+

Delete

+

Delete works the same as you are used to in Pimcore

+
$repository = $container->get('coreshop.repository.customer');
+
+
+// Query by ID
+$customerWithIdOne = $repository->findById(1);
+$customerWithIdOne->delete();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Customers/Company_Extension.html b/docs/generated-docs/Development/Customers/Company_Extension.html new file mode 100644 index 0000000000..6c204415ec --- /dev/null +++ b/docs/generated-docs/Development/Customers/Company_Extension.html @@ -0,0 +1,188 @@ + + + + + + + Company Extension - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Customer Company Extension

+

The Company Entity allows you to append customers to a given company. +After a customer has been connected to a company by using the 1to1 relation company, it's possible to share addresses between company and the self-assigned addresses.

+

Access Types

+
+

Note! This is only available if a customer already is connected to a valid company!

+
+

Own Only

+

If set, the customer can create, edit and delete own addresses and choose them in checkout as well. This is the default behaviour.

+

Company Only

+

If set, the customer can create, edit und delete company addresses and choose them in checkout as well. He's not able to add addresses to himself.

+

Own And Company

+

If set, the customer can create, edit and delete company and private addresses and choose them in checkout as well.

+

Plus, the own_and_company mode allows the customer to define and modify the allocation of the address. +To do so, coreshop renders an additional choice type to the address creation/modification form.

+

Note: If a customer switches the allocation after it has been created, the address also physically gets moved to its desired location. +In this example, the customer changes the allocation from own to company:

+

Before:

+
- company A
+    - addresses
+    - customer A
+        - addresses
+            - address A
+
+

After:

+
- company A
+    - addresses
+        - address A
+    - customer A
+        - addresses
+
+

Read more about this feature here.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Customers/Context.html b/docs/generated-docs/Development/Customers/Context.html new file mode 100644 index 0000000000..bf2a8f1ab8 --- /dev/null +++ b/docs/generated-docs/Development/Customers/Context.html @@ -0,0 +1,169 @@ + + + + + + + Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Customer Context

+

CoreShop Customer Security uses Symfony Firewall to handle authentication.

+

CoreShop implemented a Context based Wrapper around that to be more flexible. Currently CoreShop implements these Contexts for Customer determination:

+ +

Create a Custom Resolver

+

A Store Context needs to implement the interface CoreShop\Component\Customer\Context\CustomerContextInterface. This interface +consists of one function called "getCustomer" which returns a CoreShop\Component\Customer\Model\CustomerInterface or throws an CoreShop\Component\Customer\Context\CustomerNotFoundException

+

To register your context, you need to use the tag: coreshop.context.customer with an optional priority attribute.

+

The use case of changing this is quite rare. But if you need to, you can create a Custom Resolver if you wish.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Customers/Customer_Manager.html b/docs/generated-docs/Development/Customers/Customer_Manager.html new file mode 100644 index 0000000000..cb9a7c873b --- /dev/null +++ b/docs/generated-docs/Development/Customers/Customer_Manager.html @@ -0,0 +1,189 @@ + + + + + + + Customer Manager - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Customer Manager

+

CoreShop already implements a Customer Manager which handles creating a Customer with Addresses. +The Customer Manager implements the Interface CoreShop\Bundle\CoreBundle\Customer\CustomerManagerInterface and CoreShop implements it using the service coreshop.customer.manager.

+

Usage

+

To use the Service, you need to pass a Customer. +In our example, we gonna do that from a Controller with a FormType.

+
$customer = $this->getCustomer();
+
+if ($customer instanceof CustomerInterface && null === $customer->getUser()) {
+    return $this->redirectToRoute('coreshop_customer_profile');
+}
+
+$form = $this->get('form.factory')->createNamed('customer', CustomerRegistrationType::class, $this->get('coreshop.factory.customer')->createNew());
+
+$redirect = $this->getParameterFromRequest($request, '_redirect', $this->generateUrl('coreshop_customer_profile'));
+
+if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) {
+    $form = $form->handleRequest($request);
+
+    if ($form->isValid()) {
+        $customer = $form->getData();
+        $customer->setLocaleCode($this->get('coreshop.context.locale')->getLocaleCode());
+
+        $this->get('coreshop.customer.manager')->persistCustomer($customer);
+
+        return $this->redirect($redirect);
+    }
+}
+
+return $this->render($this->templateConfigurator->findTemplate('Register/register.html'), [
+    'form' => $form->createView(),
+]);
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Customers/Registration_Types.html b/docs/generated-docs/Development/Customers/Registration_Types.html new file mode 100644 index 0000000000..a7ec6df08a --- /dev/null +++ b/docs/generated-docs/Development/Customers/Registration_Types.html @@ -0,0 +1,182 @@ + + + + + + + Registration Types - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Customer Registration Types

+

By default, a customer needs to provide a unique and valid email address to pass a registration.

+

Register By Email

+
+

This is the default setting!

+
+

To switch to registration by a unique and valid email address, you need set the identifier:

+
core_shop_customer:
+    login_identifier: 'email'
+
+

Register By Username

+

First, you need to make sure your customer object provides a username field. +By default, coreshop does not install this field to prevent unnecessary confusion. +To implement the username field, just open your class editor and add a text field called username and you're good to go!

+

To switch to registration by a unique username, you need change the identifier:

+
core_shop_customer:
+    login_identifier: 'username'
+
+

Security

+

Form (Frontend)

+

CoreShop comes with a preinstalled constraint which will tell your customer, if an email address or username - depending on your settings - is valid or not.

+

Backend / API

+

Plus, if you're going to update a customer by API or Backend, coreshop also checks if your customer entity has unique data.

+
+

Note: Both checks only apply to non-guest entities!

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Customers/index.html b/docs/generated-docs/Development/Customers/index.html new file mode 100644 index 0000000000..9f26aac940 --- /dev/null +++ b/docs/generated-docs/Development/Customers/index.html @@ -0,0 +1,175 @@ + + + + + + + Customers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Ecommerce_Tracking/index.html b/docs/generated-docs/Development/Ecommerce_Tracking/index.html new file mode 100644 index 0000000000..ca09e9194c --- /dev/null +++ b/docs/generated-docs/Development/Ecommerce_Tracking/index.html @@ -0,0 +1,305 @@ + + + + + + + Ecommerce Tracking - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop eCommerce Tracking

+

CoreShop currently implements Tracking for Analytics and Google Tag Manager. +Tracking is automatically available (but not enabled), as soon as you enable Tag Manager or Analytics in Pimcore.

+

Per default configuration, all the ecommerce trackers are disabled. You need to enable them manually.

+

Available Trackers

+
    +
  • google-analytics-enhanced-ecommerce
  • +
  • google-analytics-universal-ecommerce
  • +
  • google-gtag-enhanced-ecommerce
  • +
  • google-gtm-classic-ecommerce
  • +
  • google-gtm-enhanced-ecommerce
  • +
  • matomo (piwik)
  • +
+

Enabling Trackers

+
core_shop_tracking:
+    trackers:
+        google-analytics-enhanced-ecommerce:
+            enabled: false
+        google-analytics-universal-ecommerce:
+            enabled: false
+        google-gtag-enhanced-ecommerce:
+            enabled: false
+        google-gtm-classic-ecommerce:
+            enabled: false
+        google-gtm-enhanced-ecommerce:
+            enabled: false
+        matomo:
+            enabled: true
+
+

External

+ +

Actions

+
Product Impression
+
$this->get('coreshop.tracking.manager')->trackProductImpression($product);
+
+
Product View
+
$this->get('coreshop.tracking.manager')->trackProduct($product);
+
+
Product Action Add from Cart
+
$this->get('coreshop.tracking.manager')->trackCartAdd($cart, $product);
+
+
Product Action Remove from Cart
+
$this->get('coreshop.tracking.manager')->trackCartRemove($cart, $product);
+
+
Checkout Step
+
$this->get('coreshop.tracking.manager')->trackCheckoutStep($cart, $stepIdentifier, $isFirstStep, $checkoutOption)
+
+
Checkout Complete
+
$this->get('coreshop.tracking.manager')->trackCheckoutComplete($order)
+
+

Add a custom Tracker

+

To add a custom tracker you need to implement the interface CoreShop\Component\Tracking\Tracker\TrackerInterface

+
app.tracking.tracker.my_tracker:
+    class: AppBundle\Tracker\CustomTracker
+    parent: coreshop.tracking.tracker.ecommerce_tracker
+    tags:
+        - { name: coreshop.tracking.tracker, type: app-custom-tracker }
+
+

Google Tag Manager

+

If you have enabled the gtm in backend, CoreShop sends some data to a dataLayer object which submits the object to gtm.

+

GTM Classic eCommerce

+

If you enable the classic mode only the order gets submitted if user has successfully reached the "thank-you" page.

+

GTM Enhanced eCommerce

+

There are six Impressions/Events for Google Tag Manager Enhanced eCommerce:

+

Product Impression

+

Tag Config Example:

+
+Tag type : Universal Analytics
+Track type : Pageview
+Enable Enhanced Ecommerce Features: true
+Use Data Layer: true
+Trigger: event equals gtm.dom
+
+

Product Detail View

+

Tag Config Example:

+
+Tag type : Universal Analytics
+Track type : Pageview
+Enable Enhanced Ecommerce Features: true
+Use Data Layer: true
+Trigger: event equals gtm.dom
+
+

Checkout Step:

+
+

Event-Name: csCheckout

+
+

Tag Config Example:

+
+Tag type : Universal Analytics
+Track type : Event
+Event Category: Ecommerce
+Event Action: Checkout
+Enable Enhanced Ecommerce Features: true
+Use Data Layer: true
+Trigger: event equals csCheckout
+
+

Checkout Complete (Purchase):

+

Tag Config Example:

+
+Tag type : Universal Analytics
+Track type : Pageview
+Enable Enhanced Ecommerce Features: true
+Use Data Layer: true
+Trigger: event equals gtm.dom
+
+

Remove Item from Cart

+
+

Event-Name: csRemoveFromCart

+
+

Tag Config Example:

+
+Tag type : Universal Analytics
+Track type : Event
+Event Category: Ecommerce
+Event Action: Remove from Cart
+Enable Enhanced Ecommerce Features: true
+Use Data Layer: true
+Trigger: event equals csRemoveFromCart
+
+

Add Item to Cart

+
+

Event-Name: csAddToCart

+
+

Tag Config Example:

+
+Tag type : Universal Analytics
+Track type : Event
+Event Category: Ecommerce
+Event Action: Add to Cart
+Enable Enhanced Ecommerce Features: true
+Use Data Layer: true
+Trigger: event equals csAddToCart
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Events/index.html b/docs/generated-docs/Development/Events/index.html new file mode 100644 index 0000000000..6598824b20 --- /dev/null +++ b/docs/generated-docs/Development/Events/index.html @@ -0,0 +1,544 @@ + + + + + + + Events - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Events

+

CoreShop comes with a lot of build-in events.

+

Frontend Controller

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.customer.update_postResourceControllerEventFires after Customer has updated the profile
coreshop.customer.change_password_postResourceControllerEventFires after Customer has changed the password
coreshop.customer.newsletter_confirm_postResourceControllerEventFires after Customer has confirmed his newsletter subscription
coreshop.address.add_postResourceControllerEventFires after Customer has added a new address
coreshop.address.update_postResourceControllerEventFires after Customer has updated a address
coreshop.address.delete_preResourceControllerEventFires before Customer deletes a address
+

Cart

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.cart.updateGenericEventFires after cart has been updated
coreshop.cart.pre_add_itemGenericEventFires before a item gets added to cart
coreshop.cart.post_add_itemGenericEventFires after a item gets added to cart
coreshop.cart.pre_remove_itemGenericEventFires before a item gets removed from cart
coreshop.cart.post_remove_itemGenericEventFires after a item gets removed from cart
+

Customer

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.customer.registerCustomerRegistrationEventFires after a new customer has been generated
coreshop.customer.request_password_resetRequestPasswordChangeEventFires after password reset has been requested
coreshop.customer.password_resetGenericEventFires after new password hast been applied to customer
+

Order Document

+ + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.order.shipment.wkhtml.optionsWkhtmlOptionsEventOptions Event: Use it to change wkhtml options.
coreshop.order.invoice.wkhtml.optionsWkhtmlOptionsEventOptions Event: Use it to change wkhtml options.
+

Payment

+ + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.payment_provider.supportsPaymentProviderSupportsEventSupport Event: Use it to modify available Payment Providers
+

Notes

+ + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.note.*.post_addGenericEventFires after a note of type * has been created
coreshop.note.*.post_deleteGenericEventFires after a note of type * has been deleted
+

Rules

+ + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.rule.availability_checkRuleAvailabilityCheckEventFires in RuleAvailabilityCheck maintenance/command for every active rule.
+

Replace symbol (*) with one of those note types:

+
    +
  • +payment +
  • +
  • +update_order +
  • +
  • +update_order_item +
  • +
  • +email +
  • +
  • +order_comment +
  • +
+

Workflow

+ + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.workflow.valid_transitionsWorkflowTransitionEventValid Event: Use it if you need to extend the workflow transitions
+

Transformer

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.quote_item.pre_transformGenericEventFires before proposal item gets transformed to a quote item
coreshop.quote_item.post_transformGenericEventFires after proposal item has been transformed to a quote item
coreshop.order_item.pre_transformGenericEventFires before proposal item gets transformed to a order item
coreshop.order_item.post_transformGenericEventFires after proposal item has been transformed to a order item
coreshop.quote.pre_transformGenericEventFires before proposal gets transformed to a quote
coreshop.quote.post_transformGenericEventFires after proposal has been transformed to a quote
coreshop.order.pre_transformGenericEventFires before proposal gets transformed to a order
coreshop.order.post_transformGenericEventFires after proposal has been transformed to a order
coreshop.shipment_item.pre_transformGenericEventFires before proposal item gets transformed to a shipment item
coreshop.shipment_item.post_transformGenericEventFires after proposal item has been transformed to a shipment item
coreshop.shipment.pre_transformGenericEventFires before proposal gets transformed to a shipment
coreshop.shipment.post_transformGenericEventFires after proposal has been transformed to a shipment
coreshop.invoice.pre_transformGenericEventFires before proposal gets transformed to a invoice
coreshop.invoice.post_transformGenericEventFires after proposal has been transformed to a invoice
+

Backend Controller

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.*.pre_createResourceControllerEventFires before object gets created in backend
coreshop.*.post_createResourceControllerEventFires after object gets created in backend
coreshop.*.pre_saveResourceControllerEventFires before object gets saved in backend
coreshop.*.post_saveResourceControllerEventFires after object gets saved in backend
coreshop.*.pre_deleteResourceControllerEventFires before object gets deleted in backend
coreshop.*.post_deleteResourceControllerEventFires after object gets deleted in backend
+

Replace symbol (*) with one of those controller:

+
    +
  • +configuration +
  • +
  • +payment_provider +
  • +
  • +exchange_rate +
  • +
  • +filter +
  • +
  • +index +
  • +
  • +notification_rule +
  • +
  • +notification_rule +
  • +
  • +cart_price_rule +
  • +
  • +product_price_rule +
  • +
  • +shipping_rule +
  • +
  • +store +
  • +
  • +tax_rule_group +
  • +
+

Workflow Events

+

There are events vor every state machine transition. Read more about it here.

+

Model Events

+

You can use Pimcore Events for CoreShops Pimcore Models: Pimcore Events

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html b/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html new file mode 100644 index 0000000000..04d7957695 --- /dev/null +++ b/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html @@ -0,0 +1,169 @@ + + + + + + + Extend CoreShop DataObjects - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Extending CoreShop

+

CoreShop Data Objects (like CoreShopProduct or CoreShopOrder) can be changed directly within Pimcore.

+

Replace CoreShop Object Classes with your own Classes

+

CoreShop uses Pimcore Parameters to determine the Pimcore Object Class. To change it, simply add this to your config.yml

+
core_shop_order:
+    pimcore:
+        order:
+            classes:
+                model: 'Pimcore\Model\DataObject\MyOrderClass'
+                install_file: '@AppBundle/Resources/install/pimcore/classes/MyOrderClass.json'
+                repository: AppBundle\Repository\OrderRepository
+                factory: AppBundle\Factory\OrderFactory
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Forms.html b/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Forms.html new file mode 100644 index 0000000000..93b21d477d --- /dev/null +++ b/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Forms.html @@ -0,0 +1,245 @@ + + + + + + + Extend CoreShop Forms - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Customizing Forms

+

The forms in CoreShop are placed in the CoreShop\Bundle\*BundleName*\Form\Type namespaces and the extensions +will be placed in AppBundle\Form\Extension.

+

Why would you customize a Form?

+

There are plenty of reasons to modify forms that have already been defined in CoreShop. +Your business needs may sometimes slightly differ from our internal assumptions.

+

You can:

+
    +
  • add completely new fields,
  • +
  • +modify existing fields, make them required, change their HTML class, change labels etc.,
  • +
  • +remove fields that are not used.
  • +
+

How to customize a CoreShop Resource Form?

+

If you want to modify the form for the Store in your system there are a few steps that you should take. +Assuming that you would like to (for example):

+
    +
  • Add a contactHours field,
  • +
+

These will be the steps that you will have to take to achieve that:

+

1. If your are planning to add new fields remember that beforehand they need to be added on the model that the form type is based on.

+

In case of our example if you need to have the contactHours on the model and the entity mapping for the Store resource. +To get to know how to prepare that go there

+

2. Create a Form Extension.

+

Your form has to extend a proper base class. How can you check that?

+

For the StoreType run:

+
$ php bin/console debug:container coreshop.form.type.store
+
+

As a result you will get the CoreShop\Bundle\StoreBundle\Form\Type\StoreType - this is the class that you need to be extending.

+
<?php
+
+namespace AppBundle\Form\Extension;
+
+use CoreShop\Bundle\StoreBundle\Form\Type\StoreType;
+use Symfony\Component\Form\AbstractTypeExtension;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+use Symfony\Component\Form\FormBuilderInterface;
+
+final class StoreTypeExtension extends AbstractTypeExtension
+{
+    public function buildForm(FormBuilderInterface $builder, array $options): void
+    {
+        // Adding new fields works just like in the parent form type.
+        $builder->add('contactHours', TextType::class, [
+            'required' => false
+        ]);
+    }
+
+    public static function getExtendedTypes(): array
+    {
+        return [StoreType::class];
+    }
+}
+
+

3. After creating your class, register this extension as a service in the AppBundle/Resources/config/services.yml:

+
services:
+    app.form.extension.type.customer_profile:
+        class: AppBundle\Form\Extension\StoreTypeExtension
+        tags:
+            - { name: form.type_extension, extended_type: CoreShop\Bundle\StoreBundle\Form\Type\StoreType }
+
+

In our case you will need to extend the ExtJs Form as well: src/AppBundle/Resources/public/pimcore/js/store.js.

+

In ExtJs your new store file need to like like this:

+
coreshop.store.item = Class.create(coreshop.store.item, {
+
+    getFormPanel: function ($super) {
+        var panel = $super();
+
+        panel.down("fieldset").add(
+            [
+                {
+                    xtype: 'textfield',
+                    fieldLabel: 'Contact Hours',
+                    name: 'contactHours'
+                }
+            ]
+        );
+
+        return this.formPanel;
+    }
+});
+
+

And you need to configure it to be loaded as well:

+
core_shop_store:
+    pimcore_admin:
+        js:
+            custom_store: '/bundles/app/pimcore/js/store.js'
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Resources.html b/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Resources.html new file mode 100644 index 0000000000..c3fb14bba7 --- /dev/null +++ b/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Resources.html @@ -0,0 +1,263 @@ + + + + + + + Extend CoreShop Resources - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Extend CoreShop Resources

+

All models in Coreshop are placed in the Coreshop\Component\*ComponentName*\Model namespaces alongside with their interfaces.

+
+

Many models in CoreShop are extended in the Core component. If the model you are willing to override exists in the Core you should be extending the Core one, not the base model from the component.

+
+

How to Customize a Model

+

First things first: If you want to extend coreshop models your Bundle must extend the AbstractResourceBundle. Next you have set your supported drivers. Just add the following lines of code to your bundle class:

+
public function getSupportedDrivers(); array
+{
+    return [
+        CoreShopResourceBundle::DRIVER_DOCTRINE_ORM
+    ];
+}
+
+

After that have to tell the bundle where your models are. For that, add the override the following method in your bundle class and return the model namespace. Here is an example for the AppBundle

+
 protected function getModelNamespace(): string
+{
+    return "AppBundle\Model";
+} 
+
+

Here a quick overview for you which dictories are important for you, when customizing CoreShop models.

+ + + + + + + + + + + + + + + + + + + + + +
FolderDescription
AcmeBundle/Model or AcmeBundle/EntityWhere your models are living
AcmeBundle/config/doctrine/modelPut your doctrine .yml config files in here
AcmeBundle/config/serializerThe serializer configs for the models
+

Let’s take the CoreShop\Component\Currency\Model\Currency as an example. This one is extended in Core. How can you check that?

+

First of all, you need to find the current used class by doing following:

+
$ php bin/console debug:container --parameter=coreshop.model.currency.class
+
+

As a result you will get the CoreShop\Component\Core\Model\Currency - this is the class that you need to be extending.

+

Assuming you want to add a field called flag

+

1. The first thing to do is to write your own class which will extend the base Currency class

+
<?php
+
+namespace AppBundle\Entity;
+
+use CoreShop\Component\Core\Model\Currency as BaseCurrency;
+
+class Currency extends BaseCurrency
+{
+    /**
+     * @var bool
+     */
+    private $flag;
+
+    /**
+     * @return bool
+     */
+    public function getFlag()
+    {
+        return $this->flag;
+    }
+
+    /**
+     * @param bool $flag
+     */
+    public function setFlag($flag)
+    {
+        $this->flag = $flag;
+    }
+}
+
+

2. Next define your entity’s mapping.

+

The file should be placed in AppBundle/Resources/config/doctrine/Currency.orm.yml

+
AppBundle\Entity\Currency:
+    type: mappedSuperclass
+    table: coreshop_currency
+    fields:
+        flag:
+            type: boolean
+            nullable: true
+
+

3. Finally you’ll need to override the model’s class in the app/config/config.yml.

+

Under the core_shop_* where * is the name of the bundle of the model you are customizing, in our case it will be the CoreShopCurrencyBundle -> core_shop_currency.

+
core_shop_currency:
+    resources:
+        currency:
+            classes:
+                model: AppBundle\Entity\Currency
+
+

4. Update the database. There are two ways to do it.

+

via direct database schema update:

+
$ php bin/console doctrine:schema:update --force
+
+

via migrations: +Which we strongly recommend over updating the schema.

+
$ php bin/console doctrine:migrations:diff
+$ php bin/console doctrine:migrations:migrate
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Extending_Guide/Extending_Rule_Actions.html b/docs/generated-docs/Development/Extending_Guide/Extending_Rule_Actions.html new file mode 100644 index 0000000000..5899d4d0e8 --- /dev/null +++ b/docs/generated-docs/Development/Extending_Guide/Extending_Rule_Actions.html @@ -0,0 +1,283 @@ + + + + + + + Extending Rule Actions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Custom Price-Rule/Shipping-Rule/Notification-Rule Actions

+

Adding Price-, Shipping- or Notification-Rule Actions is the same for all of these types. Their only difference is the +tag you use and Interface you need to implement for them.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Action TypeTagInterface
Cart Price Rulecoreshop.cart_price_rule.actionCoreShop\Component\Order\Cart\Rule\Action\CartPriceRuleActionProcessorInterface
Product Price Rulecoreshop.product_price_rule.actionCoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface
Product Specific Pricecoreshop.product_specific_price_rule.actionCoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface
Shipping Rulecoreshop.shipping_rule.actionCoreShop\Component\Shipping\Rule\Action\CarrierPriceActionProcessorInterface
Notification Rulecoreshop.notification_rule.actionCoreShop\Component\Notification\Rule\Action\NotificationRuleProcessorInterface
+

Example Adding a new Action

+

Now, lets add a new Action for Product Price Rules.

+

To do so, we first need to create a new class and implement the interface listed in the table above. For Product Price Rules, we need to use +CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface

+
//AppBundle/CoreShop/CustomAction.php
+namespace AppBundle\CoreShop;
+
+final class CustomAction implements \CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface
+{
+    public function getPrice($subject, array $context, array $configuration): int 
+    {
+        //If your action gives the product a new Price, put your calculation here
+
+        return $configuration['some_value'];
+    }
+}
+
+

We also need a FormType for the actions configurations:

+
//AppBundle/Form/Type/CustomActionType.php
+namespace AppBundle\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+
+final class CustomActionType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options): void
+    {
+        $builder
+            ->add('some_value', TextType::class)
+        ;
+    }
+}
+
+

With configuration, comes a Javascript file as well:

+
//AppBundle/Resources/public/pimcore/js/custom_action.js
+
+pimcore.registerNS('coreshop.product.pricerule.actions.custom');
+coreshop.product.pricerule.actions.custom = Class.create(coreshop.rules.actions.abstract, {
+
+    type: 'custom',
+
+    getForm: function () {
+        var some_value = 0;
+        var me = this;
+
+        if (this.data) {
+            some_value = this.data.some_value / 100;
+        }
+
+        var some_valueField = new Ext.form.NumberField({
+            fieldLabel: t('custom'),
+            name: 'some_value',
+            value: some_value,
+            decimalPrecision: 2
+        });
+
+        this.form = new Ext.form.Panel({
+            items: [
+                some_valueField
+            ]
+        });
+
+        return this.form;
+    }
+});
+
+
+

Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony structure, omit the web.

+
bin/console assets:install web
+
+

Registering the Custom Action to the Container and load the Javascript File

+

We now need to create our Service Definition for our Custom Action:

+
app.product_price_rule.custom:
+    class: AppBundle\CoreShop\CustomAction
+    tags:
+      - { name: coreshop.product_price_rule.action, type: custom, form-type: AppBundle\Form\Type\CustomActionType }
+
+

and add this to your config.yml:

+
core_shop_product:
+    pimcore_admin:
+        js:
+            custom_action: '/bundles/app/pimcore/js/custom_action.js'
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Extending_Guide/Extending_Rule_Conditions.html b/docs/generated-docs/Development/Extending_Guide/Extending_Rule_Conditions.html new file mode 100644 index 0000000000..808b46530a --- /dev/null +++ b/docs/generated-docs/Development/Extending_Guide/Extending_Rule_Conditions.html @@ -0,0 +1,280 @@ + + + + + + + Extending Rule Conditions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Custom Price-Rule/Shipping-Rule/Notification-Rule Conditions

+

Adding Price-, Shipping- or Notification-Rule Conditions is the same for all of these types. They're only difference is the +tag you use and Interface you need to implement for them.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Action TypeTagInterface/AbstractClass
Cart Price Rulecoreshop.cart_price_rule.conditionCoreShop\Component\Order\Cart\Rule\Condition\AbstractConditionChecker
Product Price Rulecoreshop.product_price_rule.conditionCoreShop\Component\Rule\Condition\ConditionCheckerInterface
Product Specific Pricecoreshop.product_specific_price_rule.conditionCoreShop\Component\Rule\Condition\ConditionCheckerInterface
Shipping Rulecoreshop.shipping_rule.conditionCoreShop\Component\Shipping\Rule\Condition\CategoriesConditionChecker
Notification Rulecoreshop.notification_rule.conditionCoreShop\Component\Notification\Rule\Condition\AbstractConditionChecker
+

Example Adding a new Condition

+

Now, lets add a new Condition for Product Price Rules.

+

To do so, we first need to create a new class and implement the interface listed in the table above. For Product Price Rules, we need to use +CoreShop\Component\Rule\Condition\ConditionCheckerInterface

+
//AppBundle/CoreShop/CustomCondition.php
+namespace AppBundle\CoreShop;
+
+use CoreShop\Component\Resource\Model\ResourceInterface;
+use CoreShop\Component\Rule\Model\RuleInterface;
+
+final class CustomCondition implements \CoreShop\Component\Rule\Condition\ConditionCheckerInterface
+{
+    public function isValid(ResourceInterface $subject, RuleInterface $rule, array $configuration, array $params = []): bool
+    {
+        //return true if valid, false if not
+        return true;
+    }
+}
+
+

We also need a FormType for the conditions configurations:

+
//AppBundle/Form/Type/CustomConditionType.php
+namespace AppBundle\Form\Type;
+
+final class CustomConditionType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options): void
+    {
+        $builder
+            ->add('some_value', TextType::class)
+        ;
+    }
+}
+
+

With configuration, comes a Javascript file as well:

+
//AppBundle/Resources/public/pimcore/js/custom_condition.js
+
+pimcore.registerNS('coreshop.product.pricerule.conditions.custom');
+coreshop.product.pricerule.conditions.custom = Class.create(coreshop.rules.conditions.abstract, {
+
+    type: 'custom',
+
+    getForm: function () {
+        var some_value = 0;
+        var me = this;
+
+        if (this.data) {
+            some_value = this.data.some_value / 100;
+        }
+
+        var some_valueField = new Ext.form.NumberField({
+            fieldLabel: t('custom'),
+            name: 'some_value',
+            value: some_value,
+            decimalPrecision: 2
+        });
+
+        this.form = new Ext.form.Panel({
+            items: [
+                some_valueField
+            ]
+        });
+
+        return this.form;
+    }
+});
+
+

Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony structure, omit the web.

+
bin/console assets:install web
+
+

Registering the Custom Condition to the Container and load the Javascript File

+

We now need to create our Service Definition for our Custom Condition:

+
app.product_price_rule.custom_condition:
+    class: AppBundle\CoreShop\CustomCondition
+    tags:
+      - { name: coreshop.product_price_rule.condition, type: custom, form-type: AppBundle\Form\Type\CustomConditionType }
+
+

and add this to your config.yml:

+
core_shop_product:
+    pimcore_admin:
+        js:
+            custom_condition: '/bundles/app/pimcore/js/custom_condition.js'
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Index_and_Filters/Filter/Custom_Filter.html b/docs/generated-docs/Development/Index_and_Filters/Filter/Custom_Filter.html new file mode 100644 index 0000000000..2d6024db53 --- /dev/null +++ b/docs/generated-docs/Development/Index_and_Filters/Filter/Custom_Filter.html @@ -0,0 +1,219 @@ + + + + + + + Custom Filter - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Filter - Create Custom Filter

+

1. We need to create 2 new files: +- FormType for processing the Input Data +- And a FilterConditionProcessorInterface, which checks if a cart fulfills the condition.

+
namespace AppBundle\Filter\Form\Type\Condition;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\IntegerType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Validator\Constraints\NotBlank;
+use Symfony\Component\Validator\Constraints\Type;
+
+final class MyFilterCondition extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->add('myData', IntegerType::class, [
+                'constraints' => [
+                    new NotBlank(['groups' => ['coreshop']]),
+                    new Type(['type' => 'numeric', 'groups' => ['coreshop']]),
+                ],
+            ])
+        ;
+    }
+}
+
+
+
namespace AppBundle\Filter;
+
+use CoreShop\Component\Address\Model\AddressInterface;
+use CoreShop\Component\Core\Model\CarrierInterface;
+
+class MyFilterCondition extends FilterConditionProcessorInterface
+{
+    public function prepareValuesForRendering(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter)
+    {
+        //Prepare values for rendering HTML
+    }
+
+    public function addCondition(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter, ParameterBag $parameterBag, $isPrecondition = false)
+    {
+        //Add Condition to Listing
+
+        return $currentFilter;
+    }
+
+}
+
+

2. Register MyFilterCondition as service with tag coreshop.filter.condition_type, type and form

+
app.coreshop.shipping_rule.condition.my_rule:
+    class: AppBundle\Shipping\Rule\Condition\MyRuleConditionChecker
+    tags:
+      - { name: coreshop.shipping_rule.condition, type: my_rule, form-type: AppBundle\Shipping\Form\Type\Condition\MyRuleConfigurationType }
+
+app.filter.condition_type.my_filter_condition:
+    class: AppBundle\Filter\MyFilterCondition
+    tags:
+      - { name: coreshop.filter.condition_type, type: app-my-filter, form-type: AppBundle\Filter\Form\Type\Condition\MyFilterCondition}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Index_and_Filters/Filter/index.html b/docs/generated-docs/Development/Index_and_Filters/Filter/index.html new file mode 100644 index 0000000000..11f7174f94 --- /dev/null +++ b/docs/generated-docs/Development/Index_and_Filters/Filter/index.html @@ -0,0 +1,227 @@ + + + + + + + Filter - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Filter

+

After creating the index, you can configure the Filters.

+

Create a new Filter

+

You can create different Filters for different Categories.

+

A filter exists of different settings, pre-conditions, filters and similar products.

+

You can even create Custom Filters

+

Filter Settings

+

Filter Settings

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
NameName of the Filter-Set
IndexWhich Index should be used
OrderOrder of the products
Order KeyOrder key (index-field) to sort from
Results per PageHow many products should be displayed per page, you can use Shop Settings, or override it
+

Pre-Conditions

+

Filter Pre-Conditions

+

You can define pre-filters for the index.

+

Conditions

+

Filter Conditions

+

Here you can define different kind of filters. These filters will be displayed on the front-page for customers to find products.

+

CoreShop currently supports 4 types of filters:

+
    +
  • +Select +
  • +
  • +Multiselect +
  • +
  • +Range +
  • +
  • +Boolean +
  • +
+

Select Condition

+

A select condition is basically just a simple dropdown field where customer can select one field.

+

Filter Condition Select

+

Multiselect Condition

+

A multi-select condition is basically a list of fields where customer can select multiple entries.

+

Filter Condition Select

+

Range Condition

+

A Range Condition is a slider of two ranges. The ranges are calculated automatically using MIN and MAX values.

+

Filter Condition Select

+

Boolean Condition

+

Boolean is a Condition where the customer can check different values.

+

Filter Condition Select

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Index_and_Filters/Index/Extension.html b/docs/generated-docs/Development/Index_and_Filters/Index/Extension.html new file mode 100644 index 0000000000..e7b3087f11 --- /dev/null +++ b/docs/generated-docs/Development/Index_and_Filters/Index/Extension.html @@ -0,0 +1,167 @@ + + + + + + + Extension - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Index Extension

+

In order to make the index more flexible, it is possible for you to write extensions. Extensions allow you to do following things:

+
- Add more "default" columns and corresponding data
+- Pre Filter an mysql index
+
+

To create a new extension, you need to implement either the interface +CoreShop\Component\Index\Extension\IndexColumnsExtensionInterface +for column extensions or the interface +CoreShop\Bundle\IndexBundle\Extension\MysqlIndexQueryExtensionInterface +for mysql query extensions.

+

You then need to register your service using the tag coreshop.index.extension

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Index_and_Filters/Index/Interpreter.html b/docs/generated-docs/Development/Index_and_Filters/Index/Interpreter.html new file mode 100644 index 0000000000..01d2f53150 --- /dev/null +++ b/docs/generated-docs/Development/Index_and_Filters/Index/Interpreter.html @@ -0,0 +1,224 @@ + + + + + + + Interpreter - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Index Interpreter

+

To prepare your index and transform data, you use one of the existing Interpreter or create one yourself.

+

CoreShop currently has following Interpreters:

+
    +
  • +Object: converts an object or and object array to relations. It saves the values to the relations inex
  • +
  • +ObjectId: converts an object to its ID
  • +
  • +ObjectIdSum: calculates the sum of all IDs. (Could be used for similar products)
  • +
  • +ObjectProperty: calls a getter method of the value
  • +
  • +Soundex: calls PHP soundex function (Could be used for similar products)
  • +
+

Create a Custom Interpreter

+

1 We need to create 2 new files:

+
    +
  • FormType for processing the Input Data
  • +
  • And a InterpreterInterface, which interprets the data
  • +
+

+namespace AppBundle\Index\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\IntegerType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Validator\Constraints\NotBlank;
+use Symfony\Component\Validator\Constraints\Type;
+
+final class MyInterpreterType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->add('myInterpreterData', IntegerType::class, [
+                'constraints' => [
+                    new NotBlank(['groups' => ['coreshop']]),
+                    new Type(['type' => 'numeric', 'groups' => ['coreshop']]),
+                ],
+            ])
+        ;
+    }
+}
+
+
+
namespace AppBundle\CoreShop\Index\Interpreter;
+
+use CoreShop\Component\Index\Interpreter\InterpreterInterface;
+
+class MyInterpreter implements InterpreterInterface
+{
+    public function interpret($value, IndexableInterface $indexable, IndexColumnInterface $config, array $interpreterConfig = []) {
+        //Do some interpretation here
+
+        return $value;
+    }
+}
+
+

2:Register MyInterpreter as service with tag coreshop.index.interpreter, type and form

+
app.index.interpreter.my_interpreter:
+    class: AppBundle\CoreShop\Index\Interpreter\MyInterpreter
+    tags:
+     - { name: coreshop.index.interpreter, type: my_interpreter, form-type: AppBundle\Index\Form\Type\MyInterpreterType}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Index_and_Filters/Index/index.html b/docs/generated-docs/Development/Index_and_Filters/Index/index.html new file mode 100644 index 0000000000..41a45d7d03 --- /dev/null +++ b/docs/generated-docs/Development/Index_and_Filters/Index/index.html @@ -0,0 +1,213 @@ + + + + + + + Index - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Index

+

To create a rich layered navigation (faceted navigation), you need to create an index of your Products.

+

Create a new Index

+

CoreShop currently supports two type of indexes:

+
    +
  • Mysql
  • +
  • ~~Elasticsearch~~
  • +
+

Add Fields

+

To add a new field, simply drag'n'drop the field from the left tree to the right tree.

+

Index Fields

+

Field Properties

+

Every field has some properties that needs to be configured

+

Field

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
KeyPimcore Field Name
NameName in the Index
Getter ClassGetter Class is important for field-types like "Localized Fields", "Classification Store", "Object Brick" and "Field Collection". CoreShop needs it to get the right value for the index
InterpreterUsing Interpreters helps you to transform values before they get stored in the index. For example: Resolving dependencies, create a similarity Index
TypeType of the field in the index, depends on which Index-Type you are using. MySql or Elasticsearch
Getter ConfigConfiguration depends on Getter, for example: Language for Localized Fields
+

Re-Index

+

If you make changes to the index, you need to re-index all of your products. To do that, there is a CLI command.

+
$ php bin/console coreshop:index
+
+

If you don't want to re-index all of your indices, you can pass the corresponding IDs or names of the indices separated +with a space as arguments to the CLI command. The following example will only re-index indices with IDs 1 and 2 and name +"Products". If none of those indices exist, nothing will be re-indexed.

+
$ php bin/console coreshop:index 1 2 Products
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Index_and_Filters/index.html b/docs/generated-docs/Development/Index_and_Filters/index.html new file mode 100644 index 0000000000..2e7671a7c6 --- /dev/null +++ b/docs/generated-docs/Development/Index_and_Filters/index.html @@ -0,0 +1,166 @@ + + + + + + + Index and Filters - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Inventory/index.html b/docs/generated-docs/Development/Inventory/index.html new file mode 100644 index 0000000000..e28aeba65a --- /dev/null +++ b/docs/generated-docs/Development/Inventory/index.html @@ -0,0 +1,169 @@ + + + + + + + Inventory - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Inventory

+

Twig Helper

+

There are some Helpers to check the product inventory.

+

Inventory Available

+
{% if coreshop_inventory_is_available(product) %}
+    {# show cart button since there is at least one item available #}
+{% endif %}
+
+

Inventory is Sufficient

+
{% if coreshop_inventory_is_sufficient(product, 10) %}
+    {# do something here since there are at least 10 items available #}
+{% endif %}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Countries/CRUD.html b/docs/generated-docs/Development/Localization/Countries/CRUD.html new file mode 100644 index 0000000000..df55381498 --- /dev/null +++ b/docs/generated-docs/Development/Localization/Countries/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Countries

+

Create

+

If you want to create a Country via API, you can do following:

+
$newCountry = $container->get('coreshop.factory.country')->createNew();
+
+

Now you have a new Country, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.country')->persist($newCountry);
+$container->get('coreshop.manager.country')->flush();
+
+

You now have a new persisted Country.

+

Read

+

If you want to query for Countries, you can do following:

+
$countryRepository = $container->get('coreshop.repository.country');
+
+$queryBuilder = $countryRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$countries = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Country, you need to do following:

+
// Fetch Country
+
+$country = $countryRepository->findById(1);
+$country->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.country')->persist($country);
+$container->get('coreshop.manager.country')->flush();
+
+

Delete

+

If you want to update and existing Country, you need to do following:

+
// Fetch Country
+
+$country = $countryRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.country')->remove($country);
+$container->get('coreshop.manager.country')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Countries/Context.html b/docs/generated-docs/Development/Localization/Countries/Context.html new file mode 100644 index 0000000000..575e951969 --- /dev/null +++ b/docs/generated-docs/Development/Localization/Countries/Context.html @@ -0,0 +1,283 @@ + + + + + + + Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Country Context

+

For CoreShop to determine the current country the visitor or customer comes from, +it uses a concept called context and context resolver.

+

Context

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePriorityTagDescription
FixedCountryContextdefaultcoreshop.context.countryUsed for testing purposes
CountryContextdefaultcoreshop.context.countryCheck for a country within the country request resolver
StoreAwareCountryContextdefaultcoreshop.context.countryCheck if current country is available in current store context
+

Resolver

+ + + + + + + + + + + + + + + + + +
NamePriorityTagDescription
GeoLiteBasedRequestResolver10coreshop.context.country.request_based.resolverThis Resolver tries to determinate the users location by using the Geo Lite Database.
+

These resolver takes care about finding the correct country for the current request.

+

Create a Custom Resolver

+

A Country Context needs to implement the interface CoreShop\Component\Address\Context\CountryContextInterface. +This interface consists of one method called getCountry which returns a CoreShop\Component\Address\Model\CountryInterface or throws an CoreShop\Component\Address\Context\CountryNotFoundException.

+

To register your context, you need to use the tag: coreshop.context.country with an optional priority attribute.

+

Create a Request based Resolver

+

CoreShop already implements Request based country context resolver. +So if your Context depends on the current request, you can create a custom RequestBased Resolver. +To do that, implement the interface CoreShop\Component\Address\Context\RequestBased\RequestResolverInterface +with the method findCountry. This method either returns a country or null.

+

To register this resolver, use the tag: coreshop.context.country.request_based.resolver with an optional priority attribute.

+

Example

+

We want to a CountryContext to be based on the Pimcore Document. So if we are on site /de, we want to resolve to Austria, if we +are on page /en we want to resolve to Country Great Britain:

+

1: First of all we need to create our RequestBased Country Context:

+
<?php
+
+namespace AppBundle\CoreShop\Address\Context;
+
+use CoreShop\Component\Address\Context\RequestBased\RequestResolverInterface;
+use CoreShop\Component\Address\Repository\CountryRepositoryInterface;
+use Pimcore\Http\Request\Resolver\DocumentResolver;
+use Symfony\Component\HttpFoundation\Request;
+
+final class DocumentBasedRequestRequestResolver implements RequestResolverInterface
+{
+    /**
+     * @var DocumentResolver
+     */
+    private $pimcoreDocumentResolver;
+
+    /**
+     * @var CountryRepositoryInterface
+     */
+    private $countryRepository;
+
+    /**
+     * @param DocumentResolver $pimcoreDocumentResolver
+     * @param CountryRepositoryInterface $countryRepository
+     */
+    public function __construct(DocumentResolver $pimcoreDocumentResolver, CountryRepositoryInterface $countryRepository)
+    {
+        $this->pimcoreDocumentResolver = $pimcoreDocumentResolver;
+        $this->countryRepository = $countryRepository;
+    }
+
+    public function findCountry(Request $request)
+    {
+        $doc = $this->pimcoreDocumentResolver->getDocument($request);
+
+        if (substr($doc->getFullPath(), 0, 3) === '/en') {
+            return $this->countryRepository->findByCode('GB');
+        }
+
+        if (substr($doc->getFullPath(), 0, 3) === '/de') {
+            return $this->countryRepository->findByCode('AT');
+        }
+
+        return null;
+    }
+}
+
+

Now we need to configure the service in src/AppBundle/Resources/config/services.yml

+
services:
+  app.coreshop.country.context.request.document_based:
+    class: AppBundle\CoreShop\Address\Context\DocumentBasedRequestRequestResolver
+    arguments:
+      - '@Pimcore\Http\Request\Resolver\DocumentResolver'
+      - '@coreshop.repository.country'
+    tags:
+      - { name: coreshop.context.country.request_based.resolver }
+
+
+

CoreShop now tries to resolve the current country based on the Pimcore Site we are on.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Countries/index.html b/docs/generated-docs/Development/Localization/Countries/index.html new file mode 100644 index 0000000000..a71969dd57 --- /dev/null +++ b/docs/generated-docs/Development/Localization/Countries/index.html @@ -0,0 +1,168 @@ + + + + + + + Countries - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Currencies/CRUD.html b/docs/generated-docs/Development/Localization/Currencies/CRUD.html new file mode 100644 index 0000000000..c0757dc6d5 --- /dev/null +++ b/docs/generated-docs/Development/Localization/Currencies/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Currencies

+

Create

+

If you want to create a Currency via API, you can do following:

+
$newCurrency = $container->get('coreshop.factory.currency')->createNew();
+
+

Now you have a new Currency, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.currency')->persist($newCurrency);
+$container->get('coreshop.manager.currency')->flush();
+
+

You now have a new persisted Currency.

+

Read

+

If you want to query for Currencies, you can do following:

+
$currencyRepository = $container->get('coreshop.repository.currency');
+
+$queryBuilder = $currencyRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$currencies = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Currency, you need to do following:

+
// Fetch Currency
+
+$currency = $currencyRepository->findById(1);
+$currency->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.currency')->persist($currency);
+$container->get('coreshop.manager.currency')->flush();
+
+

Delete

+

If you want to update and existing Currency, you need to do following:

+
// Fetch Currency
+
+$currency = $currencyRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.currency')->remove($currency);
+$container->get('coreshop.manager.currency')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Currencies/Context.html b/docs/generated-docs/Development/Localization/Currencies/Context.html new file mode 100644 index 0000000000..a2701da269 --- /dev/null +++ b/docs/generated-docs/Development/Localization/Currencies/Context.html @@ -0,0 +1,194 @@ + + + + + + + Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Currency Context

+

For CoreShop to determine the current currency it uses a concept called context and context resolver.

+

Context

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePriorityTagDescription
FixedCurrencyContextdefaultcoreshop.context.currencyUsed for testing purposes
StorageBasedCurrencyContextdefaultcoreshop.context.currencycheck if a currency has been changed during a frontend request
CountryAwareCurrencyContextdefaultcoreshop.context.currencyMostly this context will apply since it will get the currency based on the current country context
+

These Contexts take care about finding the correct currency for the current request.

+

Create a Custom Resolver

+

A Currency Context needs to implement the interface CoreShop\Component\Currency\Context\CurrencyContextInterface. +This interface consists of one method called getCurrency which returns a CoreShop\Component\Currency\Model\CurrencyInterface or throws an CoreShop\Component\Currency\Context\CurrencyNotFoundException

+

To register your context, you need to use the tag: coreshop.context.currency with an optional priority attribute.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Currencies/index.html b/docs/generated-docs/Development/Localization/Currencies/index.html new file mode 100644 index 0000000000..8fe83e5131 --- /dev/null +++ b/docs/generated-docs/Development/Localization/Currencies/index.html @@ -0,0 +1,168 @@ + + + + + + + Currencies - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/States/CRUD.html b/docs/generated-docs/Development/Localization/States/CRUD.html new file mode 100644 index 0000000000..549917cb6c --- /dev/null +++ b/docs/generated-docs/Development/Localization/States/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

States

+

Create

+

If you want to create a State via API, you can do following:

+
$newState = $container->get('coreshop.factory.state')->createNew();
+
+

Now you have a new State, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.state')->persist($newState);
+$container->get('coreshop.manager.state')->flush();
+
+

You now have a new persisted State.

+

Read

+

If you want to query for States, you can do following:

+
$stateRepository = $container->get('coreshop.repository.state');
+
+$queryBuilder = $stateRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$states = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing State, you need to do following:

+
// Fetch State
+
+$state = $stateRepository->findById(1);
+$state->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.state')->persist($state);
+$container->get('coreshop.manager.state')->flush();
+
+

Delete

+

If you want to update and existing State, you need to do following:

+
// Fetch State
+
+$state = $stateRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.state')->remove($state);
+$container->get('coreshop.manager.state')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/States/index.html b/docs/generated-docs/Development/Localization/States/index.html new file mode 100644 index 0000000000..a3e3686cca --- /dev/null +++ b/docs/generated-docs/Development/Localization/States/index.html @@ -0,0 +1,162 @@ + + + + + + + States - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Taxes/Tax_Rate/CRUD.html b/docs/generated-docs/Development/Localization/Taxes/Tax_Rate/CRUD.html new file mode 100644 index 0000000000..fad26a9a6f --- /dev/null +++ b/docs/generated-docs/Development/Localization/Taxes/Tax_Rate/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Tax Rates

+

Create

+

If you want to create a Zone via API, you can do following:

+
$newZone = $container->get('coreshop.factory.tax_rate')->createNew();
+
+

Now you have a new Zone, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.tax_rate')->persist($newZone);
+$container->get('coreshop.manager.tax_rate')->flush();
+
+

You now have a new persisted Zone.

+

Read

+

If you want to query for Tax Rates, you can do following:

+
$rateRepository = $container->get('coreshop.repository.tax_rate');
+
+$queryBuilder = $rateRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$rates = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Zone, you need to do following:

+
// Fetch Zone
+
+$rate = $rateRepository->findById(1);
+$rate->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.tax_rate')->persist($rate);
+$container->get('coreshop.manager.tax_rate')->flush();
+
+

Delete

+

If you want to update and existing Zone, you need to do following:

+
// Fetch Zone
+
+$rate = $rateRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.tax_rate')->remove($rate);
+$container->get('coreshop.manager.tax_rate')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Taxes/Tax_Rate/index.html b/docs/generated-docs/Development/Localization/Taxes/Tax_Rate/index.html new file mode 100644 index 0000000000..da2e3619d9 --- /dev/null +++ b/docs/generated-docs/Development/Localization/Taxes/Tax_Rate/index.html @@ -0,0 +1,165 @@ + + + + + + + Tax Rate - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/CRUD.html b/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/CRUD.html new file mode 100644 index 0000000000..da2a8cb073 --- /dev/null +++ b/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Tax Rules

+

Create

+

If you want to create a Tax Rule via API, you can do following:

+
$newTaxRule = $container->get('coreshop.factory.tax_rule')->createNew();
+
+

Now you have a new Tax Rule, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.tax_rule')->persist($newTaxRule);
+$container->get('coreshop.manager.tax_rule')->flush();
+
+

You now have a new persisted Tax Rule.

+

Read

+

If you want to query for Tax Rules, you can do following:

+
$ruleRepository = $container->get('coreshop.repository.tax_rule');
+
+$queryBuilder = $ruleRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$rules = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Tax Rule, you need to do following:

+
// Fetch Tax Rule
+
+$rule = $ruleRepository->findById(1);
+$rule->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.tax_rule')->persist($rule);
+$container->get('coreshop.manager.tax_rule')->flush();
+
+

Delete

+

If you want to update and existing Tax Rule, you need to do following:

+
// Fetch Tax Rule
+
+$rule = $ruleRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.tax_rule')->remove($rule);
+$container->get('coreshop.manager.tax_rule')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html b/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html new file mode 100644 index 0000000000..bc2f06ce7d --- /dev/null +++ b/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html @@ -0,0 +1,156 @@ + + + + + + + Tax Factory - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/index.html b/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/index.html new file mode 100644 index 0000000000..32db286484 --- /dev/null +++ b/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/index.html @@ -0,0 +1,165 @@ + + + + + + + Tax Rule - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Taxes/index.html b/docs/generated-docs/Development/Localization/Taxes/index.html new file mode 100644 index 0000000000..295103fe69 --- /dev/null +++ b/docs/generated-docs/Development/Localization/Taxes/index.html @@ -0,0 +1,168 @@ + + + + + + + Taxes - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Zones/CRUD.html b/docs/generated-docs/Development/Localization/Zones/CRUD.html new file mode 100644 index 0000000000..b8b47d2d7f --- /dev/null +++ b/docs/generated-docs/Development/Localization/Zones/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Zones

+

Create

+

If you want to create a Zone via API, you can do following:

+
$newZone = $container->get('coreshop.factory.zone')->createNew();
+
+

Now you have a new Zone, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.zone')->persist($newZone);
+$container->get('coreshop.manager.zone')->flush();
+
+

You now have a new persisted Zone.

+

Read

+

If you want to query for Zones, you can do following:

+
$zoneRepository = $container->get('coreshop.repository.zone');
+
+$queryBuilder = $zoneRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$zones = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Zone, you need to do following:

+
// Fetch Zone
+
+$zone = $zoneRepository->findById(1);
+$zone->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.zone')->persist($zone);
+$container->get('coreshop.manager.zone')->flush();
+
+

Delete

+

If you want to update and existing Zone, you need to do following:

+
// Fetch Zone
+
+$zone = $zoneRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.zone')->remove($zone);
+$container->get('coreshop.manager.zone')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/Zones/index.html b/docs/generated-docs/Development/Localization/Zones/index.html new file mode 100644 index 0000000000..fb37ad095e --- /dev/null +++ b/docs/generated-docs/Development/Localization/Zones/index.html @@ -0,0 +1,162 @@ + + + + + + + Zones - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Localization/index.html b/docs/generated-docs/Development/Localization/index.html new file mode 100644 index 0000000000..ab18a8c4cc --- /dev/null +++ b/docs/generated-docs/Development/Localization/index.html @@ -0,0 +1,175 @@ + + + + + + + Localization - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Notification_Rules/Custom_Actions.html b/docs/generated-docs/Development/Notification_Rules/Custom_Actions.html new file mode 100644 index 0000000000..ea30985811 --- /dev/null +++ b/docs/generated-docs/Development/Notification_Rules/Custom_Actions.html @@ -0,0 +1,162 @@ + + + + + + + Custom Actions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Notification_Rules/Custom_Conditions.html b/docs/generated-docs/Development/Notification_Rules/Custom_Conditions.html new file mode 100644 index 0000000000..7f3e484663 --- /dev/null +++ b/docs/generated-docs/Development/Notification_Rules/Custom_Conditions.html @@ -0,0 +1,162 @@ + + + + + + + Custom Conditions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Notification_Rules/Custom_Types.html b/docs/generated-docs/Development/Notification_Rules/Custom_Types.html new file mode 100644 index 0000000000..4567e7186f --- /dev/null +++ b/docs/generated-docs/Development/Notification_Rules/Custom_Types.html @@ -0,0 +1,166 @@ + + + + + + + Custom Types - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Notification Rule Custom Type

+

Notification Types are registered dynamically by using tag-attributes on conditions and actions. If you want to have your own +type, you can do so by adding a new condition or action and specify your own type:

+
services:
+  app.coreshop.notification_rule.condition.order.custom_notification_condition:
+    class: AppBundle\CoreShop\Notification\CustomNotificationCondition
+    tags:
+      - { name: coreshop.notification_rule.condition, type: custom_condition, notification-type: custom, form-type: AppBundle\Form\Type\CoreShop\CustomConditionType }
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Notification_Rules/Triggering.html b/docs/generated-docs/Development/Notification_Rules/Triggering.html new file mode 100644 index 0000000000..7ab7aba305 --- /dev/null +++ b/docs/generated-docs/Development/Notification_Rules/Triggering.html @@ -0,0 +1,173 @@ + + + + + + + Triggering - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Notification Trigger Notifications

+

Triggering Notification events is quite easy, you can use the CoreShop\Component\Notification\Processor\RulesProcessorInterface implemented by service +@coreshop.notification_rule.processor

+

You also need to add different kinds of parameters based on your Notification Type. +In our case, we trigger an Order event.

+
$this->rulesProcessor->applyRules('order', $event->getProposal(), [
+    'fromState' => $event->getMarking()->getPlaces(),
+    'toState' => $event->getTransition()->getTos(),
+    '_locale' => $order->getLocaleCode(),
+    'recipient' => $customer->getEmail(),
+    'firstname' => $customer->getFirstname(),
+    'lastname' => $customer->getLastname(),
+    'orderNumber' => $order->getOrderNumber(),
+    'transition' => $event->getTransition()->getName()
+]);
+
+

The rest is now handled by CoreShop Notifications.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Notification_Rules/index.html b/docs/generated-docs/Development/Notification_Rules/index.html new file mode 100644 index 0000000000..364f6fff20 --- /dev/null +++ b/docs/generated-docs/Development/Notification_Rules/index.html @@ -0,0 +1,703 @@ + + + + + + + Notification Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Notification Rules

+

Notification Rules are responsible for all types of notification triggered by CoreShop. +It handles notification for following types:

+
    +
  • order
  • +
  • quote
  • +
  • invoice
  • +
  • shipment
  • +
  • user
  • +
  • payment
  • +
+

Overview

+

Let's checkout each notification type:

+

Order

+

Allowed Conditions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
Invoice StateDispatch if given Invoice State is active
Invoice TransitionDispatch if given Invoice Transition has been applied
Payment StateDispatch if given Payment State is active
Payment TransitionDispatch if given Payment Transition has been applied
Shipping StateDispatch if given Shipping State is active
Shipping TransitionDispatch if given Shipping Transition has been applied
Order StateDispatch if given Order State is active
Order TransitionDispatch if given Order Transition has been applied
CarriersDispatch if given Carrier has been selected in Order
CommentDispatch if a Comment Action has been applied. Available Types: create comment
+

Allowed Actions

+ + + + + + + + + + + + + + + + + +
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
+

Available Placeholders keys for email templates

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValue
objectObject of type OrderInterface
fromStateState identifier from which it is transitioning away from
toStateState identifier from which it is transitioning to
transitionUsed transition
_localeUsed locale
recipientCustomer E-Mail Address
firstnameCustomer Firstname
lastnameCustomer Lastname
orderNumberOrder Number
+

Available Placeholders keys for email templates for comment

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValue
objectObject of type OrderInterface
_localeUsed locale
recipientCustomer E-Mail Address
firstnameCustomer Firstname
lastnameCustomer Lastname
orderNumberOrder Number
typeType of comment
submitAsEmailshould comment be sent as mail
commentcontents of the comment
+

Shipment

+

Allowed Conditions

+ + + + + + + + + + + + + + + + + +
NameDescription
Shipping StateDispatch if given Shipping State is active
Shipping TransitionDispatch if given Shipping Transition has been applied
+

Allowed Actions

+ + + + + + + + + + + + + + + + + +
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
+

Available Placeholders keys for email templates

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValue
objectObject of type OrderShipmentInterface
orderObject of type OrderInterface
fromStateState identifier from which it is transitioning away from
toStateState identifier from which it is transitioning to
transitionUsed transition
+

Invoice

+

Allowed Conditions

+ + + + + + + + + + + + + + + + + +
NameDescription
Invoice StateDispatch if given Invoice State is active
Invoice TransitionDispatch if given Invoice Transition has been applied
+

Allowed Actions

+ + + + + + + + + + + + + + + + + +
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
+

Available Placeholders keys for email templates

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValue
objectObject of type OrderInvoiceInterface
orderObject of type OrderInterface
fromStateState identifier from which it is transitioning away from
toStateState identifier from which it is transitioning to
transitionUsed transition
+

Payment

+

Allowed Conditions

+ + + + + + + + + + + + + + + + + +
NameDescription
Payment StateDispatch if given Payment State is active
Payment TransitionDispatch if given Payment Transition has been applied
+

Allowed Actions

+ + + + + + + + + + + + + + + + + +
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
+

Available Placeholders keys for email templates

+ + + + + + + + + + + + + + + + + + + + + +
KeyValue
objectObject of type PaymentInterface
orderObject of type OrderInterface
paymentStateState of the Payment
+

User

+

Allowed Conditions

+ + + + + + + + + + + + + +
NameDescription
User TypeDispatch if given Type has been applied. Allowed Types: new account, password reset
+

Allowed Actions

+ + + + + + + + + + + + + +
NameDescription
EmailDefault Email without Order Object
+

Available Placeholders keys for email templates

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValue
objectObject of type CustomerInterface
recipientCustomer E-Mail Address
genderCustomer Gender
firstnameCustomer Firstname
lastnameCustomer Lastname
emailCustomer E-Mail
typetype of customer notification
+

Additional Placeholders keys for Password Reset

+ + + + + + + + + + + + + +
KeyValue
resetLinkLink where customer can reset his Password
+

Additional Placeholders keys for Request Newsletter

+ + + + + + + + + + + + + + + + + +
KeyValue
confirmLinkLink where customer can confirm his Newsletter subscription
tokenConfirmation Token
+

Quote

+

Allowed Conditions

+ + + + + + + + + + + + + +
NameDescription
CarriersDispatch if given Carrier has been selected in Order
+

Allowed Actions

+ + + + + + + + + + + + + +
NameDescription
EmailDefault Email without Order Object
+

Available Placeholders keys for email templates

+ + + + + + + + + + + + + +
KeyValue
objectObject of type QuoteInterface
+

Custom Implementation

+

It's also easy to implement custom notification rules. Read more about this here

+

Extend CoreShop Notification Rules

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Order/AdditionalData.html b/docs/generated-docs/Development/Order/AdditionalData.html new file mode 100644 index 0000000000..ca8ece04a9 --- /dev/null +++ b/docs/generated-docs/Development/Order/AdditionalData.html @@ -0,0 +1,289 @@ + + + + + + + AdditionalData - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Additional Data in Order

+

Sometimes you need to implement additional information in your order (Besides the comment field, which is available by default in the shipping checkout step).

+
+

Note: To add custom fields you need a custom checkout step.

+
+
    +
  1. Create your custom brick and apply it to the classes:
  2. +
+
    +
  • Cart (additionalData)
  • +
  • Order (additionalData)
  • +
  • Quote (additionalData)
  • +
+
    +
  1. Add fields to your custom checkout step (createForm()):
  2. +
+
$form->add('af_secretField', TextType::class, [
+    'required' => false,
+    'label' => 'coreshop.ui.your_secret_field'
+]);
+$form->add('af_secondSecretField', TextType::class, [
+    'required' => false,
+    'label' => 'coreshop.ui.your_second_secret_field'
+]);
+
+
    +
  1. Store data in cart (commitStep())
  2. +
+
use Pimcore\Model\DataObject\Objectbrick\Data\AdditionalField;
+
+if ($form->isSubmitted()) {
+    if ($form->isValid()) {
+        $formData = $form->getData();
+        if(!empty($formData['af_secretField'])) {
+            $brick = new AdditionalField($cart);
+            $brick->setSecretField($formData['af_secretField']);
+            $brick->setSecondSecretField($formData['af_secondSecretField']);
+            $cart->getAdditionalData()->setAdditionalField($brick);
+        }
+        $cart->save();
+        return true;
+    }
+}
+
+

That's it - your additional data is now available in backend. +If you want to display those fields in the overview, you need to add some JS:

+
core_shop_core:
+    pimcore_admin:
+        js:
+            filter_condition_relational_multi_select: '/bundles/app/additionalData.js'
+
+

This file has to extend coreshop.order.sale.detail.abstractBlock +and requires several methods: initBlock, updateSale, getPanel, getPriority and getPosition.

+
pimcore.registerNS('coreshop.order.order.detail.blocks.yourBlockName');
+coreshop.order.order.detail.blocks.yourBlockName = Class.create(coreshop.order.sale.detail.abstractBlock, {
+
+    saleInfo: {},
+    hasItems: true,
+
+    initBlock: function () {
+        this.saleInfo = Ext.create('Ext.panel.Panel', {
+            title: t('coreshop_order_additional_data'),
+            margin: '0 20 20 0',
+            border: true,
+            flex: 8
+        });
+    },
+
+    updateSale: function () {
+
+        var items = [],
+            subItems = [];
+
+        //console.log(this.sale.additionalData);
+
+        var items = [], subItems = [];
+
+        Ext.Array.each(this.sale.additionalData, function (block, i) {
+            var data = block.data;
+            subItems.push({
+                xtype: 'label',
+                style: 'font-weight:bold;display:block',
+                text: 'Title for your custom field A'
+            },
+            {
+                xtype: 'label',
+                style: 'display:block',
+                html: data.secretField
+            });
+            subItems.push({
+                xtype: 'label',
+                style: 'font-weight:bold;display:block',
+                text: 'Title for your custom field B'
+            },
+            {
+                xtype: 'label',
+                style: 'display:block',
+                html: data.secondSecretField
+            })
+        });
+
+        if (subItems.length === 0) {
+            this.hasItems = false;
+            return;
+        }
+
+        items.push({
+            xtype: 'panel',
+            bodyPadding: 10,
+            margin: '0 0 10px 0',
+            items: subItems
+        });
+
+        // remove all before adding new ones
+        // otherwise they will append during a refresh
+        this.saleInfo.removeAll();
+
+        this.saleInfo.add(items);
+    },
+
+    getPanel: function () {
+        return this.hasItems ? this.saleInfo : null;
+    },
+
+    getPriority: function () {
+        return 10;
+    },
+
+    getPosition: function () {
+        return 'right';
+    }
+});
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Order/Invoice/Invoice_Creation.html b/docs/generated-docs/Development/Order/Invoice/Invoice_Creation.html new file mode 100644 index 0000000000..2d14a17a61 --- /dev/null +++ b/docs/generated-docs/Development/Order/Invoice/Invoice_Creation.html @@ -0,0 +1,178 @@ + + + + + + + Invoice Creation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Invoice Creation

+

See Order Transformer for more.

+

Add a Invoice to an Order

+
/**
+ * Note:
+ *
+ * The TRANSITION_REQUEST_INVOICE transition can only be applied once.
+ * Only dispatch it with the creation of the first invoice.
+ * This transition will inform the order invoice workflow that it's ready to initiate the invoice processing.
+*/
+$workflow = $this->getStateMachineManager()->get($order, 'coreshop_order_invoice');
+$workflow->apply($order, OrderInvoiceTransitions::TRANSITION_REQUEST_INVOICE);
+
+$order = '';
+
+/** @var InvoiceInterface $invoice */
+$invoice = $this->container->get('coreshop.factory.order_invoice')->createNew();
+$invoice->setState(InvoiceStates::STATE_NEW);
+
+$items = [];
+$invoice = $this->get('coreshop.order.transformer.order_to_invoice')->transform($order, $invoice, $items);
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Order/Invoice/index.html b/docs/generated-docs/Development/Order/Invoice/index.html new file mode 100644 index 0000000000..841dfd574e --- /dev/null +++ b/docs/generated-docs/Development/Order/Invoice/index.html @@ -0,0 +1,158 @@ + + + + + + + Invoice - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Order/OrderList/Action.html b/docs/generated-docs/Development/Order/OrderList/Action.html new file mode 100644 index 0000000000..e723f0c945 --- /dev/null +++ b/docs/generated-docs/Development/Order/OrderList/Action.html @@ -0,0 +1,250 @@ + + + + + + + Action - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Order List Actions

+

Actions allows you to process orders rapidly, right in the order grid view.

+

filter

+

Register Filter Service

+
AppBundle\CoreShop\OrderList\Action\Demo:
+    arguments:
+        $stateMachineManager: '@coreshop.state_machine_manager'
+        $shipmentRepository: '@coreshop.repository.order_shipment'
+    tags:
+        - { name: coreshop.grid.action, type: demo }
+
+

Create PHP Class

+

In this example we want to apply the shipment transition "ship" to selected orders.

+
<?php
+
+namespace AppBundle\CoreShop\OrderList\Action;
+
+use CoreShop\Component\Order\Repository\OrderShipmentRepositoryInterface;
+use CoreShop\Bundle\WorkflowBundle\Manager\StateMachineManagerInterface;
+use CoreShop\Component\Pimcore\DataObject\Grid\GridActionInterface;
+use Pimcore\Model\DataObject\CoreShopOrder;
+
+class DemoAction implements GridActionInterface
+{
+    protected $stateMachineManager;
+
+    protected $shipmentRepository;
+
+    public function __construct(
+        StateMachineManagerInterface $stateMachineManager,
+        OrderShipmentRepositoryInterface $shipmentRepository
+    ) {
+        $this->stateMachineManager = $stateMachineManager;
+        $this->shipmentRepository = $shipmentRepository;
+    }
+
+    public function getName(): string
+    {
+        return 'coreshop.order.demo';
+    }
+
+    public function apply(array $processIds): string
+    {
+        $message = '';
+        $transition = 'ship';
+        $shipmentIds = [];
+
+        foreach ($processIds as $id) {
+
+            $m = [];
+            $order = CoreShopOrder::getById($id);
+            $shipments = $this->shipmentRepository->getDocuments($order);
+
+            if (count($shipments) === 0) {
+                $m[] = sprintf('- no shipments for order %s found. skipping....', $order->getId());
+            } else {
+                foreach ($shipments as $shipment) {
+                    if ($shipment->getState() === 'shipped') {
+                        $m[] = sprintf('- transition "%s" for shipment %s already applied. skipping...', $transition, $shipment->getId());
+                        continue;
+                    }
+                    $workflow = $this->stateMachineManager->get($shipment, 'coreshop_shipment');
+                    if (!$workflow->can($shipment, $transition)) {
+                        $m[] = sprintf('- transition "%s" for shipment %s not allowed.', $transition, $shipment->getId());
+                    } else {
+                        try {
+                            $workflow->apply($shipment, $transition);
+                            $shipmentIds[] = $shipment->getId();
+                            $m[] = sprintf('- transition "%s" for shipment id %s successfully applied.', $transition, $shipment->getId());
+                        } catch (\Exception $e) {
+                            $m[] = sprintf('- error while applying transition "%s" to shipment with id %s: %s.', $transition, $shipment->getId(), $e->getMessage());
+                        }
+                    }
+                }
+            }
+
+            $message .= sprintf('<strong>Order %s:</strong><br>%s<br>', $id, join('<br>', $m));
+
+        }
+
+        if (count($shipmentIds) > 0) {
+            $packingListUrl = '/admin/your-packing-list-generator-url?ids=' . join(',', $shipmentIds);
+            $message .= sprintf('<br><a href="%s" target="_blank">%s</a><br>', $packingListUrl, 'packing list');
+        }
+
+        return $message;
+    }
+
+    public function supports(string $listType): bool
+    {
+        return $listType === 'coreshop_order';
+    }
+}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Order/OrderList/Filter.html b/docs/generated-docs/Development/Order/OrderList/Filter.html new file mode 100644 index 0000000000..da0156ad0b --- /dev/null +++ b/docs/generated-docs/Development/Order/OrderList/Filter.html @@ -0,0 +1,203 @@ + + + + + + + Filter - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Order List Filter

+

This comes in handy if you need some special filtered data in your Order List. +Your Customer is able to filter orders on specific conditions.

+

filter

+

Register Filter Service

+
AppBundle\CoreShop\OrderList\Filter\DemoFilter:
+    tags:
+        - { name: coreshop.grid.filter, type: demo }
+
+

Create PHP Class

+

In this example we want to filter orders with available shipments in state "ready".

+
<?php
+
+namespace AppBundle\CoreShop\OrderList\Filter;
+
+use CoreShop\Component\Pimcore\DataObject\Grid\GridFilterInterface;
+use Pimcore\Db\ZendCompatibility\QueryBuilder;
+use Pimcore\Model\DataObject;
+
+class DemoFilter implements GridFilterInterface
+{
+    public function getName(): string
+    {
+        return 'coreshop.order_filter.shipment_apply';
+    }
+
+    public function filter(DataObject\Listing $list, array $context): DataObject\Listing
+    {
+        $list->onCreateQuery(function (QueryBuilder $select) use ($list) {
+            $select->join(
+                ['shipment' => 'object_query_4'],
+                'shipment.order__id = object_' . $list->getClassId() . '.o_id'
+            );
+        });
+
+        $list->addConditionParam('orderState = ?', 'confirmed');
+        $list->addConditionParam('shipment.state = ?', 'ready');
+
+        return $list;
+    }
+
+    public function supports(string $listType): bool
+    {
+        return $listType === 'coreshop_order';
+    }
+}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Order/Order_Creation.html b/docs/generated-docs/Development/Order/Order_Creation.html new file mode 100644 index 0000000000..53a7f5a968 --- /dev/null +++ b/docs/generated-docs/Development/Order/Order_Creation.html @@ -0,0 +1,164 @@ + + + + + + + Order Creation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Order Creation

+

Orders are usually getting created through the Checkout Step. If you ever need to create an Order manually, there are multiple ways.

+

Order CRUD

+

You can always use the Pimcore API to create Orders, in CoreShop you would do it through the Factory:

+
$factory = $container->get('coreshop.factory.order')->createNew();
+
+

You can now fill the Order with all necessary information.

+

The more usual way to create Orders is through Carts or Quotes. Therefore CoreShop implements Transformer for that.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Order/Order_Workflow.html b/docs/generated-docs/Development/Order/Order_Workflow.html new file mode 100644 index 0000000000..a5218b3a39 --- /dev/null +++ b/docs/generated-docs/Development/Order/Order_Workflow.html @@ -0,0 +1,158 @@ + + + + + + + Order Workflow - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Order/Purchasable.html b/docs/generated-docs/Development/Order/Purchasable.html new file mode 100644 index 0000000000..51cf5e4381 --- /dev/null +++ b/docs/generated-docs/Development/Order/Purchasable.html @@ -0,0 +1,210 @@ + + + + + + + Purchasable - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Order Purchasable

+

Items, you want to add to your Cart/Order/Quote, need to implement CoreShop\Component\Order\Model\PurchasableInterface.

+

The concept of Purchasable allows us to decouple CoreShops Order Component from the Product Component and makes the Cart/Quote/Order more flexible +in ways of which object types can be used.

+
+

A Purchasable does not a have Price directly +You need create a class that implements CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface. +in order to calculate price

+
+

Implementation of a new Purchasable Price Calculator

+

To implement a new custom Purchasable Price Calculator, you need to implement the interface CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface.

+

As an example, we create a ProductSetCalculator, which takes prices of each consisting Product:

+
<?php
+
+namespace AppBundle\CoreShop\Order\Calculator;
+
+use CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface;
+use CoreShop\Component\Order\Exception\NoPurchasablePriceFoundException;use CoreShop\Component\Order\Model\PurchasableInterface;
+use Pimcore\Model\Product\ProductSet;
+
+final class ProductSetCalculator implements PurchasablePriceCalculatorInterface
+{
+    private PurchasablePriceCalculatorInterface $purchasablePriceCalculator;
+
+    public function __construct(PurchasablePriceCalculatorInterface $purchasablePriceCalculator)
+    {
+        $this->purchasablePriceCalculator = $purchasablePriceCalculator;
+    }
+
+    public function getPrice(PurchasableInterface $purchasable, array $context, bool $includingDiscounts = false): int
+    {
+        if ($purchasable instanceof ProductSet) {
+            $price = 0;
+
+            foreach ($purchasable->getProducts() as $product) {
+                $price .= $this->purchasablePriceCalculator->getPrice($product);
+            }
+
+            return $price;
+        }
+
+        throw new NoPurchasablePriceFoundException($this);
+    }
+
+}
+
+

Now we need to register our Service to the Container:

+
app.coreshop.order.purchasable.price_calculator.product_set:
+    class: AppBundle\CoreShop\Order\Calculator\ProductSetCalculator
+    arguments:
+        - '@coreshop.order.purchasable.price_calculator'
+    tags:
+     - { name: coreshop.order.purchasable.price_calculator, type: product_set, priority: 20 }
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Order/Shipment/Shipment_Creation.html b/docs/generated-docs/Development/Order/Shipment/Shipment_Creation.html new file mode 100644 index 0000000000..4f2f6ed204 --- /dev/null +++ b/docs/generated-docs/Development/Order/Shipment/Shipment_Creation.html @@ -0,0 +1,178 @@ + + + + + + + Shipment Creation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Shipment Creation

+

See Order Transformer for more.

+

Add a Shipment to an Order

+
/**
+ * Note:
+ *
+ * The TRANSITION_REQUEST_SHIPMENT transition can only be applied once.
+ * Only dispatch it with the creation of the first shipment.
+ * This transition will inform the order shipment workflow that it's ready to initiate the shipment processing.
+*/
+$workflow = $this->getStateMachineManager()->get($order, 'coreshop_order_shipment');
+$workflow->apply($order, OrderShipmentTransitions::TRANSITION_REQUEST_SHIPMENT);
+
+$order = '';
+
+/** @var ShipmentInterface $shipment */
+$shipment = $this->container->get('coreshop.factory.order_shipment')->createNew();
+$shipment->setState(ShipmentStates::STATE_NEW);
+
+$items = [];
+$shipment = $this->get('coreshop.order.transformer.order_to_shipment')->transform($order, $shipment, $items);
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Order/Shipment/index.html b/docs/generated-docs/Development/Order/Shipment/index.html new file mode 100644 index 0000000000..4401485cc3 --- /dev/null +++ b/docs/generated-docs/Development/Order/Shipment/index.html @@ -0,0 +1,158 @@ + + + + + + + Shipment - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Shipment

+

CoreShop comes with an Shipment (Delivery Slip) creation feature. This means, it can create Shipments for Orders based on Workflow States.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Order/TemplateHelper.html b/docs/generated-docs/Development/Order/TemplateHelper.html new file mode 100644 index 0000000000..c174000dfa --- /dev/null +++ b/docs/generated-docs/Development/Order/TemplateHelper.html @@ -0,0 +1,161 @@ + + + + + + + TemplateHelper - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Order/Transformer.html b/docs/generated-docs/Development/Order/Transformer.html new file mode 100644 index 0000000000..95e0970d1e --- /dev/null +++ b/docs/generated-docs/Development/Order/Transformer.html @@ -0,0 +1,201 @@ + + + + + + + Transformer - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Transfomers

+

Transfomers, as the name say, transform Data from different formats. A transformer converts between Object Types. For example: Cart -> Order. Following implementation do exist right now:

+ +

The base transformer interface for all "Proposals" is CoreShop\Component\Order\Transformer\ProposalTransformerInterface

+

Extending Transfomers

+

If you ever have the need to adapt the transfomer, eg. hook into it and store some custom data into the order, you can do so +by decorating the default service. Following Services are used by CoreShop for all different Transfomers:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FromToService
OrderInvoicecoreshop.order.transformer.order_to_invoice
OrderItemInvoiceItemcoreshop.order_invoice.transformer.cart_item_to_order_item
OrderShipmentcoreshop.order.transformer.order_to_invoice
OrderItemShipmentItemcoreshop.order_invoice.transformer.order_item_to_shipment_item
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Order/index.html b/docs/generated-docs/Development/Order/index.html new file mode 100644 index 0000000000..b6569b399a --- /dev/null +++ b/docs/generated-docs/Development/Order/index.html @@ -0,0 +1,190 @@ + + + + + + + Order - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Payment/Omnipay_Bridge.html b/docs/generated-docs/Development/Payment/Omnipay_Bridge.html new file mode 100644 index 0000000000..4c6a29dbf3 --- /dev/null +++ b/docs/generated-docs/Development/Payment/Omnipay_Bridge.html @@ -0,0 +1,282 @@ + + + + + + + Omnipay Bridge - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Payum Ominpay Bridge

+

Here is a list of all available Omnipay Payment Providers.

+
+

As of now, Omnipay is not compatible with Symfony 3. They are already working on it, but will need some time to be finished. +But: You can use the dev-master Version Omnipay to add the Bridge

+
+

To add the Omnipay Bridge, do following:

+
$ composer require payum/omnipay-v3-bridge:dev-master
+
+

This will install the Bridge for you.

+

Now you still need to create your Gateway Configuration as described here.

+

Example of Omnipay Gateway Configuration

+

As example we add omnipay-worldpay:

+
+

Worldpay is currently in PR and I don't know when it is getting merged

+
+

1: add FormType for Worldpay Configuration:

+
<?php
+
+namespace AppBundle\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\PasswordType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Form\FormEvent;
+use Symfony\Component\Form\FormEvents;
+use Symfony\Component\Validator\Constraints\NotBlank;
+
+final class WorldpayType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->add('serviceKey', TextType::class, [
+                'constraints' => [
+                    new NotBlank([
+                        'groups' => 'coreshop',
+                    ]),
+                ],
+            ])
+            ->add('clientKey', PasswordType::class, [
+                'constraints' => [
+                    new NotBlank([
+                        'groups' => 'coreshop',
+                    ]),
+                ],
+            ])
+            ->add('merchantId', TextType::class, [
+                'constraints' => [
+                    new NotBlank([
+                        'groups' => 'coreshop',
+                    ]),
+                ],
+            ])
+            ->add('factory', TextType::class, [
+                'data' => 'omnipay',
+                'empty_data' => 'omnipay'
+            ])
+            ->add('type', TextType::class, [
+                'data' => 'WorldPay\\Json',
+                'empty_data' => 'WorldPay\\Json'
+            ])
+            ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
+                $data = $event->getData();
+
+                $data['payum.http_client'] = '@coreshop.payum.http_client';
+            })
+        ;
+    }
+}
+
+
+

Register into the container:

+
services:
+  app.form.type.gateway_configuration.worldpay:
+    class: AppBundle\Form\Type\WorldpayType
+    tags:
+      - { name: coreshop.gateway_configuration_type, type: omnipay_worldpay }
+      - { name: form.type }
+
+
+

Its important that it starts with omnipay_ here

+
+

2: Add ExtJs Form:

+
pimcore.registerNS('coreshop.provider.gateways.omnipay_worldpay');
+coreshop.provider.gateways.omnipay_worldpay = Class.create(coreshop.provider.gateways.abstract, {
+
+    getLayout: function (config) {
+        return [
+            {
+                xtype: 'textfield',
+                fieldLabel: t('coreshop_worldpay_service_key'),
+                name: 'gatewayConfig.config.serviceKey',
+                length: 255,
+                value: config.serviceKey ? config.serviceKey : ""
+            },
+            {
+                xtype: 'textfield',
+                fieldLabel: t('coreshop_worldpay_client_key'),
+                name: 'gatewayConfig.config.clientKey',
+                length: 255,
+                value: config.clientKey
+            },
+            {
+                xtype: 'textfield',
+                fieldLabel: t('coreshop_worldpay_merchant_id'),
+                name: 'gatewayConfig.config.merchantId',
+                length: 255,
+                value: config.merchantId
+            }
+        ];
+    }
+
+});
+
+

Register JS File for CoreShop to be loaded:

+
core_shop_payment:
+    pimcore_admin:
+      js:
+        worldpay: /bundles/app/pimcore/static/js/payment/provider/worldpay.js
+
+

Thats it, now you can create a new Payment Provider in the Backend and use Omnipay WorldPay as Payment Provider.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Payment/Payment_Provider.html b/docs/generated-docs/Development/Payment/Payment_Provider.html new file mode 100644 index 0000000000..77d5056d87 --- /dev/null +++ b/docs/generated-docs/Development/Payment/Payment_Provider.html @@ -0,0 +1,261 @@ + + + + + + + Payment Provider - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Payment Providers

+

A Payment Provider represents a way that your customer pays during the checkout process. +It holds a reference to a specific gateway with custom configuration. +A gateway is configured for each payment method separately using the payment method form.

+

Payment Gateway configuration

+

Payment Gateways that already have a CoreShop bridge

+

First you need to create the configuration form type for your gateway. +Have a look at the configuration form types of Paypal and Sofort.

+

Then you should register its configuration form type with coreshop.gateway_configuration_type tag. +After that it will be available in the admin panel in the gateway choice dropdown.

+
+

If you are not sure how your configuration form type should look like, +head to Payum documentation.

+
+

Other Payment Gateways

+
+

Learn more about integrating payment gateways in the Payum docs.

+
+
+

You’ll probably need also this kind of configuration in your app/config/config.yml for the gateway’s factory:

+
payum:
+    gateways:
+       yourgateway:
+           factory: yourgateway
+
+
+

As an example, we add Sofort as a payment gateway factory. +To add a new gateway configuration you need to add 2 files:

+
    +
  • A new FormType for configuration values
  • +
  • A new Javascript File for ExtJs Form
  • +
+

1: Form Type for Configuration Values:

+

+namespace AppBundle\CoreShop\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Form\FormEvent;
+use Symfony\Component\Form\FormEvents;
+use Symfony\Component\Validator\Constraints\NotBlank;
+
+final class SofortGatewayConfigurationType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->add('config_key', TextType::class, [
+                'constraints' => [
+                    new NotBlank([
+                        'groups' => 'coreshop',
+                    ]),
+                ],
+            ])
+            ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
+                $data = $event->getData();
+
+                $data['payum.http_client'] = '@coreshop.payum.http_client';
+            })
+        ;
+    }
+}
+
+
+

Now we register the FormType into the container

+
services:
+  app.coreshop.form.type.gateway_configuration.sofort:
+    class: AppBundle\Form\Type\SofortGatewayConfigurationType
+    tags:
+      - { name: coreshop.gateway_configuration_type, type: sofort }
+      - { name: form.type }
+
+

2: Create the corresponding ExtJs Form:

+
+

You need to use the type attribute as identifier here

+
+
pimcore.registerNS('coreshop.provider.gateways.sofort');
+coreshop.provider.gateways.sofort = Class.create(coreshop.provider.gateways.abstract, {
+
+    getLayout: function (config) {
+        return [
+            {
+                xtype: 'textfield',
+                fieldLabel: t('config_key'),
+                name: 'gatewayConfig.config.config_key',
+                length: 255,
+                value: config.config_key ? config.config_key : ""
+            }
+        ];
+    }
+
+});
+
+
+

Next we need to register our new Gateway JS file to be loaded:

+
core_shop_payment:
+    pimcore_admin:
+        js:
+            sofort_gateway: '/bundles/app/pimcore/js/sofort.js'
+
+

Thats it, now after reloading Pimcore, you'll see a new Factory.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Payment/Payum_Providers.html b/docs/generated-docs/Development/Payment/Payum_Providers.html new file mode 100644 index 0000000000..73d264db7f --- /dev/null +++ b/docs/generated-docs/Development/Payment/Payum_Providers.html @@ -0,0 +1,158 @@ + + + + + + + Payum Providers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Payment/index.html b/docs/generated-docs/Development/Payment/index.html new file mode 100644 index 0000000000..946188e89e --- /dev/null +++ b/docs/generated-docs/Development/Payment/index.html @@ -0,0 +1,246 @@ + + + + + + + Payment - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Payment

+

CoreShop contains a very flexible payments management system with support for many gateways (payment providers). +We are using a payment abstraction library - Payum, +which handles all sorts of capturing, refunding and recurring payments logic.

+

On CoreShop side, we integrate it into our checkout and manage all the payment data.

+

Available Payment Gateways for CoreShop

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameStateLinkSupportOffsiteSupports Server-NotificationSupports Refund
HeidelpaystableGithubPayPal, Klarna Sofort, Credit CardNoYesNo
SaferPaystableGithubSupported Payment MethodsYesYesPartially
PostFinancestableGithubPostFinance Card, PostFinance E-Finance, Visa, MasterCard, Diners Club, American Express, JCB, PayPal, TWINTYesYesNo
PowerPaydevGithubinvoice, automatic credit checkNoNo (not required)No
CuraBilldevGithubinvoice, instalments via iframeNoNo (not required)No
+

Payment

+

Every payment in CoreShop, successful or failed, is represented by the payment model, +which contains basic information and a reference to appropriate order.

+

Create a Payment programmatically

+

As usually, use a factory to create a new PaymentMethod and give it a unique code.

+
$payment = $this->container->get('coreshop.factory.payment')->createNew();
+
+$payment->setOrder($order);
+$payment->setCurrencyCode('EUR');
+
+$this->container->get('coreshop.repository.payment')->add($payment);
+
+

More

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Products/CRUD.html b/docs/generated-docs/Development/Products/CRUD.html new file mode 100644 index 0000000000..c2c9bf984d --- /dev/null +++ b/docs/generated-docs/Development/Products/CRUD.html @@ -0,0 +1,203 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product

+

CoreShop uses Pimcore Data Objects to persist Product Information. But, it adds a little wrapper around it to be more +dynamic and configurable. It uses a Factory and Repository Pattern to do that.

+

Create

+

If you want to create a new Product, we need to get our Factory Service for that:

+
$productFactory = $container->get('coreshop.factory.product');
+$product = $productFactory->createNew();
+
+

No we have our product and we can set all needed values.

+

If you now want to save it, just call the save function

+
$product->save();
+
+

Read

+

To get products, you need to use the Repository Service CoreShop provides you.

+
$repository = $container->get('coreshop.repository.product');
+
+
+// Query by ID
+$productWithIdOne = $repository->findById(1);
+
+// Get a Listing how you know it from Pimcore
+$list = $repository->getList();
+$list->setCondition("active = 1");
+$products = $list->getObjects();
+
+
+

Update

+

Update works the same as you are used to in Pimcore

+
$repository = $container->get('coreshop.repository.product');
+
+
+// Query by ID
+$productWithIdOne = $repository->findById(1);
+
+// Change values
+$productWithIdOne->setName('test');
+$productWithIdOne->save();
+
+

Delete

+

Delete works the same as you are used to in Pimcore

+
$repository = $container->get('coreshop.repository.product');
+
+
+// Query by ID
+$productWithIdOne = $repository->findById(1);
+$productWithIdOne->delete();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Products/Configuration.html b/docs/generated-docs/Development/Products/Configuration.html new file mode 100644 index 0000000000..fcbf139d1c --- /dev/null +++ b/docs/generated-docs/Development/Products/Configuration.html @@ -0,0 +1,169 @@ + + + + + + + Configuration - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Configuration

+
core_shop_product:
+    pimcore:
+        product:
+            path: coreshop/products
+            classes:
+                repository: CoreShop\Bundle\CoreBundle\Pimcore\Repository\ProductRepository
+                install_file: '@CoreShopCoreBundle/Resources/install/pimcore/classes/CoreShopProductBundle/CoreShopProduct.json'
+                model: Pimcore\Model\DataObject\CoreShopProduct
+                interface: CoreShop\Component\Product\Model\ProductInterface
+                factory: CoreShop\Component\Resource\Factory\PimcoreFactory
+                type: object
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Products/Multiple_Product_DataObjects.html b/docs/generated-docs/Development/Products/Multiple_Product_DataObjects.html new file mode 100644 index 0000000000..44761dac9a --- /dev/null +++ b/docs/generated-docs/Development/Products/Multiple_Product_DataObjects.html @@ -0,0 +1,295 @@ + + + + + + + Multiple Product DataObjects - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Multiple Product DataObjects

+

CoreShop comes with one pre-installed Product Class (CoreShopProduct), which in most cases is enough. In some cases, you might want to use separated classes with different purposes. For example a ProductSet, which consists of multiple Products but also needs to be available for complex price calculations like Price Rules.

+

First of all, we need to create a new DataObject Class in Pimcore. A basic Purchasable Product only needs to implement \CoreShop\Component\Order\Model\PurchasableInterface but since we want to allow complex price calculation, we need to implement CoreShop\Component\Core\Model\ProductInterface.

+
+

Note +If your Product is very simple and you do not need complex price calculations +you then only need to implement \CoreShop\Component\Order\Model\PurchasableInterface

+
+

Easiest way to create the new class is:

+
    +
  • +1: Open Pimcore DataObject Editor
  • +
  • +2: Add a new Class called ProductSet
  • +
  • +3: Import CoreShop Default Product Class (CoreShopProduct.json)
  • +
  • +4: Adapt to your needs
  • +
  • +5: Register your ProductSet Class to CoreShop:
  • +
+
<?php
+
+//src/AppBundle/DependencyInjection/Configuration.php
+
+namespace AppBundle\DependencyInjection;
+
+use CoreShop\Bundle\ProductBundle\Pimcore\Repository\ProductRepository;
+use CoreShop\Bundle\ResourceBundle\CoreShopResourceBundle;
+use CoreShop\Component\Product\Model\ProductInterface;
+use CoreShop\Component\Resource\Factory\PimcoreFactory;
+use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
+use Symfony\Component\Config\Definition\Builder\TreeBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+final class Configuration implements ConfigurationInterface
+{
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('app');
+
+        $rootNode
+            ->children()
+                ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end()
+            ->end()
+        ;
+
+        $this->addModelsSection($rootNode);
+
+        return $treeBuilder;
+    }
+
+    //Add your configuration here
+    private function addModelsSection(ArrayNodeDefinition $node)
+    {
+        $node
+            ->children()
+                ->arrayNode('pimcore')
+                    ->addDefaultsIfNotSet()
+                    ->children()
+                        ->arrayNode('product_set')
+                            ->addDefaultsIfNotSet()
+                            ->children()
+                                ->variableNode('options')->end()
+                                ->scalarNode('path')->defaultValue('products')->end()
+                                ->arrayNode('classes')
+                                    ->addDefaultsIfNotSet()
+                                    ->children()
+                                        ->scalarNode('model')->defaultValue('Pimcore\Model\DataObject\ProductSet')->cannotBeEmpty()->end()
+                                        ->scalarNode('interface')->defaultValue(ProductInterface::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('factory')->defaultValue(PimcoreFactory::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('repository')->defaultValue(ProductRepository::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('install_file')->defaultValue('@CoreShopProductBundle/Resources/install/pimcore/classes/CoreShopProduct.json')->end()
+                                        ->scalarNode('type')->defaultValue(CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT)->cannotBeOverwritten(true)->end()
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+}
+
+
<?php
+
+//src/AppBundle/DependencyInjection/AppExtension.php
+
+namespace AppBundle\DependencyInjection;
+
+use CoreShop\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractModelExtension;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
+
+class AppExtension extends AbstractModelExtension
+{
+    public function load(array $config, ContainerBuilder $container)
+    {
+        $config = $this->processConfiguration($this->getConfiguration([], $container), $config);
+        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
+
+        //Register the model to the container
+        $this->registerPimcoreModels('app', $config['pimcore'], $container);
+
+        //Alternative you can do it manually like:
+
+        $this->registerPimcoreModels('app', [
+            'product_set' => [
+                'path' => '/product-sets',
+                'classes' => [
+                    'model' => 'Pimcore\Model\DataObject\ProductSet',
+                    'interface' => ProductInterface::class,
+                    'factory' => PimcoreFactory::class,
+                    'type' => CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT
+                ]
+            ]
+        ], $container);
+
+        $loader->load('services.yml');
+    }
+}
+
+
    +
  • +6: You can now use the new ObjectClass as you wish, CoreShop automatically recognises it as ProductClass and your are allowed to use it in PriceRules.
  • +
+
+

Note: +For the Class to be allowed as href/multihref in Pimcore, you need to adapt following classes as well:

+
    +
  • CoreShopCartItem
  • +
  • CoreShopOrderItem
  • +
  • CoreShopQuoteItem
  • +
+

Check for the product field and add your new ProductSet there as allowed references.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Products/Price_Calculation.html b/docs/generated-docs/Development/Products/Price_Calculation.html new file mode 100644 index 0000000000..4b3935e9ae --- /dev/null +++ b/docs/generated-docs/Development/Products/Price_Calculation.html @@ -0,0 +1,255 @@ + + + + + + + Price Calculation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Price Calculation

+

CoreShop uses multiple Price Calculators to determine the correct price for a product. Per default following Calculators are used

+ +

These two are only the default implementations, if you need a custom Calculator, you need to implement the Interface

+

CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface and register your service with the tag +coreshop.product.price_calculator, a type attribute and a priority

+

What prices does CoreShop calculate?

+

CoreShop Price Calculation consists of 3 different prices:

+
    +
  • +Retail Price: Base Price without any discounts
  • +
  • +Discount Price: Special Price for promotions. Needs to return a price smaller than retail price, otherwise retail price is valid
  • +
  • +Discount: Discount from promotions
  • +
  • +Price: Retail Price or Discount Price (if available) minus discount rules
  • +
+

The default is always to use store values prices.

+

Calculator Service

+

If you want to calculate the Price for a Product, you need to use a special service to do that. There are two options:

+

1: coreshop.product.price_calculator which calculates prices without any tax regards.

+

2: coreshop.product.taxed_price_calculator which calculates prices with tax or without. (recommended one to use)

+

Templating

+

If you want to calculate the price within a Template, you can do so by using the filter coreshop_product_price

+
+
{{ (product|coreshop_product_price(true)) }}
+
+

Custom Price Calculator Example

+

Our Example Service will take the Property "price" - 1 as Product Price and -1 as Discount, therefore the price stays the same. +This example is only a show-case of how to add a new calculator.

+
+

CoreShop Price calculation always depends on a context. The context per default consists of following values:

+
    +
  • Store
  • +
  • Country
  • +
  • Currency
  • +
  • Customer (if logged in)
  • +
  • Cart
  • +
+
+
<?php
+
+namespace AppBundle\CoreShop\Product;
+
+use CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface;
+use CoreShop\Component\Product\Model\ProductInterface;
+
+final class CustomPriceCalculator implements ProductPriceCalculatorInterface
+{
+    /**
+     * Used to determine a retail price
+     */
+    public function getPrice(ProductInterface $subject, array $context, bool $withDiscount = true): int
+    {
+        $price = $this->getRetailPrice($subject, $context);
+
+        return $withDiscount ? $this->getDiscount($subject, $price) : $price;
+    }
+
+    /**
+     * Used to determine a retail price
+     */
+    public function getRetailPrice(ProductInterface $subject, array $context): int
+    {
+        return $subject->getStorePrice($context['store']);
+    }
+
+    /**
+     * Used to determine a discount
+     */
+    public function getDiscount(ProductInterface $subject, array $context, int $price): int
+    {
+        return 0;
+    }
+
+    /**
+     * Used to determine a discounted price
+     */
+    public function getDiscountPrice(ProductInterface $subject, array $context): int
+    {
+        return 0;
+    }
+}
+
+

Now we need to register our service to the container and add the calculator tag:

+
app.coreshop.product.price_calculator.custom:
+    class: AppBundle\CoreShop\Product\CustomPriceCalculator
+    tags:
+      - { name: coreshop.product.price_calculator, type: custom, priority: 1 }
+
+

CoreShop now uses our service for all Product Price Calculations.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Products/Price_Rules/index.html b/docs/generated-docs/Development/Products/Price_Rules/index.html new file mode 100644 index 0000000000..51e94ad842 --- /dev/null +++ b/docs/generated-docs/Development/Products/Price_Rules/index.html @@ -0,0 +1,202 @@ + + + + + + + Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Price Rules

+

CoreShop gives you the ability of very complex price calculation methods. +Price Rules always consist of Conditions and Actions.

+

Price Rule Types

+

Product Price Rules

+
+

Checkout all available product price rules here

+
+

Product price rules are applied to multiple products based on conditions like category or manufacturer.

+

Specific Price Rules

+
+

Checkout all available specific price rules here

+
+

Specific price rules are applied to a single product based on conditions like customer or customer group.

+

Quantity Price Rules

+
+

Checkout all available quantity price rules here

+
+

Quantity price rules are applied to a single product based on conditions like the quantity of a cart item.

+

These rules apply only in the calculation of cart item prices. If you have only quantity rules configured, +the default price calculation of CoreShop will return zero outside of cart context.

+

Extending Conditions and Actions

+ +

Template Helper

+

Get Formatted Price with all applied Rules

+
{% import '@CoreShopFrontend/Common/Macro/currency.html.twig' as currency %}
+{% import '@CoreShopFrontend/Common/Macro/product_price.html.twig' as product_price %}
+
+<div class="price">
+    <span class="price-head">{{ 'coreshop.ui.price'|trans }}:</span>
+    {{ product_price.display_product_price(product) }}
+</div>
+<div class="tax">
+    {{ 'coreshop_product_tax_inc'|trans|format(product|coreshop_product_tax_rate) }} ({{ currency.convertAndFormat(product|coreshop_product_tax_amount) }})
+</div>
+
+

Get Active Price Rules

+
{{ dump(product|coreshop_product_price_rules) }}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Products/Unit_Definitions.html b/docs/generated-docs/Development/Products/Unit_Definitions.html new file mode 100644 index 0000000000..0f43addb81 --- /dev/null +++ b/docs/generated-docs/Development/Products/Unit_Definitions.html @@ -0,0 +1,211 @@ + + + + + + + Unit Definitions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Unit Definitions

+

CoreShop has a great new feature for product units. E.g. you can sell items "per meter" etc.

+

First, add some product units in Pimcore > CoreShop > Product > Product Units. Click "Add" and fill all the fields.

+

Then you can add product-units directly in the product-objects inside Pimcore (take a look at the "Price"-tab). There, you can also add multiple product units (eg: 1 box contains of 12 items - CoreShop will show you different order-possibilities in the add-to-cart section in the webshop)

+

Using the API for product units:

+

Create Default UnitDefinition

+

If you want to create a new Product, we need to get our Factory Service for that:

+
/** @var DataObject\CoreShopProduct $product */
+$product = DataObject::getById(1);
+
+$unitRepository = $container->get('coreshop.repository.product_unit');
+
+/** @var ProductUnitDefinitionInterface $defaultUnitDefinition */
+$defaultUnitDefinition = $container->get('coreshop.factory.product_unit_definition')->createNew();
+$defaultUnitDefinition->setUnit($unitRepository->findByName('Kubikmeter'));
+
+/** @var ProductUnitDefinitionsInterface $unitDefinitions */
+$unitDefinitions = $container->get('coreshop.factory.product_unit_definitions')->createNew();
+
+$unitDefinitions->setDefaultUnitDefinition($defaultUnitDefinition);
+$unitDefinitions->setProduct($product);
+
+$product->setUnitDefinitions($unitDefinitions);
+
+$product->save();
+
+

Update Default UnitDefinition

+
/** @var DataObject\CoreShopProduct $product */
+$product = DataObject::getById(1);
+
+$unitRepository = $container->get('coreshop.repository.product_unit');
+
+$defaultUnitDefinition = $product->getUnitDefinitions()->getDefaultUnitDefinition();
+$defaultUnitDefinition->setUnit($unitRepository->findByName('Liter'));
+
+$unitDefinitionsRepository = $container->get('coreshop.repository.product_unit_definitions');
+
+/** @var ProductUnitDefinitions $unitDefinitions */
+$unitDefinitions = $unitDefinitionsRepository->findOneForProduct($product);
+$unitDefinitions->setDefaultUnitDefinition($defaultUnitDefinition);
+
+$product->setUnitDefinitions($unitDefinitions);
+
+$product->save();
+
+

Delete UnitDefinition

+

Deleting a UnitDefiniton from a product is done by finding the UnitDefinitions for the product in the product_unit_definitions repository and then deleting it.

+
/** @var DataObject\CoreShopProduct $product */
+$product = DataObject::getById(1);
+
+$unitDefinitionsRepository = $container->get('coreshop.repository.product_unit_definitions');
+$item = $unitDefinitionsRepository->findOneForProduct($product);
+
+$unitDefinitionsRepository->remove($item);
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Products/Units.html b/docs/generated-docs/Development/Products/Units.html new file mode 100644 index 0000000000..323c2fa907 --- /dev/null +++ b/docs/generated-docs/Development/Products/Units.html @@ -0,0 +1,185 @@ + + + + + + + Units - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Units

+

Units for Products can be defined globally in the Pimcore Backend on CoreShopMenu > Product > Product Units.

+

Each Product can have different units. Also each product/unit relation can have an own precision that differs to other relations. To archive that, the relation between products and units consists of three objects:

+
    +
  • ProductUnit
  • +
  • ProductUnitDefinition
  • +
  • ProductUnitDefinitions
  • +
+

As already said, the ProductUnit can be created in Pimcore Backend and consists mainly of the key for unit like PCS, CNT etc. and some localized fields for rendering in frontend.

+

To connect a ProductUnit to a CoreShopProduct in Backend you need to get the ProductUnit via repository and create a ProductUnitDefinition.

+
use CoreShop\Component\Product\Model\Product;
+use CoreShop\Component\Product\Model\ProductUnitInterface;
+use CoreShop\Component\Product\Model\ProductUnitDefinition;
+
+$product = Product::getById(1);
+
+/** @var ProductUnitInterface $unit */
+$unit = $this->unitRepository->findOneBy(['name' => '']);
+
+$unitDefinition = new ProductUnitDefinition();
+$unitDefinition->setConversionRate(1.0); // optional
+$unitDefinition->setPrecision(0);        // optional
+$unitDefinition->setUnit($unit);
+
+$product->getUnitDefinitions()->setDefaultUnitDefinition($unitDefinition);
+$product->save();
+
+

To add multiple units for a product use $product->addUnitDefinition($unitDefinition).

+

To change a unit override the default one $product->getUnitDefinitions()->getDefaultUnitDefinition()->setUnit($otherUnit).

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Products/index.html b/docs/generated-docs/Development/Products/index.html new file mode 100644 index 0000000000..58bb816fa7 --- /dev/null +++ b/docs/generated-docs/Development/Products/index.html @@ -0,0 +1,181 @@ + + + + + + + Products - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/SEO/index.html b/docs/generated-docs/Development/SEO/index.html new file mode 100644 index 0000000000..1ee6434002 --- /dev/null +++ b/docs/generated-docs/Development/SEO/index.html @@ -0,0 +1,162 @@ + + + + + + + SEO - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Shipping/Carrier/CRUD.html b/docs/generated-docs/Development/Shipping/Carrier/CRUD.html new file mode 100644 index 0000000000..1a0ece41b7 --- /dev/null +++ b/docs/generated-docs/Development/Shipping/Carrier/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Carrier

+

Create

+

If you want to create a Carrier via API, you can do following:

+
$newCarrier = $container->get('coreshop.factory.carrier')->createNew();
+
+

Now you have a new Carrier, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.carrier')->persist($newCarrier);
+$container->get('coreshop.manager.carrier')->flush();
+
+

You now have a new persisted Carrier.

+

Read

+

If you want to query for Carriers, you can do following:

+
$carrierRepository = $container->get('coreshop.repository.carrier');
+
+$queryBuilder = $carrierRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$carriers = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Carrier, you need to do following:

+
// Fetch Carrier
+
+$carrier = $carrierRepository->findById(1);
+$carrier->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.carrier')->persist($carrier);
+$container->get('coreshop.manager.carrier')->flush();
+
+

Delete

+

If you want to update and existing Carrier, you need to do following:

+
// Fetch Carrier
+
+$carrier = $carrierRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.carrier')->remove($carrier);
+$container->get('coreshop.manager.carrier')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Shipping/Carrier/Carrier_Discovery.html b/docs/generated-docs/Development/Shipping/Carrier/Carrier_Discovery.html new file mode 100644 index 0000000000..bbf3fadade --- /dev/null +++ b/docs/generated-docs/Development/Shipping/Carrier/Carrier_Discovery.html @@ -0,0 +1,159 @@ + + + + + + + Carrier Discovery - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Carrier Discovery

+

CoreShop uses a Service to discover available Carriers for a given Shippable. These Service implements the Interface CoreShop\Bundle\ShippingBundle\Discover\ShippableCarriersDiscoveryInterface. +The Interface is implemented by Service with ID coreshop.carrier.discovery

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Shipping/Carrier/Price_Calculation.html b/docs/generated-docs/Development/Shipping/Carrier/Price_Calculation.html new file mode 100644 index 0000000000..f847d07e36 --- /dev/null +++ b/docs/generated-docs/Development/Shipping/Carrier/Price_Calculation.html @@ -0,0 +1,162 @@ + + + + + + + Price Calculation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Carrier Price Calculation

+

CoreShop Shipping/Carrier Calculation uses multiple Calculation methods to calculate the price for a given Carrier on a given +Cart. A Calculator needs to implement the Interface CoreShop\Component\Shipping\Calculator\CarrierPriceCalculatorInterface +and registered to the container using the tag coreshop.shipping.price_calculator, a type attribute and a priority

+

Default Implementation

+

The Default Implementation calculates the Price based on Shipping Rules.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Shipping/Carrier/index.html b/docs/generated-docs/Development/Shipping/Carrier/index.html new file mode 100644 index 0000000000..81e573cb7d --- /dev/null +++ b/docs/generated-docs/Development/Shipping/Carrier/index.html @@ -0,0 +1,169 @@ + + + + + + + Carrier - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Shipping/Shipping_Rules/index.html b/docs/generated-docs/Development/Shipping/Shipping_Rules/index.html new file mode 100644 index 0000000000..2a04d42804 --- /dev/null +++ b/docs/generated-docs/Development/Shipping/Shipping_Rules/index.html @@ -0,0 +1,194 @@ + + + + + + + Shipping Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Shipping Rules

+

Default Conditions and Actions

+

CoreShop comes with a set of default action and condition implementations:

+

Default Conditions

+
    +
  • Currencies
  • +
  • Customer Groups
  • +
  • Customers
  • +
  • Stores
  • +
  • Zones
  • +
  • Amount
  • +
  • Categories
  • +
  • Countries
  • +
  • Dimension
  • +
  • Post Codes
  • +
  • Products
  • +
  • Shipping Rule
  • +
  • Weight
  • +
  • Nested
  • +
+

Default Actions

+
    +
  • Addition Amount
  • +
  • Addition Percent
  • +
  • Discount Amount
  • +
  • Discount Percent
  • +
  • Price
  • +
  • Shipping Rule
  • +
+

Extending Conditions and Actions

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Shipping/index.html b/docs/generated-docs/Development/Shipping/index.html new file mode 100644 index 0000000000..d1b1776fd9 --- /dev/null +++ b/docs/generated-docs/Development/Shipping/index.html @@ -0,0 +1,166 @@ + + + + + + + Shipping - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/State_Machine/Available_Workflows.html b/docs/generated-docs/Development/State_Machine/Available_Workflows.html new file mode 100644 index 0000000000..09bafdcf0d --- /dev/null +++ b/docs/generated-docs/Development/State_Machine/Available_Workflows.html @@ -0,0 +1,635 @@ + + + + + + + Available Workflows - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop State Machine - Available Workflows

+

Order Sale Workflow

+

In CoreShop 3.x the Cart, Order and Quote are the same DataObject. To differentiate between them, we use states with workflows.

+

State Machine: coreshop_order_sales_type

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
cartInitial State - Cart
orderOnce the customer finishes the checkout, pre-payment, it becomes an order
quoteOnce the customer finishes the checkout and requests a quote
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
ordercart
cartcart
quotecart
+

Order Workflow

+

State Machine: coreshop_order +Description: The Order Workflow is the most simplest and also the most important one.

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
initializedInitial State. Just before a order gets saved for the very first time.
newa new order has been created
confirmedcustomer has successfully placed an order
cancelledorder has been cancelled
completethe order is complete (all payments and shipments have been successfully processed)
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
createinitialized
confirmnew
cancelnew, confirmed
completeconfirmed
+

Visualization

+

coreshop_order Workflow Visualization

+

Order Payment Workflow

+

State Machine: coreshop_order_payment +Description: Defines the summary payment state

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
neworder has been initial created
awaiting_paymenta payment has been captured
partially_paidone of the order payments has been paid
cancelledall payments has been cancelled
paidall order payments successfully paid
partially_refundedone of the order payments has been refunded
refundedall payments has been refunded
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
request_paymentnew
partially_payawaiting_payment, partially_paid
cancelawaiting_payment
partially_refundpaid, partially_paid, partially_refunded
refundpaid, partially_paid, partially_refunded
+

Visualization

+

coreshop_order_payment Workflow Visualization

+

Order Shipment Workflow

+

State Machine: coreshop_order_shipment +Description: Defines the summary shipment state

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
neworder has been initial created
cancelledall shipments has been cancelled
partially_shippedone of the order shipments has been shipped
shippedall order shipments has been shipped
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
partially_shipnew
cancelnew
shipnew, partially_shipped
+

Visualization

+

coreshop_order_shipment Workflow Visualization

+

Order Invoice Workflow

+

State Machine: coreshop_order_invoice +Description: Defines the summary invoice state

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
neworder has been initial created
cancelledall invoices has been cancelled
partially_invoicedone of the order invoices has been invoiced
invoicedall order invoices has been successfully invoiced
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
cancelnew
partially_invoicenew
invoicenew, partially_invoiced
+

Visualization

+

coreshop_order_invoice Workflow Visualization

+

Payment Workflow

+

State Machine: coreshop_payment +Description: Defines the single payment state

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newnew payment has been created
processingpayment has been captured
completedpayment is complete
failedpayment has failed
cancelledpayment has been canceled
refundedpayment has been refunded
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
processnew
completenew, processing
failnew, processing
cancelnew, processing
refundcompleted
+

Visualization

+

coreshop_payment Workflow Visualization

+

Shipment Workflow

+

State Machine: coreshop_shipment +Description: Defines the single shipment state

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newnew shipment has been created
readyshipment has been assigned to order
cancelledshipment has been cancelled
shippedshipment has been shipped
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
createnew
shipready
cancelready
+

Visualization

+

coreshop_shipment Workflow Visualization

+

Invoice Workflow

+

State Machine: coreshop_invoice +Description: Defines the single invoice state

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newnew invoice has been created
readyinvoice has been assigned to order
cancelledinvoice has been cancelled
completeinvoice has been completed
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
createnew
cancelready
completeready
+

Visualization

+

coreshop_invoice Workflow Visualization

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/State_Machine/Create_Callbacks.html b/docs/generated-docs/Development/State_Machine/Create_Callbacks.html new file mode 100644 index 0000000000..9ecce52d45 --- /dev/null +++ b/docs/generated-docs/Development/State_Machine/Create_Callbacks.html @@ -0,0 +1,282 @@ + + + + + + + Create Callbacks - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop State Machine - Callbacks

+

It's really simple to create a custom state machine callback.

+

After Callbacks

+

In this example we want to register a simple listener which gets triggered after a customer successfully placed a order:

+
core_shop_workflow:
+    state_machine:
+        coreshop_order:
+            callbacks:
+                after:
+                    do_something_special:
+                        on: ['confirm']
+                        do: ['@AppBundle\EventListener\SpecialListener', 'doSomething']
+                        args: ['object']
+                        priority: -10 # fire action early!
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
ontransition name
doservice and method to dispatch
argsobject or event. Object type depends on state machine type.
priorityset priority. default is 0
+

And your Service:

+
<?php
+
+namespace AppBundle\EventListener;
+
+use CoreShop\Component\Core\Model\CustomerInterface;
+use CoreShop\Component\Core\Model\OrderInterface;
+
+final class SpecialListener
+{
+    /**
+     * @param OrderInterface $order
+     */
+    public function doSomething(OrderInterface $order)
+    {
+        /** @var CustomerInterface $customer */
+        $customer = $order->getCustomer();
+
+        /** @var string $locale */
+        $locale = $order->getLocaleCode();
+
+        // your very special code.
+    }
+}
+
+

Before Callbacks

+

In this example we want to register a simple listener which gets triggered before a the shipment transaction ready gets applied:

+
core_shop_workflow:
+    state_machine:
+        coreshop_shipment:
+            callbacks:
+                before:
+                    check_something:
+                        on: ['create']
+                        do: ['@AppBundle\EventListener\SpecialListener', 'checkSomething']
+                        args: ['object']
+                        priority: 0
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
ontransition name
doservice and method to dispatch
argsobject or event. Object type depends on state machine type.
priorityset priority. default is 0
+

As you can see in the class below, the checkSomething() method throws an exception. +This prevents the state machine from switching to the ready state. +Just remove the exception and the transition gets applied as expected.

+
<?php
+
+namespace AppBundle\EventListener;
+
+use CoreShop\Component\Core\Model\OrderShipmentInterface;
+
+final class SpecialListener
+{
+    /**
+     * @param OrderShipmentInterface $shipment
+     */
+    public function checkSomething(OrderShipmentInterface $shipment)
+    {
+        // check something and throw an exeption
+        throw new \Exception('something is wrong...');
+    }
+}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/State_Machine/Extend_Workflows.html b/docs/generated-docs/Development/State_Machine/Extend_Workflows.html new file mode 100644 index 0000000000..e47559e3ce --- /dev/null +++ b/docs/generated-docs/Development/State_Machine/Extend_Workflows.html @@ -0,0 +1,262 @@ + + + + + + + Extend Workflows - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop State Machine - Extend Workflows

+

It's possible to extend all available CoreShop Workflow.

+

Example A: Extend Shipment Workflow

+

Workflow Configuration

+
core_shop_workflow:
+    state_machine:
+        coreshop_shipment:
+            # define a new place "reviewed"
+            places:
+                - reviewed
+            # define a new transition "review"
+            transitions:
+                review:
+                    from: [new, ready]
+                    to: reviewed
+            # add some colors for better ux
+            place_colors:
+                reviewed: '#2f819e'
+            transition_colors:
+                review: '#2f819e'
+
+

Add translations

+

Just use the Pimcore Backend/Frontend translation or just add it via default symfony translation context:

+
# app/Resources/translations/admin.en.yml
+coreshop_workflow_transition_coreshop_shipment_review: 'Review'
+coreshop_workflow_state_coreshop_shipment_reviewed: 'Reviewed'
+
+# app/Resources/translations/messages.en.yml
+coreshop.ui.workflow.state.coreshop_shipment.reviewed: 'Shipment under Review'
+
+

Inform CoreShop about new Transition of Shipment Workflow

+

Not all transitions should be available in backend. +To allow the transition to show up, you need to implement a simple event listener:

+
# app/config/services
+AppBundle\EventListener\WorkflowListener:
+    autowire: true
+    tags:
+        - { name: kernel.event_listener, event: coreshop.workflow.valid_transitions, method: parseTransitions}
+
+
<?php
+
+namespace AppBundle\EventListener;
+
+use CoreShop\Bundle\OrderBundle\Event\WorkflowTransitionEvent;
+
+class WorkflowListener
+{
+    public function parseTransitions(WorkflowTransitionEvent $event)
+    {
+        $workflowName = $event->getWorkflowName();
+        if($workflowName === 'coreshop_shipment') {
+            $event->addAllowedTransitions(['review']);
+        }
+    }
+}
+
+

Example B: Change default Transition Behaviour of Shipment Workflow

+
+

Note: Be careful while changing transitions. Test your application if a workflow still runs smoothly after changing it!

+
+

In this example we want to change the default shipping behavior.

+

Workflow before:

+

ready -> shipped -> cancelled

+

Workflow after:

+

ready -> reviewed -> shipped -> cancelled

+

Workflow Configuration

+
core_shop_workflow:
+    state_machine:
+        coreshop_shipment:
+            # define a new place "reviewed"
+            places:
+                - reviewed
+            # define a new transition "review"
+            transitions:
+                review:
+                    from: [ready]
+                    to: reviewed
+                # override the default "ship" transition
+                # which only allows [ready] as valid "from" dispatcher
+                ship:
+                    from: [reviewed]
+                    to: shipped
+            # add some colors for better ux
+            place_colors:
+                reviewed: '#2f819e'
+            transition_colors:
+                review: '#2f819e'
+
+

Example C: Callback Listener

+

If you need to implement some further business logic after the coreshop_shipment state has changed to reviewed +you need to define a callback:

+
+

Note: Please make sure your service is public available!

+
+
core_shop_workflow:
+    state_machine:
+        coreshop_shipment:
+            callbacks:
+                after:
+                    do_something_after_review:
+                        on: ['review']
+                        do: ['@your_service', 'yourAction']
+                        # in this context, "object" is the shipment item
+                        args: ['object']
+                        priority: -10 # fire action early!
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/State_Machine/Things_To_Know.html b/docs/generated-docs/Development/State_Machine/Things_To_Know.html new file mode 100644 index 0000000000..c65adea4b1 --- /dev/null +++ b/docs/generated-docs/Development/State_Machine/Things_To_Know.html @@ -0,0 +1,180 @@ + + + + + + + Things To Know - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop State Machine - Important Things to Know

+

Canceling Orders

+

Within the CoreShop workflow architecture a lot of orders may stay forever in the new or confirmed state. +CoreShop will automatically cancel orders older than 20 days under following conditions:

+
    +
  • Order creationDate >= 20 days ago
  • +
  • Order State is initialized or new or confirmed +
  • +
  • Order Payment State is not paid +
  • +
+

Read more about automation here.

+

Expire Orders via Backend

+

There is also a cancel button in the order detail section.

+

Expire Orders via Command

+

There is also a command for that:

+
$ coreshop:order:expire
+
+

Change Orders Expiration Date

+
core_shop_order:
+    expiration:
+        order:
+            days: 30
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/State_Machine/index.html b/docs/generated-docs/Development/State_Machine/index.html new file mode 100644 index 0000000000..22ede6341f --- /dev/null +++ b/docs/generated-docs/Development/State_Machine/index.html @@ -0,0 +1,212 @@ + + + + + + + State Machine - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop State Machine

+

The CoreShop State Machine is a important core feature which allows to determinate complex workflows securely and in a most modern way. +Unlike the most eCommerce Frameworks out there, CoreShop does not work with the messy and hard do extend "state/status" concept. +Every order-section and of course the order itself provides its own state machine which allows us to build a super strong state workflow.

+

Places

+

In State Machine context, the well-known "Status" Property is called "Places". +Every Workflow comes with a pre-defined set of Places.

+

Transition

+

To change the Place of a workflow we need to apply a transition. +If the transition is valid the new place gets stored.

+

Callbacks

+

There are several events for each transition which can be also extend by every project. +Example:: If all order payments has been successfully transformed to the completed place, +the coreshop_order_payment workflow will automatically change to paid.

+

Workflows

+

There are seven implemented Workflows:

+
    +
  • +coreshop_order +
  • +
  • +coreshop_order_payment +
  • +
  • +coreshop_order_shipment +
  • +
  • +coreshop_order_invoice +
  • +
  • +coreshop_payment +
  • +
  • +coreshop_shipment +
  • +
  • +coreshop_invoice +
  • +
+

Workflows are connected among themselves so every transition will trigger another Workflow and so on. +If a transition has been dispatched, it cannot be transformed back unless it has been defined in the available transitions.

+

So let's start:

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Store_Front/Controllers.html b/docs/generated-docs/Development/Store_Front/Controllers.html new file mode 100644 index 0000000000..d352e765d5 --- /dev/null +++ b/docs/generated-docs/Development/Store_Front/Controllers.html @@ -0,0 +1,198 @@ + + + + + + + Controllers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Store Front Controller

+

If you use CoreShop FrontendBundle, you can change the Controllers it uses. Simply change the configuration for the controller:

+
core_shop_frontend:
+    controllers:
+        index: CoreShop\Bundle\FrontendBundle\Controller\IndexController
+        register: CoreShop\Bundle\FrontendBundle\Controller\RegisterController
+        customer: CoreShop\Bundle\FrontendBundle\Controller\CustomerController
+        currency: CoreShop\Bundle\FrontendBundle\Controller\CurrencyController
+        language: CoreShop\Bundle\FrontendBundle\Controller\LanguageController
+        search: CoreShop\Bundle\FrontendBundle\Controller\SearchController
+        cart: CoreShop\Bundle\FrontendBundle\Controller\CartController
+        checkout: CoreShop\Bundle\FrontendBundle\Controller\CheckoutController
+        category: CoreShop\Bundle\FrontendBundle\Controller\CategoryController
+        product: CoreShop\Bundle\FrontendBundle\Controller\ProductController
+        quote: CoreShop\Bundle\FrontendBundle\Controller\QuoteController
+        security: CoreShop\Bundle\FrontendBundle\Controller\SecurityController
+        payment: CoreShop\Bundle\PayumBundle\Controller\PaymentController
+
+

Example of using a Custom ProductController

+

1: Add a new Controller and inherit from the FrontendController

+
<?php
+
+namespace AppBundle\Controller;
+
+use CoreShop\Component\Core\Model\ProductInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+class ProductController extends \CoreShop\Bundle\FrontendBundle\Controller\ProductController
+{
+    public function detailAction(Request $request)
+    {
+        //Do whatever you want in here
+
+        return parent::detailAction($request);
+    }
+}
+
+

2: Change Configuration of the Controller:

+
core_shop_frontend:
+    controllers:
+        product: AppBundle\Controller\ProductController
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Store_Front/index.html b/docs/generated-docs/Development/Store_Front/index.html new file mode 100644 index 0000000000..ab87672f7f --- /dev/null +++ b/docs/generated-docs/Development/Store_Front/index.html @@ -0,0 +1,164 @@ + + + + + + + Store Front - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Stores/CRUD.html b/docs/generated-docs/Development/Stores/CRUD.html new file mode 100644 index 0000000000..b0b2b34585 --- /dev/null +++ b/docs/generated-docs/Development/Stores/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Stores

+

Create

+

If you want to create a Store via API, you can do following:

+
$newStore = $container->get('coreshop.factory.store')->createNew();
+
+

Now you have a new Store, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.store')->persist($newStore);
+$container->get('coreshop.manager.store')->flush();
+
+

You now have a new persisted Store.

+

Read

+

If you want to query for Stores, you can do following:

+
$storeRepository = $container->get('coreshop.repository.store');
+
+$queryBuilder = $storeRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$stores = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Store, you need to do following:

+
// Fetch Store
+
+$store = $storeRepository->findById(1);
+$store->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.store')->persist($store);
+$container->get('coreshop.manager.store')->flush();
+
+

Delete

+

If you want to update and existing Store, you need to do following:

+
// Fetch Store
+
+$store = $storeRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.store')->remove($store);
+$container->get('coreshop.manager.store')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Stores/Context.html b/docs/generated-docs/Development/Stores/Context.html new file mode 100644 index 0000000000..642072514d --- /dev/null +++ b/docs/generated-docs/Development/Stores/Context.html @@ -0,0 +1,266 @@ + + + + + + + Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Store Context

+

For CoreShop to determine the current store the visitor or customer comes from +it uses a concept called context and context resolver.

+

Context

+ + + + + + + + + + + + + + + + + + + + + + + +
NamePriorityTagDescription
FixedStoreContext2coreshop.context.storeUsed for testing purposes
StoreContext1coreshop.context.storeLoad a store from given request resolver
+

Resolver

+ + + + + + + + + + + + + + + + + + + + + + + +
NamePriorityTagDescription
SiteBasedRequestResolver100coreshop.context.store.request_based.resolverDetermines a store by a given pimcore frontend site
PimcoreAdminSiteBasedRequestResolver200coreshop.context.store.request_based.resolverDetermines a store by a given document in backend
+

These resolver take care about finding the correct store for the current request.

+

Create a Custom Resolver

+

A Store Context needs to implement the interface CoreShop\Component\Store\Context\StoreContextInterface. +This interface consists of one method called getStore which returns a CoreShop\Component\Store\Model\StoreInterface or throws an CoreShop\Component\Store\Context\StoreNotFoundException.

+

To register your context, you need to use the tag coreshop.context.store with an optional priority attribute.

+

Create a Request based Resolver

+

CoreShop already implements Request based store context resolver. So if your context depends on the current request, you can +create a custom RequestBased resolver. To do that, implement the interface CoreShop\Component\Store\Context\RequestBased\RequestResolverInterface +with the method findStore. This method either returns a store or null.

+

To register this resolver, use the tag: coreshop.context.store.request_based.resolver with an optional priority attribute.

+

Example

+

We want to a StoreContext to be based on the Pimcore Document. So if we are on site /de, we want to resolve to Store DE, if we +are on page /en we want to resolve to Store Store EN:

+

1: First of all we need to create our RequestBased Store Context:

+
<?php
+
+namespace AppBundle\CoreShop\Store\Context;
+
+use CoreShop\Component\Store\Context\RequestBased\RequestResolverInterface;
+use CoreShop\Component\Store\Repository\StoreRepositoryInterface;
+use Pimcore\Http\Request\Resolver\DocumentResolver;
+use Symfony\Component\HttpFoundation\Request;
+
+final class DocumentBasedRequestRequestResolver implements RequestResolverInterface
+{
+    private StoreRepositoryInterface $storeRepository;
+
+    public function __construct(StoreRepositoryInterface $storeRepository)
+    {
+        $this->storeRepository = $storeRepository;
+    }
+
+    public function findStore(Request $request): ?StoreInterface
+    {
+        if (substr($request->getPathInfo(), 0, 3) === '/en') {
+            return $this->storeRepository->find(1);
+        }
+
+        if (substr($request->getPathInfo(), 0, 3) === '/de') {
+            return $this->storeRepository->find(2);
+        }
+
+        return null;
+    }
+}
+
+

Now we need to configure the service in src/AppBundle/Resources/config/services.yml

+
services:
+  app.coreshop.store.context.request.document_based:
+    class: AppBundle\CoreShop\Store\Context\DocumentBasedRequestRequestResolver
+    arguments:
+      - '@coreshop.repository.store'
+    tags:
+      - { name: coreshop.context.store.request_based.resolver, priority: 300 }
+
+
+

CoreShop now tries to resolve the current Store based on the Pimcore Site we are on.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Stores/Theme.html b/docs/generated-docs/Development/Stores/Theme.html new file mode 100644 index 0000000000..de14a96284 --- /dev/null +++ b/docs/generated-docs/Development/Stores/Theme.html @@ -0,0 +1,159 @@ + + + + + + + Theme - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/Stores/index.html b/docs/generated-docs/Development/Stores/index.html new file mode 100644 index 0000000000..e2bfed7dbc --- /dev/null +++ b/docs/generated-docs/Development/Stores/index.html @@ -0,0 +1,169 @@ + + + + + + + Stores - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Development/index.html b/docs/generated-docs/Development/index.html new file mode 100644 index 0000000000..e344bf0508 --- /dev/null +++ b/docs/generated-docs/Development/index.html @@ -0,0 +1,192 @@ + + + + + + + Development - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop

+

The Developer’s guide to leveraging the flexibility of CoreShop. Here you will find all the concepts used in CoreShop.

+

Introduction

+

CoreShop Resources

+

CoreShop uses Doctrine ORM for Custom Resources. ORM enables us great flexibility and extendability for simple models like Currencies and Countries. +CoreShop currently implements these Resources as ORM Model:

+
    +
  • Currency
  • +
  • Country and State
  • +
  • Tax Rate and Tax Rules
  • +
  • Price Rules
  • +
  • Carrier
  • +
  • Shipping Rules
  • +
  • Index and Filter Configuration
  • +
  • Notification Rule Configuration
  • +
  • Stores
  • +
  • Payments
  • +
+

Everytime something is called a Resource, we talk about ORM Models.

+

CoreShop Pimcore Models

+

CoreShop also takes advantage of Pimcores flexible data-model. +Objects that are heavily used and changed are implemented using Data Objects:

+
    +
  • Product
  • +
  • Product Category
  • +
  • Manufacturer
  • +
  • Cart
  • +
  • Order
  • +
  • Order Invoice
  • +
  • Order Shipment
  • +
  • Quote
  • +
  • Customer
  • +
  • Customer Group
  • +
  • Addresses
  • +
+

Everytime we talk about Objects, we talk about Pimcore Data Objects.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Getting_Started/Architecture_Overview.html b/docs/generated-docs/Getting_Started/Architecture_Overview.html new file mode 100644 index 0000000000..0987c614f0 --- /dev/null +++ b/docs/generated-docs/Getting_Started/Architecture_Overview.html @@ -0,0 +1,189 @@ + + + + + + + Architecture Overview - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Architecture

+

CoreShop is completely open source (GPl license) and free, maintained by diverse and creative community of developers and companies.

+

What are our core values and what makes us different from other solutions?

+
    +
  • Components based approach
  • +
  • Unlimited flexibility and simple customization
  • +
  • Developer-friendly, using latest technologies
  • +
  • Highest quality of code
  • +
+

The Three Natures of CoreShop

+

CoreShop is constructed from fully decoupled and flexible e-commerce components for PHP. +It is also a set of Symfony bundles, which integrate the components into the full-stack framework. +On top of that, CoreShop is also a complete eCommerce suite crafted from all these building blocks.

+

It is your choice how to use CoreShop, you can benefit from the components with any framework, +integrate selected bundles into existing or new Pimcore app or built your application on top of CoreShop Suite.

+

CoreShop Suite

+

This book is about our full-stack eCommerce suite, which is a standard Pimcore Bundle providing the most common webshop and a foundation for custom systems.

+

Leveraging Symfony Bundles

+

If you prefer to build your very custom system step by step and from scratch, +you can integrate the standalone Symfony bundles. +For the installation instructions, please refer to the appropriate bundle documentation.

+

Difference to the official Pimcore eCommerce Framework

+

The eCommerce Framework provides you with a basic Toolset for eCommerce Development. +CoreShop gives you a feature-rich Toolset of common needed Tools for rich and complex eCommerce Solutions.

+
+

Example I: the Framework does'nt give you the full opportunity for calculating complex Shipping Prices. +You need to code it by yourself. CoreShop provides you with Carriers and Shipping Rules to do that.

+
+

CoreShops Bundles are build to be used individually. The CoreBundle combines all the Features.

+

Architecture Overview

+

CoreShop Suite is build on CoreShop Components and Bundles. +The CoreBundle and CoreComponent glues all different Bundles and Components into one eCommerce Suite for B2B and B2C Solutions.

+

Architecture

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Getting_Started/Difference_to_ecommerce_Framework.html b/docs/generated-docs/Getting_Started/Difference_to_ecommerce_Framework.html new file mode 100644 index 0000000000..02da2a7e26 --- /dev/null +++ b/docs/generated-docs/Getting_Started/Difference_to_ecommerce_Framework.html @@ -0,0 +1,501 @@ + + + + + + + Difference to ecommerce Framework - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop vs. eCommerce Framework

+

The idea behind CoreShop is totally different to the eCommerce framework. The eCommerce framework gives you skeleton for building +eCommerce applications and heavily depends on you doing all the things.

+

CoreShop, on the other hand, comes full-featured with a rich toolset of optional Components which you can use, or not use, for your +ecommerce Application. In other words: CoreShop is the framework on steroids :)

+

Feature Comparison

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureeCommerce FrameworkCoreShop
Product Management
Product RestrictionsX
Product Variants
Category Management
Customer ManagementX
Customer Address ManagementX
LocalizationX
Currency ManagementX
Country ManagementX
Taxation
Payment Management
Supported Payment Providers
- Wirecard Qpay
- Wirecard Seamless
- Datatrans
- Klarna
- Recurring Payments
- PayPal ExpressX
- PayPal Pro CheckoutX
- PayPal Pro HostedX
- PayPal MasspayX
- PayPal RestX
- Stripe.jsX
- Stripe CheckoutX
- Authorize.NET AIMX
- Be2Bill Credit CardX
- Be2Bill OffsiteX
- PayexX
- OfflineX
- Payum and OmnipayX
Voucher Codes
Catalog Price Rules
Product Specific Price RulesX
Product Facet Index
Multi Theme SupportedX
Carrier ManagementX
Shipping CalculationX
Order Management
Order WorkflowX
Order Invoice GenerationX
Order Shipment GenerationX
Quotes ManagementX
ReportingX
Multi Store/Tenant
eCommerce Tracking
Configurable Mail RulesX
Backend Functionality
- Country ManagementX
- Currency ManagementX
- Taxation ManagementX
- Taxation ManagementX
- Index ManagementX
- Filter ManagementX
- Order ManagementX (partial)
- Voucher Rules
- Price Rules
- Order OverviewX (partial)
- Quote OverviewX
- Order DetailX (partial)
- Quote DetailX
- Order CreationX
- Quote CreationX
Checkout Manager
Modular/ComponentizedX (partial)
Extendable
+

To be fair, both Systems have their purpose and you can do the same with both systems. The ecommerce Framework is designed +to be very good extendable but you still need to implement a lot of stuff yourself. CoreShop gives you a lot of out-of-the-box +features to quickly create rich ecommerce systems.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Getting_Started/Installation.html b/docs/generated-docs/Getting_Started/Installation.html new file mode 100644 index 0000000000..60b4ccc966 --- /dev/null +++ b/docs/generated-docs/Getting_Started/Installation.html @@ -0,0 +1,179 @@ + + + + + + + Installation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Installation

+

You need a running instance of Pimcore on your system before you can install CoreShop.

+

You can setup your own example:

+
    +
  • Install with composer composer require coreshop/core-shop ^3.0 +
  • +
  • Run enable Bundle command +php bin/console pimcore:bundle:enable CoreShopCoreBundle +
  • +
  • Run Install Command +php bin/console coreshop:install +
  • +
  • Optional: Install Demo Data php bin/console coreshop:install:demo +
  • +
+

Messenger

+

CoreShop also uses Symfony Messenger for async tasks like sending E-Mails or Processing DataObjects for the Index. Please run these 2 transports to process the data

+
bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300
+
+

Payment

+

CoreShop uses Payum for Payment. Checkout Payums Documentation on how to add payment providers.

+

Payment providers are implemented as Pimcore Plugin. They can be installed using composer. Here you can find all available payment modules via composer

+

Payum Documentation

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Getting_Started/Upgrade_Notes.html b/docs/generated-docs/Getting_Started/Upgrade_Notes.html new file mode 100644 index 0000000000..2c40daa1ce --- /dev/null +++ b/docs/generated-docs/Getting_Started/Upgrade_Notes.html @@ -0,0 +1,444 @@ + + + + + + + Upgrade Notes - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Upgrade Notes

+

Always check this page for some important upgrade notes before updating to the latest coreshop build.

+

2.0.0-beta.3 to 2.0.0-beta.4

+
    +
  • +BC break: All occurrences of parameters coreshop.all.stack.pimcore_class_ids, "application".model."class".pimcore_class_id, coreshop.all.pimcore_classes.ids have been removed. Inject the corresponding Repository and use classId function instead
  • +
  • +Pimcore: CoreShop now requires at least Pimcore 5.4.0. You need to update Pimcore to the at least 5.4.0 in order to use/update CoreShop.
  • +
+

Product Price Calculation

+

In order to allow custom price calculation on API Level, we changed the way CoreShop calculates product prices by introducing a new parameter to every PriceCalculation Interface. Price Calculator Conditions are not anymore using a Live context, instead it gets passed via API.

+

Following interfaces have changed:

+
    +
  • +CoreShop\Component\Core\Product\TaxedProductPriceCalculatorInterface +
  • +
  • +CoreShop\Component\Order\Calculator\PurchasableDiscountCalculatorInterface +
  • +
  • +CoreShop\Component\Order\Calculator\PurchasableDiscountPriceCalculatorInterface +
  • +
  • +CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface +
  • +
  • +CoreShop\Component\Order\Calculator\PurchasableRetailPriceCalculatorInterface +
  • +
  • +CoreShop\Component\Product\Calculator\ProductDiscountCalculatorInterface +
  • +
  • +CoreShop\Component\Product\Calculator\ProductDiscountPriceCalculatorInterface +
  • +
  • +CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface +
  • +
  • +CoreShop\Component\Product\Calculator\ProductRetailPriceCalculatorInterface +
  • +
  • +CoreShop\Component\Product\Rule\Action\ProductDiscountActionProcessorInterface +
  • +
  • +CoreShop\Component\Product\Rule\Action\ProductDiscountPriceActionProcessorInterface +
  • +
  • +CoreShop\Component\Product\Rule\Action\ProductDiscountPriceActionProcessorInterface +
  • +
  • +CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface +
  • +
  • +CoreShop\Component\Product\Rule\Fetcher\ValidRulesFetcherInterface +
  • +
+

If you have anything customized with those classes, please change them accordingly.

+

If you use the PriceCalculator Service directly, you also need to change the call from

+
$this->priceCalculator->getPrice($object, true)
+
+

to

+
$this->priceCalculator->getPrice($object, [
+    'store' => $store,
+    'country' => $country,
+    'customer' => $customer,
+    'currency' $currency,
+    'cart' => $cart
+], true)
+
+

The new second argument, is the Context for which you want to get the Price. This is highly depends on your +need. On a default CoreShop setup, the context can be fetched form the ShopperContext Service like this:

+
return  [
+    'store' => $this->shopperContext->getStore(),
+    'customer' => $this->shopperContext->hasCustomer() ? $this->shopperContext->getCustomer() : null,
+    'currency' => $this->shopperContext->getCurrency(),
+    'country' => $this->shopperContext->getCountry(),
+    'cart' => $this->shopperContext->getCart()
+];
+
+

CoreShop makes that easier for you, you can just use $this->shoppperContext->getContext(). But be aware, the Shopper Context is only in a Web Request available. +When you work on a CLI Level, you have to define the context yourself.

+

If you already have a cart and want to calculate the price for the cart, the context is a bit different, cause it resolves from the cart

+
$context = [
+    'store' => $cart->getStore(),
+    'customer' => $cart->getCustomer() ?: null,
+    'currency' => $cart->getCurrency(),
+    'country' => $cart->getStore()->getBaseCountry(),
+    'cart' => $cart
+];
+
+

Taxation

+

Tax Rule Store relation has been removed as it makes currently no sense.

+

Tracking

+

Tracking bundle has completely been refactored in order to support more use-cases than just ecommerce. If you have any customizations made, please check the current implementation to adapt your changes.

+

Order Invoice

+

Due to changes in adjustments, we also need to change OrderInvoice/OrderInvoiceItem.

+

After you have migrated to the latest version you also have to remove some fields:

+

CoreShopOrderInvoice

+
    +
  • totalTax
  • +
  • baseTotalTax
  • +
  • subtotalTax
  • +
  • baseSubtotalTax
  • +
  • shippingTax
  • +
  • baseShippingTax
  • +
  • taxes
  • +
  • baseTaxes
  • +
  • discountTax
  • +
  • baseDiscountTax
  • +
  • discountNet
  • +
  • discountGross
  • +
  • baseDiscountNet
  • +
  • baseDiscountGross
  • +
  • shippingNet
  • +
  • shippingGross
  • +
  • baseShippingNet
  • +
  • baseShippingGross
  • +
  • shippingTaxRate
  • +
+

CoreShopOrderInvoiceItem

+
    +
  • totalTax
  • +
  • baseTotalTax
  • +
  • taxes
  • +
  • baseTaxes
  • +
+

Adjustments

+
+

BC break / New Feature

+
+

There are several deprecated class fields. +After you have migrated to the latest version you also have to remove them:

+

CoreShopOrder / CoreShopQuote

+
    +
  • shippingGross
  • +
  • shippingNet
  • +
  • shippingTax
  • +
  • discountGross
  • +
  • discountNet
  • +
  • discountTax
  • +
  • baseShippingNet
  • +
  • baseShippingGross
  • +
  • baseShippingTax
  • +
  • baseDiscountNet
  • +
  • baseDiscountGross
  • +
  • totalTax
  • +
  • baseTotalTax
  • +
  • subTotalTax
  • +
  • baseSubtotalTax
  • +
+

CoreShopOrderItem / CoreShopQuoteItem

+
    +
  • totalTax
  • +
  • baseTotalTax
  • +
+

CoreShopCart

+
    +
  • shippingGross
  • +
  • shippingNet
  • +
  • discountGross
  • +
  • discountNet
  • +
+

2.0.0-beta.2 to 2.0.0-beta.3

+
    +
  • +

    BC break Signature of following interfaces changed:

    +
      +
    • +CoreShop\Component\Index\Interpreter\InterpreterInterface: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []);
    • +
    • +CoreShop\Component\Index\Interpreter\LocalizedInterpreterInterface: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []);
    • +
    • +CoreShop\Component\Index\Interpreter\RelationInterpreterInterface: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config, $interpreterConfig = []);
    • +
    • +CoreShop\Component\Customer\Model\UserInterface::ROLE_DEFAULT renamed CoreShop\Component\Customer\Model\UserInterface::CORESHOP_ROLE_DEFAULT +
    • +
    • +CoreShop\Component\Customer\Model\UserInterface::ROLE_SUPER_ADMIN renamed CoreShop\Component\Customer\Model\UserInterface::CORESHOP_ROLE_SUPER_ADMIN +
    • +
    +
  • +
  • +

    BC break Shipment / Invoice Creation via API changed

    +
      +
    • Before adding a new Shipment / Invoice you need to dispatch a request state to your order. Read more about it here and here.
    • +
    +
  • +
  • +

    BC break getName in CoreShop\Component\Index\Model\IndexableInterface has been changed to getIndexableName as getName could eventually conflict with a non localized Pimcore Field

    +
  • +
  • +

    BC break getEnabled in CoreShop\Component\Index\Model\IndexableInterface has been changed to getIndexableEnabled as getEnabled could eventually conflict with a localized Pimcore Field

    +
  • +
+

2.0.0-beta.1 to 2.0.0-beta.2

+
    +
  • Link Generator implemented. If you want to use nice urls, you need to add the link generator service: +
      +
    • CoreShopProduct: add @coreshop.object.link_generator.product as Link Provider
    • +
    • CoreShopCategory: add @coreshop.object.link_generator.category as Link Provider
    • +
    • Change {{ path('') }} to {{ coreshop_path('') }}. You may want to checkout the FrontendBundle to get a deeper insight.
    • +
    +
  • +
  • Deprecated Field Names in - CoreShop\Component\Payment\Model\PaymentInterface`: +
      +
    • getName is now getTitle
    • +
    • getOrderId is now getOrder and directly returns a OrderInterface
    • +
    +
  • +
  • Deprecated Field Names in - CoreShop\Component\Shipping\Model\CarrierInterface: +
      +
    • getLabel is not getTitle
    • +
    • getName is now getIdentifier
    • +
    +
  • +
+

2.0.0-alpha.4 to 2.0.0-beta.1

+
    +
  • +

    BC break Signature of following interfaces changed:

    +
      +
    • +CoreShop\Component\Index\Interpreter\InterpreterInterface: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config);
    • +
    • +CoreShop\Component\Index\Interpreter\LocalizedInterpreterInterface: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config);
    • +
    • +CoreShop\Component\Index\Interpreter\RelationInterpreterInterface: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config);
    • +
    +
  • +
  • +

    BC break CoreShop now takes advantage of the dependent bundle feature introduced in Pimcore 5.1.2. Therefore, +all bundles are now automatically loaded. This is a BC break, as when updating, you might run into issues. +To solve the issues, check following things:

    +
      +
    • remove RegisterBundles entry from app/AppKernel.php +
    • +
    • remove loading CoreShopCoreBundle Configuration in app/config.yml +
    • +
    • enable CoreShopCoreBundle via CLI or manually in var/config/extensions.php: "CoreShop\\Bundle\\CoreBundle\\CoreShopCoreBundle" => TRUE +
    • +
    +
  • +
  • +

    BC break Upgraded Default Layout to Bootstrap 4. This will most certainly cause issues when you just override certain templates. Best would be to copy all templates from before the Bootstrap 4 Upgrade.

    +
  • +
+

2.0.0-alpha.4 to 2.0.0-alpha.5

+
    +
  • +BC break added Component\Core\Model\OrderItem and Component\Core\Model\QuoteItem. If you already customized them, inherit them from the Core Models.
  • +
  • +BC break changed the way CoreShop processes Cart-Rules. If you implemented a custom-condition, inherit from CoreShop\Component\Order\Cart\Rule\Condition\AbstractConditionChecker and implement isCartRuleValid instead of isValid +
  • +
  • Deprecated: remove cart/add-price-rule/ static route.
  • +
+

2.0.0-alpha.3 to 2.0.0-alpha.4

+
    +
  • +BC break decoupled MoneyBundle from CurrencyBundle, therefore the Twig Extension for Money Conversion went to the CurrencyBundle. Therefore the name of that extension was renamed from +coreshop_convert_money to coreshop_convert_currency. If you use it directly in your code, please rename all of them.
  • +
  • Deprecated CoreShopAdminBundle which responsability was only handling installation and deliviering pimcore resources like JS and CSS files. +
      +
    • Installation has been moved to CoreShopCoreBundle
    • +
    • Delivering of resources is now handled by CoreShopResourceBundle, this also makes it easier to use CoreShop Bundles without handling resources yourself.
    • +
    +
  • +
+

2.0.0-alpha.2 to 2.0.0-alpha.3

+
    +
  • +

    BC break getPrice in PurchasableInterface and ProductInterface has been removed. In favor of this a new coreShopStorePrice editable has been introduced, which stores prices for each store. This makes handling of multiple currencies way more elegant.

    +

    If you still want to use the old getPrice, create a new Subclass of \CoreShop\Component\Core\Model\Product, implement \CoreShop\Component\Order\Model\PriceAwarePurchasableInterface and set your class to CoreShopProduct parents.

    +
  • +
+

V1 to V2

+
    +
  • CoreShop 2 is not backward compatible. Due to the framework change, we decided to re-make CoreShop from scratch. If you still have instances running and want to migrate, there is a basic migration way which gets you data from V1 to V2.
  • +
  • +Export from CoreShop1 +
  • +
  • +Import into CoreShop2 +
  • +
+

Within V1

+
    +
  • Nothing available
  • +
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/Getting_Started/index.html b/docs/generated-docs/Getting_Started/index.html new file mode 100644 index 0000000000..b28796fba4 --- /dev/null +++ b/docs/generated-docs/Getting_Started/index.html @@ -0,0 +1,178 @@ + + + + + + + Getting Started - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Automation/index.html b/docs/generated-docs/User_Documentation/Automation/index.html new file mode 100644 index 0000000000..d555c223d6 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Automation/index.html @@ -0,0 +1,194 @@ + + + + + + + Automation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Automation

+

In CoreShop there are several automation mechanism implemented.

+

Order Cancellation

+
+

Execution Time: Once per day via maintenance job

+
+

CoreShop will automatically cancel orders older than 20 days.

+

Change Orders Expiration Date

+
core_shop_order:
+    expiration:
+        order:
+            days: 30
+
+

Expired Carts

+
+

Execution Time: Once per day via maintenance job

+
+
+

Note: By default, this feature is disabled.

+
+

By default, this feature is disabled (days = 0) so no carts will be removed by default. +If you want to remove older carts, just enable it via configuration:

+

Change Cart Expiration Date

+
core_shop_order:
+    expiration:
+        cart:
+            days: 20
+            anonymous: true
+            customer: true
+
+

Expired Rules

+
+

Execution Time: Once per day via maintenance job

+
+

If you're having a lot of active rules in your system, you may want to disable them via automation. +CoreShop already comes with a time-span check, which means all rules with time-span elements will be disabled if they're outdated. +If you want do implement some further availability logic, you could use the coreshop.rule.availability_check Event to define +the availability of the rule. Just use the setAvailability() method to override the system availability suggestion.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Cart/index.html b/docs/generated-docs/User_Documentation/Cart/index.html new file mode 100644 index 0000000000..60f140ad50 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Cart/index.html @@ -0,0 +1,169 @@ + + + + + + + Cart - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart

+

Inventory Change

+

If a customer adds a item to the cart CoreShop will check if product stock is sufficient. If not, a form error will show up.

+

Disable / Delete Products

+

If a product gets disabled or deleted in backend CoreShop will automatically remove this product from all active carts. +A form error will notify every customer in frontend if the cart has been modified.

+

Abandoned Carts

+

No cart gets deleted by default. This allows you to:

+
    +
  • check abandoned cart statistics
  • +
  • build your own business logic in case you want to inform customers within a follow-up email for example
  • +
+

There is a expire cart command to remove abandoned carts, please checkout the development section.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Catalog/Categories.html b/docs/generated-docs/User_Documentation/Catalog/Categories.html new file mode 100644 index 0000000000..fe02f8c542 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Catalog/Categories.html @@ -0,0 +1,158 @@ + + + + + + + Categories - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Categories Documentation

+

Categories in CoreShop provide a way to organize and structure the products in your e-commerce store built on the Pimcore platform. Using categories, you can create a hierarchical navigation system that allows customers to browse and find products easily.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Catalog/Product_Variants.html b/docs/generated-docs/User_Documentation/Catalog/Product_Variants.html new file mode 100644 index 0000000000..5cacffb455 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Catalog/Product_Variants.html @@ -0,0 +1,158 @@ + + + + + + + Product Variants - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Catalog/Products.html b/docs/generated-docs/User_Documentation/Catalog/Products.html new file mode 100644 index 0000000000..4a7dc0047b --- /dev/null +++ b/docs/generated-docs/User_Documentation/Catalog/Products.html @@ -0,0 +1,158 @@ + + + + + + + Products - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Products Documentation

+

Products are the core of any e-commerce store built on the Pimcore platform. CoreShop provides a flexible and feature-rich system for managing products, including product variants, attributes, images, and more.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Catalog/index.html b/docs/generated-docs/User_Documentation/Catalog/index.html new file mode 100644 index 0000000000..c9e6825d60 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Catalog/index.html @@ -0,0 +1,168 @@ + + + + + + + Catalog - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Geo_IP.html b/docs/generated-docs/User_Documentation/Geo_IP.html new file mode 100644 index 0000000000..e069779e85 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Geo_IP.html @@ -0,0 +1,158 @@ + + + + + + + Geo IP - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop can use GeoIP to locate visitors countries using IP-Addresses.

+

CoreShop uses the already existing Pimcore GeoIP Database located in: /var/config/GeoLite2-City.mmdb

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Inventory/index.html b/docs/generated-docs/User_Documentation/Inventory/index.html new file mode 100644 index 0000000000..c070e8e34e --- /dev/null +++ b/docs/generated-docs/User_Documentation/Inventory/index.html @@ -0,0 +1,201 @@ + + + + + + + Inventory - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Inventory

+

The Inventory is a complex topic since there is a lot of business logic you need to know about.

+

Product Inventory

+

Every Product object comes with a "Stock" Tab. Let's have a look about the configuration:

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
Is TrackedDefine if a product should get tracked
On HandAmount of available products.
On HoldDefines how many elements are currently locked. Do not change that value unless you know what you're doing.
+

Is Tracked

+

If you want to enable the inventory feature for a product, you need to check this setting. +After that this product is not orderable in frontend if stock is insufficient.

+
+

Note: Only if you enable "Is Tracked" the inventory stock is active! +Otherwise the product is always available regardless of it's stock amount.

+
+

On Hand

+

Define a available amount for each product. +With every successfully order, an arbitrary amount will be subtracted.

+

On Hold

+

This one needs some further explanation: +After the checkout is complete, all ordered items will be removed from "On Hand" and get moved to "On Hold" until the payment is complete:

+
    +
  • If the unpaid order gets cancelled, the reserved "On Hold" amount gets back to "On Hand".
  • +
  • If the order payment status switches to paid, the reserved "On Hold" amount gets subtracted.
  • +
+

Cart / Checkout

+

If a product stock gets insufficient during a customers checkout, the product gets removed from customers cart following by a form error.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Localization/Countries.html b/docs/generated-docs/User_Documentation/Localization/Countries.html new file mode 100644 index 0000000000..63c8633f15 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Localization/Countries.html @@ -0,0 +1,168 @@ + + + + + + + Countries - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Country

+

A Country consists of following values:

+
    +
  • Name
  • +
  • ISO-Code
  • +
  • Active: Determines if customers from this country are able to purchase from your store
  • +
  • Use Store default Currency: If checked, your stores default currency will be applied to the country
  • +
  • Currency
  • +
  • Zone
  • +
  • Stores: Determines for which Stores this Country is available.
  • +
+

Countries

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Localization/Currencies.html b/docs/generated-docs/User_Documentation/Localization/Currencies.html new file mode 100644 index 0000000000..7fe32d283c --- /dev/null +++ b/docs/generated-docs/User_Documentation/Localization/Currencies.html @@ -0,0 +1,178 @@ + + + + + + + Currencies - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Currencies

+

A Currency consists of following values:

+
    +
  • Name
  • +
  • ISO Code
  • +
  • Numeric ISO Code
  • +
  • Symbol
  • +
  • Exchange Rate: Is used to convert between different currencies
  • +
+

If you are going to use Currency conversion, you need to update exchange ranges regularly.

+

Currencies

+

Automated Exchange Rates

+

CoreShop supports mulitple providers to get exchange ranges from. Currently supported:

+
    +
  • CentralBankOfRepulicTurkey
  • +
  • EuropeanCentralBank
  • +
  • GoogleFinance
  • +
  • NationalBankOfRomania
  • +
  • YahooFinance
  • +
  • WebserviceX
  • +
+

To activate this feature, enable it within CoreShop Settings and choose your provider.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Localization/States.html b/docs/generated-docs/User_Documentation/Localization/States.html new file mode 100644 index 0000000000..575100765c --- /dev/null +++ b/docs/generated-docs/User_Documentation/Localization/States.html @@ -0,0 +1,165 @@ + + + + + + + States - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Localization/TaxRules.html b/docs/generated-docs/User_Documentation/Localization/TaxRules.html new file mode 100644 index 0000000000..5fc3943955 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Localization/TaxRules.html @@ -0,0 +1,166 @@ + + + + + + + TaxRules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Tax Rules

+

Tax Rules determine which Tax Rate should be used for the customers country/state. This Tax Rule is then applied to a product.

+

A Tax Rule consists of following values:

+
    +
  • Name
  • +
  • Active
  • +
  • Stores: In which Stores this Tax-Rule can be used.
  • +
  • Rules: Which Country and/or State should use which Tax Rate and what should happen when multiple Tax Rates apply.
  • +
+

Tax Rules

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Localization/Taxes.html b/docs/generated-docs/User_Documentation/Localization/Taxes.html new file mode 100644 index 0000000000..62000b9206 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Localization/Taxes.html @@ -0,0 +1,165 @@ + + + + + + + Taxes - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Taxes

+

A Tax Rate consists of following values:

+
    +
  • Localized Name: This name can also be seen in the cart or on invoices
  • +
  • Rate: Tax Rate, for example 20%
  • +
  • Active
  • +
+

Taxes are going to be used in Tax Rules.

+

Taxes

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Localization/Zones.html b/docs/generated-docs/User_Documentation/Localization/Zones.html new file mode 100644 index 0000000000..9581b838b2 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Localization/Zones.html @@ -0,0 +1,164 @@ + + + + + + + Zones - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Localization/index.html b/docs/generated-docs/User_Documentation/Localization/index.html new file mode 100644 index 0000000000..08a1446be2 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Localization/index.html @@ -0,0 +1,177 @@ + + + + + + + Localization - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Order/Order_Comments.html b/docs/generated-docs/User_Documentation/Order/Order_Comments.html new file mode 100644 index 0000000000..aa91f52a1a --- /dev/null +++ b/docs/generated-docs/User_Documentation/Order/Order_Comments.html @@ -0,0 +1,164 @@ + + + + + + + Order Comments - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Order Comments

+

Comment +Comment

+

CoreShop provides a simple comment interface which allows you to add simple notes to every order. +It's also possible to send the order comment to the customer. Just check "Submit Comment to Customer".

+
+

Note: You need a valid Notification Rule to send comments to user.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Order/Order_Detail.html b/docs/generated-docs/User_Documentation/Order/Order_Detail.html new file mode 100644 index 0000000000..3450953825 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Order/Order_Detail.html @@ -0,0 +1,310 @@ + + + + + + + Order Detail - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Order Detail

+

State / Price Overview

+

Please read more about the order workflow process here

+

Besides some useful information about the order store and the total order amount, +there're also several order states:

+

State

+

This is the main state and represents the summary of all order states.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newNew order has been placed.
confirmedNew order has been successfully created (after a offline order or a customer returns from payment gateway regardless of its state).
cancelledOrder has been cancelled.
completeOrder is complete.
+

Payment State

+

Global payment states per order and represents the summary of all order payments:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newNew payment has been created.
awaiting_paymentWaiting for payment: User is on payment offsite or payment is offline.
partially_paidSome order payments have been paid.
paidAll payments have been paid.
cancelledOrder is complete.
partially_refundedSome order payments have been refunded.
refundedAll payments have been refunded.
+

Shipment State

+

Global shipment states per order and represents the summary of all order shipments:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newNew shipment has been placed.
cancelledShipment has been cancelled
partially_shippedSome order items have been shipped.
shippedAll items have been shipped.
+

Invoice State

+

Global invoice states per order and represents the summary of all order invoices:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newNew invoice has been created.
cancelledInvoice has been cancelled
partially_invoicedSome invoices have been invoiced.
invoicedAll invoices have been invoiced.
+

Carrier/Payment Provider Info

+
    +
  • Currency of Order
  • +
  • Overall weight of Order Items
  • +
  • Carrier
  • +
  • Total Amount
  • +
+

Order History

+

The Order History shows you when specific states have been changed.

+

Payments

+

--

+

Shipments

+

--

+

Invoices

+

--

+

Mail Correspondence

+

--

+

Customer

+

--

+

Comments

+

--

+

Additional Data

+

--

+

Products

+

--

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Order/Order_Workflow.html b/docs/generated-docs/User_Documentation/Order/Order_Workflow.html new file mode 100644 index 0000000000..6bb9bc07a9 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Order/Order_Workflow.html @@ -0,0 +1,220 @@ + + + + + + + Order Workflow - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Order Workflow

+
+

Technical Overview of CoreShop Workflows.

+
+

Change States

+

States can be changed for: Order, Payment, Shipment and Invoice. +If any transition is available, you'll find a colored state button. +Click on that button to change the state.

+

Order Completion

+

In CoreShop a order is complete after the order payment reaches the paid state +and order shipment reaches the shipped state. If you also want to include the order invoice state invoiced +before a order gets completed, you need to enable a configuration flag:

+
## app/config/config.yml
+parameters:
+    coreshop.workflow.include_invoice_state_to_complete_order: true
+
+

Order Cancellation

+

In CoreShop a order rarely gets cancelled. Some reasons are:

+

Front-End Revise +After a customer has cancelled his payment he will reach a so called revise page. +From there he's able to reselect a payment gateway to start over. In revise mode, however, it's possible to cancel the order and restore the cart. +Only than the order gets cancelled.

+

Back-End Revise +In CoreShop it's possible to create orders in Back-End. Instead of adding sensitive payment information, +you're able to provide a revise link to your customer which then works the same as the Front-End revise process +(except that your customer is not able to restore a cart since there never was one).

+

Please read more about the canceling process here

+

Payment Workflow

+

Create a Payment

+

Just use the green bottom on the right top corner to add a new shipment. +A payment creation normally gets created by a frontend payment gateway. +This gateway also handles all the payment state changes.

+

Workflow Rules

+
    +
  • A payment reaches the new state after its creation.
  • +
  • A payment can be canceled as long it's in the new or processing state.
  • +
  • After a payment reaches completed state it only can get refunded.
  • +
+
+

Attention: The Refund process is not implemented yet in Coreshop!

+
+

Shipment Workflow

+

Create a Shipment

+

Just use the green bottom on the right top corner to add a new shipment. +If there are enough shippable items you can create a shipment.

+

Workflow Rules

+
    +
  • A shipment reaches the ready state (triggered by a create transition) after its creation.
  • +
  • A shipment can be canceled as long it's in the ready state
  • +
  • After you provoked the ship state a shipment can't be cancelled anymore.
  • +
+

Invoice Workflow

+

Create Invoice

+

Just use the green bottom on the right top corner to add a new invoice. +If there are enough invoiceable items you can create a invoice.

+

Workflow Rules

+
    +
  • A invoice reaches the ready state (triggered by a create transition) after its creation.
  • +
  • A invoice can be canceled as long it's in the ready state. Please note: Cancelling an invoice is not a refund action. You're allowed to create another invoice after cancelling the previous one.
  • +
  • After you provoked the complete state a invoice can't be cancelled anymore which means the invoice has been finally captured. After that you need to go on with a refund process
  • +
+
+

Attention: The Refund process is not implemented yet in Coreshop!

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Order/Orders.html b/docs/generated-docs/User_Documentation/Order/Orders.html new file mode 100644 index 0000000000..f47e951007 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Order/Orders.html @@ -0,0 +1,170 @@ + + + + + + + Orders - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Orders

+

Grid View

+

The default order list is based on the pimcore grid view. +CoreShop comes with a default column configuration:

+
    +
  • On the right side, click "Column configuration" and select "Order Overview".
  • +
  • Now click that button again and select "Set as favorite".
  • +
+

Filters in Grid View

+

It's possible to add custom filter definitions based on your project. +This has to be done via a php service. Read more about it here.

+

Apply Actions in Grid View

+

It's possible to apply custom bulk actions for selected orders. +This has to be done via a php service. Read more about it here.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Order/index.html b/docs/generated-docs/User_Documentation/Order/index.html new file mode 100644 index 0000000000..b63c6a937e --- /dev/null +++ b/docs/generated-docs/User_Documentation/Order/index.html @@ -0,0 +1,171 @@ + + + + + + + Order - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Actions.html b/docs/generated-docs/User_Documentation/Price_Rules/Actions.html new file mode 100644 index 0000000000..83863a9273 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Price_Rules/Actions.html @@ -0,0 +1,291 @@ + + + + + + + Actions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Price Rule Actions

+

Get a brief overview of all the available Price Rule Actions in CoreShop.

+

Free Shipping

+
+

Available for: Cart Price Rules

+
+

Add this action to allow free shipping.

+

Gift Product

+
+

Available for: Cart Price Rules

+
+

Add this action to place a gift in customers cart.

+

Options

+ + + + + + + + + + + + + +
NameDescription
Gift ProductNeeds to be a coreshop registered product object
+

Discount Amount

+
+

Available for: Cart Price Rules, Specific Product Price, Product Price

+
+

Set a arbitrary amount of discount.

+

Options

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
AmountDefine Amount
GrossIf given Amount has included VAT, check it
CurrencySet Currency of given amount
Apply OnSelect Between total and subtotal. Note: This option is only available in the cart rule context
+

Discount Percent

+
+

Available for: Cart Price Rules, Specific Product Price, Product Price

+
+

Set a arbitrary percentage amount of discount.

+

Options

+ + + + + + + + + + + + + + + + + +
NameDescription
PercentDefine Amount
Apply OnSelect Between total and subtotal. Note: This option is only available in the cart rule context
+

New Price

+
+

Available for: Specific Product Price, Product Price

+
+

Define a new Price.

+
+

Note: This will be used as a new price in frontend so there is no "special discount price" labelling. +If you need a highlighted discount price, use the Discount Price Action.

+
+

Options

+ + + + + + + + + + + + + + + + + +
NameDescription
PriceSet new Price
CurrencySet Currency of given amount
+

Discount Price

+
+

Available for: Specific Product Price, Product Price

+
+

Define a discount Price.

+

Options

+ + + + + + + + + + + + + + + + + +
NameDescription
PriceSet discount Price
CurrencySet Currency of given amount
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Cart_Price_Rules.html b/docs/generated-docs/User_Documentation/Price_Rules/Cart_Price_Rules.html new file mode 100644 index 0000000000..5154896094 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Price_Rules/Cart_Price_Rules.html @@ -0,0 +1,216 @@ + + + + + + + Cart Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart Price Rules Documentation

+

Cart price rules in CoreShop provide a flexible way to offer discounts and promotions in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions, such as cart subtotal, specific products, customer groups, or other criteria. This documentation will guide you through creating and managing cart price rules in CoreShop.

+

Cart Price Rules

+

Available Actions

+ +

Available Conditions

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Conditions.html b/docs/generated-docs/User_Documentation/Price_Rules/Conditions.html new file mode 100644 index 0000000000..d79cbaa632 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Price_Rules/Conditions.html @@ -0,0 +1,435 @@ + + + + + + + Conditions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Price Rules Conditions

+

Get a brief overview of all the available Price Rule Conditions in CoreShop.

+

Customers

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Define one ore more customers to whom the price rule should get applied.

+

Options

+ + + + + + + + + + + + + +
NameDescription
CustomersOne ore multiple CoreShop Customer Objects
+

Customer Groups

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Define one ore more customer groups to whom the price rule should get applied.

+

Options

+ + + + + + + + + + + + + +
NameDescription
GroupsOne ore multiple CoreShop Customer Group Objects
+

Time Span

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Define a time span in which range the price rule is valid

+

Options

+ + + + + + + + + + + + + + + + + +
NameDescription
Date FromDate/Time Start
Date ToDate/Time End
+

Voucher

+
+

Available for: Cart Price Rules

+
+

Define some Voucher Conditions. Check out the Voucher Section to learn more about Voucher Configuration.

+

Options

+ + + + + + + + + + + + + + + + + +
NameDescription
Max. Usage per CodeDefine how often a voucher code can be used.
Allow only one Voucher per CodeIf checked, only one Voucher per Cart is allowed.
+

Amount

+
+

Available for: Cart Price Rules

+
+

Define a Price range within the price rule should get applied.

+

Options

+ + + + + + + + + + + + + + + + + +
NameDescription
Min AmountThe min amount of cart
Max AmountThe max amount of cart
+

Countries

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Bind a specific country to the price rule. +Important: This Condition is connected with the Country Context Resolver. +This Condition does not implies to use the Users current location since the Resolver could be also store related.

+

Options

+ + + + + + + + + + + + + +
NameDescription
CountriesSelect one or multiple Countries
+

Zones

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Bind a specific zone to the price rule. +Important: This Condition is connected with the Country Context Resolver. +This Condition does not implies to use the Users current location since the Resolver could be also store related.

+

Options

+ + + + + + + + + + + + + +
NameDescription
ZonesSelect one or multiple Zones
+

Stores

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Bind a specific store to the price rule.

+

Options

+ + + + + + + + + + + + + +
NameDescription
StoresSelect one or multiple Stores
+

Currencies

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Define which currencies are valid to apply the price rule

+

Options

+ + + + + + + + + + + + + +
NameDescription
CurrenciesSelect one or multiple Currencies
+

Carriers

+
+

Available for: Cart Price Rules

+
+

Define which carriers are valid to apply the price rule

+

Options

+ + + + + + + + + + + + + +
NameDescription
CarriersSelect one or multiple Carriers
+

Nested Rules

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Build complex AND, OR and NOT nested conditions. +Within a nested rules it's possible to add any other condition again.

+

Options

+ + + + + + + + + + + + + +
NameDescription
OperatorAND, OR and NOT
+

Products

+
+

Available for: Cart Price Rules, Product Price

+
+

Apply rule only if given products are available.

+

Options

+ + + + + + + + + + + + + +
NameDescription
ProductsOne ore multiple CoreShop Product Objects
+

Categories

+
+

Available for: Cart Price Rules, Product Price

+
+

Apply rule only if products linked with given categories are available.

+

Options

+ + + + + + + + + + + + + +
NameDescription
CategoriesOne ore multiple CoreShop Category Objects
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Product_Price_Rules.html b/docs/generated-docs/User_Documentation/Price_Rules/Product_Price_Rules.html new file mode 100644 index 0000000000..d78bc382d4 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Price_Rules/Product_Price_Rules.html @@ -0,0 +1,210 @@ + + + + + + + Product Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Price Rules Documentation

+

Product price rules in CoreShop offer a flexible way to provide discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions and can apply to specific products, categories, or customer groups. This documentation will guide you through creating and managing product price rules in CoreShop.

+

Cart Price Rules

+

Available Actions

+ +

Available Conditions

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html b/docs/generated-docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html new file mode 100644 index 0000000000..e0f16147e1 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html @@ -0,0 +1,186 @@ + + + + + + + Quantity Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Quantity Price Rules Documentation

+

CoreShop Quantity Price Rules provide a flexible way to offer volume-based discounts for products in your e-commerce store built on the Pimcore platform. These rules apply to specific products and offer tiered pricing depending on the quantity purchased. This documentation will guide you through creating and managing quantity price rules in CoreShop.

+

Specific Price Rules

+

Available Conditions

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Specific_Price_Rules.html b/docs/generated-docs/User_Documentation/Price_Rules/Specific_Price_Rules.html new file mode 100644 index 0000000000..10561c6043 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Price_Rules/Specific_Price_Rules.html @@ -0,0 +1,201 @@ + + + + + + + Specific Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Specific Price Rules Documentation

+

Specific price rules in CoreShop provide a flexible way to create targeted discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules apply directly to individual products or variants and can be based on customer groups, currencies, or countries. This documentation will guide you through creating and managing specific price rules in CoreShop.

+

Specific Price Rules

+

Available Actions

+ +

Available Conditions

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Vouchers.html b/docs/generated-docs/User_Documentation/Price_Rules/Vouchers.html new file mode 100644 index 0000000000..26cf16cb7c --- /dev/null +++ b/docs/generated-docs/User_Documentation/Price_Rules/Vouchers.html @@ -0,0 +1,264 @@ + + + + + + + Vouchers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Vouchers

+
+

Info: In CoreShop Vouchers are Price Rules too. +To use or generate Vouchers you need to add a Cart Price Rule.

+
+

How to create Vouchers

+

Simple create a new cart price rule and activate "Is Voucher Rule". +With that, the "Voucher Codes" tab gets enabled.

+

Voucher

+

Voucher Condition

+

Voucher

+

If you need more control about handling Vouchers you need to add the "Voucher" Condition:

+ + + + + + + + + + + + + + + + + +
NameDescription
Max. Usage per CodeDefine how often a voucher code can be used.
Allow only one Voucher per CodeIf checked, only one Voucher per Cart is allowed.
+

Voucher Codes

+

Voucher

+

Within the "Voucher Codes" tab you're able to manage codes for the current price rule. +It's also possible to export generated codes to csv file.

+
+

If you need more globally statistics about vouchers please use the voucher report.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
CodeGenerated voucher code
Creation DateVoucher creation date
UsedIf the Voucher has been used you'll see a true statement
UsesAmount of uses per code
ActionIt's possible to delete voucher codes as long they're not in use
+

Create Voucher Code

+

There are two ways to generate Codes:

+

Single Voucher Code

+

Create a single voucher code. +The input field allows any string input, however if you already have added a code with the same string, you'll get a unique error message.

+

Voucher Codes Generator

+

This is the more advanced option to generate voucher codes:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
AmountDefine how many voucher codes should be generated
LengthDefine the Voucher Code Length
FormatVoucher Format. Possible Values: Alphanumeric, Alphabetic, Numeric
PrefixDefine a prefix for each code. For example SHOP-
SuffixDefine a suffix for each code. For example -SHOP
Hyphens all X charactersAdd a Dash (-) after every X character
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Price_Rules/index.html b/docs/generated-docs/User_Documentation/Price_Rules/index.html new file mode 100644 index 0000000000..85dfec0600 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Price_Rules/index.html @@ -0,0 +1,213 @@ + + + + + + + Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Price Rules

+

CoreShop Price Rules are very powerful tools for price calculation. +This section will help you to get a detailed overview about how price calculation works in CoreShop:

+

Types of Price Rules

+

There are three Price Rule Types.

+

1. Cart Price Rules

+

Apply Price Rule to the customers cart.

+

2. Product Price Rules

+

Apply Price Rule globally.

+

3. Specific Product Prices

+

Apply Price Rules to specific products.

+

Global Priority

+
    +
  • Product Price Rules first
  • +
  • Specific Price Rules second
  • +
+

Example 1:

+
    +
  • Given: Product A with price 100,-
  • +
  • Product Price Rule for Product A: New Price 50,-
  • +
  • Specific Price Rule for Product A: New Price: 20,-
  • +
  • Given Price: 20,-
  • +
+

Example 2:

+
    +
  • Given: Product A with price 100,-
  • +
  • Product Price Rule for Product A: Discount Percentage 50%
  • +
  • Specific Price Rule for Product A: New Price: 50,-
  • +
  • Given Price: 25,-
  • +
+

Specific Price Priority

+

Since it's possible to add multiple Specific Price Rules per Product you can adjust the +priority via the priority number field.

+

Automatic Rule Availability Checker

+

Rules with time-span elements included on root level will be disabled automatically if they're outdated. +Read more about automation here.

+

More Information

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Reports/Abandoned_Carts.html b/docs/generated-docs/User_Documentation/Reports/Abandoned_Carts.html new file mode 100644 index 0000000000..585506d389 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Reports/Abandoned_Carts.html @@ -0,0 +1,257 @@ + + + + + + + Abandoned Carts - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Abandoned Carts Report

+ + + + + + + + + + + + + +
TypeHas Pagination
ListYes
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Grid Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
Customer NameCustomer name (if available)
EmailCustomer Email (if available)
Selected PaymentName of selected Payment
Creation DateCreation Date
Modification DateModification Date
Items in CartAmount of Items in Cart
ActionOpen Cart Object
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Reports/Carrier_Distribution.html b/docs/generated-docs/User_Documentation/Reports/Carrier_Distribution.html new file mode 100644 index 0000000000..b1ffa22f8f --- /dev/null +++ b/docs/generated-docs/User_Documentation/Reports/Carrier_Distribution.html @@ -0,0 +1,221 @@ + + + + + + + Carrier Distribution - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Carrier Distribution Report

+

Carrier Distribution

+ + + + + + + + + + + + + +
TypeHas Pagination
Pie ChartNo
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Chart Fields

+

Carrier Distribution

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Reports/Carts.html b/docs/generated-docs/User_Documentation/Reports/Carts.html new file mode 100644 index 0000000000..7153bc7d5c --- /dev/null +++ b/docs/generated-docs/User_Documentation/Reports/Carts.html @@ -0,0 +1,238 @@ + + + + + + + Carts - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart/Order Conversion Report

+

Carts Report

+ + + + + + + + + + + + + +
TypeHas Pagination
Cartesian ChartNo
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Chart Fields

+ + + + + + + + + + + + + + + + + +
NameDescription
YAmount (Cart, Order)
XDate
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Reports/Categories.html b/docs/generated-docs/User_Documentation/Reports/Categories.html new file mode 100644 index 0000000000..697421e94e --- /dev/null +++ b/docs/generated-docs/User_Documentation/Reports/Categories.html @@ -0,0 +1,250 @@ + + + + + + + Categories - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Categories Report

+

Categories Report

+ + + + + + + + + + + + + +
TypeHas Pagination
ListNo
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Grid Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
NameProduct Name
Order CountAmount of Orders
QuantityQuantity
SalesSales
ProfitProfit
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Reports/Customers.html b/docs/generated-docs/User_Documentation/Reports/Customers.html new file mode 100644 index 0000000000..af8cfa820e --- /dev/null +++ b/docs/generated-docs/User_Documentation/Reports/Customers.html @@ -0,0 +1,242 @@ + + + + + + + Customers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Customers Report

+

Customers Report

+ + + + + + + + + + + + + +
TypeHas Pagination
ListNo
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Grid Fields

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
NameCustomer Name
Order CountAmount of Orders
SalesSales
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Reports/Payment_Distribution.html b/docs/generated-docs/User_Documentation/Reports/Payment_Distribution.html new file mode 100644 index 0000000000..1c247846e8 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Reports/Payment_Distribution.html @@ -0,0 +1,221 @@ + + + + + + + Payment Distribution - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Payment Distribution Report

+

Payment Distribution

+ + + + + + + + + + + + + +
TypeHas Pagination
Pie ChartNo
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Chart Fields

+

Payment Provider Distribution

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Reports/Products.html b/docs/generated-docs/User_Documentation/Reports/Products.html new file mode 100644 index 0000000000..751dfb981e --- /dev/null +++ b/docs/generated-docs/User_Documentation/Reports/Products.html @@ -0,0 +1,281 @@ + + + + + + + Products - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Products Report

+

Products Report

+ + + + + + + + + + + + + +
TypeHas Pagination
ListYes
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
Product TypesGroup Filter by Main Products, Variants, Container Products
+

Product Types

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
Main ProductsOnly show Products without Variant inclusion
VariantsOnly show Variant Product Types
Container ProductsShow Sum of Products and Child-Products. Note: Container Products are bounded to the original pimcore objects. The products will be ignored in this report, if those main-objects have been deleted!
+

Available Grid Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
NameProduct Name
Order CountAmount of Order
QuantityQuantity
Sale PriceSale Price
SalesAmount of Sales
ProfitAmount of Profit
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Reports/Sales.html b/docs/generated-docs/User_Documentation/Reports/Sales.html new file mode 100644 index 0000000000..f519956915 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Reports/Sales.html @@ -0,0 +1,242 @@ + + + + + + + Sales - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Sales Report

+

Sales Report

+ + + + + + + + + + + + + +
TypeHas Pagination
Cartesian ChartNo
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
Group ByGroup Filter by Day, Month, Year
+

Available Chart Fields

+ + + + + + + + + + + + + + + + + +
NameDescription
YAmount (Sales)
XDate
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Reports/Vouchers.html b/docs/generated-docs/User_Documentation/Reports/Vouchers.html new file mode 100644 index 0000000000..6fb7c3fe9a --- /dev/null +++ b/docs/generated-docs/User_Documentation/Reports/Vouchers.html @@ -0,0 +1,245 @@ + + + + + + + Vouchers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Voucher Report

+ + + + + + + + + + + + + +
TypeHas Pagination
ListYes
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Grid Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
CodeApplied Code
DiscountAmount of Discount
Price RuleName of applied Price Rule
Applied DateApplied Date
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Reports/index.html b/docs/generated-docs/User_Documentation/Reports/index.html new file mode 100644 index 0000000000..f0e0aa9ba6 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Reports/index.html @@ -0,0 +1,186 @@ + + + + + + + Reports - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Settings.html b/docs/generated-docs/User_Documentation/Settings.html new file mode 100644 index 0000000000..42b2a20812 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Settings.html @@ -0,0 +1,230 @@ + + + + + + + Settings - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop's Settings are divided into each "sub"-shop and some system settings.

+

Shop-Settings

+

Settings can be different for each Store.

+

Settings

+

Base

+
    +
  • Catalog-Mode: With catalog-mode enabled, the cart and checkout are disabled. Products can only be viewed.
  • +
  • Guest-Checkout: Enables or disables guest-checkout feature
  • +
+

Customer Service

+
    +
  • Customer Email Document: Email document used to send customer messages
  • +
  • Customer Re Email Document: Email document used to send customer reply messages
  • +
  • Contact Email Document: Email document used to send contact messages
  • +
  • Contact Sales: Default contact used for sales messages
  • +
  • Contact Technology: Default contact used for technology messages
  • +
+

Stock

+
    +
  • Default Stock Behaviour: Describes the default stock behaviour for products
  • +
+

Tax

+
    +
  • Validate VAT: Describes if the VAT-Number for European Countries should be validated
  • +
  • Disable VAT for Base Country: Disable VAT-Free Shopping for Customers, with valid Vat-Number, in Base Country
  • +
  • Taxation Address: Describes witch address is responsibly for taxation
  • +
+

Prices

+
    +
  • Prices are gross prices: Determines if entered prices in CoreShop are with or without tax included.
  • +
+

Shipping

+
    +
  • Free Shipping starts at weight: Describes free shipping at weight. It's also much faster using this than price-rules
  • +
  • Free Shipping starts at Currency: Describes free shipping at cart value. It's also much faster using this than price-rules
  • +
  • Carrier Sort: Describes how the Carriers should be sorted
  • +
+

Product

+
    +
  • Default Image: Defines an default image for products if no image is available.
  • +
  • Number of days as new: Defines the time of days a product is marked as new.
  • +
+

Category

+
    +
  • Default Image: Defines an default image for categories if no image is available.
  • +
+

Invoice

+
    +
  • Create Invoice for Orders: Defines if invoices are going to be created on an paid order.
  • +
  • Prefix: Prefix string for Order and Invoice numbers
  • +
  • Suffix: Suffix string for Orders and Invoice numbers.
  • +
  • WKHTMLTOPDF Parameters: Parameters which will be passed to WKHTMLTOPDF
  • +
+

Mail Settings

+
    +
  • admin email-addresses to send order notification (CSV): Email addresses which will be notified on new orders
  • +
  • Send OrderStates as BCC to admin email-addresses: Determines if order-state emails should also be sent to admin-emails
  • +
+

Cart

+
    +
  • Activate automatic cart cleanup: Activate automatic cart cleanup -> cleans inactive and empty carts
  • +
+

System - Settings

+

System Settings are defined one time for all shops.

+

System Settings

+

System Settings

+
    +
  • Send Usagelog to CoreShop: Sends an anonymous usagelog to CoreShop Developer
  • +
+

Currency

+
    +
  • Automatic Exchange Rates: Describes if exchange rates should be fetched automatically
  • +
  • Exchange Rate Provider: Describes which exchange rate provider should be used.
  • +
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Shipping/Carriers.html b/docs/generated-docs/User_Documentation/Shipping/Carriers.html new file mode 100644 index 0000000000..a874852f23 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Shipping/Carriers.html @@ -0,0 +1,176 @@ + + + + + + + Carriers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Carriers Documentation

+

CoreShop Carriers are an essential part of the shipping process in the CoreShop e-commerce framework, built on the Pimcore platform. Carriers represent shipping providers (e.g., UPS, FedEx, or DHL) and are responsible for delivering orders to customers. This documentation will guide you through the process of creating and managing carriers in CoreShop.

+

Creating a Carrier

+

To create a carrier, follow these steps:

+
    +
  • Log in to the CoreShop admin interface.
  • +
  • Navigate to the "Shipping" tab and click on "Carriers."
  • +
  • Click the "Add new" button to create a new carrier.
  • +
  • Enter a name for the carrier and configure the other available options as needed.
  • +
+

Carrier Options

+

When creating a carrier, you can configure various options to customize its behavior:

+
    +
  • Name: A descriptive name for the carrier (e.g., UPS, FedEx, or DHL).
  • +
  • Tracking Url: A string value that indicates the tracking url
  • +
  • Tax Rule Group: The tax rule group applied to shipping costs for this carrier. If you want to apply taxes to shipping costs, you'll need to create a tax rule group and assign it to the carrier.
  • +
  • Shipping Rules: The shipping rules associated with this carrier. Shipping rules define shipping costs based on various conditions such as weight, price, dimensions, and destination. You can assign multiple shipping rules to a carrier, and the system will evaluate them in order of priority to determine the final shipping cost.
  • +
+

Summary

+

CoreShop Carriers provide a robust way to manage shipping providers and their associated services. By creating carriers and configuring their options, you can offer customers a range of shipping choices based on factors such as delivery time and cost. Combined with shipping rules, carriers give you the flexibility to create a tailored shipping experience for your e-commerce store.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Shipping/Shipping_Rules.html b/docs/generated-docs/User_Documentation/Shipping/Shipping_Rules.html new file mode 100644 index 0000000000..c4d6d2f293 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Shipping/Shipping_Rules.html @@ -0,0 +1,201 @@ + + + + + + + Shipping Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Shipping Rules Documentation

+

CoreShop Shipping Rules is a powerful feature within the CoreShop e-commerce framework built on the Pimcore platform. It allows you to create flexible and customizable shipping rules that define shipping costs based on various conditions such as weight, price, dimensions, and shipping destination.

+

Overview

+

Shipping rules in CoreShop can be composed of conditions and actions. Conditions determine whether a rule should be applied, while actions define the changes to the shipping costs.

+

CoreShop provides a user-friendly interface for creating and managing shipping rules. You can create multiple rules, each with different conditions and actions, to cover various scenarios.

+

Creating Shipping Rules

+
    +
  • Navigate to the "Shipping" tab and click on "Shipping Rules."
  • +
  • Click the "Add new" button to create a new shipping rule.
  • +
  • Enter a name for the rule and configure the other available options as needed.
  • +
+

Configuring Conditions

+

Conditions determine whether the shipping rule should be applied to an order. You can create multiple conditions for a single rule, and all conditions must be met for the rule to be applied. CoreShop offers several types of conditions, including:

+
    +
  • Weight: Based on the total weight of the order.
  • +
  • Price: Based on the total price of the order.
  • +
  • Dimension: Based on the dimensions (length, width, and height) of the order.
  • +
  • Quantity: Based on the total quantity of items in the order.
  • +
  • Countries: Based on the shipping destination country.
  • +
  • Zones: Based on the shipping destination zone (a group of countries).
  • +
+

To add a condition to your shipping rule:

+
    +
  • Click the "Add Condition" button in the "Conditions" section of the shipping rule.
  • +
  • Choose the desired condition type from the dropdown menu.
  • +
  • Configure the condition parameters as needed.
  • +
+

For example, if you want to apply a shipping rule only to orders with a total weight of over 10kg, you would add a weight condition and set the minimum weight to 10kg.

+

Configuring Actions

+

Actions define the changes to the shipping costs when a rule is applied. You can create multiple actions for a single rule. CoreShop offers several types of actions, including:

+
    +
  • Discount Amount: Apply a fixed discount amount to the shipping cost.
  • +
  • Discount Percentage: Apply a percentage discount to the shipping cost.
  • +
  • Add Amount: Add a fixed amount to the shipping cost.
  • +
  • Add Percentage: Add a percentage amount to the shipping cost.
  • +
+

To add an action to your shipping rule:

+
    +
  • Click the "Add Action" button in the "Actions" section of the shipping rule.
  • +
  • Choose the desired action type from the dropdown menu.
  • +
  • Configure the action parameters as needed.
  • +
+

For example, if you want to apply a 20% discount to the shipping cost when the rule is applied, you would add a discount percentage action and set the percentage value to 20.

+

Summary

+

CoreShop Shipping Rules offer a powerful and flexible way to define and manage shipping costs for your e-commerce store. By creating various conditions and actions, you can customize shipping costs based on factors such as weight, price, dimensions, and destination. This allows you to cater to different customer needs and provide more accurate shipping estimates.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Shipping/index.html b/docs/generated-docs/User_Documentation/Shipping/index.html new file mode 100644 index 0000000000..d268ef2d7c --- /dev/null +++ b/docs/generated-docs/User_Documentation/Shipping/index.html @@ -0,0 +1,166 @@ + + + + + + + Shipping - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/Stores.html b/docs/generated-docs/User_Documentation/Stores.html new file mode 100644 index 0000000000..ff735bc941 --- /dev/null +++ b/docs/generated-docs/User_Documentation/Stores.html @@ -0,0 +1,180 @@ + + + + + + + Stores - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Stores

+

Every CoreShop Installation is bounded to a default Store. +By default a store is connected with a pimcore Site.

+

Stores

+

Domain based Store

+

This is CoreShops default behaviour. One store for your default page, which is also your default store. +If you have multiple Domains it's possible to add a store to each domain.

+
+

Tip: Learn more about pimcore multi sites: Pimcore Sites

+
+

Custom Store Locator

+

Sometimes you have just one site installation but you want do use different Stores. +Example: /de-at should use a austrian store and /de-de a german one. +For that you need to build a custom store locator to do so, checkout the dev section to find out how this can be achieved.

+

Configure CoreShop Stores

+

Open CoreShop Menu -> "Stores". There should be already a default store, connected to your default (main-domain) site. +To create a new store, click on the "Add" button. Proceed wih configuring your new store.

+

Examples

+

Stores can be used in many ways, checkout the examples to find out which solution suits you most.

+

Example 1: Global Store

+

Use a Store to handle multiple currencies, countries and tax calculations. +Depending on your product and price strategy, it's possible to use it within one store.

+

Example 2: Country Store

+

Use a Store for each Country. This allows you to restrict your shop within a country context.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/User_Documentation/index.html b/docs/generated-docs/User_Documentation/index.html new file mode 100644 index 0000000000..ff7968564f --- /dev/null +++ b/docs/generated-docs/User_Documentation/index.html @@ -0,0 +1,298 @@ + + + + + + + User Documentation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

User Documentation

+

This section provides a quick getting started tutorial for CoreShop and covers the following topics:

+
    +
  1. +Stores +
  2. +
  3. +Settings +
  4. +
  5. +Price Rules +
      +
    1. +Cart Price Rules +
    2. +
    3. +Product Price Rules +
    4. +
    5. +Specific Product Price +
    6. +
    7. +Vouchers +
    8. +
    9. +Available Actions +
    10. +
    11. +Available Conditions +
    12. +
    +
  6. +
  7. +Localization +
      +
    1. +Countries +
    2. +
    3. +States +
    4. +
    5. +Zones +
    6. +
    7. +Taxes +
    8. +
    9. +Taxes +
    10. +
    11. +TaxRules +
    12. +
    +
  8. +
  9. +Shipping +
      +
    1. +Carriers +
    2. +
    3. +Shipping Rules +
    4. +
    +
  10. +
  11. +Cart +
  12. +
  13. +Order +
      +
    1. +Orders +
    2. +
    3. +Order Detail +
    4. +
    5. +Order Workflow +
    6. +
    7. +Order Comments +
    8. +
    +
  14. +
  15. +Catalog +
      +
    1. +Products +
    2. +
    3. +Product Variants +
    4. +
    5. +Categories +
    6. +
    +
  16. +
  17. +Inventory +
  18. +
  19. +GEO IP +
  20. +
  21. +Reports +
      +
    1. +Sales +
    2. +
    3. +Cart/Order Conversion +
    4. +
    5. +Abandoned Carts +
    6. +
    7. +Products +
    8. +
    9. +Categories +
    10. +
    11. +Customers +
    12. +
    13. +Carrier Distribution +
    14. +
    15. +Payment Distribution +
    16. +
    17. +Vouchers +
    18. +
    +
  22. +
  23. +Automation +
  24. +
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Address_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Address_Bundle.html new file mode 100644 index 0000000000..6a062154d7 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Address_Bundle.html @@ -0,0 +1,166 @@ + + + + + + + Address Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Address Bundle

+

CoreShop Address Bundle provides a basic set of data for Addressing Information like:

+
    +
  • Country
  • +
  • State
  • +
  • Address
  • +
+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Configuration_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Configuration_Bundle.html new file mode 100644 index 0000000000..b7618e99de --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Configuration_Bundle.html @@ -0,0 +1,167 @@ + + + + + + + Configuration Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Configuration Bundle

+

Installation

+
$ composer require coreshop/configuration-bundle:^3.0
+
+

Usage

+

Configuration Component helps you store your configurations in database.

+
    $service = new CoreShop\Component\Configuration\Service\ConfigurationService($doctrineEntityManager, $configRepo, $configFactory);
+    $service->set('key', 'value');
+
+    $service->get('key');
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Core_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Core_Bundle.html new file mode 100644 index 0000000000..3fa93009f6 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Core_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Core Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Core Bundle

+

Core Bundle glues all independent CoreShop Bundles into one e-commerce suite and extends certain parts accordingly.

+
+

This Bundle is not advised to be installed seperately!

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Currency_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Currency_Bundle.html new file mode 100644 index 0000000000..a72c1ccfe9 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Currency_Bundle.html @@ -0,0 +1,208 @@ + + + + + + + Currency Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Currency Bundle

+

Currency Bundle provides you with Models for persisting Currencies and resolving Currency Contexts.

+
    +
  • Symfony Profiler
  • +
  • Pimcore Core Extensions
  • +
  • Doctrine Mappings
  • +
  • Symfony Forms
  • +
  • Money Formatter
  • +
  • Twig Extensions +
      +
    • Currency Formatting
    • +
    • Currency Conversion
    • +
    • Currency Code to Symbol
    • +
    +
  • +
+

Installation

+
$ composer require coreshop/currency-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\CurrencyBundle\CoreShopCurrencyBundle(),
+    ]);
+}
+
+

Updating database schema

+

Run the following command.

+
$ php bin/console doctrine:schema:update --force
+
+

Usage

+

This Bundle integrates Currency Component into Symfony and Doctrine

+

The Currency Bundle provides you with basic information needed for Currencies: Currency, Exchange Rates, Conversion and Formatting

+

Doctrine Entities

+
    +
  • Currency
  • +
+

Pimcore UI

+
    +
  • Currency
  • +
  • Exchange Rate
  • +
+

How to use?

+
coreshop.global.resource.open('coreshop.currency', 'currency');
+coreshop.global.resource.open('coreshop.currency', 'exchange_rate');
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Customer_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Customer_Bundle.html new file mode 100644 index 0000000000..6a5c89c5e4 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Customer_Bundle.html @@ -0,0 +1,190 @@ + + + + + + + Customer Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Customer Bundle

+

Installation

+
$ composer require coreshop/customer-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\CustomerBundle\CoreShopCustomerBundle(),
+    ]);
+}
+
+

Updating database schema

+

Run the following command.

+
$ php bin/console doctrine:schema:update --force
+
+

Install Pimcore Entities

+
$ php bin/console coreshop:resources:install
+
+

Learn more about overriding Pimcore Classes here)

+

Usage

+

This Bundle integrates Customer Component into Symfony and Doctrine

+

The Customer Bundle provides you with basic information needed for a Customer: Customer and CustomerGroup

+

The Bundle also introduces an Customer Context, which helps you determine the current Customer.

+

Pimcore Entities

+
    +
  • Customer (CoreShopCustomer)
  • +
  • CustomerGroup (CoreShopCustomerGroup)
  • +
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Fixture_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Fixture_Bundle.html new file mode 100644 index 0000000000..ef17dac419 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Fixture_Bundle.html @@ -0,0 +1,246 @@ + + + + + + + Fixture Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Fixture Bundle

+

Fixture Bundle allows us to Install certain data needed for runtime of CoreShop or for the Demo.

+

Installation

+
$ composer require coreshop/fixture-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\FixtureBundle\CoreShopFixtureBundle(),
+    ]);
+}
+
+

Updating database schema

+

Run the following command.

+
$ php bin/console doctrine:schema:update --force
+
+

Creating a new Fixture

+

Create a new File in your Bundle within the Namespace Fixtures\Data\Application for app fixtures and Fixtures\Data\Demo for Demo fixtures. The FixtureBundle +will automatically recognize your fixtures.

+
<?php
+
+namespace CoreShop\Bundle\CoreBundle\Fixtures\Application;
+
+use CoreShop\Bundle\FixtureBundle\Fixture\VersionedFixtureInterface;
+use Doctrine\Common\DataFixtures\AbstractFixture;
+use Doctrine\Common\Persistence\ObjectManager;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+class ConfigurationFixture extends AbstractFixture implements ContainerAwareInterface, VersionedFixtureInterface
+{
+    /**
+     * @var ContainerInterface
+     */
+    private $container;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getVersion()
+    {
+        return '2.0';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setContainer(ContainerInterface $container = null)
+    {
+        $this->container = $container;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function load(ObjectManager $manager)
+    {
+        $configurations = [
+            'system.guest.checkout' => true,
+            'system.category.list.mode' => 'list',
+            'system.category.list.per_page' => [12, 24, 36],
+            'system.category.list.per_page.default' => 12,
+            'system.category.grid.per_page' => [5, 10, 15, 20, 25],
+            'system.category.grid.per_page.default' => 10,
+            'system.category.variant_mode' => 'hide',
+            'system.order.prefix' => 'O',
+            'system.order.suffix' => '',
+            'system.quote.prefix' => 'Q',
+            'system.quote.suffix' => '',
+            'system.invoice.prefix' => 'IN',
+            'system.invoice.suffix' => '',
+            'system.invoice.wkhtml' => '-T 40mm -B 15mm -L 10mm -R 10mm --header-spacing 5 --footer-spacing 5',
+            'system.shipment.prefix' => 'SH',
+            'system.shipment.suffix' => '',
+            'system.shipment.wkhtml' => '-T 40mm -B 15mm -L 10mm -R 10mm --header-spacing 5 --footer-spacing 5',
+        ];
+
+        foreach ($configurations as $key => $value) {
+            $this->container->get('coreshop.configuration.service')->set($key, $value);
+        }
+    }
+}
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Frontend_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Frontend_Bundle.html new file mode 100644 index 0000000000..6c261bf208 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Frontend_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Frontend Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Frontend Bundle

+

CoreShop FrontendBundle provides some FrontendControllers as well as a default Implementation for the Frontend.

+
+

This Bundle is not advised to be installed seperately!

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Index_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Index_Bundle.html new file mode 100644 index 0000000000..2d778f94af --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Index_Bundle.html @@ -0,0 +1,199 @@ + + + + + + + Index Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Index Bundle

+

Installation

+
$ composer require coreshop/index-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\IndexBundle\CoreShopIndexBundle(),
+    ]);
+}
+
+

Updating database schema

+

Run the following command.

+
$ php bin/console doctrine:schema:update --force
+
+

Usage

+

This Bundle integrates Index Component into Symfony and Doctrine

+

The Index Bundle provides you with basic information needed for a Indexing Pimcore Models: Index, Filters and Conditions

+

It also provides you with ListingServices and FilterServices

+

Get Listing from Index

+

How to get a Listing from an Index?

+
$filter = $this->get('coreshop.repository.filter')->find(1); //Get Filter by ID 1
+$filteredList = $this->get('coreshop.factory.filter.list')->createList($filter, $request->request);
+$filteredList->setVariantMode(ListingInterface::VARIANT_MODE_HIDE);
+$filteredList->setCategory($category);
+$this->get('coreshop.filter.processor')->processConditions($filter, $filteredList, $request->query);
+$filteredList->load();
+
+

Pimcore UI

+
    +
  • Index Configuration
  • +
  • Filter Configuration
  • +
+

How to use?

+
coreshop.global.resource.open('coreshop.index', 'index');
+coreshop.global.resource.open('coreshop.index', 'filter');
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Inventory_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Inventory_Bundle.html new file mode 100644 index 0000000000..a29fceebdd --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Inventory_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Inventory Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Inventory Bundle

+

CoreShop Inventory Bundle provides a Basic implementation to handle Inventory for a Product.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Locale_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Locale_Bundle.html new file mode 100644 index 0000000000..4209e2d1f1 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Locale_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Locale Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Locale Bundle

+

CoreShop Locale Bundle provides a basic set of data for Locale Information.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Menu_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Menu_Bundle.html new file mode 100644 index 0000000000..c5fabef061 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Menu_Bundle.html @@ -0,0 +1,225 @@ + + + + + + + Menu Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Menu Bundle

+

Menu Bundle makes it easy creating Pimcore Menus based on permissions.

+

Installation

+
$ composer require coreshop/menu-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\MenuBundle\CoreShopMenuBundle(),
+    ]);
+}
+
+

Usage

+

Create a new Menu by creating a new Class, let's call it MyMenuBuilder

+

+namespace AppBundle\Menu;
+
+use CoreShop\Bundle\MenuBundle\Builder\MenuBuilderInterface;
+use Knp\Menu\FactoryInterface;
+use Knp\Menu\ItemInterface;
+
+class MyMenuBuilder implements MenuBuilderInterface
+{
+    public function buildMenu(ItemInterface $menuItem, FactoryInterface $factory, string $type) 
+    {
+        //Create a new direct sub-menu item
+        $menuItem
+            ->addChild('my-menu-item')
+            ->setLabel('my-menu-item')
+            ->setAttribute('permission', 'my_menu_item')
+            ->setAttribute('iconCls', 'pimcore_icon_delete')
+        ;
+    }
+}
+
+

You then need to register your class to the symfony container:

+
    app.my_menu:
+        class: AppBundle\Menu\MyMenuBuilder
+        tags:
+            - { name: coreshop.menu, type: my_menu, menu: my_menu }
+
+
+

Where the menu attribute defines your unique identifier for your menu. You can also register multiple Builders +for your Menu with the same menu attribute, this will load them one after another.

+

Now, lets do the ExtJs Javascript part. In your Bundle. I assume you already have a working Bundle for that. In your +Bundle.php file, add this file to the jsPaths array:

+
'/admin/coreshop/coreshop.my_menu/menu.js'
+
+

Where my_menu here again is your defined identifier. This will load a basic helper file that will build your menu. +Now, let's actually build the menu.

+

You should already have a startup.js somehwere in your Bundle. In there, you can instantiate the menu by calling:

+
new coreshop.menu.coreshop.my_menu();
+
+

That will build the menu automatically for you.

+

In order now to do something when a menu-item is clicked, you can attach to the event that is fired:

+
pimcore.eventDispatcher.registerTarget('coreshopMenuOpen', new (Class.create({
+    coreshopMenuOpen: function(type, item) {
+        if (item.id === 'my-menu-item') {
+            alert('My Menu Item has been clicked');
+        }
+    }
+})));
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Messenger_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Messenger_Bundle.html new file mode 100644 index 0000000000..6d5e772043 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Messenger_Bundle.html @@ -0,0 +1,175 @@ + + + + + + + Messenger Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Messenger Bundle

+

CoreShop Messenger Bundle provides you with a nice UI to see what Messenger Tasks are queued in which queues:

+

Messenger

+

Installation

+
$ composer require coreshop/messenger-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\MessengerBundle\CoreShopMessengerBundle(),
+    ]);
+}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Money_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Money_Bundle.html new file mode 100644 index 0000000000..1c174d8a06 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Money_Bundle.html @@ -0,0 +1,178 @@ + + + + + + + Money Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Money Bundle

+

Installation

+
$ composer require coreshop/money-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\MoneyBundle\CoreShopMoneyBundle(),
+    ]);
+}
+
+

Usage

+

Money Bundle adds a new core-extension to pimcore which allows you to store currency values as integer.

+

You also get a Twig Extension to format money values.

+
{{ value|coreshop_format_money('€', 'de'); }}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Notification_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Notification_Bundle.html new file mode 100644 index 0000000000..2e742a9a08 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Notification_Bundle.html @@ -0,0 +1,170 @@ + + + + + + + Notification Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Notification Bundle

+

CoreShop Notification Bundle handles all communication between CoreShop and the outside world. It provides a basic set of data for Notifications like:

+
    +
  • Notification Rules
  • +
  • Notification Rule Conditions
  • +
  • Notification Rule Actions
  • +
+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+

Usage

+

Notifications run async in a Symfony messenger queue:

+
bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/OptimisticEntityLock_Bundle.html b/docs/generated-docs/generated_docs/Bundles/OptimisticEntityLock_Bundle.html new file mode 100644 index 0000000000..33fff358bb --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/OptimisticEntityLock_Bundle.html @@ -0,0 +1,179 @@ + + + + + + + OptimisticEntityLock Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Optimistic Entity Lock Bundle

+

The CoreShop Optimistic Entity Lock Bundle is a package for the CoreShop e-commerce framework, based on the Pimcore platform, designed to handle optimistic entity locking. This bundle helps prevent conflicts when multiple users try to edit the same entity concurrently by implementing an optimistic locking strategy. +Messenger

+

Installation

+
$ composer require optimistic-entity-lock-bundle
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\OptimisticEntityLockBundle\CoreShopOptimisticEntityLockBundle(),
+    ]);
+}
+
+

Usage

+

Your Pimcore DataObject Class needs to implement the Interface CoreShop\Bundle\OptimisticEntityLockBundle\Model\OptimisticLockedInterface.

+

You can therefore add the field optimisticLockVersion to your Pimcore Class Definition.

+

From now on, everytime the DataObject gets saved, CoreShop compares the Versions and increases it before saving. If the version is different, someone else saved the entity before you and you get a exception.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Order_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Order_Bundle.html new file mode 100644 index 0000000000..9eac334ac1 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Order_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Order Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Order Bundle

+

CoreShop Order Bundle provides a basic set of data for Orders.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Payment_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Payment_Bundle.html new file mode 100644 index 0000000000..d46e10cbeb --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Payment_Bundle.html @@ -0,0 +1,192 @@ + + + + + + + Payment Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Payment Bundle

+

Installation

+
$ composer require coreshop/payment-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\PaymentBundle\CoreShopPaymentBundle(),
+    ]);
+}
+
+

Updating database schema

+

Run the following command.

+
$ php bin/console doctrine:schema:update --force
+
+

Usage

+

This Bundle integrates Payment Component into Symfony and Doctrine

+

The Payment Bundle provides you with basic information needed for payment: Payment

+

The Bundle also introduces an Address Formatter, which formats addresses in country based formats.

+

Doctrine Entities

+
    +
  • Payment
  • +
+

Pimcore UI

+
    +
  • Payment Provider
  • +
+

How to use?

+
coreshop.global.resource.open('coreshop.payment', 'payment_provider');
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/PayumPayment_Bundle.html b/docs/generated-docs/generated_docs/Bundles/PayumPayment_Bundle.html new file mode 100644 index 0000000000..24ba9550ce --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/PayumPayment_Bundle.html @@ -0,0 +1,158 @@ + + + + + + + PayumPayment Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Payum_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Payum_Bundle.html new file mode 100644 index 0000000000..549c8f3013 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Payum_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Payum Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Payum Bundle

+

Handles the Payum Integration with CoreShop. This Bundle requires the Core and can only be used in the full installation.

+
+

This Bundle is not advised to be installed seperately!

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Pimcore_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Pimcore_Bundle.html new file mode 100644 index 0000000000..c865befffa --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Pimcore_Bundle.html @@ -0,0 +1,422 @@ + + + + + + + Pimcore Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Pimcore Bundle

+

Installation

+
$ composer require coreshop/pimcore-bundle:^3.0
+
+

Activating Bundle

+

You need to enable the bundle inside the kernel or with the Pimcore Extension Manager.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\PimcoreBundle\CoreShopPimcoreBundle()
+    ]);
+}
+
+

Usage

+

The CoreShopPimcoreBundle integrates the CoreShop Pimcore Component into Symfony automatically registers a lot of services for you.

+

JS/CSS Resource Loading

+

With Pimcore, every bundle needs to take care about loading static assets themselve. PimcoreBundle helps you out here, follow these steps to use it:

+
    +
  • Create a DependencyInjection Extension class like:
  • +
+
<?php
+
+namespace AppBundle\DependencyInjection;
+
+use CoreShop\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractModelExtension;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
+
+class AppExtension extends AbstractModelExtension
+{
+    public function load(array $config, ContainerBuilder $container)
+    {
+        $config = $this->processConfiguration($this->getConfiguration([], $container), $config);
+
+        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
+        $loader->load('services.yml');
+
+        $this->registerPimcoreResources('coreshop', $config['pimcore_admin'], $container);
+    }
+}
+
+
    +
  • Create a DependencyInjection Configuration class like:
  • +
+
<?php
+
+namespace AppBundle\DependencyInjection;
+
+use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
+use Symfony\Component\Config\Definition\Builder\TreeBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+final class Configuration implements ConfigurationInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('app');
+
+        $this->addPimcoreResourcesSection($rootNode);
+
+        return $treeBuilder;
+    }
+
+    /**
+     * @param ArrayNodeDefinition $node
+     */
+    private function addPimcoreResourcesSection(ArrayNodeDefinition $node)
+    {
+        $node->children()
+            ->arrayNode('pimcore_admin')
+                ->addDefaultsIfNotSet()
+                ->children()
+                    ->arrayNode('js')
+                        ->addDefaultsIfNotSet()
+                        ->ignoreExtraKeys(false)
+                        ->children()
+                            ->scalarNode('test')->defaultValue('/bundles/app/pimcore/js/test.js')->end()
+                        ->end()
+                    ->end()
+                    ->arrayNode('css')
+                        ->addDefaultsIfNotSet()
+                        ->ignoreExtraKeys(false)
+                        ->children()
+                            ->scalarNode('test')->defaultValue('/bundles/app/pimcore/css/pimcore.css')->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ->end();
+    }
+}
+
+
+
    +
  • That's it, PimcoreBundle now takes care about loading your resources and also bundles them in non DEV-Mode.
  • +
+

DataObject Extensions

+

Serialized Data

+

This extension allows you to store SerializedData inside a Pimcore DataObject.

+

Slug

+

Pimcore comes with quite useful objects slugs. But it doesn't come with a Slug Generator. CoreShop for the rescue. In Order to use it, +your class needs to implement CoreShop\Component\Pimcore\Slug\SluggableInterface and CoreShop automatically generates slugs for you.

+

Extensions / Influence the slug generation

+

If you want to change the generated slug or prefix it, you can use the CoreShop\Component\Pimcore\Event\SlugGenerationEvent Event.

+
<?php
+
+declare(strict_types=1);
+
+namespace App\EventListener;
+
+use CoreShop\Component\Pimcore\Event\SlugGenerationEvent;
+use Pimcore\Model\DataObject\PressRelease;
+use Pimcore\Model\Document;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+final class SlugEventListener implements EventSubscriberInterface
+{
+    public static function getSubscribedEvents()
+    {
+        return [
+            SlugGenerationEvent::class => 'onGenerate',
+        ];
+    }
+
+    public function onGenerate(SlugGenerationEvent $event): void
+    {
+        $event->setSlug($event->getSlug() . '-bar');
+    }
+}
+
+

Data Object Features

+

Class Converter and Data Migrate

+

Class converter is a small utility, which lets you migrate all Data from one class to another. Usage:

+
<?php
+
+use CoreShop\Component\Pimcore\Migrate;
+
+$currentClassName = 'Product';
+$newClassName = 'NewProduct';
+$options = [
+    'delete_existing_class' => true,
+    'parentClass' => 'AppBundle\Model\MyProduct'
+];
+
+//Copies $currentClassName Definition to $newClassName
+//$options can overwrite some properties like parentClass
+Migrate::migrateClass($currentClassName, $newClassName, $options);
+
+//This function migrates all data from $currentClassName to $newClassName
+//It uses SQL Commands to increase performance of migration
+Migrate::migrateData($currentClassName, $newClassName);
+
+

Class Installer

+

Class Installer helps you importing Classes/FieldCollections/ObjectBricks into Pimcore based of a JSON Definition:

+

+use CoreShop\Component\Pimcore\ClassInstaller;
+
+$installer = new ClassInstaller();
+
+// For Bricks use
+$installer->createBrick($pathToJson, $brickName);
+
+// For Classes use
+$installer->createClass($pathToJson, $className, $updateExistingClass);
+
+// For FieldCollections use
+$installer->createFieldCollection($pathToJson, $fcName);
+
+
+

Class/Brick/Field Collection Updater

+

Definition Updaters help you in migrating your Pimcore Class/Bricks or Field Collection Definitions to be properly +migrated from Release to Release.

+

To update a Pimcore class use it like this:

+
use CoreShop\Component\Pimcore\DataObject\ClassUpdate;
+
+$classUpdater = new ClassUpdate('Product');
+
+//Your JSON Definition from Pimcore
+$payment = [
+    'fieldtype' => 'coreShopSerializedData',
+    'phpdocType' => 'array',
+    'allowedTypes' =>
+        [
+        ],
+    'maxItems' => 1,
+    'name' => 'paymentSettings',
+    'title' => 'Payment Settings',
+    'tooltip' => '',
+    'mandatory' => false,
+    'noteditable' => true,
+    'index' => false,
+    'locked' => null,
+    'style' => '',
+    'permissions' => null,
+    'datatype' => 'data',
+    'columnType' => null,
+    'queryColumnType' => null,
+    'relationType' => false,
+    'invisible' => false,
+    'visibleGridView' => false,
+    'visibleSearch' => false,
+];
+
+//Check if field exists
+if (!$classUpdater->hasField('paymentSettings')) {
+    //If not insert field after a specific field and save the definition
+    $classUpdater->insertFieldAfter('paymentProvider', $payment);
+    $classUpdater->save();
+}
+
+
+

Thats it, the same works for FieldCollections with the class CoreShop\Component\Pimcore\DataObject\FieldCollectionDefinitionUpdate +and for Bricks with the class CoreShop\Component\Pimcore\DataObject\BrickDefinitionUpdate

+

Inheritance Helper

+

Inhertiance Helper is a small little but very useful helper class to enable Pimcore inheritance only with a closure function like this:

+

+use CoreShop\Component\Pimcore\DataObject\InheritanceHelper;
+
+$inheritedValue = InheritanceHelper::useInheritedValues(function() use($object) {
+    return $object->getValueInherited();
+}, true);
+
+
+

Version Helper

+

Version Helper is a small little but very useful helper class to disabling or enablind Pimcore Versioning.

+

+use CoreShop\Component\Pimcore\DataObject\VersionHelper;
+
+VersionHelper::useVersioning(function() use($object) {
+    //Object will be saved without creating a new Version
+    $object->save();
+}, false);
+
+
+

Unpublished Helper

+

Unpublsihed Helper is a small little but very useful helper class to get unpublished objects in Pimcore Frontend.

+

+use CoreShop\Component\Pimcore\DataObject\UnpublishedHelper;
+
+$allProducts = UnpublishedHelper::hideUnpublished(function() use($object) {
+    //Will return all products, even the unpbulished ones
+    return $object->getProducts();
+}, false);
+
+
+

Expression Language Features

+

CoreShop adds some features to the Symfony Expression language like:

+
    +
  • PimcoreLanguageProvider: to get Pimcore Objects, Assets or Documents inside a Expression Language Query
  • +
+

Migration Features

+

Pimcore Shared Translations

+

Helps you to install new Shared Translations during Migration:

+
use CoreShop\Component\Pimcore\Migration\SharedTranslation;
+
+SharedTranslation::add('key', 'en', 'value');
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/ProductQuantityPriceRules_Bundle.html b/docs/generated-docs/generated_docs/Bundles/ProductQuantityPriceRules_Bundle.html new file mode 100644 index 0000000000..50c91e7b13 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/ProductQuantityPriceRules_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + ProductQuantityPriceRules Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Quantity Price Rules Bundle

+

This Bundle implements the Quantity Price Rules for CoreShop.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Product_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Product_Bundle.html new file mode 100644 index 0000000000..20a1925877 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Product_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Product Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Bundle

+

CoreShop Product Bundle is responsible for the Product Management.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/CustomEntities.html b/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/CustomEntities.html new file mode 100644 index 0000000000..7abe1b63c2 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/CustomEntities.html @@ -0,0 +1,446 @@ + + + + + + + CustomEntities - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Adding a new custom entity

+

Create Translatable Entity

+

First of all, we need to create our Entity Class. In this case, we create a Translatable Entity.

+
<?php
+
+//AppBundle/Model/CustomEntityInterface.php
+
+interface CustomEntityInterface extends ResourceInterface, TranslatableInterface {
+    public function getName($language = null);
+
+    public function setName($name, $language = null);
+}
+
+
<?php
+
+//AppBundle/Model/CustomEntity.php
+
+class CustomEntity implements CustomEntityInterface {
+    use TranslatableTrait {
+        __construct as private initializeTranslationsCollection;
+    }
+
+    protected $id;
+    protected $name;
+
+    public function __construct()
+    {
+        $this->initializeTranslationsCollection();
+    }
+
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    public function getName($language = null)
+    {
+        return $this->getTranslation($language)->getName();
+    }
+
+    public function setName($name, $language = null)
+    {
+        $this->getTranslation($language, false)->setName($name);
+
+        return $this;
+    }
+
+    protected function createTranslation()
+    {
+        return new CustomEntityTranslation();
+    }
+}
+
+

Since our Entity is Translatable, we need to add our Translation Entity as well.

+
<?php
+
+//AppBundle/Model/CustomEntityTranslationInterface.php
+
+interface CustomEntityTranslationInterface extends ResourceInterface, TimestampableInterface
+{
+    /**
+     * @return string
+     */
+    public function getName();
+
+    /**
+     * @param string $name
+     */
+    public function setName($name);
+}
+
+
<?php
+
+//AppBundle/Model/CustomEntityTranslation.php
+
+class CustomEntityTranslation extends AbstractTranslation implements CustomEntityTranslationInterface
+{
+    protected $id;
+    protected $name;
+
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+}
+
+

Create Doctrine Configuration

+
# AppBundle/Resources/config/doctrine/model/CustomEntity.orm.yml
+
+AppBundle\Model\CustomEntity:
+  type: mappedSuperclass
+  table: app_custom_entity
+  fields:
+    id:
+      type: integer
+      column: id
+      id: true
+      generator:
+        strategy: AUTO
+
+

Our Translation Doctrine definition:

+
# AppBundle/Resources/config/doctrine/model/CustomEntityTranslation.orm.yml
+
+AppBundle\Model\CustomEntityTranslation:
+  type: mappedSuperclass
+  table: app_custom_entity_translation
+  fields:
+    id:
+      type: integer
+      column: id
+      id: true
+      generator:
+        strategy: AUTO
+    name:
+      type: string
+      column: name
+
+

Create DI Configuration

+
<?php
+
+//AppBundle/DependencyInjection/Configuration.php
+
+namespace CoreShop\Bundle\AddressBundle\DependencyInjection;
+
+final class Configuration implements ConfigurationInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('app');
+
+        $rootNode
+            ->children()
+                ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end()
+            ->end()
+        ;
+        $this->addModelsSection($rootNode);
+
+        return $treeBuilder;
+    }
+
+    /**
+     * @param ArrayNodeDefinition $node
+     */
+    private function addModelsSection(ArrayNodeDefinition $node)
+    {
+        $node
+            ->children()
+                ->arrayNode('resources')
+                    ->addDefaultsIfNotSet()
+                    ->children()
+                        ->arrayNode('custom_entity')
+                            ->addDefaultsIfNotSet()
+                            ->children()
+                                ->variableNode('options')->end()
+                                ->scalarNode('permission')->defaultValue('custom_entity')->cannotBeOverwritten()->end()
+                                ->arrayNode('classes')
+                                    ->addDefaultsIfNotSet()
+                                    ->children()
+                                        ->scalarNode('model')->defaultValue(CustomEntity::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('interface')->defaultValue(CustomEntityInterface::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('admin_controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('factory')->defaultValue(TranslatableFactory::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('repository')->defaultValue(CustomEntityRepository::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('form')->defaultValue(CustomEntityType::class)->cannotBeEmpty()->end()
+                                    ->end()
+                                ->end()
+                                ->arrayNode('translation')
+                                    ->addDefaultsIfNotSet()
+                                    ->children()
+                                        ->variableNode('options')->end()
+                                        ->arrayNode('classes')
+                                            ->addDefaultsIfNotSet()
+                                            ->children()
+                                                ->scalarNode('model')->defaultValue(CustomEntityTranslation::class)->cannotBeEmpty()->end()
+                                                ->scalarNode('interface')->defaultValue(CustomEntityTranslationInterface::class)->cannotBeEmpty()->end()
+                                                ->scalarNode('controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end()
+                                                ->scalarNode('repository')->cannotBeEmpty()->end()
+                                                ->scalarNode('factory')->defaultValue(Factory::class)->end()
+                                                ->scalarNode('form')->defaultValue(CustomEntityTranslationType::class)->cannotBeEmpty()->end()
+                                            ->end()
+                                        ->end()
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+}
+
+
<?php
+
+//AppBundle/DependencyInjection/AppExtension.php
+
+final class AppExtension extends AbstractModelExtension
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function load(array $config, ContainerBuilder $container)
+    {
+        $config = $this->processConfiguration($this->getConfiguration([], $container), $config);
+        //'app' is the application name
+        $this->registerResources('app', $config['driver'], $config['resources'], $container);
+    }
+}
+
+
+
<?php
+
+//AppBundle/DependencyInjection/AppExtension.php
+
+final class AppBundle extends AbstractResourceBundle
+{
+    public function getSupportedDrivers()
+    {
+        return [
+            CoreShopResourceBundle::DRIVER_DOCTRINE_ORM,
+        ];
+    }
+
+    protected function getModelNamespace()
+    {
+        return 'AppBundle\Model';
+    }
+}
+
+
+

Create Serialization Definition if you want to serialize your Entity

+
# AppBundle/Resources/config/serializer/Model.CustomEntity.yml
+
+AppBundle\Model\CustomEntity:
+  exclusion_policy: ALL
+  xml_root_name: custom_entity
+  properties:
+    id:
+      expose: true
+      type: integer
+      groups: [List, Detailed]
+    translations:
+      expose: true
+      type: array
+      groups: [Detailed]
+  virtual_properties:
+    getName:
+      serialized_name: name
+      groups: [List, Detailed]
+
+
# AppBundle/Resources/config/serializer/Model.CustomEntityTranslation.yml
+
+AppBundle\Model\CustomEntityTranslation:
+  exclusion_policy: ALL
+  xml_root_name: custom_entity_translation
+  properties:
+    name:
+      expose: true
+      type: string
+      groups: [Detailed]
+
+

Create Routes to ResourceController

+
# AppBundle/Resources/config/pimcore/routing.yml
+
+app_custom_entity:
+  type: coreshop.resources
+  resource: |
+    alias: app.custom_entity
+
+
+

This will create all CRUD routes: (app is the application name specified in AppExtension.php)

+

GET: /admin/app/custom_entity/list +GET: /admin/app/custom_entity/get +POST: /admin/app/custom_entity/add +POST: /admin/app/custom_entity/save +DELETE: /admin/app/custom_entity/delete

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/Installation.html b/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/Installation.html new file mode 100644 index 0000000000..956481aa17 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/Installation.html @@ -0,0 +1,221 @@ + + + + + + + Installation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Adding new files that needs to be installed

+

Resource Bundles takes care about installing your resources. It can handle following types: +- Object Classes +- Field Collection Classes +- Objectbrick Classes +- Routes +- Permissions +- SQL Files

+

Object Classes, Field Collections and Objectbrick Classes

+

To install object classes, you need to configure your classes inside your Bundle and register them to Resource Bundle. (as described here)

+

Routes, SQL and Permissions

+

To install routes, permissions or execute sql files, configure them in your Bundle likes this:

+
<?php
+
+namespace AppBundle\DependencyInjection;
+
+final class Configuration implements ConfigurationInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('AppBundle');
+
+        $this->addPimcoreResourcesSection($rootNode);
+
+        return $treeBuilder;
+    }
+
+    private function addPimcoreResourcesSection(ArrayNodeDefinition $node)
+    {
+        $node->children()
+            ->arrayNode('pimcore_admin')
+                ->addDefaultsIfNotSet()
+                ->children()
+                    ->arrayNode('install')
+                        ->addDefaultsIfNotSet()
+                        ->children()
+                            ->scalarNode('routes')->defaultValue(['@AppBundle/Resources/install/pimcore/routes.yml'])->end()
+                            ->scalarNode('sql')->defaultValue(['@AppBundle/Resources/install/pimcore/data.sql'])->end()
+                        ->end()
+                    ->end()
+                    ->scalarNode('permissions')
+                        ->cannotBeOverwritten()
+                        ->defaultValue(['name_of_permission'])
+                    ->end()
+                ->end()
+            ->end()
+        ->end();
+    }
+}
+
+
+

Routes Example File

+
yeah_route:
+  pattern: "/(\\w+)\\/yeah-route/"
+  reverse: "/%_locale/yeah\-route"
+  module: AppBundle
+  controller: "@app.frontend.controller.controller"
+  action: doSomething
+  variables: _locale
+  priority: 2
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/PimcoreEntities.html b/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/PimcoreEntities.html new file mode 100644 index 0000000000..cde008ece6 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/PimcoreEntities.html @@ -0,0 +1,261 @@ + + + + + + + PimcoreEntities - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Adding a new Pimcore Entity with automated installation

+
    +
  1. Add a new Pimcore Class in Pimcore.
  2. +
  3. Add a Parent Class to your Pimcore Entity
  4. +
  5. Export Class Definition to AppBundle/Resources/install/pimcore/classes/PimcoreEntity.json +
  6. +
+

Create Parent Class

+
<?php
+//AppBundle/Model/PimcoreEntityInterface.php
+
+interface PimcoreEntityInterface extends ResourceInterface
+    public function getName($language = null);
+
+    public function setName($name, $language = null);
+}
+
+
<?php
+//AppBundle/Model/PimcoreEntity.php
+
+class PimcoreEntity extends AbstractPimcoreModel implements PimcoreEntityInterface, PimcoreModelInterface {
+    public function getName($language = null) {
+        throw new ImplementedByPimcoreException(__CLASS__, __METHOD__);
+    }
+
+    public function setName($name, $language = null) {
+        throw new ImplementedByPimcoreException(__CLASS__, __METHOD__);
+    }
+}
+
+

Create Dependency Injection Configuration

+
<?php
+//AppBundle/DependencyInjection/Configuration.php
+
+namespace AppBundle\DependencyInjection;
+
+final class Configuration implements ConfigurationInterface
+{
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('app_custom');
+
+        $this->addModelsSection($rootNode);
+
+        return $treeBuilder;
+    }
+
+    private function addModelsSection(ArrayNodeDefinition $node)
+    {
+        $node
+            ->children()
+                ->arrayNode('pimcore')
+                    ->addDefaultsIfNotSet()
+                    ->children()
+                        ->arrayNode('pimcore_entity')
+                            ->addDefaultsIfNotSet()
+                            ->children()
+                                ->variableNode('PimcoreEntity')->end()
+                                ->arrayNode('options')
+                                    ->scalarNode('path')->defaultValue('path/within/pimcore')->end()
+                                    ->scalarNode('permission')->defaultValue('pimcore_entity')->cannotBeOverwritten()->end()
+                                    ->addDefaultsIfNotSet()
+                                    ->children()
+                                        ->scalarNode('model')->defaultValue('Pimcore\Model\Object\PimcoreEntity')->cannotBeEmpty()->end()
+                                        ->scalarNode('interface')->defaultValue(PimcoreEntity::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('factory')->defaultValue(PimcoreFactory::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('repository')->cannotBeEmpty()->end()
+                                        ->scalarNode('admin_controller')->cannotBeEmpty()->end()
+                                        ->scalarNode('install_file')->defaultValue('@AppBundle/Resources/install/pimcore/classes/PimcoreEntity.json')->end()
+                                        ->scalarNode('type')->defaultValue(CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT)->cannotBeOverwritten(true)->end()
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+}
+
+
<?php
+//AppBundle/DependencyInjection/AppBundleExtension.php
+
+namespace AppBundle\DependencyInjection;
+
+final class AppBundleExtension extends AbstractModelExtension
+{
+    public function load(array $config, ContainerBuilder $container)
+    {
+        $this->registerPimcoreModels('app', $config['pimcore'], $container);
+    }
+}
+
+
+

Use your Pimcore Entity

+

You can either use Pimcore Listing Classes like:

+
$list = new Pimcore\Model\Object\PimcoreEntity\Listing();
+
+

or use automated generated Factory/Repository Classes

+
$pimcoreEntityObject = $container->get('app.repository.pimcore_entity')->findBy($id);
+
+$list = $container->get('app.repository.pimcore_entity')->getList();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/index.html b/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/index.html new file mode 100644 index 0000000000..7737fcdbb6 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/index.html @@ -0,0 +1,181 @@ + + + + + + + Resource Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Resource Bundle

+

Resource Bundle is the Heart of CoreShops Model. It handles saving/deleting/updating/creating of CoreShop Models. It handles +Doctrine ORM Mappings and Translations. As well as Routing, Event Dispatching, Serialization and CRUD.

+

Resource Bundle also takes care about installation of Pimcore Class Definitions, Object Brick Definitions, Field Collection Definitions, +Static Routes and SQL.

+

You can use Resource Bundle as base for all your Custom Pimcore Entities.

+

Installation

+
$ composer require coreshop/resource-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \JMS\SerializerBundle\JMSSerializerBundle(),
+        new \CoreShop\Bundle\ResourceBundle\CoreShopResourceBundle(),
+        new \Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle(),
+        new \Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle()
+    ]);
+}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Rule_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Rule_Bundle.html new file mode 100644 index 0000000000..aa43e87b40 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Rule_Bundle.html @@ -0,0 +1,165 @@ + + + + + + + Rule Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Rule Bundle

+

CoreShop Rule Bundle is the base Bundle for all Rule Based Systems in CoreShop. It provides a basic set of data for Rules like:

+
    +
  • Rule Conditions
  • +
  • Rule Actions
  • +
+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/SEO_Bundle.html b/docs/generated-docs/generated_docs/Bundles/SEO_Bundle.html new file mode 100644 index 0000000000..38f8cf6104 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/SEO_Bundle.html @@ -0,0 +1,237 @@ + + + + + + + SEO Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop SEO Bundle

+

Installation

+
$ composer require coreshop/seo-bundle:^3.0
+
+

Activating Bundle

+

You need to enable the bundle inside the kernel or with the Pimcore Extension Manager.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\SEOBundle\CoreShopSEOBundle()
+    ]);
+}
+
+

Usage

+

The SEO Bundle provides you with services to make SEO more manageable. It depends on Pimcore's HeadLink and HeadMeta Helper.

+

There are multiple ways of making use of this bundle:

+
    +
  • Implement SEO interfaces provided with this bundle
  • +
  • Implement Custom Extractors and add them to the SEOMetadata Model
  • +
+

To update the SEO Information, you need to use the service coreshop.seo.presentation:

+

+//From a Controller
+$this->get('coreshop.seo.presentation')->updateSeoMetadata($object);
+
+

Implement SEO Interfaces

+

SEO Bundle comes with 3 SEO Aware interfaces you can take advantage of:

+
    +
  • +CoreShop\Component\SEO\Model\SEOAwareInterface for meta-title and meta-description
  • +
  • +CoreShop\Component\SEO\Model\SEOImageAwareInterface for og-image attribute
  • +
  • +CoreShop\Component\SEO\Model\SEOImageAwareInterface for og-title, og-type and pg-description attribute
  • +
+

Implement SEO Extractors

+

To add a new Extractor, you need to implement the interface CoreShop\Component\SEO\Extractor\ExtractorInterface and register your class with the tag coreshop.seo.extractor:

+

Example

+

Let's implement a custom extractor for our Product class with a Video.

+
<?php
+//src/AppBundle/SEO/Extractor/ProductVideoExtractor.php
+
+namespace AppBundle\SEO\Extractor;
+
+use Pimcore\Model\DataObject\Product;
+use Pimcore\Tool;
+
+final class ProductVideoExtractor implements ExtractorInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function supports($object)
+    {
+        return $object instanceof Product && $object->getVideoUrl();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function updateMetadata($object, SEOMetadataInterface $seoMetadata)
+    {
+        /**
+         * @var $object Product
+         */
+        $seoMetadata->addExtraProperty('og:video', Tool::getHostUrl() . $object->getVideoUrl());
+    }
+}
+
+

Now we need to register the service

+
# src/AppBundle/Resources/config/services.yml
+services:
+    AppBundle\SEO\Extractor:
+        tags:
+            - { name: coreshop.seo.extractor, type: product_video }
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Sequence_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Sequence_Bundle.html new file mode 100644 index 0000000000..98ab9cf686 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Sequence_Bundle.html @@ -0,0 +1,189 @@ + + + + + + + Sequence Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Sequence Bundle

+

Installation

+
$ composer require coreshop/sequence-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\SequenceBundle\CoreShopSequenceBundle(),
+    ]);
+}
+
+

Updating database schema

+

Run the following command.

+
$ php bin/console doctrine:schema:update --force
+
+

Usage

+

This Bundle integrates Sequence Component into Symfony and Doctrine

+

The sequence Bundle provides you with basic information needed for sequence generation.

+

Doctrine Entities

+
    +
  • Sequence
  • +
+

Get a new Sequence

+

+$container->get('coreshop.sequence.generator')->getNextSequenceForType('my_sequence');
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Shipping_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Shipping_Bundle.html new file mode 100644 index 0000000000..5b09c7e467 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Shipping_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Shipping Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Shipping Bundle

+

CoreShop Shipping Bundle is responsible for Shipping Calculations.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/StorageList_Bundle.html b/docs/generated-docs/generated_docs/Bundles/StorageList_Bundle.html new file mode 100644 index 0000000000..fba098228f --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/StorageList_Bundle.html @@ -0,0 +1,215 @@ + + + + + + + StorageList Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Storage List Bundle

+

Storage List Component helps you with Lists/Collections of Objects like a Cart, Wishlist or Compare List.

+

Usage

+

To use it you need to have 3 models:

+ +

The component already provides you with a basic implementation of Storage List and Storage Item. +You need to implement the StorageListProduct yourself.

+

To now mutate lists, the component gives you a Storage List Modifier, which takes care about creating and persisting the List.

+

Basic usage, Wishist example

+

For now, lets create a very basic Session based Wishlist:

+

We need to have following things:

+
    +
  • A Factory class for the Wishlist
  • +
  • A Factory class for the Wishlist Item
  • +
  • A StorageListManager to get the current list (more like a repository actually)
  • +
  • A StoreListModifier
  • +
+

CoreShop gives you Basic classes for these 4 things, we just need to instantiate them:

+

+use Symfony\Component\HttpFoundation\Session\Session;
+
+use CoreShop\Component\StorageList\Model\StorageList;
+use CoreShop\Component\StorageList\Model\StorageListItem;
+use CoreShop\Component\Resource\Factory\Factory;
+use CoreShop\Component\StorageList\SessionStorageManager;
+use CoreShop\Component\StorageList\SessionStorageListModifier;
+
+$session = new Session();
+$session->start();
+
+$wishlistFactory = new Factory(StorageList::class);
+$wishlistItemFactory = new Factory(StorageListItem::class);
+
+$wishlistManager = new SessionStorageManager($session, 'wishlist', $wishlistFactory);
+$wishlistModifier = new SessionStorageListModifier($wishlistItemFactory, $wishlistManager);
+
+//Now we can start putting data into our List
+$list = $wishlistManager->getStorageList();
+
+//Fetch our Product which implements CoreShop\Component\StorageList\Model\StorageListProductInterface
+$product = $productRepository->find(1);
+
+
+$listItem = $wishlistItemFactory->createNew();
+$listItem->setProduct($product);
+$listItem->setQuantity($quantity);
+
+//Lets add our Product
+$wishlistModifier->addToList($list, $listItem);
+
+//If we now want to remove it, we can either use the $listItem, or the Product
+//To do that with our item, we simply call
+$wishlistModifier->removeFromList($list, $listItem);
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Store_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Store_Bundle.html new file mode 100644 index 0000000000..6208737954 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Store_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Store Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Store Bundle

+

CoreShop Store Bundle provides the abstraction of a Pimcore Website and a CoreShop Store. It handles the configuration for base-currencies and themes.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Taxation_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Taxation_Bundle.html new file mode 100644 index 0000000000..e6538df789 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Taxation_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Taxation Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Taxation Bundle

+

CoreShop Taxation Bundle is responsible for Tax Calculations.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Theme_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Theme_Bundle.html new file mode 100644 index 0000000000..469c376522 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Theme_Bundle.html @@ -0,0 +1,218 @@ + + + + + + + Theme Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Theme Bundle

+

CoreShop Theme Bundle provides you with a flexible and extensible way of having multiple themes in a Pimcore installation.

+

Installation

+
$ composer require coreshop/theme-bundle:^3.0
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\ThemeBundle\CoreShopThemeBundle(),
+    ]);
+}
+
+

Configuration

+

Per Default, no Theme Resolver is enabled, you can enable on or multiples like:

+
core_shop_theme:
+    default_resolvers:
+      pimcore_site: true
+      pimcore_document_property: true
+
+

Pimcore Site

+

Resolves the Theme based on the Key of the Root Document of a Pimcore Site. So if the Site's Root Document is called "demo" it tries to find a theme called the same.

+

Pimcore Document Property

+

Resolves the Theme based on a Document Property of the Site. The Property is called "theme".

+

Custom Resolvers

+

You can also add custom resolvers like:

+
<?php
+
+declare(strict_types=1);
+
+namespace App\Theme;
+
+use CoreShop\Bundle\ThemeBundle\Service\ThemeNotResolvedException;
+use CoreShop\Bundle\ThemeBundle\Service\ThemeResolverInterface;
+use CoreShop\Component\Store\Context\StoreNotFoundException;
+
+final class CustomThemeResolver implements ThemeResolverInterface
+{
+    public function resolveTheme(): string
+    {
+        if(rand() === 1) {
+            // if you cannot resolve the theme, throw an exception
+            throw new ThemeNotResolvedException();
+        }
+    
+        return "custom/custom";
+    }
+}
+
+

You also need to Register the Theme Resolver:

+
services:
+  App\Theme\CustomThemeResolver:
+    tags:
+      - { name: coreshop.theme.resolver, type: custom, priority: 20 }
+
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Tracking_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Tracking_Bundle.html new file mode 100644 index 0000000000..f532a2c90a --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Tracking_Bundle.html @@ -0,0 +1,162 @@ + + + + + + + Tracking Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/User_Bundle.html b/docs/generated-docs/generated_docs/Bundles/User_Bundle.html new file mode 100644 index 0000000000..846a41f1e1 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/User_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + User Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop User Bundle

+

CoreShop User Bundle is responsible for the User Management.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Variant_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Variant_Bundle.html new file mode 100644 index 0000000000..2f88d67ea0 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Variant_Bundle.html @@ -0,0 +1,218 @@ + + + + + + + Variant Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Variant Bundle

+

CoreShop Variant Bundle allows you to manage different Variants of a Product.

+

Installation

+
  composer require coreshop/variant-bundle
+
+

Adding required bundles to kernel

+

You need to enable the bundle inside the kernel.

+
<?php
+
+// app/AppKernel.php
+
+public function registerBundlesToCollection(BundleCollection $collection)
+{
+    $collection->addBundles([
+        new \CoreShop\Bundle\VariantBundle\CoreShopVariantBundle(),
+    ]);
+}
+
+

Abstract

+

Pimcore already supports variants. But it doesn't define what a Variant is, or how a variant differs from the Parent Product or other Variants.

+

In classical e-commerce scenarios, you usually have different Variation Types like Size and Color with different Values like XL or Red.

+

CoreShop describes these two types of entities as Group (CoreShop\Component\Variant\Model\AttributeGroupInterface) and Value (CoreShop\Component\Variant\Model\AttributeValueInterface

+

The "Product" itself than is a sort-of abstract entity that is used to define what Attribute Groups are allowed. The Pimcore Variants then, need to have the values of thse Groups filled.

+

Example:

+
    +
  • +

    AttributeGroup Color +-AttributeValue Red +-AttributeValue Blue

    +
  • +
  • +

    product (defines allowed groups for color)

    +
      +
    • variant-red (defines the AttributeValue Red in attributes)
    • +
    • variant-blue (defines the AttributeValue Blue in attributes)
    • +
    +
  • +
+

Usage

+

CoreShop Variant Bundle does NOT come with a Installer for certain Resources it requires. That is on purpose and you need to manually install what you need.

+

Per Default, it comes with 3 different Classes:

+
    +
  • +CoreShopAttributeGroup +
  • +
  • +CoreShopAttributeColor +
  • +
  • +CoreShopAttributeValue +
  • +
+

Whereas Color and Value are two Value types and Group is a Group type.

+

You can manually import the classes from this dir vendor/coreshop/variant-bundle/Resources/install/pimcore/classes

+

To create a "Product" Class, you need to implement the interface CoreShop\Component\Variant\Model\ProductVariantAwareInterface. The Class requires you to have these fields:

+
    +
  • attributes - ManyToManyObjectRelation for CoreShopAttributeColor/CoreShopAttributeValue +
  • +
  • allowedAttributeGroups - ManyToManyObjectRelation for CoreShopAttributeGroup +
  • +
  • mainVariant - ManyToOneRelation for Product (eg. your Class where you implemented the interface)
  • +
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Wishlist_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Wishlist_Bundle.html new file mode 100644 index 0000000000..0be7558ad0 --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Wishlist_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Wishlist Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Order Bundle

+

CoreShop Order Wishlist provides a basic set of data for Wishlists. It is based on StorageList Bundle and shows how that can be integrated into a Pimcore Project.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/Workflow_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Workflow_Bundle.html new file mode 100644 index 0000000000..027f58ef1c --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/Workflow_Bundle.html @@ -0,0 +1,161 @@ + + + + + + + Workflow Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Workflow Bundle

+

CoreShop Workflow Bundle is a extension of Symfony Workflow and adds some configuration features to it.

+
+

This Bundle can be used separately, but doesn't provide any detail information how to use it.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Bundles/index.html b/docs/generated-docs/generated_docs/Bundles/index.html new file mode 100644 index 0000000000..b6c03436cf --- /dev/null +++ b/docs/generated-docs/generated_docs/Bundles/index.html @@ -0,0 +1,257 @@ + + + + + + + Bundles - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Bundles

+

CoreShop is a set of Bundles that provide different functionality. Each Bundle is supposed to be independent and can be used without the other Bundles. Glued together, they provide a full e-commerce solution.

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Cart/CRUD.html b/docs/generated-docs/generated_docs/Development/Cart/CRUD.html new file mode 100644 index 0000000000..239c9b96e0 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Cart/CRUD.html @@ -0,0 +1,203 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart

+

CoreShop uses Pimcore Data Objects to persist Cart Information. But, it adds a little wrapper around it to be mire +dynamic and configurable. It uses a Factory and Repository Pattern to do that.

+

Create

+

If you want to create a new Cart, we need to get our Factory Service for that:

+
$factory = $container->get('coreshop.factory.cart');
+$cart = $factory->createNew();
+
+

No we have a new Cart and we can set all needed values.

+

If you now want to save it, just call the save function

+
$cart->save();
+
+

Read

+

To get carts, you need to use the Repository Service CoreShop provides you.

+
$repository = $container->get('coreshop.repository.cart');
+
+
+// Query by ID
+$cartWithIdOne = $repository->findById(1);
+
+// Get a Listing how you know it from Pimcore
+$list = $repository->getList();
+$list->setCondition("total > 100");
+$carts = $list->getObjects();
+
+
+

Update

+

Update works the same as you are used to in Pimcore

+
$repository = $container->get('coreshop.repository.cart');
+
+
+// Query by ID
+$cartWithIdOne = $repository->findById(1);
+
+// Change values
+$cartWithIdOne->setCustomer($customer);
+$cartWithIdOne->save();
+
+

Delete

+

Delete works the same as you are used to in Pimcore

+
$repository = $container->get('coreshop.repository.cart');
+
+
+// Query by ID
+$cartWithIdOne = $repository->findById(1);
+$cartWithIdOne->delete();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Cart/Cart_Manager.html b/docs/generated-docs/generated_docs/Development/Cart/Cart_Manager.html new file mode 100644 index 0000000000..701316b56b --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Cart/Cart_Manager.html @@ -0,0 +1,163 @@ + + + + + + + Cart Manager - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Cart/Cart_Modifier.html b/docs/generated-docs/generated_docs/Development/Cart/Cart_Modifier.html new file mode 100644 index 0000000000..1ea2b147ca --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Cart/Cart_Modifier.html @@ -0,0 +1,166 @@ + + + + + + + Cart Modifier - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Cart/Cart_Processor.html b/docs/generated-docs/generated_docs/Development/Cart/Cart_Processor.html new file mode 100644 index 0000000000..6be7400d14 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Cart/Cart_Processor.html @@ -0,0 +1,212 @@ + + + + + + + Cart Processor - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart Processor

+

The Cart Processor takes care about refreshing the state and prices of carts for you. Everytime the persistCart function of the Cart-Manager is called +on a Cart, it gets triggered and re-calculates the cart.

+

Following Processors are implemented by default:

+ +

These Processors calculate all necessary prices of the cart. If you need to extend the Cart and change calculations, you need +to create a new Processor.

+

Creating a Cart Processor

+

A Cart Processor needs to implement the Interface CoreShop\Component\Order\Processor\CartProcessorInterface and registered +into the container with the tag coreshop.cart_processor and a priority attribute.

+

Example of a Cart Processor

+

For example, we create a Cart Processor, which calculates a custom field in our Cart.

+
<?php
+
+namespace AppBundle\CoreShop\Order\Cart\Processor;
+
+use CoreShop\Component\Order\Model\OrderInterface;
+use CoreShop\Component\Order\Processor\CartProcessorInterface;
+
+final class CustomCartProcessor implements CartProcessorInterface
+{
+    public function process(OrderInterface $cart): void
+    {
+        $cart->setCustomField(uniqid());
+    }
+}
+
+

We now only need to register the class:

+
app.coreshop.cart.processor.custom:
+    class: AppBundle\CoreShop\Order\Cart\Processor\CustomCartProcessor
+    tags:
+      - { name: coreshop.cart_processor, priority: 200 }
+
+

On every Cart Update, our service now gets called a the custom field gets a new unique id.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Cart/Commands.html b/docs/generated-docs/generated_docs/Development/Cart/Commands.html new file mode 100644 index 0000000000..5df9e7a9ad --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Cart/Commands.html @@ -0,0 +1,178 @@ + + + + + + + Commands - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart Commands

+

Expire Abandoned Carts

+
# Delete only anonymous carts
+$ bin/console coreshop:cart:expire --anonymous
+
+# Delete only user carts
+$ bin/console coreshop:cart:expire --user
+
+# Delete carts older than 20 days
+$ bin/console coreshop:cart:expire --days=20
+
+

Expire Abandoned Carts via Maintenance Mode

+

By default, this feature is disabled. +If you want to swipe abandoned carts by default you need to define a expiration date:

+
core_shop_order:
+    expiration:
+        cart:
+            days: 20
+            anonymous: true
+            customer: true
+
+

Read more about automation here.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Cart/Context.html b/docs/generated-docs/generated_docs/Development/Cart/Context.html new file mode 100644 index 0000000000..eb01edc02b --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Cart/Context.html @@ -0,0 +1,202 @@ + + + + + + + Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart Context

+

For CoreShop to determine the current cart it uses a concept called context and context resolver.

+

The Cart Context implements the Interface CoreShop\Component\Order\Context\CartContextInterface and is implemented in the Service +coreshop.context.cart:

+

Getting the current Cart

+

If you want to get the current cart, you simply use the service:

+
$cartContext = $container->get('coreshop.context.cart');
+
+// Get current cart, if none exists, it creates a new one
+$cart = $cartContext->getCart();
+
+
+

Context

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePriorityDescription
FixedCartContext-100Used for testing purposes or for backend order creation
SessionAndStoreBasedCartContext-555Search for a valid session cart in given store context
CustomerAndStoreBasedCartContext-777Search for a cart based on a customer. Note: This context only triggers after a user has been successfully logged in. It searches for the last available cart a user may has left.
CartContext-999If all other context classes failed finally this context will create a fresh cart
+

Create a Custom Resolver

+

To register your context, you need to use the tag: coreshop.context.cart with an optional priority attribute.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Cart/index.html b/docs/generated-docs/generated_docs/Development/Cart/index.html new file mode 100644 index 0000000000..9e1c41ae35 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Cart/index.html @@ -0,0 +1,181 @@ + + + + + + + Cart - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Checkout/Checkout_Manager.html b/docs/generated-docs/generated_docs/Development/Checkout/Checkout_Manager.html new file mode 100644 index 0000000000..0e3abfcd84 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Checkout/Checkout_Manager.html @@ -0,0 +1,208 @@ + + + + + + + Checkout Manager - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Checkout Manager

+

CoreShop Checkout

+

CoreShop uses a CheckoutManager to handle Checkout steps. The default installation comes with following Steps:

+
    +
  • Cart
  • +
  • Customer
  • +
  • Address
  • +
  • Shipping
  • +
  • Payment
  • +
  • Summary
  • +
+

Create a Custom CheckoutManager

+

If you want to modify the Checkout Manager, you have two options:

+
    +
  • Create a total different Checkout Manager configuration
  • +
  • Modify the default configuration
  • +
+

Create a total different Checkout Manager

+
# app/config/config.yml
+core_shop_core:
+    checkout_manager: my_custom_manager
+    checkout:
+      my_custom_manager:
+        steps:
+          customer:
+            step: coreshop.checkout.step.customer
+            priority: 10
+          address:
+            step: coreshop.checkout.step.address
+            priority: 20
+          shipping:
+            step: coreshop.checkout.step.shipping
+            priority: 30
+          payment:
+            step: coreshop.checkout.step.payment
+            priority: 40
+          summary:
+            step: coreshop.checkout.step.summary
+            priority: 50
+
+

Modify the default configuration

+
# app/config/config.yml
+core_shop_core:
+    checkout:
+        default:
+            steps:
+              payment: false                                              # disables the payment step
+              shipping: false                                             # disables the shipping step
+              payment_shipping:                                           # adds a new PaymentShiping Step
+                  step: app_bundle.coreshop.checkout.payment_shipping     # This is your service-id, the service needs to implement CoreShop\Component\Order\Checkout\CheckoutStepInterface
+                  priority: 40                                            # Priority of this step
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Checkout/Checkout_Step.html b/docs/generated-docs/generated_docs/Development/Checkout/Checkout_Step.html new file mode 100644 index 0000000000..a90aa87df0 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Checkout/Checkout_Step.html @@ -0,0 +1,268 @@ + + + + + + + Checkout Step - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Checkout Step

+

If you want to implement a custom checkout step, you need to implement the interface CoreShop\Component\Order\Checkout\CheckoutStepInterface +and register your step into your Cart Manager:

+
# app/config/config.yml
+core_shop_core:
+    checkout:
+        default:
+            steps:
+              custom:
+                  step: app.coreshop.checkout.custom
+                  priority: 50
+
+

The Checkout Controller takes care about handling +the Checkout for you then.

+

Optional Checkout Step

+

If you have an optional checkout step - depending on the cart, your Checkout Step can implement the interface CoreShop\Component\Order\Checkout\OptionalCheckoutStepInterface.

+

You need to implement the function isRequired(OrderInterface $cart)

+

Optional Checkout Step Example

+
<?php
+
+namespace CoreShop\Bundle\CoreBundle\Checkout\Step;
+
+use CoreShop\Bundle\CoreBundle\Form\Type\Checkout\PaymentType;
+use CoreShop\Component\Order\Checkout\CheckoutException;
+use CoreShop\Component\Order\Checkout\CheckoutStepInterface;
+use CoreShop\Component\Order\Checkout\OptionalCheckoutStepInterface;
+use CoreShop\Component\Order\Checkout\ValidationCheckoutStepInterface;
+use CoreShop\Component\Order\Manager\CartManagerInterface;
+use CoreShop\Component\Order\Model\OrderInterface;
+use CoreShop\Component\Payment\Model\PaymentProviderInterface;
+use CoreShop\Component\Store\Context\StoreContextInterface;
+use Symfony\Component\Form\FormFactoryInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+class PaymentCheckoutStep implements CheckoutStepInterface, OptionalCheckoutStepInterface, ValidationCheckoutStepInterface
+{
+    private FormFactoryInterface $formFactory;
+    private StoreContextInterface $storeContext;
+    private CartManagerInterface $cartManager;
+
+    public function __construct(
+        FormFactoryInterface $formFactory,
+        StoreContextInterface $storeContext,
+        CartManagerInterface $cartManager
+    )
+    {
+        $this->formFactory = $formFactory;
+        $this->storeContext = $storeContext;
+        $this->cartManager = $cartManager;
+    }
+
+    public function getIdentifier(): string
+    {
+        return 'payment';
+    }
+
+    public function doAutoForward(OrderInterface $cart): bool
+    {
+        return $cart->getTotal() > 0;
+    }
+
+    public function doAutoForward(OrderInterface $cart): bool
+    {
+        return false;
+    }
+
+    public function validate(OrderInterface $cart): bool
+    {
+        return $cart->hasItems() && $cart->getPaymentProvider() instanceof PaymentProviderInterface;
+    }
+
+    public function commitStep(OrderInterface $cart, Request $request): bool
+    {
+        $form = $this->createForm($request, $cart);
+
+        if ($form->isSubmitted()) {
+            if ($form->isValid()) {
+                $cart = $form->getData();
+
+                $this->cartManager->persistCart($cart);
+
+                return true;
+            } else {
+                throw new CheckoutException('Payment Form is invalid', 'coreshop.ui.error.coreshop_checkout_payment_form_invalid');
+            }
+        }
+
+        return false;
+    }
+
+    public function prepareStep(OrderInterface $cart, Request $request): array
+    {
+        return [
+            'form' => $this->createForm($request, $cart)->createView(),
+        ];
+    }
+
+    private function createForm(Request $request, OrderInterface $cart)
+    {
+        $form = $this->formFactory->createNamed('', PaymentType::class, $cart, [
+            'payment_subject' => $cart
+        ]);
+
+        if ($request->isMethod('post')) {
+            $form = $form->handleRequest($request);
+        }
+
+        return $form;
+    }
+}
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Checkout/index.html b/docs/generated-docs/generated_docs/Development/Checkout/index.html new file mode 100644 index 0000000000..6c84796c4b --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Checkout/index.html @@ -0,0 +1,166 @@ + + + + + + + Checkout - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Currency_Fractions/index.html b/docs/generated-docs/generated_docs/Development/Currency_Fractions/index.html new file mode 100644 index 0000000000..6e0acdc14b --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Currency_Fractions/index.html @@ -0,0 +1,192 @@ + + + + + + + Currency Fractions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Fraction Digits

+

CoreShop allows you working with more than 2 digits for Currency Values. The default configuration looks like this:

+
core_shop_currency:
+    money_decimal_precision: 2
+    money_decimal_factor: 100
+
+
+

money_decimal_precision: 2

+
+

Having a global precision of 2

+
+

money_decimal_factor: 100

+
+

Displaying Currency with a factor of 100 (in Pimcore Backend).

+
+

WARNING If you change these settings in an existing Installation with Orders/Products etc. you also have to create +a migration to change all the values from a precision of 2 to your new setting.

+
+

In order to handle payment values with a precision of for example 4, we introduced a new Order Property called paymentTotal. +Within a Payment, you cannot deal with a precision > 2, since a currency only has eg. 100 Cents. Therefore, we round the total +Cart/Order value to a precision of 2 into the paymentTotal Value.

+

For example:

+

Your Cart/Order is "€ 1.000,5498", your payment total then is: "€ 1.000,55".

+

If you want to display the payment total in your cart, you can use this template:

+
{% if currency.convertAndFormat(cart.total) != currency.convertAndFormat(cart.paymentTotal, 2, 100) %}
+<tr>
+    <td class="text-right" colspan="3">	
+        <strong>{{ 'coreshop.ui.payment_total'|trans }}:</strong>
+    </td>
+    <td colspan="2" class="text-right cart-total-payment-price">
+        {{ currency.convertAndFormat(cart.paymentTotal, 2, 100) }}
+    </td>
+</tr>
+{% endif %}
+
+

c

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Customers/CRUD.html b/docs/generated-docs/generated_docs/Development/Customers/CRUD.html new file mode 100644 index 0000000000..5fd1d5d5a8 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Customers/CRUD.html @@ -0,0 +1,203 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Custom

+

CoreShop uses Pimcore Data Objects to persist Customer Information. But, it adds a little wrapper around it to be mire +dynamic and configurable. It uses a Factory and Repository Pattern to do that.

+

Create

+

If you want to create a new Custom, we need to get our Factory Service for that:

+
$customerFactory = $container->get('coreshop.factory.customer');
+$customer = $customerFactory->createNew();
+
+

No we have our customer and we can set all needed values.

+

If you now want to save it, just call the save function

+
$customer->save();
+
+

Read

+

To get customers, you need to use the Repository Service CoreShop provides you.

+
$repository = $container->get('coreshop.repository.customer');
+
+
+// Query by ID
+$customerWithIdOne = $repository->findById(1);
+
+// Get a Listing how you know it from Pimcore
+$list = $repository->getList();
+$list->setCondition("active = 1");
+$customers = $list->getObjects();
+
+
+

Update

+

Update works the same as you are used to in Pimcore

+
$repository = $container->get('coreshop.repository.customer');
+
+
+// Query by ID
+$customerWithIdOne = $repository->findById(1);
+
+// Change values
+$customerWithIdOne->setName('test');
+$customerWithIdOne->save();
+
+

Delete

+

Delete works the same as you are used to in Pimcore

+
$repository = $container->get('coreshop.repository.customer');
+
+
+// Query by ID
+$customerWithIdOne = $repository->findById(1);
+$customerWithIdOne->delete();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Customers/Company_Extension.html b/docs/generated-docs/generated_docs/Development/Customers/Company_Extension.html new file mode 100644 index 0000000000..6c204415ec --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Customers/Company_Extension.html @@ -0,0 +1,188 @@ + + + + + + + Company Extension - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Customer Company Extension

+

The Company Entity allows you to append customers to a given company. +After a customer has been connected to a company by using the 1to1 relation company, it's possible to share addresses between company and the self-assigned addresses.

+

Access Types

+
+

Note! This is only available if a customer already is connected to a valid company!

+
+

Own Only

+

If set, the customer can create, edit and delete own addresses and choose them in checkout as well. This is the default behaviour.

+

Company Only

+

If set, the customer can create, edit und delete company addresses and choose them in checkout as well. He's not able to add addresses to himself.

+

Own And Company

+

If set, the customer can create, edit and delete company and private addresses and choose them in checkout as well.

+

Plus, the own_and_company mode allows the customer to define and modify the allocation of the address. +To do so, coreshop renders an additional choice type to the address creation/modification form.

+

Note: If a customer switches the allocation after it has been created, the address also physically gets moved to its desired location. +In this example, the customer changes the allocation from own to company:

+

Before:

+
- company A
+    - addresses
+    - customer A
+        - addresses
+            - address A
+
+

After:

+
- company A
+    - addresses
+        - address A
+    - customer A
+        - addresses
+
+

Read more about this feature here.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Customers/Context.html b/docs/generated-docs/generated_docs/Development/Customers/Context.html new file mode 100644 index 0000000000..bf2a8f1ab8 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Customers/Context.html @@ -0,0 +1,169 @@ + + + + + + + Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Customer Context

+

CoreShop Customer Security uses Symfony Firewall to handle authentication.

+

CoreShop implemented a Context based Wrapper around that to be more flexible. Currently CoreShop implements these Contexts for Customer determination:

+ +

Create a Custom Resolver

+

A Store Context needs to implement the interface CoreShop\Component\Customer\Context\CustomerContextInterface. This interface +consists of one function called "getCustomer" which returns a CoreShop\Component\Customer\Model\CustomerInterface or throws an CoreShop\Component\Customer\Context\CustomerNotFoundException

+

To register your context, you need to use the tag: coreshop.context.customer with an optional priority attribute.

+

The use case of changing this is quite rare. But if you need to, you can create a Custom Resolver if you wish.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Customers/Customer_Manager.html b/docs/generated-docs/generated_docs/Development/Customers/Customer_Manager.html new file mode 100644 index 0000000000..cb9a7c873b --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Customers/Customer_Manager.html @@ -0,0 +1,189 @@ + + + + + + + Customer Manager - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Customer Manager

+

CoreShop already implements a Customer Manager which handles creating a Customer with Addresses. +The Customer Manager implements the Interface CoreShop\Bundle\CoreBundle\Customer\CustomerManagerInterface and CoreShop implements it using the service coreshop.customer.manager.

+

Usage

+

To use the Service, you need to pass a Customer. +In our example, we gonna do that from a Controller with a FormType.

+
$customer = $this->getCustomer();
+
+if ($customer instanceof CustomerInterface && null === $customer->getUser()) {
+    return $this->redirectToRoute('coreshop_customer_profile');
+}
+
+$form = $this->get('form.factory')->createNamed('customer', CustomerRegistrationType::class, $this->get('coreshop.factory.customer')->createNew());
+
+$redirect = $this->getParameterFromRequest($request, '_redirect', $this->generateUrl('coreshop_customer_profile'));
+
+if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) {
+    $form = $form->handleRequest($request);
+
+    if ($form->isValid()) {
+        $customer = $form->getData();
+        $customer->setLocaleCode($this->get('coreshop.context.locale')->getLocaleCode());
+
+        $this->get('coreshop.customer.manager')->persistCustomer($customer);
+
+        return $this->redirect($redirect);
+    }
+}
+
+return $this->render($this->templateConfigurator->findTemplate('Register/register.html'), [
+    'form' => $form->createView(),
+]);
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Customers/Registration_Types.html b/docs/generated-docs/generated_docs/Development/Customers/Registration_Types.html new file mode 100644 index 0000000000..a7ec6df08a --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Customers/Registration_Types.html @@ -0,0 +1,182 @@ + + + + + + + Registration Types - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Customer Registration Types

+

By default, a customer needs to provide a unique and valid email address to pass a registration.

+

Register By Email

+
+

This is the default setting!

+
+

To switch to registration by a unique and valid email address, you need set the identifier:

+
core_shop_customer:
+    login_identifier: 'email'
+
+

Register By Username

+

First, you need to make sure your customer object provides a username field. +By default, coreshop does not install this field to prevent unnecessary confusion. +To implement the username field, just open your class editor and add a text field called username and you're good to go!

+

To switch to registration by a unique username, you need change the identifier:

+
core_shop_customer:
+    login_identifier: 'username'
+
+

Security

+

Form (Frontend)

+

CoreShop comes with a preinstalled constraint which will tell your customer, if an email address or username - depending on your settings - is valid or not.

+

Backend / API

+

Plus, if you're going to update a customer by API or Backend, coreshop also checks if your customer entity has unique data.

+
+

Note: Both checks only apply to non-guest entities!

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Customers/index.html b/docs/generated-docs/generated_docs/Development/Customers/index.html new file mode 100644 index 0000000000..9f26aac940 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Customers/index.html @@ -0,0 +1,175 @@ + + + + + + + Customers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Ecommerce_Tracking/index.html b/docs/generated-docs/generated_docs/Development/Ecommerce_Tracking/index.html new file mode 100644 index 0000000000..ca09e9194c --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Ecommerce_Tracking/index.html @@ -0,0 +1,305 @@ + + + + + + + Ecommerce Tracking - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop eCommerce Tracking

+

CoreShop currently implements Tracking for Analytics and Google Tag Manager. +Tracking is automatically available (but not enabled), as soon as you enable Tag Manager or Analytics in Pimcore.

+

Per default configuration, all the ecommerce trackers are disabled. You need to enable them manually.

+

Available Trackers

+
    +
  • google-analytics-enhanced-ecommerce
  • +
  • google-analytics-universal-ecommerce
  • +
  • google-gtag-enhanced-ecommerce
  • +
  • google-gtm-classic-ecommerce
  • +
  • google-gtm-enhanced-ecommerce
  • +
  • matomo (piwik)
  • +
+

Enabling Trackers

+
core_shop_tracking:
+    trackers:
+        google-analytics-enhanced-ecommerce:
+            enabled: false
+        google-analytics-universal-ecommerce:
+            enabled: false
+        google-gtag-enhanced-ecommerce:
+            enabled: false
+        google-gtm-classic-ecommerce:
+            enabled: false
+        google-gtm-enhanced-ecommerce:
+            enabled: false
+        matomo:
+            enabled: true
+
+

External

+ +

Actions

+
Product Impression
+
$this->get('coreshop.tracking.manager')->trackProductImpression($product);
+
+
Product View
+
$this->get('coreshop.tracking.manager')->trackProduct($product);
+
+
Product Action Add from Cart
+
$this->get('coreshop.tracking.manager')->trackCartAdd($cart, $product);
+
+
Product Action Remove from Cart
+
$this->get('coreshop.tracking.manager')->trackCartRemove($cart, $product);
+
+
Checkout Step
+
$this->get('coreshop.tracking.manager')->trackCheckoutStep($cart, $stepIdentifier, $isFirstStep, $checkoutOption)
+
+
Checkout Complete
+
$this->get('coreshop.tracking.manager')->trackCheckoutComplete($order)
+
+

Add a custom Tracker

+

To add a custom tracker you need to implement the interface CoreShop\Component\Tracking\Tracker\TrackerInterface

+
app.tracking.tracker.my_tracker:
+    class: AppBundle\Tracker\CustomTracker
+    parent: coreshop.tracking.tracker.ecommerce_tracker
+    tags:
+        - { name: coreshop.tracking.tracker, type: app-custom-tracker }
+
+

Google Tag Manager

+

If you have enabled the gtm in backend, CoreShop sends some data to a dataLayer object which submits the object to gtm.

+

GTM Classic eCommerce

+

If you enable the classic mode only the order gets submitted if user has successfully reached the "thank-you" page.

+

GTM Enhanced eCommerce

+

There are six Impressions/Events for Google Tag Manager Enhanced eCommerce:

+

Product Impression

+

Tag Config Example:

+
+Tag type : Universal Analytics
+Track type : Pageview
+Enable Enhanced Ecommerce Features: true
+Use Data Layer: true
+Trigger: event equals gtm.dom
+
+

Product Detail View

+

Tag Config Example:

+
+Tag type : Universal Analytics
+Track type : Pageview
+Enable Enhanced Ecommerce Features: true
+Use Data Layer: true
+Trigger: event equals gtm.dom
+
+

Checkout Step:

+
+

Event-Name: csCheckout

+
+

Tag Config Example:

+
+Tag type : Universal Analytics
+Track type : Event
+Event Category: Ecommerce
+Event Action: Checkout
+Enable Enhanced Ecommerce Features: true
+Use Data Layer: true
+Trigger: event equals csCheckout
+
+

Checkout Complete (Purchase):

+

Tag Config Example:

+
+Tag type : Universal Analytics
+Track type : Pageview
+Enable Enhanced Ecommerce Features: true
+Use Data Layer: true
+Trigger: event equals gtm.dom
+
+

Remove Item from Cart

+
+

Event-Name: csRemoveFromCart

+
+

Tag Config Example:

+
+Tag type : Universal Analytics
+Track type : Event
+Event Category: Ecommerce
+Event Action: Remove from Cart
+Enable Enhanced Ecommerce Features: true
+Use Data Layer: true
+Trigger: event equals csRemoveFromCart
+
+

Add Item to Cart

+
+

Event-Name: csAddToCart

+
+

Tag Config Example:

+
+Tag type : Universal Analytics
+Track type : Event
+Event Category: Ecommerce
+Event Action: Add to Cart
+Enable Enhanced Ecommerce Features: true
+Use Data Layer: true
+Trigger: event equals csAddToCart
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Events/index.html b/docs/generated-docs/generated_docs/Development/Events/index.html new file mode 100644 index 0000000000..6598824b20 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Events/index.html @@ -0,0 +1,544 @@ + + + + + + + Events - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Events

+

CoreShop comes with a lot of build-in events.

+

Frontend Controller

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.customer.update_postResourceControllerEventFires after Customer has updated the profile
coreshop.customer.change_password_postResourceControllerEventFires after Customer has changed the password
coreshop.customer.newsletter_confirm_postResourceControllerEventFires after Customer has confirmed his newsletter subscription
coreshop.address.add_postResourceControllerEventFires after Customer has added a new address
coreshop.address.update_postResourceControllerEventFires after Customer has updated a address
coreshop.address.delete_preResourceControllerEventFires before Customer deletes a address
+

Cart

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.cart.updateGenericEventFires after cart has been updated
coreshop.cart.pre_add_itemGenericEventFires before a item gets added to cart
coreshop.cart.post_add_itemGenericEventFires after a item gets added to cart
coreshop.cart.pre_remove_itemGenericEventFires before a item gets removed from cart
coreshop.cart.post_remove_itemGenericEventFires after a item gets removed from cart
+

Customer

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.customer.registerCustomerRegistrationEventFires after a new customer has been generated
coreshop.customer.request_password_resetRequestPasswordChangeEventFires after password reset has been requested
coreshop.customer.password_resetGenericEventFires after new password hast been applied to customer
+

Order Document

+ + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.order.shipment.wkhtml.optionsWkhtmlOptionsEventOptions Event: Use it to change wkhtml options.
coreshop.order.invoice.wkhtml.optionsWkhtmlOptionsEventOptions Event: Use it to change wkhtml options.
+

Payment

+ + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.payment_provider.supportsPaymentProviderSupportsEventSupport Event: Use it to modify available Payment Providers
+

Notes

+ + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.note.*.post_addGenericEventFires after a note of type * has been created
coreshop.note.*.post_deleteGenericEventFires after a note of type * has been deleted
+

Rules

+ + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.rule.availability_checkRuleAvailabilityCheckEventFires in RuleAvailabilityCheck maintenance/command for every active rule.
+

Replace symbol (*) with one of those note types:

+
    +
  • +payment +
  • +
  • +update_order +
  • +
  • +update_order_item +
  • +
  • +email +
  • +
  • +order_comment +
  • +
+

Workflow

+ + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.workflow.valid_transitionsWorkflowTransitionEventValid Event: Use it if you need to extend the workflow transitions
+

Transformer

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.quote_item.pre_transformGenericEventFires before proposal item gets transformed to a quote item
coreshop.quote_item.post_transformGenericEventFires after proposal item has been transformed to a quote item
coreshop.order_item.pre_transformGenericEventFires before proposal item gets transformed to a order item
coreshop.order_item.post_transformGenericEventFires after proposal item has been transformed to a order item
coreshop.quote.pre_transformGenericEventFires before proposal gets transformed to a quote
coreshop.quote.post_transformGenericEventFires after proposal has been transformed to a quote
coreshop.order.pre_transformGenericEventFires before proposal gets transformed to a order
coreshop.order.post_transformGenericEventFires after proposal has been transformed to a order
coreshop.shipment_item.pre_transformGenericEventFires before proposal item gets transformed to a shipment item
coreshop.shipment_item.post_transformGenericEventFires after proposal item has been transformed to a shipment item
coreshop.shipment.pre_transformGenericEventFires before proposal gets transformed to a shipment
coreshop.shipment.post_transformGenericEventFires after proposal has been transformed to a shipment
coreshop.invoice.pre_transformGenericEventFires before proposal gets transformed to a invoice
coreshop.invoice.post_transformGenericEventFires after proposal has been transformed to a invoice
+

Backend Controller

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameEventTypeDescription
coreshop.*.pre_createResourceControllerEventFires before object gets created in backend
coreshop.*.post_createResourceControllerEventFires after object gets created in backend
coreshop.*.pre_saveResourceControllerEventFires before object gets saved in backend
coreshop.*.post_saveResourceControllerEventFires after object gets saved in backend
coreshop.*.pre_deleteResourceControllerEventFires before object gets deleted in backend
coreshop.*.post_deleteResourceControllerEventFires after object gets deleted in backend
+

Replace symbol (*) with one of those controller:

+
    +
  • +configuration +
  • +
  • +payment_provider +
  • +
  • +exchange_rate +
  • +
  • +filter +
  • +
  • +index +
  • +
  • +notification_rule +
  • +
  • +notification_rule +
  • +
  • +cart_price_rule +
  • +
  • +product_price_rule +
  • +
  • +shipping_rule +
  • +
  • +store +
  • +
  • +tax_rule_group +
  • +
+

Workflow Events

+

There are events vor every state machine transition. Read more about it here.

+

Model Events

+

You can use Pimcore Events for CoreShops Pimcore Models: Pimcore Events

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html new file mode 100644 index 0000000000..04d7957695 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html @@ -0,0 +1,169 @@ + + + + + + + Extend CoreShop DataObjects - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Extending CoreShop

+

CoreShop Data Objects (like CoreShopProduct or CoreShopOrder) can be changed directly within Pimcore.

+

Replace CoreShop Object Classes with your own Classes

+

CoreShop uses Pimcore Parameters to determine the Pimcore Object Class. To change it, simply add this to your config.yml

+
core_shop_order:
+    pimcore:
+        order:
+            classes:
+                model: 'Pimcore\Model\DataObject\MyOrderClass'
+                install_file: '@AppBundle/Resources/install/pimcore/classes/MyOrderClass.json'
+                repository: AppBundle\Repository\OrderRepository
+                factory: AppBundle\Factory\OrderFactory
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Forms.html b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Forms.html new file mode 100644 index 0000000000..93b21d477d --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Forms.html @@ -0,0 +1,245 @@ + + + + + + + Extend CoreShop Forms - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Customizing Forms

+

The forms in CoreShop are placed in the CoreShop\Bundle\*BundleName*\Form\Type namespaces and the extensions +will be placed in AppBundle\Form\Extension.

+

Why would you customize a Form?

+

There are plenty of reasons to modify forms that have already been defined in CoreShop. +Your business needs may sometimes slightly differ from our internal assumptions.

+

You can:

+
    +
  • add completely new fields,
  • +
  • +modify existing fields, make them required, change their HTML class, change labels etc.,
  • +
  • +remove fields that are not used.
  • +
+

How to customize a CoreShop Resource Form?

+

If you want to modify the form for the Store in your system there are a few steps that you should take. +Assuming that you would like to (for example):

+
    +
  • Add a contactHours field,
  • +
+

These will be the steps that you will have to take to achieve that:

+

1. If your are planning to add new fields remember that beforehand they need to be added on the model that the form type is based on.

+

In case of our example if you need to have the contactHours on the model and the entity mapping for the Store resource. +To get to know how to prepare that go there

+

2. Create a Form Extension.

+

Your form has to extend a proper base class. How can you check that?

+

For the StoreType run:

+
$ php bin/console debug:container coreshop.form.type.store
+
+

As a result you will get the CoreShop\Bundle\StoreBundle\Form\Type\StoreType - this is the class that you need to be extending.

+
<?php
+
+namespace AppBundle\Form\Extension;
+
+use CoreShop\Bundle\StoreBundle\Form\Type\StoreType;
+use Symfony\Component\Form\AbstractTypeExtension;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+use Symfony\Component\Form\FormBuilderInterface;
+
+final class StoreTypeExtension extends AbstractTypeExtension
+{
+    public function buildForm(FormBuilderInterface $builder, array $options): void
+    {
+        // Adding new fields works just like in the parent form type.
+        $builder->add('contactHours', TextType::class, [
+            'required' => false
+        ]);
+    }
+
+    public static function getExtendedTypes(): array
+    {
+        return [StoreType::class];
+    }
+}
+
+

3. After creating your class, register this extension as a service in the AppBundle/Resources/config/services.yml:

+
services:
+    app.form.extension.type.customer_profile:
+        class: AppBundle\Form\Extension\StoreTypeExtension
+        tags:
+            - { name: form.type_extension, extended_type: CoreShop\Bundle\StoreBundle\Form\Type\StoreType }
+
+

In our case you will need to extend the ExtJs Form as well: src/AppBundle/Resources/public/pimcore/js/store.js.

+

In ExtJs your new store file need to like like this:

+
coreshop.store.item = Class.create(coreshop.store.item, {
+
+    getFormPanel: function ($super) {
+        var panel = $super();
+
+        panel.down("fieldset").add(
+            [
+                {
+                    xtype: 'textfield',
+                    fieldLabel: 'Contact Hours',
+                    name: 'contactHours'
+                }
+            ]
+        );
+
+        return this.formPanel;
+    }
+});
+
+

And you need to configure it to be loaded as well:

+
core_shop_store:
+    pimcore_admin:
+        js:
+            custom_store: '/bundles/app/pimcore/js/store.js'
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Resources.html b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Resources.html new file mode 100644 index 0000000000..c3fb14bba7 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Resources.html @@ -0,0 +1,263 @@ + + + + + + + Extend CoreShop Resources - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Extend CoreShop Resources

+

All models in Coreshop are placed in the Coreshop\Component\*ComponentName*\Model namespaces alongside with their interfaces.

+
+

Many models in CoreShop are extended in the Core component. If the model you are willing to override exists in the Core you should be extending the Core one, not the base model from the component.

+
+

How to Customize a Model

+

First things first: If you want to extend coreshop models your Bundle must extend the AbstractResourceBundle. Next you have set your supported drivers. Just add the following lines of code to your bundle class:

+
public function getSupportedDrivers(); array
+{
+    return [
+        CoreShopResourceBundle::DRIVER_DOCTRINE_ORM
+    ];
+}
+
+

After that have to tell the bundle where your models are. For that, add the override the following method in your bundle class and return the model namespace. Here is an example for the AppBundle

+
 protected function getModelNamespace(): string
+{
+    return "AppBundle\Model";
+} 
+
+

Here a quick overview for you which dictories are important for you, when customizing CoreShop models.

+ + + + + + + + + + + + + + + + + + + + + +
FolderDescription
AcmeBundle/Model or AcmeBundle/EntityWhere your models are living
AcmeBundle/config/doctrine/modelPut your doctrine .yml config files in here
AcmeBundle/config/serializerThe serializer configs for the models
+

Let’s take the CoreShop\Component\Currency\Model\Currency as an example. This one is extended in Core. How can you check that?

+

First of all, you need to find the current used class by doing following:

+
$ php bin/console debug:container --parameter=coreshop.model.currency.class
+
+

As a result you will get the CoreShop\Component\Core\Model\Currency - this is the class that you need to be extending.

+

Assuming you want to add a field called flag

+

1. The first thing to do is to write your own class which will extend the base Currency class

+
<?php
+
+namespace AppBundle\Entity;
+
+use CoreShop\Component\Core\Model\Currency as BaseCurrency;
+
+class Currency extends BaseCurrency
+{
+    /**
+     * @var bool
+     */
+    private $flag;
+
+    /**
+     * @return bool
+     */
+    public function getFlag()
+    {
+        return $this->flag;
+    }
+
+    /**
+     * @param bool $flag
+     */
+    public function setFlag($flag)
+    {
+        $this->flag = $flag;
+    }
+}
+
+

2. Next define your entity’s mapping.

+

The file should be placed in AppBundle/Resources/config/doctrine/Currency.orm.yml

+
AppBundle\Entity\Currency:
+    type: mappedSuperclass
+    table: coreshop_currency
+    fields:
+        flag:
+            type: boolean
+            nullable: true
+
+

3. Finally you’ll need to override the model’s class in the app/config/config.yml.

+

Under the core_shop_* where * is the name of the bundle of the model you are customizing, in our case it will be the CoreShopCurrencyBundle -> core_shop_currency.

+
core_shop_currency:
+    resources:
+        currency:
+            classes:
+                model: AppBundle\Entity\Currency
+
+

4. Update the database. There are two ways to do it.

+

via direct database schema update:

+
$ php bin/console doctrine:schema:update --force
+
+

via migrations: +Which we strongly recommend over updating the schema.

+
$ php bin/console doctrine:migrations:diff
+$ php bin/console doctrine:migrations:migrate
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Actions.html b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Actions.html new file mode 100644 index 0000000000..5899d4d0e8 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Actions.html @@ -0,0 +1,283 @@ + + + + + + + Extending Rule Actions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Custom Price-Rule/Shipping-Rule/Notification-Rule Actions

+

Adding Price-, Shipping- or Notification-Rule Actions is the same for all of these types. Their only difference is the +tag you use and Interface you need to implement for them.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Action TypeTagInterface
Cart Price Rulecoreshop.cart_price_rule.actionCoreShop\Component\Order\Cart\Rule\Action\CartPriceRuleActionProcessorInterface
Product Price Rulecoreshop.product_price_rule.actionCoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface
Product Specific Pricecoreshop.product_specific_price_rule.actionCoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface
Shipping Rulecoreshop.shipping_rule.actionCoreShop\Component\Shipping\Rule\Action\CarrierPriceActionProcessorInterface
Notification Rulecoreshop.notification_rule.actionCoreShop\Component\Notification\Rule\Action\NotificationRuleProcessorInterface
+

Example Adding a new Action

+

Now, lets add a new Action for Product Price Rules.

+

To do so, we first need to create a new class and implement the interface listed in the table above. For Product Price Rules, we need to use +CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface

+
//AppBundle/CoreShop/CustomAction.php
+namespace AppBundle\CoreShop;
+
+final class CustomAction implements \CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface
+{
+    public function getPrice($subject, array $context, array $configuration): int 
+    {
+        //If your action gives the product a new Price, put your calculation here
+
+        return $configuration['some_value'];
+    }
+}
+
+

We also need a FormType for the actions configurations:

+
//AppBundle/Form/Type/CustomActionType.php
+namespace AppBundle\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+
+final class CustomActionType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options): void
+    {
+        $builder
+            ->add('some_value', TextType::class)
+        ;
+    }
+}
+
+

With configuration, comes a Javascript file as well:

+
//AppBundle/Resources/public/pimcore/js/custom_action.js
+
+pimcore.registerNS('coreshop.product.pricerule.actions.custom');
+coreshop.product.pricerule.actions.custom = Class.create(coreshop.rules.actions.abstract, {
+
+    type: 'custom',
+
+    getForm: function () {
+        var some_value = 0;
+        var me = this;
+
+        if (this.data) {
+            some_value = this.data.some_value / 100;
+        }
+
+        var some_valueField = new Ext.form.NumberField({
+            fieldLabel: t('custom'),
+            name: 'some_value',
+            value: some_value,
+            decimalPrecision: 2
+        });
+
+        this.form = new Ext.form.Panel({
+            items: [
+                some_valueField
+            ]
+        });
+
+        return this.form;
+    }
+});
+
+
+

Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony structure, omit the web.

+
bin/console assets:install web
+
+

Registering the Custom Action to the Container and load the Javascript File

+

We now need to create our Service Definition for our Custom Action:

+
app.product_price_rule.custom:
+    class: AppBundle\CoreShop\CustomAction
+    tags:
+      - { name: coreshop.product_price_rule.action, type: custom, form-type: AppBundle\Form\Type\CustomActionType }
+
+

and add this to your config.yml:

+
core_shop_product:
+    pimcore_admin:
+        js:
+            custom_action: '/bundles/app/pimcore/js/custom_action.js'
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Conditions.html b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Conditions.html new file mode 100644 index 0000000000..808b46530a --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Conditions.html @@ -0,0 +1,280 @@ + + + + + + + Extending Rule Conditions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Custom Price-Rule/Shipping-Rule/Notification-Rule Conditions

+

Adding Price-, Shipping- or Notification-Rule Conditions is the same for all of these types. They're only difference is the +tag you use and Interface you need to implement for them.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Action TypeTagInterface/AbstractClass
Cart Price Rulecoreshop.cart_price_rule.conditionCoreShop\Component\Order\Cart\Rule\Condition\AbstractConditionChecker
Product Price Rulecoreshop.product_price_rule.conditionCoreShop\Component\Rule\Condition\ConditionCheckerInterface
Product Specific Pricecoreshop.product_specific_price_rule.conditionCoreShop\Component\Rule\Condition\ConditionCheckerInterface
Shipping Rulecoreshop.shipping_rule.conditionCoreShop\Component\Shipping\Rule\Condition\CategoriesConditionChecker
Notification Rulecoreshop.notification_rule.conditionCoreShop\Component\Notification\Rule\Condition\AbstractConditionChecker
+

Example Adding a new Condition

+

Now, lets add a new Condition for Product Price Rules.

+

To do so, we first need to create a new class and implement the interface listed in the table above. For Product Price Rules, we need to use +CoreShop\Component\Rule\Condition\ConditionCheckerInterface

+
//AppBundle/CoreShop/CustomCondition.php
+namespace AppBundle\CoreShop;
+
+use CoreShop\Component\Resource\Model\ResourceInterface;
+use CoreShop\Component\Rule\Model\RuleInterface;
+
+final class CustomCondition implements \CoreShop\Component\Rule\Condition\ConditionCheckerInterface
+{
+    public function isValid(ResourceInterface $subject, RuleInterface $rule, array $configuration, array $params = []): bool
+    {
+        //return true if valid, false if not
+        return true;
+    }
+}
+
+

We also need a FormType for the conditions configurations:

+
//AppBundle/Form/Type/CustomConditionType.php
+namespace AppBundle\Form\Type;
+
+final class CustomConditionType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options): void
+    {
+        $builder
+            ->add('some_value', TextType::class)
+        ;
+    }
+}
+
+

With configuration, comes a Javascript file as well:

+
//AppBundle/Resources/public/pimcore/js/custom_condition.js
+
+pimcore.registerNS('coreshop.product.pricerule.conditions.custom');
+coreshop.product.pricerule.conditions.custom = Class.create(coreshop.rules.conditions.abstract, {
+
+    type: 'custom',
+
+    getForm: function () {
+        var some_value = 0;
+        var me = this;
+
+        if (this.data) {
+            some_value = this.data.some_value / 100;
+        }
+
+        var some_valueField = new Ext.form.NumberField({
+            fieldLabel: t('custom'),
+            name: 'some_value',
+            value: some_value,
+            decimalPrecision: 2
+        });
+
+        this.form = new Ext.form.Panel({
+            items: [
+                some_valueField
+            ]
+        });
+
+        return this.form;
+    }
+});
+
+

Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony structure, omit the web.

+
bin/console assets:install web
+
+

Registering the Custom Condition to the Container and load the Javascript File

+

We now need to create our Service Definition for our Custom Condition:

+
app.product_price_rule.custom_condition:
+    class: AppBundle\CoreShop\CustomCondition
+    tags:
+      - { name: coreshop.product_price_rule.condition, type: custom, form-type: AppBundle\Form\Type\CustomConditionType }
+
+

and add this to your config.yml:

+
core_shop_product:
+    pimcore_admin:
+        js:
+            custom_condition: '/bundles/app/pimcore/js/custom_condition.js'
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/Custom_Filter.html b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/Custom_Filter.html new file mode 100644 index 0000000000..2d6024db53 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/Custom_Filter.html @@ -0,0 +1,219 @@ + + + + + + + Custom Filter - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Filter - Create Custom Filter

+

1. We need to create 2 new files: +- FormType for processing the Input Data +- And a FilterConditionProcessorInterface, which checks if a cart fulfills the condition.

+
namespace AppBundle\Filter\Form\Type\Condition;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\IntegerType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Validator\Constraints\NotBlank;
+use Symfony\Component\Validator\Constraints\Type;
+
+final class MyFilterCondition extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->add('myData', IntegerType::class, [
+                'constraints' => [
+                    new NotBlank(['groups' => ['coreshop']]),
+                    new Type(['type' => 'numeric', 'groups' => ['coreshop']]),
+                ],
+            ])
+        ;
+    }
+}
+
+
+
namespace AppBundle\Filter;
+
+use CoreShop\Component\Address\Model\AddressInterface;
+use CoreShop\Component\Core\Model\CarrierInterface;
+
+class MyFilterCondition extends FilterConditionProcessorInterface
+{
+    public function prepareValuesForRendering(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter)
+    {
+        //Prepare values for rendering HTML
+    }
+
+    public function addCondition(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter, ParameterBag $parameterBag, $isPrecondition = false)
+    {
+        //Add Condition to Listing
+
+        return $currentFilter;
+    }
+
+}
+
+

2. Register MyFilterCondition as service with tag coreshop.filter.condition_type, type and form

+
app.coreshop.shipping_rule.condition.my_rule:
+    class: AppBundle\Shipping\Rule\Condition\MyRuleConditionChecker
+    tags:
+      - { name: coreshop.shipping_rule.condition, type: my_rule, form-type: AppBundle\Shipping\Form\Type\Condition\MyRuleConfigurationType }
+
+app.filter.condition_type.my_filter_condition:
+    class: AppBundle\Filter\MyFilterCondition
+    tags:
+      - { name: coreshop.filter.condition_type, type: app-my-filter, form-type: AppBundle\Filter\Form\Type\Condition\MyFilterCondition}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/index.html b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/index.html new file mode 100644 index 0000000000..11f7174f94 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/index.html @@ -0,0 +1,227 @@ + + + + + + + Filter - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Filter

+

After creating the index, you can configure the Filters.

+

Create a new Filter

+

You can create different Filters for different Categories.

+

A filter exists of different settings, pre-conditions, filters and similar products.

+

You can even create Custom Filters

+

Filter Settings

+

Filter Settings

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
NameName of the Filter-Set
IndexWhich Index should be used
OrderOrder of the products
Order KeyOrder key (index-field) to sort from
Results per PageHow many products should be displayed per page, you can use Shop Settings, or override it
+

Pre-Conditions

+

Filter Pre-Conditions

+

You can define pre-filters for the index.

+

Conditions

+

Filter Conditions

+

Here you can define different kind of filters. These filters will be displayed on the front-page for customers to find products.

+

CoreShop currently supports 4 types of filters:

+
    +
  • +Select +
  • +
  • +Multiselect +
  • +
  • +Range +
  • +
  • +Boolean +
  • +
+

Select Condition

+

A select condition is basically just a simple dropdown field where customer can select one field.

+

Filter Condition Select

+

Multiselect Condition

+

A multi-select condition is basically a list of fields where customer can select multiple entries.

+

Filter Condition Select

+

Range Condition

+

A Range Condition is a slider of two ranges. The ranges are calculated automatically using MIN and MAX values.

+

Filter Condition Select

+

Boolean Condition

+

Boolean is a Condition where the customer can check different values.

+

Filter Condition Select

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Extension.html b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Extension.html new file mode 100644 index 0000000000..e7b3087f11 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Extension.html @@ -0,0 +1,167 @@ + + + + + + + Extension - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Index Extension

+

In order to make the index more flexible, it is possible for you to write extensions. Extensions allow you to do following things:

+
- Add more "default" columns and corresponding data
+- Pre Filter an mysql index
+
+

To create a new extension, you need to implement either the interface +CoreShop\Component\Index\Extension\IndexColumnsExtensionInterface +for column extensions or the interface +CoreShop\Bundle\IndexBundle\Extension\MysqlIndexQueryExtensionInterface +for mysql query extensions.

+

You then need to register your service using the tag coreshop.index.extension

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Interpreter.html b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Interpreter.html new file mode 100644 index 0000000000..01d2f53150 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Interpreter.html @@ -0,0 +1,224 @@ + + + + + + + Interpreter - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Index Interpreter

+

To prepare your index and transform data, you use one of the existing Interpreter or create one yourself.

+

CoreShop currently has following Interpreters:

+
    +
  • +Object: converts an object or and object array to relations. It saves the values to the relations inex
  • +
  • +ObjectId: converts an object to its ID
  • +
  • +ObjectIdSum: calculates the sum of all IDs. (Could be used for similar products)
  • +
  • +ObjectProperty: calls a getter method of the value
  • +
  • +Soundex: calls PHP soundex function (Could be used for similar products)
  • +
+

Create a Custom Interpreter

+

1 We need to create 2 new files:

+
    +
  • FormType for processing the Input Data
  • +
  • And a InterpreterInterface, which interprets the data
  • +
+

+namespace AppBundle\Index\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\IntegerType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Validator\Constraints\NotBlank;
+use Symfony\Component\Validator\Constraints\Type;
+
+final class MyInterpreterType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->add('myInterpreterData', IntegerType::class, [
+                'constraints' => [
+                    new NotBlank(['groups' => ['coreshop']]),
+                    new Type(['type' => 'numeric', 'groups' => ['coreshop']]),
+                ],
+            ])
+        ;
+    }
+}
+
+
+
namespace AppBundle\CoreShop\Index\Interpreter;
+
+use CoreShop\Component\Index\Interpreter\InterpreterInterface;
+
+class MyInterpreter implements InterpreterInterface
+{
+    public function interpret($value, IndexableInterface $indexable, IndexColumnInterface $config, array $interpreterConfig = []) {
+        //Do some interpretation here
+
+        return $value;
+    }
+}
+
+

2:Register MyInterpreter as service with tag coreshop.index.interpreter, type and form

+
app.index.interpreter.my_interpreter:
+    class: AppBundle\CoreShop\Index\Interpreter\MyInterpreter
+    tags:
+     - { name: coreshop.index.interpreter, type: my_interpreter, form-type: AppBundle\Index\Form\Type\MyInterpreterType}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/index.html b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/index.html new file mode 100644 index 0000000000..41a45d7d03 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/index.html @@ -0,0 +1,213 @@ + + + + + + + Index - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Index

+

To create a rich layered navigation (faceted navigation), you need to create an index of your Products.

+

Create a new Index

+

CoreShop currently supports two type of indexes:

+
    +
  • Mysql
  • +
  • ~~Elasticsearch~~
  • +
+

Add Fields

+

To add a new field, simply drag'n'drop the field from the left tree to the right tree.

+

Index Fields

+

Field Properties

+

Every field has some properties that needs to be configured

+

Field

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
KeyPimcore Field Name
NameName in the Index
Getter ClassGetter Class is important for field-types like "Localized Fields", "Classification Store", "Object Brick" and "Field Collection". CoreShop needs it to get the right value for the index
InterpreterUsing Interpreters helps you to transform values before they get stored in the index. For example: Resolving dependencies, create a similarity Index
TypeType of the field in the index, depends on which Index-Type you are using. MySql or Elasticsearch
Getter ConfigConfiguration depends on Getter, for example: Language for Localized Fields
+

Re-Index

+

If you make changes to the index, you need to re-index all of your products. To do that, there is a CLI command.

+
$ php bin/console coreshop:index
+
+

If you don't want to re-index all of your indices, you can pass the corresponding IDs or names of the indices separated +with a space as arguments to the CLI command. The following example will only re-index indices with IDs 1 and 2 and name +"Products". If none of those indices exist, nothing will be re-indexed.

+
$ php bin/console coreshop:index 1 2 Products
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Index_and_Filters/index.html b/docs/generated-docs/generated_docs/Development/Index_and_Filters/index.html new file mode 100644 index 0000000000..2e7671a7c6 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Index_and_Filters/index.html @@ -0,0 +1,166 @@ + + + + + + + Index and Filters - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Inventory/index.html b/docs/generated-docs/generated_docs/Development/Inventory/index.html new file mode 100644 index 0000000000..e28aeba65a --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Inventory/index.html @@ -0,0 +1,169 @@ + + + + + + + Inventory - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Inventory

+

Twig Helper

+

There are some Helpers to check the product inventory.

+

Inventory Available

+
{% if coreshop_inventory_is_available(product) %}
+    {# show cart button since there is at least one item available #}
+{% endif %}
+
+

Inventory is Sufficient

+
{% if coreshop_inventory_is_sufficient(product, 10) %}
+    {# do something here since there are at least 10 items available #}
+{% endif %}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Countries/CRUD.html b/docs/generated-docs/generated_docs/Development/Localization/Countries/CRUD.html new file mode 100644 index 0000000000..df55381498 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Countries/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Countries

+

Create

+

If you want to create a Country via API, you can do following:

+
$newCountry = $container->get('coreshop.factory.country')->createNew();
+
+

Now you have a new Country, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.country')->persist($newCountry);
+$container->get('coreshop.manager.country')->flush();
+
+

You now have a new persisted Country.

+

Read

+

If you want to query for Countries, you can do following:

+
$countryRepository = $container->get('coreshop.repository.country');
+
+$queryBuilder = $countryRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$countries = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Country, you need to do following:

+
// Fetch Country
+
+$country = $countryRepository->findById(1);
+$country->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.country')->persist($country);
+$container->get('coreshop.manager.country')->flush();
+
+

Delete

+

If you want to update and existing Country, you need to do following:

+
// Fetch Country
+
+$country = $countryRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.country')->remove($country);
+$container->get('coreshop.manager.country')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Countries/Context.html b/docs/generated-docs/generated_docs/Development/Localization/Countries/Context.html new file mode 100644 index 0000000000..575e951969 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Countries/Context.html @@ -0,0 +1,283 @@ + + + + + + + Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Country Context

+

For CoreShop to determine the current country the visitor or customer comes from, +it uses a concept called context and context resolver.

+

Context

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePriorityTagDescription
FixedCountryContextdefaultcoreshop.context.countryUsed for testing purposes
CountryContextdefaultcoreshop.context.countryCheck for a country within the country request resolver
StoreAwareCountryContextdefaultcoreshop.context.countryCheck if current country is available in current store context
+

Resolver

+ + + + + + + + + + + + + + + + + +
NamePriorityTagDescription
GeoLiteBasedRequestResolver10coreshop.context.country.request_based.resolverThis Resolver tries to determinate the users location by using the Geo Lite Database.
+

These resolver takes care about finding the correct country for the current request.

+

Create a Custom Resolver

+

A Country Context needs to implement the interface CoreShop\Component\Address\Context\CountryContextInterface. +This interface consists of one method called getCountry which returns a CoreShop\Component\Address\Model\CountryInterface or throws an CoreShop\Component\Address\Context\CountryNotFoundException.

+

To register your context, you need to use the tag: coreshop.context.country with an optional priority attribute.

+

Create a Request based Resolver

+

CoreShop already implements Request based country context resolver. +So if your Context depends on the current request, you can create a custom RequestBased Resolver. +To do that, implement the interface CoreShop\Component\Address\Context\RequestBased\RequestResolverInterface +with the method findCountry. This method either returns a country or null.

+

To register this resolver, use the tag: coreshop.context.country.request_based.resolver with an optional priority attribute.

+

Example

+

We want to a CountryContext to be based on the Pimcore Document. So if we are on site /de, we want to resolve to Austria, if we +are on page /en we want to resolve to Country Great Britain:

+

1: First of all we need to create our RequestBased Country Context:

+
<?php
+
+namespace AppBundle\CoreShop\Address\Context;
+
+use CoreShop\Component\Address\Context\RequestBased\RequestResolverInterface;
+use CoreShop\Component\Address\Repository\CountryRepositoryInterface;
+use Pimcore\Http\Request\Resolver\DocumentResolver;
+use Symfony\Component\HttpFoundation\Request;
+
+final class DocumentBasedRequestRequestResolver implements RequestResolverInterface
+{
+    /**
+     * @var DocumentResolver
+     */
+    private $pimcoreDocumentResolver;
+
+    /**
+     * @var CountryRepositoryInterface
+     */
+    private $countryRepository;
+
+    /**
+     * @param DocumentResolver $pimcoreDocumentResolver
+     * @param CountryRepositoryInterface $countryRepository
+     */
+    public function __construct(DocumentResolver $pimcoreDocumentResolver, CountryRepositoryInterface $countryRepository)
+    {
+        $this->pimcoreDocumentResolver = $pimcoreDocumentResolver;
+        $this->countryRepository = $countryRepository;
+    }
+
+    public function findCountry(Request $request)
+    {
+        $doc = $this->pimcoreDocumentResolver->getDocument($request);
+
+        if (substr($doc->getFullPath(), 0, 3) === '/en') {
+            return $this->countryRepository->findByCode('GB');
+        }
+
+        if (substr($doc->getFullPath(), 0, 3) === '/de') {
+            return $this->countryRepository->findByCode('AT');
+        }
+
+        return null;
+    }
+}
+
+

Now we need to configure the service in src/AppBundle/Resources/config/services.yml

+
services:
+  app.coreshop.country.context.request.document_based:
+    class: AppBundle\CoreShop\Address\Context\DocumentBasedRequestRequestResolver
+    arguments:
+      - '@Pimcore\Http\Request\Resolver\DocumentResolver'
+      - '@coreshop.repository.country'
+    tags:
+      - { name: coreshop.context.country.request_based.resolver }
+
+
+

CoreShop now tries to resolve the current country based on the Pimcore Site we are on.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Countries/index.html b/docs/generated-docs/generated_docs/Development/Localization/Countries/index.html new file mode 100644 index 0000000000..a71969dd57 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Countries/index.html @@ -0,0 +1,168 @@ + + + + + + + Countries - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Currencies/CRUD.html b/docs/generated-docs/generated_docs/Development/Localization/Currencies/CRUD.html new file mode 100644 index 0000000000..c0757dc6d5 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Currencies/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Currencies

+

Create

+

If you want to create a Currency via API, you can do following:

+
$newCurrency = $container->get('coreshop.factory.currency')->createNew();
+
+

Now you have a new Currency, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.currency')->persist($newCurrency);
+$container->get('coreshop.manager.currency')->flush();
+
+

You now have a new persisted Currency.

+

Read

+

If you want to query for Currencies, you can do following:

+
$currencyRepository = $container->get('coreshop.repository.currency');
+
+$queryBuilder = $currencyRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$currencies = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Currency, you need to do following:

+
// Fetch Currency
+
+$currency = $currencyRepository->findById(1);
+$currency->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.currency')->persist($currency);
+$container->get('coreshop.manager.currency')->flush();
+
+

Delete

+

If you want to update and existing Currency, you need to do following:

+
// Fetch Currency
+
+$currency = $currencyRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.currency')->remove($currency);
+$container->get('coreshop.manager.currency')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Currencies/Context.html b/docs/generated-docs/generated_docs/Development/Localization/Currencies/Context.html new file mode 100644 index 0000000000..a2701da269 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Currencies/Context.html @@ -0,0 +1,194 @@ + + + + + + + Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Currency Context

+

For CoreShop to determine the current currency it uses a concept called context and context resolver.

+

Context

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePriorityTagDescription
FixedCurrencyContextdefaultcoreshop.context.currencyUsed for testing purposes
StorageBasedCurrencyContextdefaultcoreshop.context.currencycheck if a currency has been changed during a frontend request
CountryAwareCurrencyContextdefaultcoreshop.context.currencyMostly this context will apply since it will get the currency based on the current country context
+

These Contexts take care about finding the correct currency for the current request.

+

Create a Custom Resolver

+

A Currency Context needs to implement the interface CoreShop\Component\Currency\Context\CurrencyContextInterface. +This interface consists of one method called getCurrency which returns a CoreShop\Component\Currency\Model\CurrencyInterface or throws an CoreShop\Component\Currency\Context\CurrencyNotFoundException

+

To register your context, you need to use the tag: coreshop.context.currency with an optional priority attribute.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Currencies/index.html b/docs/generated-docs/generated_docs/Development/Localization/Currencies/index.html new file mode 100644 index 0000000000..8fe83e5131 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Currencies/index.html @@ -0,0 +1,168 @@ + + + + + + + Currencies - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/States/CRUD.html b/docs/generated-docs/generated_docs/Development/Localization/States/CRUD.html new file mode 100644 index 0000000000..549917cb6c --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/States/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

States

+

Create

+

If you want to create a State via API, you can do following:

+
$newState = $container->get('coreshop.factory.state')->createNew();
+
+

Now you have a new State, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.state')->persist($newState);
+$container->get('coreshop.manager.state')->flush();
+
+

You now have a new persisted State.

+

Read

+

If you want to query for States, you can do following:

+
$stateRepository = $container->get('coreshop.repository.state');
+
+$queryBuilder = $stateRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$states = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing State, you need to do following:

+
// Fetch State
+
+$state = $stateRepository->findById(1);
+$state->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.state')->persist($state);
+$container->get('coreshop.manager.state')->flush();
+
+

Delete

+

If you want to update and existing State, you need to do following:

+
// Fetch State
+
+$state = $stateRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.state')->remove($state);
+$container->get('coreshop.manager.state')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/States/index.html b/docs/generated-docs/generated_docs/Development/Localization/States/index.html new file mode 100644 index 0000000000..a3e3686cca --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/States/index.html @@ -0,0 +1,162 @@ + + + + + + + States - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/CRUD.html b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/CRUD.html new file mode 100644 index 0000000000..fad26a9a6f --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Tax Rates

+

Create

+

If you want to create a Zone via API, you can do following:

+
$newZone = $container->get('coreshop.factory.tax_rate')->createNew();
+
+

Now you have a new Zone, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.tax_rate')->persist($newZone);
+$container->get('coreshop.manager.tax_rate')->flush();
+
+

You now have a new persisted Zone.

+

Read

+

If you want to query for Tax Rates, you can do following:

+
$rateRepository = $container->get('coreshop.repository.tax_rate');
+
+$queryBuilder = $rateRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$rates = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Zone, you need to do following:

+
// Fetch Zone
+
+$rate = $rateRepository->findById(1);
+$rate->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.tax_rate')->persist($rate);
+$container->get('coreshop.manager.tax_rate')->flush();
+
+

Delete

+

If you want to update and existing Zone, you need to do following:

+
// Fetch Zone
+
+$rate = $rateRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.tax_rate')->remove($rate);
+$container->get('coreshop.manager.tax_rate')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/index.html b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/index.html new file mode 100644 index 0000000000..da2e3619d9 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/index.html @@ -0,0 +1,165 @@ + + + + + + + Tax Rate - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/CRUD.html b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/CRUD.html new file mode 100644 index 0000000000..da2a8cb073 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Tax Rules

+

Create

+

If you want to create a Tax Rule via API, you can do following:

+
$newTaxRule = $container->get('coreshop.factory.tax_rule')->createNew();
+
+

Now you have a new Tax Rule, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.tax_rule')->persist($newTaxRule);
+$container->get('coreshop.manager.tax_rule')->flush();
+
+

You now have a new persisted Tax Rule.

+

Read

+

If you want to query for Tax Rules, you can do following:

+
$ruleRepository = $container->get('coreshop.repository.tax_rule');
+
+$queryBuilder = $ruleRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$rules = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Tax Rule, you need to do following:

+
// Fetch Tax Rule
+
+$rule = $ruleRepository->findById(1);
+$rule->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.tax_rule')->persist($rule);
+$container->get('coreshop.manager.tax_rule')->flush();
+
+

Delete

+

If you want to update and existing Tax Rule, you need to do following:

+
// Fetch Tax Rule
+
+$rule = $ruleRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.tax_rule')->remove($rule);
+$container->get('coreshop.manager.tax_rule')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html new file mode 100644 index 0000000000..bc2f06ce7d --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html @@ -0,0 +1,156 @@ + + + + + + + Tax Factory - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/index.html b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/index.html new file mode 100644 index 0000000000..32db286484 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/index.html @@ -0,0 +1,165 @@ + + + + + + + Tax Rule - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Taxes/index.html b/docs/generated-docs/generated_docs/Development/Localization/Taxes/index.html new file mode 100644 index 0000000000..295103fe69 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Taxes/index.html @@ -0,0 +1,168 @@ + + + + + + + Taxes - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Zones/CRUD.html b/docs/generated-docs/generated_docs/Development/Localization/Zones/CRUD.html new file mode 100644 index 0000000000..b8b47d2d7f --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Zones/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Zones

+

Create

+

If you want to create a Zone via API, you can do following:

+
$newZone = $container->get('coreshop.factory.zone')->createNew();
+
+

Now you have a new Zone, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.zone')->persist($newZone);
+$container->get('coreshop.manager.zone')->flush();
+
+

You now have a new persisted Zone.

+

Read

+

If you want to query for Zones, you can do following:

+
$zoneRepository = $container->get('coreshop.repository.zone');
+
+$queryBuilder = $zoneRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$zones = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Zone, you need to do following:

+
// Fetch Zone
+
+$zone = $zoneRepository->findById(1);
+$zone->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.zone')->persist($zone);
+$container->get('coreshop.manager.zone')->flush();
+
+

Delete

+

If you want to update and existing Zone, you need to do following:

+
// Fetch Zone
+
+$zone = $zoneRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.zone')->remove($zone);
+$container->get('coreshop.manager.zone')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/Zones/index.html b/docs/generated-docs/generated_docs/Development/Localization/Zones/index.html new file mode 100644 index 0000000000..fb37ad095e --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/Zones/index.html @@ -0,0 +1,162 @@ + + + + + + + Zones - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Localization/index.html b/docs/generated-docs/generated_docs/Development/Localization/index.html new file mode 100644 index 0000000000..ab18a8c4cc --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Localization/index.html @@ -0,0 +1,175 @@ + + + + + + + Localization - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Actions.html b/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Actions.html new file mode 100644 index 0000000000..ea30985811 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Actions.html @@ -0,0 +1,162 @@ + + + + + + + Custom Actions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Conditions.html b/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Conditions.html new file mode 100644 index 0000000000..7f3e484663 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Conditions.html @@ -0,0 +1,162 @@ + + + + + + + Custom Conditions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Types.html b/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Types.html new file mode 100644 index 0000000000..4567e7186f --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Types.html @@ -0,0 +1,166 @@ + + + + + + + Custom Types - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Notification Rule Custom Type

+

Notification Types are registered dynamically by using tag-attributes on conditions and actions. If you want to have your own +type, you can do so by adding a new condition or action and specify your own type:

+
services:
+  app.coreshop.notification_rule.condition.order.custom_notification_condition:
+    class: AppBundle\CoreShop\Notification\CustomNotificationCondition
+    tags:
+      - { name: coreshop.notification_rule.condition, type: custom_condition, notification-type: custom, form-type: AppBundle\Form\Type\CoreShop\CustomConditionType }
+
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Notification_Rules/Triggering.html b/docs/generated-docs/generated_docs/Development/Notification_Rules/Triggering.html new file mode 100644 index 0000000000..7ab7aba305 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Notification_Rules/Triggering.html @@ -0,0 +1,173 @@ + + + + + + + Triggering - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Notification Trigger Notifications

+

Triggering Notification events is quite easy, you can use the CoreShop\Component\Notification\Processor\RulesProcessorInterface implemented by service +@coreshop.notification_rule.processor

+

You also need to add different kinds of parameters based on your Notification Type. +In our case, we trigger an Order event.

+
$this->rulesProcessor->applyRules('order', $event->getProposal(), [
+    'fromState' => $event->getMarking()->getPlaces(),
+    'toState' => $event->getTransition()->getTos(),
+    '_locale' => $order->getLocaleCode(),
+    'recipient' => $customer->getEmail(),
+    'firstname' => $customer->getFirstname(),
+    'lastname' => $customer->getLastname(),
+    'orderNumber' => $order->getOrderNumber(),
+    'transition' => $event->getTransition()->getName()
+]);
+
+

The rest is now handled by CoreShop Notifications.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Notification_Rules/index.html b/docs/generated-docs/generated_docs/Development/Notification_Rules/index.html new file mode 100644 index 0000000000..364f6fff20 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Notification_Rules/index.html @@ -0,0 +1,703 @@ + + + + + + + Notification Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Notification Rules

+

Notification Rules are responsible for all types of notification triggered by CoreShop. +It handles notification for following types:

+
    +
  • order
  • +
  • quote
  • +
  • invoice
  • +
  • shipment
  • +
  • user
  • +
  • payment
  • +
+

Overview

+

Let's checkout each notification type:

+

Order

+

Allowed Conditions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
Invoice StateDispatch if given Invoice State is active
Invoice TransitionDispatch if given Invoice Transition has been applied
Payment StateDispatch if given Payment State is active
Payment TransitionDispatch if given Payment Transition has been applied
Shipping StateDispatch if given Shipping State is active
Shipping TransitionDispatch if given Shipping Transition has been applied
Order StateDispatch if given Order State is active
Order TransitionDispatch if given Order Transition has been applied
CarriersDispatch if given Carrier has been selected in Order
CommentDispatch if a Comment Action has been applied. Available Types: create comment
+

Allowed Actions

+ + + + + + + + + + + + + + + + + +
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
+

Available Placeholders keys for email templates

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValue
objectObject of type OrderInterface
fromStateState identifier from which it is transitioning away from
toStateState identifier from which it is transitioning to
transitionUsed transition
_localeUsed locale
recipientCustomer E-Mail Address
firstnameCustomer Firstname
lastnameCustomer Lastname
orderNumberOrder Number
+

Available Placeholders keys for email templates for comment

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValue
objectObject of type OrderInterface
_localeUsed locale
recipientCustomer E-Mail Address
firstnameCustomer Firstname
lastnameCustomer Lastname
orderNumberOrder Number
typeType of comment
submitAsEmailshould comment be sent as mail
commentcontents of the comment
+

Shipment

+

Allowed Conditions

+ + + + + + + + + + + + + + + + + +
NameDescription
Shipping StateDispatch if given Shipping State is active
Shipping TransitionDispatch if given Shipping Transition has been applied
+

Allowed Actions

+ + + + + + + + + + + + + + + + + +
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
+

Available Placeholders keys for email templates

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValue
objectObject of type OrderShipmentInterface
orderObject of type OrderInterface
fromStateState identifier from which it is transitioning away from
toStateState identifier from which it is transitioning to
transitionUsed transition
+

Invoice

+

Allowed Conditions

+ + + + + + + + + + + + + + + + + +
NameDescription
Invoice StateDispatch if given Invoice State is active
Invoice TransitionDispatch if given Invoice Transition has been applied
+

Allowed Actions

+ + + + + + + + + + + + + + + + + +
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
+

Available Placeholders keys for email templates

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValue
objectObject of type OrderInvoiceInterface
orderObject of type OrderInterface
fromStateState identifier from which it is transitioning away from
toStateState identifier from which it is transitioning to
transitionUsed transition
+

Payment

+

Allowed Conditions

+ + + + + + + + + + + + + + + + + +
NameDescription
Payment StateDispatch if given Payment State is active
Payment TransitionDispatch if given Payment Transition has been applied
+

Allowed Actions

+ + + + + + + + + + + + + + + + + +
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
+

Available Placeholders keys for email templates

+ + + + + + + + + + + + + + + + + + + + + +
KeyValue
objectObject of type PaymentInterface
orderObject of type OrderInterface
paymentStateState of the Payment
+

User

+

Allowed Conditions

+ + + + + + + + + + + + + +
NameDescription
User TypeDispatch if given Type has been applied. Allowed Types: new account, password reset
+

Allowed Actions

+ + + + + + + + + + + + + +
NameDescription
EmailDefault Email without Order Object
+

Available Placeholders keys for email templates

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyValue
objectObject of type CustomerInterface
recipientCustomer E-Mail Address
genderCustomer Gender
firstnameCustomer Firstname
lastnameCustomer Lastname
emailCustomer E-Mail
typetype of customer notification
+

Additional Placeholders keys for Password Reset

+ + + + + + + + + + + + + +
KeyValue
resetLinkLink where customer can reset his Password
+

Additional Placeholders keys for Request Newsletter

+ + + + + + + + + + + + + + + + + +
KeyValue
confirmLinkLink where customer can confirm his Newsletter subscription
tokenConfirmation Token
+

Quote

+

Allowed Conditions

+ + + + + + + + + + + + + +
NameDescription
CarriersDispatch if given Carrier has been selected in Order
+

Allowed Actions

+ + + + + + + + + + + + + +
NameDescription
EmailDefault Email without Order Object
+

Available Placeholders keys for email templates

+ + + + + + + + + + + + + +
KeyValue
objectObject of type QuoteInterface
+

Custom Implementation

+

It's also easy to implement custom notification rules. Read more about this here

+

Extend CoreShop Notification Rules

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Order/AdditionalData.html b/docs/generated-docs/generated_docs/Development/Order/AdditionalData.html new file mode 100644 index 0000000000..ca8ece04a9 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Order/AdditionalData.html @@ -0,0 +1,289 @@ + + + + + + + AdditionalData - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Additional Data in Order

+

Sometimes you need to implement additional information in your order (Besides the comment field, which is available by default in the shipping checkout step).

+
+

Note: To add custom fields you need a custom checkout step.

+
+
    +
  1. Create your custom brick and apply it to the classes:
  2. +
+
    +
  • Cart (additionalData)
  • +
  • Order (additionalData)
  • +
  • Quote (additionalData)
  • +
+
    +
  1. Add fields to your custom checkout step (createForm()):
  2. +
+
$form->add('af_secretField', TextType::class, [
+    'required' => false,
+    'label' => 'coreshop.ui.your_secret_field'
+]);
+$form->add('af_secondSecretField', TextType::class, [
+    'required' => false,
+    'label' => 'coreshop.ui.your_second_secret_field'
+]);
+
+
    +
  1. Store data in cart (commitStep())
  2. +
+
use Pimcore\Model\DataObject\Objectbrick\Data\AdditionalField;
+
+if ($form->isSubmitted()) {
+    if ($form->isValid()) {
+        $formData = $form->getData();
+        if(!empty($formData['af_secretField'])) {
+            $brick = new AdditionalField($cart);
+            $brick->setSecretField($formData['af_secretField']);
+            $brick->setSecondSecretField($formData['af_secondSecretField']);
+            $cart->getAdditionalData()->setAdditionalField($brick);
+        }
+        $cart->save();
+        return true;
+    }
+}
+
+

That's it - your additional data is now available in backend. +If you want to display those fields in the overview, you need to add some JS:

+
core_shop_core:
+    pimcore_admin:
+        js:
+            filter_condition_relational_multi_select: '/bundles/app/additionalData.js'
+
+

This file has to extend coreshop.order.sale.detail.abstractBlock +and requires several methods: initBlock, updateSale, getPanel, getPriority and getPosition.

+
pimcore.registerNS('coreshop.order.order.detail.blocks.yourBlockName');
+coreshop.order.order.detail.blocks.yourBlockName = Class.create(coreshop.order.sale.detail.abstractBlock, {
+
+    saleInfo: {},
+    hasItems: true,
+
+    initBlock: function () {
+        this.saleInfo = Ext.create('Ext.panel.Panel', {
+            title: t('coreshop_order_additional_data'),
+            margin: '0 20 20 0',
+            border: true,
+            flex: 8
+        });
+    },
+
+    updateSale: function () {
+
+        var items = [],
+            subItems = [];
+
+        //console.log(this.sale.additionalData);
+
+        var items = [], subItems = [];
+
+        Ext.Array.each(this.sale.additionalData, function (block, i) {
+            var data = block.data;
+            subItems.push({
+                xtype: 'label',
+                style: 'font-weight:bold;display:block',
+                text: 'Title for your custom field A'
+            },
+            {
+                xtype: 'label',
+                style: 'display:block',
+                html: data.secretField
+            });
+            subItems.push({
+                xtype: 'label',
+                style: 'font-weight:bold;display:block',
+                text: 'Title for your custom field B'
+            },
+            {
+                xtype: 'label',
+                style: 'display:block',
+                html: data.secondSecretField
+            })
+        });
+
+        if (subItems.length === 0) {
+            this.hasItems = false;
+            return;
+        }
+
+        items.push({
+            xtype: 'panel',
+            bodyPadding: 10,
+            margin: '0 0 10px 0',
+            items: subItems
+        });
+
+        // remove all before adding new ones
+        // otherwise they will append during a refresh
+        this.saleInfo.removeAll();
+
+        this.saleInfo.add(items);
+    },
+
+    getPanel: function () {
+        return this.hasItems ? this.saleInfo : null;
+    },
+
+    getPriority: function () {
+        return 10;
+    },
+
+    getPosition: function () {
+        return 'right';
+    }
+});
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Order/Invoice/Invoice_Creation.html b/docs/generated-docs/generated_docs/Development/Order/Invoice/Invoice_Creation.html new file mode 100644 index 0000000000..2d14a17a61 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Order/Invoice/Invoice_Creation.html @@ -0,0 +1,178 @@ + + + + + + + Invoice Creation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Invoice Creation

+

See Order Transformer for more.

+

Add a Invoice to an Order

+
/**
+ * Note:
+ *
+ * The TRANSITION_REQUEST_INVOICE transition can only be applied once.
+ * Only dispatch it with the creation of the first invoice.
+ * This transition will inform the order invoice workflow that it's ready to initiate the invoice processing.
+*/
+$workflow = $this->getStateMachineManager()->get($order, 'coreshop_order_invoice');
+$workflow->apply($order, OrderInvoiceTransitions::TRANSITION_REQUEST_INVOICE);
+
+$order = '';
+
+/** @var InvoiceInterface $invoice */
+$invoice = $this->container->get('coreshop.factory.order_invoice')->createNew();
+$invoice->setState(InvoiceStates::STATE_NEW);
+
+$items = [];
+$invoice = $this->get('coreshop.order.transformer.order_to_invoice')->transform($order, $invoice, $items);
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Order/Invoice/index.html b/docs/generated-docs/generated_docs/Development/Order/Invoice/index.html new file mode 100644 index 0000000000..841dfd574e --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Order/Invoice/index.html @@ -0,0 +1,158 @@ + + + + + + + Invoice - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Order/OrderList/Action.html b/docs/generated-docs/generated_docs/Development/Order/OrderList/Action.html new file mode 100644 index 0000000000..e723f0c945 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Order/OrderList/Action.html @@ -0,0 +1,250 @@ + + + + + + + Action - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Order List Actions

+

Actions allows you to process orders rapidly, right in the order grid view.

+

filter

+

Register Filter Service

+
AppBundle\CoreShop\OrderList\Action\Demo:
+    arguments:
+        $stateMachineManager: '@coreshop.state_machine_manager'
+        $shipmentRepository: '@coreshop.repository.order_shipment'
+    tags:
+        - { name: coreshop.grid.action, type: demo }
+
+

Create PHP Class

+

In this example we want to apply the shipment transition "ship" to selected orders.

+
<?php
+
+namespace AppBundle\CoreShop\OrderList\Action;
+
+use CoreShop\Component\Order\Repository\OrderShipmentRepositoryInterface;
+use CoreShop\Bundle\WorkflowBundle\Manager\StateMachineManagerInterface;
+use CoreShop\Component\Pimcore\DataObject\Grid\GridActionInterface;
+use Pimcore\Model\DataObject\CoreShopOrder;
+
+class DemoAction implements GridActionInterface
+{
+    protected $stateMachineManager;
+
+    protected $shipmentRepository;
+
+    public function __construct(
+        StateMachineManagerInterface $stateMachineManager,
+        OrderShipmentRepositoryInterface $shipmentRepository
+    ) {
+        $this->stateMachineManager = $stateMachineManager;
+        $this->shipmentRepository = $shipmentRepository;
+    }
+
+    public function getName(): string
+    {
+        return 'coreshop.order.demo';
+    }
+
+    public function apply(array $processIds): string
+    {
+        $message = '';
+        $transition = 'ship';
+        $shipmentIds = [];
+
+        foreach ($processIds as $id) {
+
+            $m = [];
+            $order = CoreShopOrder::getById($id);
+            $shipments = $this->shipmentRepository->getDocuments($order);
+
+            if (count($shipments) === 0) {
+                $m[] = sprintf('- no shipments for order %s found. skipping....', $order->getId());
+            } else {
+                foreach ($shipments as $shipment) {
+                    if ($shipment->getState() === 'shipped') {
+                        $m[] = sprintf('- transition "%s" for shipment %s already applied. skipping...', $transition, $shipment->getId());
+                        continue;
+                    }
+                    $workflow = $this->stateMachineManager->get($shipment, 'coreshop_shipment');
+                    if (!$workflow->can($shipment, $transition)) {
+                        $m[] = sprintf('- transition "%s" for shipment %s not allowed.', $transition, $shipment->getId());
+                    } else {
+                        try {
+                            $workflow->apply($shipment, $transition);
+                            $shipmentIds[] = $shipment->getId();
+                            $m[] = sprintf('- transition "%s" for shipment id %s successfully applied.', $transition, $shipment->getId());
+                        } catch (\Exception $e) {
+                            $m[] = sprintf('- error while applying transition "%s" to shipment with id %s: %s.', $transition, $shipment->getId(), $e->getMessage());
+                        }
+                    }
+                }
+            }
+
+            $message .= sprintf('<strong>Order %s:</strong><br>%s<br>', $id, join('<br>', $m));
+
+        }
+
+        if (count($shipmentIds) > 0) {
+            $packingListUrl = '/admin/your-packing-list-generator-url?ids=' . join(',', $shipmentIds);
+            $message .= sprintf('<br><a href="%s" target="_blank">%s</a><br>', $packingListUrl, 'packing list');
+        }
+
+        return $message;
+    }
+
+    public function supports(string $listType): bool
+    {
+        return $listType === 'coreshop_order';
+    }
+}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Order/OrderList/Filter.html b/docs/generated-docs/generated_docs/Development/Order/OrderList/Filter.html new file mode 100644 index 0000000000..da0156ad0b --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Order/OrderList/Filter.html @@ -0,0 +1,203 @@ + + + + + + + Filter - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Order List Filter

+

This comes in handy if you need some special filtered data in your Order List. +Your Customer is able to filter orders on specific conditions.

+

filter

+

Register Filter Service

+
AppBundle\CoreShop\OrderList\Filter\DemoFilter:
+    tags:
+        - { name: coreshop.grid.filter, type: demo }
+
+

Create PHP Class

+

In this example we want to filter orders with available shipments in state "ready".

+
<?php
+
+namespace AppBundle\CoreShop\OrderList\Filter;
+
+use CoreShop\Component\Pimcore\DataObject\Grid\GridFilterInterface;
+use Pimcore\Db\ZendCompatibility\QueryBuilder;
+use Pimcore\Model\DataObject;
+
+class DemoFilter implements GridFilterInterface
+{
+    public function getName(): string
+    {
+        return 'coreshop.order_filter.shipment_apply';
+    }
+
+    public function filter(DataObject\Listing $list, array $context): DataObject\Listing
+    {
+        $list->onCreateQuery(function (QueryBuilder $select) use ($list) {
+            $select->join(
+                ['shipment' => 'object_query_4'],
+                'shipment.order__id = object_' . $list->getClassId() . '.o_id'
+            );
+        });
+
+        $list->addConditionParam('orderState = ?', 'confirmed');
+        $list->addConditionParam('shipment.state = ?', 'ready');
+
+        return $list;
+    }
+
+    public function supports(string $listType): bool
+    {
+        return $listType === 'coreshop_order';
+    }
+}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Order/Order_Creation.html b/docs/generated-docs/generated_docs/Development/Order/Order_Creation.html new file mode 100644 index 0000000000..53a7f5a968 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Order/Order_Creation.html @@ -0,0 +1,164 @@ + + + + + + + Order Creation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Order Creation

+

Orders are usually getting created through the Checkout Step. If you ever need to create an Order manually, there are multiple ways.

+

Order CRUD

+

You can always use the Pimcore API to create Orders, in CoreShop you would do it through the Factory:

+
$factory = $container->get('coreshop.factory.order')->createNew();
+
+

You can now fill the Order with all necessary information.

+

The more usual way to create Orders is through Carts or Quotes. Therefore CoreShop implements Transformer for that.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Order/Order_Workflow.html b/docs/generated-docs/generated_docs/Development/Order/Order_Workflow.html new file mode 100644 index 0000000000..a5218b3a39 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Order/Order_Workflow.html @@ -0,0 +1,158 @@ + + + + + + + Order Workflow - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Order/Purchasable.html b/docs/generated-docs/generated_docs/Development/Order/Purchasable.html new file mode 100644 index 0000000000..51cf5e4381 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Order/Purchasable.html @@ -0,0 +1,210 @@ + + + + + + + Purchasable - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Order Purchasable

+

Items, you want to add to your Cart/Order/Quote, need to implement CoreShop\Component\Order\Model\PurchasableInterface.

+

The concept of Purchasable allows us to decouple CoreShops Order Component from the Product Component and makes the Cart/Quote/Order more flexible +in ways of which object types can be used.

+
+

A Purchasable does not a have Price directly +You need create a class that implements CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface. +in order to calculate price

+
+

Implementation of a new Purchasable Price Calculator

+

To implement a new custom Purchasable Price Calculator, you need to implement the interface CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface.

+

As an example, we create a ProductSetCalculator, which takes prices of each consisting Product:

+
<?php
+
+namespace AppBundle\CoreShop\Order\Calculator;
+
+use CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface;
+use CoreShop\Component\Order\Exception\NoPurchasablePriceFoundException;use CoreShop\Component\Order\Model\PurchasableInterface;
+use Pimcore\Model\Product\ProductSet;
+
+final class ProductSetCalculator implements PurchasablePriceCalculatorInterface
+{
+    private PurchasablePriceCalculatorInterface $purchasablePriceCalculator;
+
+    public function __construct(PurchasablePriceCalculatorInterface $purchasablePriceCalculator)
+    {
+        $this->purchasablePriceCalculator = $purchasablePriceCalculator;
+    }
+
+    public function getPrice(PurchasableInterface $purchasable, array $context, bool $includingDiscounts = false): int
+    {
+        if ($purchasable instanceof ProductSet) {
+            $price = 0;
+
+            foreach ($purchasable->getProducts() as $product) {
+                $price .= $this->purchasablePriceCalculator->getPrice($product);
+            }
+
+            return $price;
+        }
+
+        throw new NoPurchasablePriceFoundException($this);
+    }
+
+}
+
+

Now we need to register our Service to the Container:

+
app.coreshop.order.purchasable.price_calculator.product_set:
+    class: AppBundle\CoreShop\Order\Calculator\ProductSetCalculator
+    arguments:
+        - '@coreshop.order.purchasable.price_calculator'
+    tags:
+     - { name: coreshop.order.purchasable.price_calculator, type: product_set, priority: 20 }
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Order/Shipment/Shipment_Creation.html b/docs/generated-docs/generated_docs/Development/Order/Shipment/Shipment_Creation.html new file mode 100644 index 0000000000..4f2f6ed204 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Order/Shipment/Shipment_Creation.html @@ -0,0 +1,178 @@ + + + + + + + Shipment Creation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Shipment Creation

+

See Order Transformer for more.

+

Add a Shipment to an Order

+
/**
+ * Note:
+ *
+ * The TRANSITION_REQUEST_SHIPMENT transition can only be applied once.
+ * Only dispatch it with the creation of the first shipment.
+ * This transition will inform the order shipment workflow that it's ready to initiate the shipment processing.
+*/
+$workflow = $this->getStateMachineManager()->get($order, 'coreshop_order_shipment');
+$workflow->apply($order, OrderShipmentTransitions::TRANSITION_REQUEST_SHIPMENT);
+
+$order = '';
+
+/** @var ShipmentInterface $shipment */
+$shipment = $this->container->get('coreshop.factory.order_shipment')->createNew();
+$shipment->setState(ShipmentStates::STATE_NEW);
+
+$items = [];
+$shipment = $this->get('coreshop.order.transformer.order_to_shipment')->transform($order, $shipment, $items);
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Order/Shipment/index.html b/docs/generated-docs/generated_docs/Development/Order/Shipment/index.html new file mode 100644 index 0000000000..4401485cc3 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Order/Shipment/index.html @@ -0,0 +1,158 @@ + + + + + + + Shipment - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Shipment

+

CoreShop comes with an Shipment (Delivery Slip) creation feature. This means, it can create Shipments for Orders based on Workflow States.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Order/TemplateHelper.html b/docs/generated-docs/generated_docs/Development/Order/TemplateHelper.html new file mode 100644 index 0000000000..c174000dfa --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Order/TemplateHelper.html @@ -0,0 +1,161 @@ + + + + + + + TemplateHelper - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Order/Transformer.html b/docs/generated-docs/generated_docs/Development/Order/Transformer.html new file mode 100644 index 0000000000..95e0970d1e --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Order/Transformer.html @@ -0,0 +1,201 @@ + + + + + + + Transformer - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Transfomers

+

Transfomers, as the name say, transform Data from different formats. A transformer converts between Object Types. For example: Cart -> Order. Following implementation do exist right now:

+ +

The base transformer interface for all "Proposals" is CoreShop\Component\Order\Transformer\ProposalTransformerInterface

+

Extending Transfomers

+

If you ever have the need to adapt the transfomer, eg. hook into it and store some custom data into the order, you can do so +by decorating the default service. Following Services are used by CoreShop for all different Transfomers:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FromToService
OrderInvoicecoreshop.order.transformer.order_to_invoice
OrderItemInvoiceItemcoreshop.order_invoice.transformer.cart_item_to_order_item
OrderShipmentcoreshop.order.transformer.order_to_invoice
OrderItemShipmentItemcoreshop.order_invoice.transformer.order_item_to_shipment_item
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Order/index.html b/docs/generated-docs/generated_docs/Development/Order/index.html new file mode 100644 index 0000000000..b6569b399a --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Order/index.html @@ -0,0 +1,190 @@ + + + + + + + Order - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Payment/Omnipay_Bridge.html b/docs/generated-docs/generated_docs/Development/Payment/Omnipay_Bridge.html new file mode 100644 index 0000000000..4c6a29dbf3 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Payment/Omnipay_Bridge.html @@ -0,0 +1,282 @@ + + + + + + + Omnipay Bridge - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Payum Ominpay Bridge

+

Here is a list of all available Omnipay Payment Providers.

+
+

As of now, Omnipay is not compatible with Symfony 3. They are already working on it, but will need some time to be finished. +But: You can use the dev-master Version Omnipay to add the Bridge

+
+

To add the Omnipay Bridge, do following:

+
$ composer require payum/omnipay-v3-bridge:dev-master
+
+

This will install the Bridge for you.

+

Now you still need to create your Gateway Configuration as described here.

+

Example of Omnipay Gateway Configuration

+

As example we add omnipay-worldpay:

+
+

Worldpay is currently in PR and I don't know when it is getting merged

+
+

1: add FormType for Worldpay Configuration:

+
<?php
+
+namespace AppBundle\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\PasswordType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Form\FormEvent;
+use Symfony\Component\Form\FormEvents;
+use Symfony\Component\Validator\Constraints\NotBlank;
+
+final class WorldpayType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->add('serviceKey', TextType::class, [
+                'constraints' => [
+                    new NotBlank([
+                        'groups' => 'coreshop',
+                    ]),
+                ],
+            ])
+            ->add('clientKey', PasswordType::class, [
+                'constraints' => [
+                    new NotBlank([
+                        'groups' => 'coreshop',
+                    ]),
+                ],
+            ])
+            ->add('merchantId', TextType::class, [
+                'constraints' => [
+                    new NotBlank([
+                        'groups' => 'coreshop',
+                    ]),
+                ],
+            ])
+            ->add('factory', TextType::class, [
+                'data' => 'omnipay',
+                'empty_data' => 'omnipay'
+            ])
+            ->add('type', TextType::class, [
+                'data' => 'WorldPay\\Json',
+                'empty_data' => 'WorldPay\\Json'
+            ])
+            ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
+                $data = $event->getData();
+
+                $data['payum.http_client'] = '@coreshop.payum.http_client';
+            })
+        ;
+    }
+}
+
+
+

Register into the container:

+
services:
+  app.form.type.gateway_configuration.worldpay:
+    class: AppBundle\Form\Type\WorldpayType
+    tags:
+      - { name: coreshop.gateway_configuration_type, type: omnipay_worldpay }
+      - { name: form.type }
+
+
+

Its important that it starts with omnipay_ here

+
+

2: Add ExtJs Form:

+
pimcore.registerNS('coreshop.provider.gateways.omnipay_worldpay');
+coreshop.provider.gateways.omnipay_worldpay = Class.create(coreshop.provider.gateways.abstract, {
+
+    getLayout: function (config) {
+        return [
+            {
+                xtype: 'textfield',
+                fieldLabel: t('coreshop_worldpay_service_key'),
+                name: 'gatewayConfig.config.serviceKey',
+                length: 255,
+                value: config.serviceKey ? config.serviceKey : ""
+            },
+            {
+                xtype: 'textfield',
+                fieldLabel: t('coreshop_worldpay_client_key'),
+                name: 'gatewayConfig.config.clientKey',
+                length: 255,
+                value: config.clientKey
+            },
+            {
+                xtype: 'textfield',
+                fieldLabel: t('coreshop_worldpay_merchant_id'),
+                name: 'gatewayConfig.config.merchantId',
+                length: 255,
+                value: config.merchantId
+            }
+        ];
+    }
+
+});
+
+

Register JS File for CoreShop to be loaded:

+
core_shop_payment:
+    pimcore_admin:
+      js:
+        worldpay: /bundles/app/pimcore/static/js/payment/provider/worldpay.js
+
+

Thats it, now you can create a new Payment Provider in the Backend and use Omnipay WorldPay as Payment Provider.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Payment/Payment_Provider.html b/docs/generated-docs/generated_docs/Development/Payment/Payment_Provider.html new file mode 100644 index 0000000000..77d5056d87 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Payment/Payment_Provider.html @@ -0,0 +1,261 @@ + + + + + + + Payment Provider - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Payment Providers

+

A Payment Provider represents a way that your customer pays during the checkout process. +It holds a reference to a specific gateway with custom configuration. +A gateway is configured for each payment method separately using the payment method form.

+

Payment Gateway configuration

+

Payment Gateways that already have a CoreShop bridge

+

First you need to create the configuration form type for your gateway. +Have a look at the configuration form types of Paypal and Sofort.

+

Then you should register its configuration form type with coreshop.gateway_configuration_type tag. +After that it will be available in the admin panel in the gateway choice dropdown.

+
+

If you are not sure how your configuration form type should look like, +head to Payum documentation.

+
+

Other Payment Gateways

+
+

Learn more about integrating payment gateways in the Payum docs.

+
+
+

You’ll probably need also this kind of configuration in your app/config/config.yml for the gateway’s factory:

+
payum:
+    gateways:
+       yourgateway:
+           factory: yourgateway
+
+
+

As an example, we add Sofort as a payment gateway factory. +To add a new gateway configuration you need to add 2 files:

+
    +
  • A new FormType for configuration values
  • +
  • A new Javascript File for ExtJs Form
  • +
+

1: Form Type for Configuration Values:

+

+namespace AppBundle\CoreShop\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Form\FormEvent;
+use Symfony\Component\Form\FormEvents;
+use Symfony\Component\Validator\Constraints\NotBlank;
+
+final class SofortGatewayConfigurationType extends AbstractType
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->add('config_key', TextType::class, [
+                'constraints' => [
+                    new NotBlank([
+                        'groups' => 'coreshop',
+                    ]),
+                ],
+            ])
+            ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
+                $data = $event->getData();
+
+                $data['payum.http_client'] = '@coreshop.payum.http_client';
+            })
+        ;
+    }
+}
+
+
+

Now we register the FormType into the container

+
services:
+  app.coreshop.form.type.gateway_configuration.sofort:
+    class: AppBundle\Form\Type\SofortGatewayConfigurationType
+    tags:
+      - { name: coreshop.gateway_configuration_type, type: sofort }
+      - { name: form.type }
+
+

2: Create the corresponding ExtJs Form:

+
+

You need to use the type attribute as identifier here

+
+
pimcore.registerNS('coreshop.provider.gateways.sofort');
+coreshop.provider.gateways.sofort = Class.create(coreshop.provider.gateways.abstract, {
+
+    getLayout: function (config) {
+        return [
+            {
+                xtype: 'textfield',
+                fieldLabel: t('config_key'),
+                name: 'gatewayConfig.config.config_key',
+                length: 255,
+                value: config.config_key ? config.config_key : ""
+            }
+        ];
+    }
+
+});
+
+
+

Next we need to register our new Gateway JS file to be loaded:

+
core_shop_payment:
+    pimcore_admin:
+        js:
+            sofort_gateway: '/bundles/app/pimcore/js/sofort.js'
+
+

Thats it, now after reloading Pimcore, you'll see a new Factory.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Payment/Payum_Providers.html b/docs/generated-docs/generated_docs/Development/Payment/Payum_Providers.html new file mode 100644 index 0000000000..73d264db7f --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Payment/Payum_Providers.html @@ -0,0 +1,158 @@ + + + + + + + Payum Providers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Payment/index.html b/docs/generated-docs/generated_docs/Development/Payment/index.html new file mode 100644 index 0000000000..946188e89e --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Payment/index.html @@ -0,0 +1,246 @@ + + + + + + + Payment - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Payment

+

CoreShop contains a very flexible payments management system with support for many gateways (payment providers). +We are using a payment abstraction library - Payum, +which handles all sorts of capturing, refunding and recurring payments logic.

+

On CoreShop side, we integrate it into our checkout and manage all the payment data.

+

Available Payment Gateways for CoreShop

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameStateLinkSupportOffsiteSupports Server-NotificationSupports Refund
HeidelpaystableGithubPayPal, Klarna Sofort, Credit CardNoYesNo
SaferPaystableGithubSupported Payment MethodsYesYesPartially
PostFinancestableGithubPostFinance Card, PostFinance E-Finance, Visa, MasterCard, Diners Club, American Express, JCB, PayPal, TWINTYesYesNo
PowerPaydevGithubinvoice, automatic credit checkNoNo (not required)No
CuraBilldevGithubinvoice, instalments via iframeNoNo (not required)No
+

Payment

+

Every payment in CoreShop, successful or failed, is represented by the payment model, +which contains basic information and a reference to appropriate order.

+

Create a Payment programmatically

+

As usually, use a factory to create a new PaymentMethod and give it a unique code.

+
$payment = $this->container->get('coreshop.factory.payment')->createNew();
+
+$payment->setOrder($order);
+$payment->setCurrencyCode('EUR');
+
+$this->container->get('coreshop.repository.payment')->add($payment);
+
+

More

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Products/CRUD.html b/docs/generated-docs/generated_docs/Development/Products/CRUD.html new file mode 100644 index 0000000000..c2c9bf984d --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Products/CRUD.html @@ -0,0 +1,203 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product

+

CoreShop uses Pimcore Data Objects to persist Product Information. But, it adds a little wrapper around it to be more +dynamic and configurable. It uses a Factory and Repository Pattern to do that.

+

Create

+

If you want to create a new Product, we need to get our Factory Service for that:

+
$productFactory = $container->get('coreshop.factory.product');
+$product = $productFactory->createNew();
+
+

No we have our product and we can set all needed values.

+

If you now want to save it, just call the save function

+
$product->save();
+
+

Read

+

To get products, you need to use the Repository Service CoreShop provides you.

+
$repository = $container->get('coreshop.repository.product');
+
+
+// Query by ID
+$productWithIdOne = $repository->findById(1);
+
+// Get a Listing how you know it from Pimcore
+$list = $repository->getList();
+$list->setCondition("active = 1");
+$products = $list->getObjects();
+
+
+

Update

+

Update works the same as you are used to in Pimcore

+
$repository = $container->get('coreshop.repository.product');
+
+
+// Query by ID
+$productWithIdOne = $repository->findById(1);
+
+// Change values
+$productWithIdOne->setName('test');
+$productWithIdOne->save();
+
+

Delete

+

Delete works the same as you are used to in Pimcore

+
$repository = $container->get('coreshop.repository.product');
+
+
+// Query by ID
+$productWithIdOne = $repository->findById(1);
+$productWithIdOne->delete();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Products/Configuration.html b/docs/generated-docs/generated_docs/Development/Products/Configuration.html new file mode 100644 index 0000000000..fcbf139d1c --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Products/Configuration.html @@ -0,0 +1,169 @@ + + + + + + + Configuration - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Configuration

+
core_shop_product:
+    pimcore:
+        product:
+            path: coreshop/products
+            classes:
+                repository: CoreShop\Bundle\CoreBundle\Pimcore\Repository\ProductRepository
+                install_file: '@CoreShopCoreBundle/Resources/install/pimcore/classes/CoreShopProductBundle/CoreShopProduct.json'
+                model: Pimcore\Model\DataObject\CoreShopProduct
+                interface: CoreShop\Component\Product\Model\ProductInterface
+                factory: CoreShop\Component\Resource\Factory\PimcoreFactory
+                type: object
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Products/Multiple_Product_DataObjects.html b/docs/generated-docs/generated_docs/Development/Products/Multiple_Product_DataObjects.html new file mode 100644 index 0000000000..44761dac9a --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Products/Multiple_Product_DataObjects.html @@ -0,0 +1,295 @@ + + + + + + + Multiple Product DataObjects - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Multiple Product DataObjects

+

CoreShop comes with one pre-installed Product Class (CoreShopProduct), which in most cases is enough. In some cases, you might want to use separated classes with different purposes. For example a ProductSet, which consists of multiple Products but also needs to be available for complex price calculations like Price Rules.

+

First of all, we need to create a new DataObject Class in Pimcore. A basic Purchasable Product only needs to implement \CoreShop\Component\Order\Model\PurchasableInterface but since we want to allow complex price calculation, we need to implement CoreShop\Component\Core\Model\ProductInterface.

+
+

Note +If your Product is very simple and you do not need complex price calculations +you then only need to implement \CoreShop\Component\Order\Model\PurchasableInterface

+
+

Easiest way to create the new class is:

+
    +
  • +1: Open Pimcore DataObject Editor
  • +
  • +2: Add a new Class called ProductSet
  • +
  • +3: Import CoreShop Default Product Class (CoreShopProduct.json)
  • +
  • +4: Adapt to your needs
  • +
  • +5: Register your ProductSet Class to CoreShop:
  • +
+
<?php
+
+//src/AppBundle/DependencyInjection/Configuration.php
+
+namespace AppBundle\DependencyInjection;
+
+use CoreShop\Bundle\ProductBundle\Pimcore\Repository\ProductRepository;
+use CoreShop\Bundle\ResourceBundle\CoreShopResourceBundle;
+use CoreShop\Component\Product\Model\ProductInterface;
+use CoreShop\Component\Resource\Factory\PimcoreFactory;
+use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
+use Symfony\Component\Config\Definition\Builder\TreeBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+final class Configuration implements ConfigurationInterface
+{
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('app');
+
+        $rootNode
+            ->children()
+                ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end()
+            ->end()
+        ;
+
+        $this->addModelsSection($rootNode);
+
+        return $treeBuilder;
+    }
+
+    //Add your configuration here
+    private function addModelsSection(ArrayNodeDefinition $node)
+    {
+        $node
+            ->children()
+                ->arrayNode('pimcore')
+                    ->addDefaultsIfNotSet()
+                    ->children()
+                        ->arrayNode('product_set')
+                            ->addDefaultsIfNotSet()
+                            ->children()
+                                ->variableNode('options')->end()
+                                ->scalarNode('path')->defaultValue('products')->end()
+                                ->arrayNode('classes')
+                                    ->addDefaultsIfNotSet()
+                                    ->children()
+                                        ->scalarNode('model')->defaultValue('Pimcore\Model\DataObject\ProductSet')->cannotBeEmpty()->end()
+                                        ->scalarNode('interface')->defaultValue(ProductInterface::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('factory')->defaultValue(PimcoreFactory::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('repository')->defaultValue(ProductRepository::class)->cannotBeEmpty()->end()
+                                        ->scalarNode('install_file')->defaultValue('@CoreShopProductBundle/Resources/install/pimcore/classes/CoreShopProduct.json')->end()
+                                        ->scalarNode('type')->defaultValue(CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT)->cannotBeOverwritten(true)->end()
+                                    ->end()
+                                ->end()
+                            ->end()
+                        ->end()
+                    ->end()
+                ->end()
+            ->end()
+        ;
+    }
+}
+
+
<?php
+
+//src/AppBundle/DependencyInjection/AppExtension.php
+
+namespace AppBundle\DependencyInjection;
+
+use CoreShop\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractModelExtension;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
+
+class AppExtension extends AbstractModelExtension
+{
+    public function load(array $config, ContainerBuilder $container)
+    {
+        $config = $this->processConfiguration($this->getConfiguration([], $container), $config);
+        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
+
+        //Register the model to the container
+        $this->registerPimcoreModels('app', $config['pimcore'], $container);
+
+        //Alternative you can do it manually like:
+
+        $this->registerPimcoreModels('app', [
+            'product_set' => [
+                'path' => '/product-sets',
+                'classes' => [
+                    'model' => 'Pimcore\Model\DataObject\ProductSet',
+                    'interface' => ProductInterface::class,
+                    'factory' => PimcoreFactory::class,
+                    'type' => CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT
+                ]
+            ]
+        ], $container);
+
+        $loader->load('services.yml');
+    }
+}
+
+
    +
  • +6: You can now use the new ObjectClass as you wish, CoreShop automatically recognises it as ProductClass and your are allowed to use it in PriceRules.
  • +
+
+

Note: +For the Class to be allowed as href/multihref in Pimcore, you need to adapt following classes as well:

+
    +
  • CoreShopCartItem
  • +
  • CoreShopOrderItem
  • +
  • CoreShopQuoteItem
  • +
+

Check for the product field and add your new ProductSet there as allowed references.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Products/Price_Calculation.html b/docs/generated-docs/generated_docs/Development/Products/Price_Calculation.html new file mode 100644 index 0000000000..4b3935e9ae --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Products/Price_Calculation.html @@ -0,0 +1,255 @@ + + + + + + + Price Calculation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Price Calculation

+

CoreShop uses multiple Price Calculators to determine the correct price for a product. Per default following Calculators are used

+ +

These two are only the default implementations, if you need a custom Calculator, you need to implement the Interface

+

CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface and register your service with the tag +coreshop.product.price_calculator, a type attribute and a priority

+

What prices does CoreShop calculate?

+

CoreShop Price Calculation consists of 3 different prices:

+
    +
  • +Retail Price: Base Price without any discounts
  • +
  • +Discount Price: Special Price for promotions. Needs to return a price smaller than retail price, otherwise retail price is valid
  • +
  • +Discount: Discount from promotions
  • +
  • +Price: Retail Price or Discount Price (if available) minus discount rules
  • +
+

The default is always to use store values prices.

+

Calculator Service

+

If you want to calculate the Price for a Product, you need to use a special service to do that. There are two options:

+

1: coreshop.product.price_calculator which calculates prices without any tax regards.

+

2: coreshop.product.taxed_price_calculator which calculates prices with tax or without. (recommended one to use)

+

Templating

+

If you want to calculate the price within a Template, you can do so by using the filter coreshop_product_price

+
+
{{ (product|coreshop_product_price(true)) }}
+
+

Custom Price Calculator Example

+

Our Example Service will take the Property "price" - 1 as Product Price and -1 as Discount, therefore the price stays the same. +This example is only a show-case of how to add a new calculator.

+
+

CoreShop Price calculation always depends on a context. The context per default consists of following values:

+
    +
  • Store
  • +
  • Country
  • +
  • Currency
  • +
  • Customer (if logged in)
  • +
  • Cart
  • +
+
+
<?php
+
+namespace AppBundle\CoreShop\Product;
+
+use CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface;
+use CoreShop\Component\Product\Model\ProductInterface;
+
+final class CustomPriceCalculator implements ProductPriceCalculatorInterface
+{
+    /**
+     * Used to determine a retail price
+     */
+    public function getPrice(ProductInterface $subject, array $context, bool $withDiscount = true): int
+    {
+        $price = $this->getRetailPrice($subject, $context);
+
+        return $withDiscount ? $this->getDiscount($subject, $price) : $price;
+    }
+
+    /**
+     * Used to determine a retail price
+     */
+    public function getRetailPrice(ProductInterface $subject, array $context): int
+    {
+        return $subject->getStorePrice($context['store']);
+    }
+
+    /**
+     * Used to determine a discount
+     */
+    public function getDiscount(ProductInterface $subject, array $context, int $price): int
+    {
+        return 0;
+    }
+
+    /**
+     * Used to determine a discounted price
+     */
+    public function getDiscountPrice(ProductInterface $subject, array $context): int
+    {
+        return 0;
+    }
+}
+
+

Now we need to register our service to the container and add the calculator tag:

+
app.coreshop.product.price_calculator.custom:
+    class: AppBundle\CoreShop\Product\CustomPriceCalculator
+    tags:
+      - { name: coreshop.product.price_calculator, type: custom, priority: 1 }
+
+

CoreShop now uses our service for all Product Price Calculations.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Products/Price_Rules/index.html b/docs/generated-docs/generated_docs/Development/Products/Price_Rules/index.html new file mode 100644 index 0000000000..51e94ad842 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Products/Price_Rules/index.html @@ -0,0 +1,202 @@ + + + + + + + Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Price Rules

+

CoreShop gives you the ability of very complex price calculation methods. +Price Rules always consist of Conditions and Actions.

+

Price Rule Types

+

Product Price Rules

+
+

Checkout all available product price rules here

+
+

Product price rules are applied to multiple products based on conditions like category or manufacturer.

+

Specific Price Rules

+
+

Checkout all available specific price rules here

+
+

Specific price rules are applied to a single product based on conditions like customer or customer group.

+

Quantity Price Rules

+
+

Checkout all available quantity price rules here

+
+

Quantity price rules are applied to a single product based on conditions like the quantity of a cart item.

+

These rules apply only in the calculation of cart item prices. If you have only quantity rules configured, +the default price calculation of CoreShop will return zero outside of cart context.

+

Extending Conditions and Actions

+ +

Template Helper

+

Get Formatted Price with all applied Rules

+
{% import '@CoreShopFrontend/Common/Macro/currency.html.twig' as currency %}
+{% import '@CoreShopFrontend/Common/Macro/product_price.html.twig' as product_price %}
+
+<div class="price">
+    <span class="price-head">{{ 'coreshop.ui.price'|trans }}:</span>
+    {{ product_price.display_product_price(product) }}
+</div>
+<div class="tax">
+    {{ 'coreshop_product_tax_inc'|trans|format(product|coreshop_product_tax_rate) }} ({{ currency.convertAndFormat(product|coreshop_product_tax_amount) }})
+</div>
+
+

Get Active Price Rules

+
{{ dump(product|coreshop_product_price_rules) }}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Products/Unit_Definitions.html b/docs/generated-docs/generated_docs/Development/Products/Unit_Definitions.html new file mode 100644 index 0000000000..0f43addb81 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Products/Unit_Definitions.html @@ -0,0 +1,211 @@ + + + + + + + Unit Definitions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Unit Definitions

+

CoreShop has a great new feature for product units. E.g. you can sell items "per meter" etc.

+

First, add some product units in Pimcore > CoreShop > Product > Product Units. Click "Add" and fill all the fields.

+

Then you can add product-units directly in the product-objects inside Pimcore (take a look at the "Price"-tab). There, you can also add multiple product units (eg: 1 box contains of 12 items - CoreShop will show you different order-possibilities in the add-to-cart section in the webshop)

+

Using the API for product units:

+

Create Default UnitDefinition

+

If you want to create a new Product, we need to get our Factory Service for that:

+
/** @var DataObject\CoreShopProduct $product */
+$product = DataObject::getById(1);
+
+$unitRepository = $container->get('coreshop.repository.product_unit');
+
+/** @var ProductUnitDefinitionInterface $defaultUnitDefinition */
+$defaultUnitDefinition = $container->get('coreshop.factory.product_unit_definition')->createNew();
+$defaultUnitDefinition->setUnit($unitRepository->findByName('Kubikmeter'));
+
+/** @var ProductUnitDefinitionsInterface $unitDefinitions */
+$unitDefinitions = $container->get('coreshop.factory.product_unit_definitions')->createNew();
+
+$unitDefinitions->setDefaultUnitDefinition($defaultUnitDefinition);
+$unitDefinitions->setProduct($product);
+
+$product->setUnitDefinitions($unitDefinitions);
+
+$product->save();
+
+

Update Default UnitDefinition

+
/** @var DataObject\CoreShopProduct $product */
+$product = DataObject::getById(1);
+
+$unitRepository = $container->get('coreshop.repository.product_unit');
+
+$defaultUnitDefinition = $product->getUnitDefinitions()->getDefaultUnitDefinition();
+$defaultUnitDefinition->setUnit($unitRepository->findByName('Liter'));
+
+$unitDefinitionsRepository = $container->get('coreshop.repository.product_unit_definitions');
+
+/** @var ProductUnitDefinitions $unitDefinitions */
+$unitDefinitions = $unitDefinitionsRepository->findOneForProduct($product);
+$unitDefinitions->setDefaultUnitDefinition($defaultUnitDefinition);
+
+$product->setUnitDefinitions($unitDefinitions);
+
+$product->save();
+
+

Delete UnitDefinition

+

Deleting a UnitDefiniton from a product is done by finding the UnitDefinitions for the product in the product_unit_definitions repository and then deleting it.

+
/** @var DataObject\CoreShopProduct $product */
+$product = DataObject::getById(1);
+
+$unitDefinitionsRepository = $container->get('coreshop.repository.product_unit_definitions');
+$item = $unitDefinitionsRepository->findOneForProduct($product);
+
+$unitDefinitionsRepository->remove($item);
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Products/Units.html b/docs/generated-docs/generated_docs/Development/Products/Units.html new file mode 100644 index 0000000000..323c2fa907 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Products/Units.html @@ -0,0 +1,185 @@ + + + + + + + Units - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Units

+

Units for Products can be defined globally in the Pimcore Backend on CoreShopMenu > Product > Product Units.

+

Each Product can have different units. Also each product/unit relation can have an own precision that differs to other relations. To archive that, the relation between products and units consists of three objects:

+
    +
  • ProductUnit
  • +
  • ProductUnitDefinition
  • +
  • ProductUnitDefinitions
  • +
+

As already said, the ProductUnit can be created in Pimcore Backend and consists mainly of the key for unit like PCS, CNT etc. and some localized fields for rendering in frontend.

+

To connect a ProductUnit to a CoreShopProduct in Backend you need to get the ProductUnit via repository and create a ProductUnitDefinition.

+
use CoreShop\Component\Product\Model\Product;
+use CoreShop\Component\Product\Model\ProductUnitInterface;
+use CoreShop\Component\Product\Model\ProductUnitDefinition;
+
+$product = Product::getById(1);
+
+/** @var ProductUnitInterface $unit */
+$unit = $this->unitRepository->findOneBy(['name' => '']);
+
+$unitDefinition = new ProductUnitDefinition();
+$unitDefinition->setConversionRate(1.0); // optional
+$unitDefinition->setPrecision(0);        // optional
+$unitDefinition->setUnit($unit);
+
+$product->getUnitDefinitions()->setDefaultUnitDefinition($unitDefinition);
+$product->save();
+
+

To add multiple units for a product use $product->addUnitDefinition($unitDefinition).

+

To change a unit override the default one $product->getUnitDefinitions()->getDefaultUnitDefinition()->setUnit($otherUnit).

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Products/index.html b/docs/generated-docs/generated_docs/Development/Products/index.html new file mode 100644 index 0000000000..58bb816fa7 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Products/index.html @@ -0,0 +1,181 @@ + + + + + + + Products - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/SEO/index.html b/docs/generated-docs/generated_docs/Development/SEO/index.html new file mode 100644 index 0000000000..1ee6434002 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/SEO/index.html @@ -0,0 +1,162 @@ + + + + + + + SEO - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Shipping/Carrier/CRUD.html b/docs/generated-docs/generated_docs/Development/Shipping/Carrier/CRUD.html new file mode 100644 index 0000000000..1a0ece41b7 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Shipping/Carrier/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Carrier

+

Create

+

If you want to create a Carrier via API, you can do following:

+
$newCarrier = $container->get('coreshop.factory.carrier')->createNew();
+
+

Now you have a new Carrier, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.carrier')->persist($newCarrier);
+$container->get('coreshop.manager.carrier')->flush();
+
+

You now have a new persisted Carrier.

+

Read

+

If you want to query for Carriers, you can do following:

+
$carrierRepository = $container->get('coreshop.repository.carrier');
+
+$queryBuilder = $carrierRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$carriers = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Carrier, you need to do following:

+
// Fetch Carrier
+
+$carrier = $carrierRepository->findById(1);
+$carrier->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.carrier')->persist($carrier);
+$container->get('coreshop.manager.carrier')->flush();
+
+

Delete

+

If you want to update and existing Carrier, you need to do following:

+
// Fetch Carrier
+
+$carrier = $carrierRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.carrier')->remove($carrier);
+$container->get('coreshop.manager.carrier')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Shipping/Carrier/Carrier_Discovery.html b/docs/generated-docs/generated_docs/Development/Shipping/Carrier/Carrier_Discovery.html new file mode 100644 index 0000000000..bbf3fadade --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Shipping/Carrier/Carrier_Discovery.html @@ -0,0 +1,159 @@ + + + + + + + Carrier Discovery - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Carrier Discovery

+

CoreShop uses a Service to discover available Carriers for a given Shippable. These Service implements the Interface CoreShop\Bundle\ShippingBundle\Discover\ShippableCarriersDiscoveryInterface. +The Interface is implemented by Service with ID coreshop.carrier.discovery

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Shipping/Carrier/Price_Calculation.html b/docs/generated-docs/generated_docs/Development/Shipping/Carrier/Price_Calculation.html new file mode 100644 index 0000000000..f847d07e36 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Shipping/Carrier/Price_Calculation.html @@ -0,0 +1,162 @@ + + + + + + + Price Calculation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Carrier Price Calculation

+

CoreShop Shipping/Carrier Calculation uses multiple Calculation methods to calculate the price for a given Carrier on a given +Cart. A Calculator needs to implement the Interface CoreShop\Component\Shipping\Calculator\CarrierPriceCalculatorInterface +and registered to the container using the tag coreshop.shipping.price_calculator, a type attribute and a priority

+

Default Implementation

+

The Default Implementation calculates the Price based on Shipping Rules.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Shipping/Carrier/index.html b/docs/generated-docs/generated_docs/Development/Shipping/Carrier/index.html new file mode 100644 index 0000000000..81e573cb7d --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Shipping/Carrier/index.html @@ -0,0 +1,169 @@ + + + + + + + Carrier - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Shipping/Shipping_Rules/index.html b/docs/generated-docs/generated_docs/Development/Shipping/Shipping_Rules/index.html new file mode 100644 index 0000000000..2a04d42804 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Shipping/Shipping_Rules/index.html @@ -0,0 +1,194 @@ + + + + + + + Shipping Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Shipping Rules

+

Default Conditions and Actions

+

CoreShop comes with a set of default action and condition implementations:

+

Default Conditions

+
    +
  • Currencies
  • +
  • Customer Groups
  • +
  • Customers
  • +
  • Stores
  • +
  • Zones
  • +
  • Amount
  • +
  • Categories
  • +
  • Countries
  • +
  • Dimension
  • +
  • Post Codes
  • +
  • Products
  • +
  • Shipping Rule
  • +
  • Weight
  • +
  • Nested
  • +
+

Default Actions

+
    +
  • Addition Amount
  • +
  • Addition Percent
  • +
  • Discount Amount
  • +
  • Discount Percent
  • +
  • Price
  • +
  • Shipping Rule
  • +
+

Extending Conditions and Actions

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Shipping/index.html b/docs/generated-docs/generated_docs/Development/Shipping/index.html new file mode 100644 index 0000000000..d1b1776fd9 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Shipping/index.html @@ -0,0 +1,166 @@ + + + + + + + Shipping - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/State_Machine/Available_Workflows.html b/docs/generated-docs/generated_docs/Development/State_Machine/Available_Workflows.html new file mode 100644 index 0000000000..09bafdcf0d --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/State_Machine/Available_Workflows.html @@ -0,0 +1,635 @@ + + + + + + + Available Workflows - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop State Machine - Available Workflows

+

Order Sale Workflow

+

In CoreShop 3.x the Cart, Order and Quote are the same DataObject. To differentiate between them, we use states with workflows.

+

State Machine: coreshop_order_sales_type

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
cartInitial State - Cart
orderOnce the customer finishes the checkout, pre-payment, it becomes an order
quoteOnce the customer finishes the checkout and requests a quote
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
ordercart
cartcart
quotecart
+

Order Workflow

+

State Machine: coreshop_order +Description: The Order Workflow is the most simplest and also the most important one.

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
initializedInitial State. Just before a order gets saved for the very first time.
newa new order has been created
confirmedcustomer has successfully placed an order
cancelledorder has been cancelled
completethe order is complete (all payments and shipments have been successfully processed)
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
createinitialized
confirmnew
cancelnew, confirmed
completeconfirmed
+

Visualization

+

coreshop_order Workflow Visualization

+

Order Payment Workflow

+

State Machine: coreshop_order_payment +Description: Defines the summary payment state

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
neworder has been initial created
awaiting_paymenta payment has been captured
partially_paidone of the order payments has been paid
cancelledall payments has been cancelled
paidall order payments successfully paid
partially_refundedone of the order payments has been refunded
refundedall payments has been refunded
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
request_paymentnew
partially_payawaiting_payment, partially_paid
cancelawaiting_payment
partially_refundpaid, partially_paid, partially_refunded
refundpaid, partially_paid, partially_refunded
+

Visualization

+

coreshop_order_payment Workflow Visualization

+

Order Shipment Workflow

+

State Machine: coreshop_order_shipment +Description: Defines the summary shipment state

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
neworder has been initial created
cancelledall shipments has been cancelled
partially_shippedone of the order shipments has been shipped
shippedall order shipments has been shipped
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
partially_shipnew
cancelnew
shipnew, partially_shipped
+

Visualization

+

coreshop_order_shipment Workflow Visualization

+

Order Invoice Workflow

+

State Machine: coreshop_order_invoice +Description: Defines the summary invoice state

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
neworder has been initial created
cancelledall invoices has been cancelled
partially_invoicedone of the order invoices has been invoiced
invoicedall order invoices has been successfully invoiced
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
cancelnew
partially_invoicenew
invoicenew, partially_invoiced
+

Visualization

+

coreshop_order_invoice Workflow Visualization

+

Payment Workflow

+

State Machine: coreshop_payment +Description: Defines the single payment state

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newnew payment has been created
processingpayment has been captured
completedpayment is complete
failedpayment has failed
cancelledpayment has been canceled
refundedpayment has been refunded
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
processnew
completenew, processing
failnew, processing
cancelnew, processing
refundcompleted
+

Visualization

+

coreshop_payment Workflow Visualization

+

Shipment Workflow

+

State Machine: coreshop_shipment +Description: Defines the single shipment state

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newnew shipment has been created
readyshipment has been assigned to order
cancelledshipment has been cancelled
shippedshipment has been shipped
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
createnew
shipready
cancelready
+

Visualization

+

coreshop_shipment Workflow Visualization

+

Invoice Workflow

+

State Machine: coreshop_invoice +Description: Defines the single invoice state

+

Available Places

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newnew invoice has been created
readyinvoice has been assigned to order
cancelledinvoice has been cancelled
completeinvoice has been completed
+

Available Transition

+ + + + + + + + + + + + + + + + + + + + + +
NameAllowed from Places
createnew
cancelready
completeready
+

Visualization

+

coreshop_invoice Workflow Visualization

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/State_Machine/Create_Callbacks.html b/docs/generated-docs/generated_docs/Development/State_Machine/Create_Callbacks.html new file mode 100644 index 0000000000..9ecce52d45 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/State_Machine/Create_Callbacks.html @@ -0,0 +1,282 @@ + + + + + + + Create Callbacks - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop State Machine - Callbacks

+

It's really simple to create a custom state machine callback.

+

After Callbacks

+

In this example we want to register a simple listener which gets triggered after a customer successfully placed a order:

+
core_shop_workflow:
+    state_machine:
+        coreshop_order:
+            callbacks:
+                after:
+                    do_something_special:
+                        on: ['confirm']
+                        do: ['@AppBundle\EventListener\SpecialListener', 'doSomething']
+                        args: ['object']
+                        priority: -10 # fire action early!
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
ontransition name
doservice and method to dispatch
argsobject or event. Object type depends on state machine type.
priorityset priority. default is 0
+

And your Service:

+
<?php
+
+namespace AppBundle\EventListener;
+
+use CoreShop\Component\Core\Model\CustomerInterface;
+use CoreShop\Component\Core\Model\OrderInterface;
+
+final class SpecialListener
+{
+    /**
+     * @param OrderInterface $order
+     */
+    public function doSomething(OrderInterface $order)
+    {
+        /** @var CustomerInterface $customer */
+        $customer = $order->getCustomer();
+
+        /** @var string $locale */
+        $locale = $order->getLocaleCode();
+
+        // your very special code.
+    }
+}
+
+

Before Callbacks

+

In this example we want to register a simple listener which gets triggered before a the shipment transaction ready gets applied:

+
core_shop_workflow:
+    state_machine:
+        coreshop_shipment:
+            callbacks:
+                before:
+                    check_something:
+                        on: ['create']
+                        do: ['@AppBundle\EventListener\SpecialListener', 'checkSomething']
+                        args: ['object']
+                        priority: 0
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
ontransition name
doservice and method to dispatch
argsobject or event. Object type depends on state machine type.
priorityset priority. default is 0
+

As you can see in the class below, the checkSomething() method throws an exception. +This prevents the state machine from switching to the ready state. +Just remove the exception and the transition gets applied as expected.

+
<?php
+
+namespace AppBundle\EventListener;
+
+use CoreShop\Component\Core\Model\OrderShipmentInterface;
+
+final class SpecialListener
+{
+    /**
+     * @param OrderShipmentInterface $shipment
+     */
+    public function checkSomething(OrderShipmentInterface $shipment)
+    {
+        // check something and throw an exeption
+        throw new \Exception('something is wrong...');
+    }
+}
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/State_Machine/Extend_Workflows.html b/docs/generated-docs/generated_docs/Development/State_Machine/Extend_Workflows.html new file mode 100644 index 0000000000..e47559e3ce --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/State_Machine/Extend_Workflows.html @@ -0,0 +1,262 @@ + + + + + + + Extend Workflows - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop State Machine - Extend Workflows

+

It's possible to extend all available CoreShop Workflow.

+

Example A: Extend Shipment Workflow

+

Workflow Configuration

+
core_shop_workflow:
+    state_machine:
+        coreshop_shipment:
+            # define a new place "reviewed"
+            places:
+                - reviewed
+            # define a new transition "review"
+            transitions:
+                review:
+                    from: [new, ready]
+                    to: reviewed
+            # add some colors for better ux
+            place_colors:
+                reviewed: '#2f819e'
+            transition_colors:
+                review: '#2f819e'
+
+

Add translations

+

Just use the Pimcore Backend/Frontend translation or just add it via default symfony translation context:

+
# app/Resources/translations/admin.en.yml
+coreshop_workflow_transition_coreshop_shipment_review: 'Review'
+coreshop_workflow_state_coreshop_shipment_reviewed: 'Reviewed'
+
+# app/Resources/translations/messages.en.yml
+coreshop.ui.workflow.state.coreshop_shipment.reviewed: 'Shipment under Review'
+
+

Inform CoreShop about new Transition of Shipment Workflow

+

Not all transitions should be available in backend. +To allow the transition to show up, you need to implement a simple event listener:

+
# app/config/services
+AppBundle\EventListener\WorkflowListener:
+    autowire: true
+    tags:
+        - { name: kernel.event_listener, event: coreshop.workflow.valid_transitions, method: parseTransitions}
+
+
<?php
+
+namespace AppBundle\EventListener;
+
+use CoreShop\Bundle\OrderBundle\Event\WorkflowTransitionEvent;
+
+class WorkflowListener
+{
+    public function parseTransitions(WorkflowTransitionEvent $event)
+    {
+        $workflowName = $event->getWorkflowName();
+        if($workflowName === 'coreshop_shipment') {
+            $event->addAllowedTransitions(['review']);
+        }
+    }
+}
+
+

Example B: Change default Transition Behaviour of Shipment Workflow

+
+

Note: Be careful while changing transitions. Test your application if a workflow still runs smoothly after changing it!

+
+

In this example we want to change the default shipping behavior.

+

Workflow before:

+

ready -> shipped -> cancelled

+

Workflow after:

+

ready -> reviewed -> shipped -> cancelled

+

Workflow Configuration

+
core_shop_workflow:
+    state_machine:
+        coreshop_shipment:
+            # define a new place "reviewed"
+            places:
+                - reviewed
+            # define a new transition "review"
+            transitions:
+                review:
+                    from: [ready]
+                    to: reviewed
+                # override the default "ship" transition
+                # which only allows [ready] as valid "from" dispatcher
+                ship:
+                    from: [reviewed]
+                    to: shipped
+            # add some colors for better ux
+            place_colors:
+                reviewed: '#2f819e'
+            transition_colors:
+                review: '#2f819e'
+
+

Example C: Callback Listener

+

If you need to implement some further business logic after the coreshop_shipment state has changed to reviewed +you need to define a callback:

+
+

Note: Please make sure your service is public available!

+
+
core_shop_workflow:
+    state_machine:
+        coreshop_shipment:
+            callbacks:
+                after:
+                    do_something_after_review:
+                        on: ['review']
+                        do: ['@your_service', 'yourAction']
+                        # in this context, "object" is the shipment item
+                        args: ['object']
+                        priority: -10 # fire action early!
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/State_Machine/Things_To_Know.html b/docs/generated-docs/generated_docs/Development/State_Machine/Things_To_Know.html new file mode 100644 index 0000000000..c65adea4b1 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/State_Machine/Things_To_Know.html @@ -0,0 +1,180 @@ + + + + + + + Things To Know - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop State Machine - Important Things to Know

+

Canceling Orders

+

Within the CoreShop workflow architecture a lot of orders may stay forever in the new or confirmed state. +CoreShop will automatically cancel orders older than 20 days under following conditions:

+
    +
  • Order creationDate >= 20 days ago
  • +
  • Order State is initialized or new or confirmed +
  • +
  • Order Payment State is not paid +
  • +
+

Read more about automation here.

+

Expire Orders via Backend

+

There is also a cancel button in the order detail section.

+

Expire Orders via Command

+

There is also a command for that:

+
$ coreshop:order:expire
+
+

Change Orders Expiration Date

+
core_shop_order:
+    expiration:
+        order:
+            days: 30
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/State_Machine/index.html b/docs/generated-docs/generated_docs/Development/State_Machine/index.html new file mode 100644 index 0000000000..22ede6341f --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/State_Machine/index.html @@ -0,0 +1,212 @@ + + + + + + + State Machine - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop State Machine

+

The CoreShop State Machine is a important core feature which allows to determinate complex workflows securely and in a most modern way. +Unlike the most eCommerce Frameworks out there, CoreShop does not work with the messy and hard do extend "state/status" concept. +Every order-section and of course the order itself provides its own state machine which allows us to build a super strong state workflow.

+

Places

+

In State Machine context, the well-known "Status" Property is called "Places". +Every Workflow comes with a pre-defined set of Places.

+

Transition

+

To change the Place of a workflow we need to apply a transition. +If the transition is valid the new place gets stored.

+

Callbacks

+

There are several events for each transition which can be also extend by every project. +Example:: If all order payments has been successfully transformed to the completed place, +the coreshop_order_payment workflow will automatically change to paid.

+

Workflows

+

There are seven implemented Workflows:

+
    +
  • +coreshop_order +
  • +
  • +coreshop_order_payment +
  • +
  • +coreshop_order_shipment +
  • +
  • +coreshop_order_invoice +
  • +
  • +coreshop_payment +
  • +
  • +coreshop_shipment +
  • +
  • +coreshop_invoice +
  • +
+

Workflows are connected among themselves so every transition will trigger another Workflow and so on. +If a transition has been dispatched, it cannot be transformed back unless it has been defined in the available transitions.

+

So let's start:

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Store_Front/Controllers.html b/docs/generated-docs/generated_docs/Development/Store_Front/Controllers.html new file mode 100644 index 0000000000..d352e765d5 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Store_Front/Controllers.html @@ -0,0 +1,198 @@ + + + + + + + Controllers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Store Front Controller

+

If you use CoreShop FrontendBundle, you can change the Controllers it uses. Simply change the configuration for the controller:

+
core_shop_frontend:
+    controllers:
+        index: CoreShop\Bundle\FrontendBundle\Controller\IndexController
+        register: CoreShop\Bundle\FrontendBundle\Controller\RegisterController
+        customer: CoreShop\Bundle\FrontendBundle\Controller\CustomerController
+        currency: CoreShop\Bundle\FrontendBundle\Controller\CurrencyController
+        language: CoreShop\Bundle\FrontendBundle\Controller\LanguageController
+        search: CoreShop\Bundle\FrontendBundle\Controller\SearchController
+        cart: CoreShop\Bundle\FrontendBundle\Controller\CartController
+        checkout: CoreShop\Bundle\FrontendBundle\Controller\CheckoutController
+        category: CoreShop\Bundle\FrontendBundle\Controller\CategoryController
+        product: CoreShop\Bundle\FrontendBundle\Controller\ProductController
+        quote: CoreShop\Bundle\FrontendBundle\Controller\QuoteController
+        security: CoreShop\Bundle\FrontendBundle\Controller\SecurityController
+        payment: CoreShop\Bundle\PayumBundle\Controller\PaymentController
+
+

Example of using a Custom ProductController

+

1: Add a new Controller and inherit from the FrontendController

+
<?php
+
+namespace AppBundle\Controller;
+
+use CoreShop\Component\Core\Model\ProductInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+class ProductController extends \CoreShop\Bundle\FrontendBundle\Controller\ProductController
+{
+    public function detailAction(Request $request)
+    {
+        //Do whatever you want in here
+
+        return parent::detailAction($request);
+    }
+}
+
+

2: Change Configuration of the Controller:

+
core_shop_frontend:
+    controllers:
+        product: AppBundle\Controller\ProductController
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Store_Front/index.html b/docs/generated-docs/generated_docs/Development/Store_Front/index.html new file mode 100644 index 0000000000..ab87672f7f --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Store_Front/index.html @@ -0,0 +1,164 @@ + + + + + + + Store Front - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Stores/CRUD.html b/docs/generated-docs/generated_docs/Development/Stores/CRUD.html new file mode 100644 index 0000000000..b0b2b34585 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Stores/CRUD.html @@ -0,0 +1,200 @@ + + + + + + + CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Stores

+

Create

+

If you want to create a Store via API, you can do following:

+
$newStore = $container->get('coreshop.factory.store')->createNew();
+
+

Now you have a new Store, if you want to persist it, you need to do following:

+
$container->get('coreshop.manager.store')->persist($newStore);
+$container->get('coreshop.manager.store')->flush();
+
+

You now have a new persisted Store.

+

Read

+

If you want to query for Stores, you can do following:

+
$storeRepository = $container->get('coreshop.repository.store');
+
+$queryBuilder = $storeRepository->createQueryBuilder('c');
+
+// You can now create your query
+
+// And get the result
+
+$stores = $queryBuilder->getQuery()->getResult();
+
+
+

Update

+

If you want to update and existing Store, you need to do following:

+
// Fetch Store
+
+$store = $storeRepository->findById(1);
+$store->setName('Euro');
+
+// And Persist it
+$container->get('coreshop.manager.store')->persist($store);
+$container->get('coreshop.manager.store')->flush();
+
+

Delete

+

If you want to update and existing Store, you need to do following:

+
// Fetch Store
+
+$store = $storeRepository->findById(1);
+
+// And Persist it
+$container->get('coreshop.manager.store')->remove($store);
+$container->get('coreshop.manager.store')->flush();
+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Stores/Context.html b/docs/generated-docs/generated_docs/Development/Stores/Context.html new file mode 100644 index 0000000000..642072514d --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Stores/Context.html @@ -0,0 +1,266 @@ + + + + + + + Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Store Context

+

For CoreShop to determine the current store the visitor or customer comes from +it uses a concept called context and context resolver.

+

Context

+ + + + + + + + + + + + + + + + + + + + + + + +
NamePriorityTagDescription
FixedStoreContext2coreshop.context.storeUsed for testing purposes
StoreContext1coreshop.context.storeLoad a store from given request resolver
+

Resolver

+ + + + + + + + + + + + + + + + + + + + + + + +
NamePriorityTagDescription
SiteBasedRequestResolver100coreshop.context.store.request_based.resolverDetermines a store by a given pimcore frontend site
PimcoreAdminSiteBasedRequestResolver200coreshop.context.store.request_based.resolverDetermines a store by a given document in backend
+

These resolver take care about finding the correct store for the current request.

+

Create a Custom Resolver

+

A Store Context needs to implement the interface CoreShop\Component\Store\Context\StoreContextInterface. +This interface consists of one method called getStore which returns a CoreShop\Component\Store\Model\StoreInterface or throws an CoreShop\Component\Store\Context\StoreNotFoundException.

+

To register your context, you need to use the tag coreshop.context.store with an optional priority attribute.

+

Create a Request based Resolver

+

CoreShop already implements Request based store context resolver. So if your context depends on the current request, you can +create a custom RequestBased resolver. To do that, implement the interface CoreShop\Component\Store\Context\RequestBased\RequestResolverInterface +with the method findStore. This method either returns a store or null.

+

To register this resolver, use the tag: coreshop.context.store.request_based.resolver with an optional priority attribute.

+

Example

+

We want to a StoreContext to be based on the Pimcore Document. So if we are on site /de, we want to resolve to Store DE, if we +are on page /en we want to resolve to Store Store EN:

+

1: First of all we need to create our RequestBased Store Context:

+
<?php
+
+namespace AppBundle\CoreShop\Store\Context;
+
+use CoreShop\Component\Store\Context\RequestBased\RequestResolverInterface;
+use CoreShop\Component\Store\Repository\StoreRepositoryInterface;
+use Pimcore\Http\Request\Resolver\DocumentResolver;
+use Symfony\Component\HttpFoundation\Request;
+
+final class DocumentBasedRequestRequestResolver implements RequestResolverInterface
+{
+    private StoreRepositoryInterface $storeRepository;
+
+    public function __construct(StoreRepositoryInterface $storeRepository)
+    {
+        $this->storeRepository = $storeRepository;
+    }
+
+    public function findStore(Request $request): ?StoreInterface
+    {
+        if (substr($request->getPathInfo(), 0, 3) === '/en') {
+            return $this->storeRepository->find(1);
+        }
+
+        if (substr($request->getPathInfo(), 0, 3) === '/de') {
+            return $this->storeRepository->find(2);
+        }
+
+        return null;
+    }
+}
+
+

Now we need to configure the service in src/AppBundle/Resources/config/services.yml

+
services:
+  app.coreshop.store.context.request.document_based:
+    class: AppBundle\CoreShop\Store\Context\DocumentBasedRequestRequestResolver
+    arguments:
+      - '@coreshop.repository.store'
+    tags:
+      - { name: coreshop.context.store.request_based.resolver, priority: 300 }
+
+
+

CoreShop now tries to resolve the current Store based on the Pimcore Site we are on.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Stores/Theme.html b/docs/generated-docs/generated_docs/Development/Stores/Theme.html new file mode 100644 index 0000000000..de14a96284 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Stores/Theme.html @@ -0,0 +1,159 @@ + + + + + + + Theme - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/Stores/index.html b/docs/generated-docs/generated_docs/Development/Stores/index.html new file mode 100644 index 0000000000..e2bfed7dbc --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/Stores/index.html @@ -0,0 +1,169 @@ + + + + + + + Stores - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Development/index.html b/docs/generated-docs/generated_docs/Development/index.html new file mode 100644 index 0000000000..e344bf0508 --- /dev/null +++ b/docs/generated-docs/generated_docs/Development/index.html @@ -0,0 +1,192 @@ + + + + + + + Development - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop

+

The Developer’s guide to leveraging the flexibility of CoreShop. Here you will find all the concepts used in CoreShop.

+

Introduction

+

CoreShop Resources

+

CoreShop uses Doctrine ORM for Custom Resources. ORM enables us great flexibility and extendability for simple models like Currencies and Countries. +CoreShop currently implements these Resources as ORM Model:

+
    +
  • Currency
  • +
  • Country and State
  • +
  • Tax Rate and Tax Rules
  • +
  • Price Rules
  • +
  • Carrier
  • +
  • Shipping Rules
  • +
  • Index and Filter Configuration
  • +
  • Notification Rule Configuration
  • +
  • Stores
  • +
  • Payments
  • +
+

Everytime something is called a Resource, we talk about ORM Models.

+

CoreShop Pimcore Models

+

CoreShop also takes advantage of Pimcores flexible data-model. +Objects that are heavily used and changed are implemented using Data Objects:

+
    +
  • Product
  • +
  • Product Category
  • +
  • Manufacturer
  • +
  • Cart
  • +
  • Order
  • +
  • Order Invoice
  • +
  • Order Shipment
  • +
  • Quote
  • +
  • Customer
  • +
  • Customer Group
  • +
  • Addresses
  • +
+

Everytime we talk about Objects, we talk about Pimcore Data Objects.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Getting_Started/Architecture_Overview.html b/docs/generated-docs/generated_docs/Getting_Started/Architecture_Overview.html new file mode 100644 index 0000000000..0987c614f0 --- /dev/null +++ b/docs/generated-docs/generated_docs/Getting_Started/Architecture_Overview.html @@ -0,0 +1,189 @@ + + + + + + + Architecture Overview - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Architecture

+

CoreShop is completely open source (GPl license) and free, maintained by diverse and creative community of developers and companies.

+

What are our core values and what makes us different from other solutions?

+
    +
  • Components based approach
  • +
  • Unlimited flexibility and simple customization
  • +
  • Developer-friendly, using latest technologies
  • +
  • Highest quality of code
  • +
+

The Three Natures of CoreShop

+

CoreShop is constructed from fully decoupled and flexible e-commerce components for PHP. +It is also a set of Symfony bundles, which integrate the components into the full-stack framework. +On top of that, CoreShop is also a complete eCommerce suite crafted from all these building blocks.

+

It is your choice how to use CoreShop, you can benefit from the components with any framework, +integrate selected bundles into existing or new Pimcore app or built your application on top of CoreShop Suite.

+

CoreShop Suite

+

This book is about our full-stack eCommerce suite, which is a standard Pimcore Bundle providing the most common webshop and a foundation for custom systems.

+

Leveraging Symfony Bundles

+

If you prefer to build your very custom system step by step and from scratch, +you can integrate the standalone Symfony bundles. +For the installation instructions, please refer to the appropriate bundle documentation.

+

Difference to the official Pimcore eCommerce Framework

+

The eCommerce Framework provides you with a basic Toolset for eCommerce Development. +CoreShop gives you a feature-rich Toolset of common needed Tools for rich and complex eCommerce Solutions.

+
+

Example I: the Framework does'nt give you the full opportunity for calculating complex Shipping Prices. +You need to code it by yourself. CoreShop provides you with Carriers and Shipping Rules to do that.

+
+

CoreShops Bundles are build to be used individually. The CoreBundle combines all the Features.

+

Architecture Overview

+

CoreShop Suite is build on CoreShop Components and Bundles. +The CoreBundle and CoreComponent glues all different Bundles and Components into one eCommerce Suite for B2B and B2C Solutions.

+

Architecture

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Getting_Started/Difference_to_ecommerce_Framework.html b/docs/generated-docs/generated_docs/Getting_Started/Difference_to_ecommerce_Framework.html new file mode 100644 index 0000000000..02da2a7e26 --- /dev/null +++ b/docs/generated-docs/generated_docs/Getting_Started/Difference_to_ecommerce_Framework.html @@ -0,0 +1,501 @@ + + + + + + + Difference to ecommerce Framework - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop vs. eCommerce Framework

+

The idea behind CoreShop is totally different to the eCommerce framework. The eCommerce framework gives you skeleton for building +eCommerce applications and heavily depends on you doing all the things.

+

CoreShop, on the other hand, comes full-featured with a rich toolset of optional Components which you can use, or not use, for your +ecommerce Application. In other words: CoreShop is the framework on steroids :)

+

Feature Comparison

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureeCommerce FrameworkCoreShop
Product Management
Product RestrictionsX
Product Variants
Category Management
Customer ManagementX
Customer Address ManagementX
LocalizationX
Currency ManagementX
Country ManagementX
Taxation
Payment Management
Supported Payment Providers
- Wirecard Qpay
- Wirecard Seamless
- Datatrans
- Klarna
- Recurring Payments
- PayPal ExpressX
- PayPal Pro CheckoutX
- PayPal Pro HostedX
- PayPal MasspayX
- PayPal RestX
- Stripe.jsX
- Stripe CheckoutX
- Authorize.NET AIMX
- Be2Bill Credit CardX
- Be2Bill OffsiteX
- PayexX
- OfflineX
- Payum and OmnipayX
Voucher Codes
Catalog Price Rules
Product Specific Price RulesX
Product Facet Index
Multi Theme SupportedX
Carrier ManagementX
Shipping CalculationX
Order Management
Order WorkflowX
Order Invoice GenerationX
Order Shipment GenerationX
Quotes ManagementX
ReportingX
Multi Store/Tenant
eCommerce Tracking
Configurable Mail RulesX
Backend Functionality
- Country ManagementX
- Currency ManagementX
- Taxation ManagementX
- Taxation ManagementX
- Index ManagementX
- Filter ManagementX
- Order ManagementX (partial)
- Voucher Rules
- Price Rules
- Order OverviewX (partial)
- Quote OverviewX
- Order DetailX (partial)
- Quote DetailX
- Order CreationX
- Quote CreationX
Checkout Manager
Modular/ComponentizedX (partial)
Extendable
+

To be fair, both Systems have their purpose and you can do the same with both systems. The ecommerce Framework is designed +to be very good extendable but you still need to implement a lot of stuff yourself. CoreShop gives you a lot of out-of-the-box +features to quickly create rich ecommerce systems.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Getting_Started/Installation.html b/docs/generated-docs/generated_docs/Getting_Started/Installation.html new file mode 100644 index 0000000000..60b4ccc966 --- /dev/null +++ b/docs/generated-docs/generated_docs/Getting_Started/Installation.html @@ -0,0 +1,179 @@ + + + + + + + Installation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Installation

+

You need a running instance of Pimcore on your system before you can install CoreShop.

+

You can setup your own example:

+
    +
  • Install with composer composer require coreshop/core-shop ^3.0 +
  • +
  • Run enable Bundle command +php bin/console pimcore:bundle:enable CoreShopCoreBundle +
  • +
  • Run Install Command +php bin/console coreshop:install +
  • +
  • Optional: Install Demo Data php bin/console coreshop:install:demo +
  • +
+

Messenger

+

CoreShop also uses Symfony Messenger for async tasks like sending E-Mails or Processing DataObjects for the Index. Please run these 2 transports to process the data

+
bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300
+
+

Payment

+

CoreShop uses Payum for Payment. Checkout Payums Documentation on how to add payment providers.

+

Payment providers are implemented as Pimcore Plugin. They can be installed using composer. Here you can find all available payment modules via composer

+

Payum Documentation

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Getting_Started/Upgrade_Notes.html b/docs/generated-docs/generated_docs/Getting_Started/Upgrade_Notes.html new file mode 100644 index 0000000000..2c40daa1ce --- /dev/null +++ b/docs/generated-docs/generated_docs/Getting_Started/Upgrade_Notes.html @@ -0,0 +1,444 @@ + + + + + + + Upgrade Notes - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Upgrade Notes

+

Always check this page for some important upgrade notes before updating to the latest coreshop build.

+

2.0.0-beta.3 to 2.0.0-beta.4

+
    +
  • +BC break: All occurrences of parameters coreshop.all.stack.pimcore_class_ids, "application".model."class".pimcore_class_id, coreshop.all.pimcore_classes.ids have been removed. Inject the corresponding Repository and use classId function instead
  • +
  • +Pimcore: CoreShop now requires at least Pimcore 5.4.0. You need to update Pimcore to the at least 5.4.0 in order to use/update CoreShop.
  • +
+

Product Price Calculation

+

In order to allow custom price calculation on API Level, we changed the way CoreShop calculates product prices by introducing a new parameter to every PriceCalculation Interface. Price Calculator Conditions are not anymore using a Live context, instead it gets passed via API.

+

Following interfaces have changed:

+
    +
  • +CoreShop\Component\Core\Product\TaxedProductPriceCalculatorInterface +
  • +
  • +CoreShop\Component\Order\Calculator\PurchasableDiscountCalculatorInterface +
  • +
  • +CoreShop\Component\Order\Calculator\PurchasableDiscountPriceCalculatorInterface +
  • +
  • +CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface +
  • +
  • +CoreShop\Component\Order\Calculator\PurchasableRetailPriceCalculatorInterface +
  • +
  • +CoreShop\Component\Product\Calculator\ProductDiscountCalculatorInterface +
  • +
  • +CoreShop\Component\Product\Calculator\ProductDiscountPriceCalculatorInterface +
  • +
  • +CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface +
  • +
  • +CoreShop\Component\Product\Calculator\ProductRetailPriceCalculatorInterface +
  • +
  • +CoreShop\Component\Product\Rule\Action\ProductDiscountActionProcessorInterface +
  • +
  • +CoreShop\Component\Product\Rule\Action\ProductDiscountPriceActionProcessorInterface +
  • +
  • +CoreShop\Component\Product\Rule\Action\ProductDiscountPriceActionProcessorInterface +
  • +
  • +CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface +
  • +
  • +CoreShop\Component\Product\Rule\Fetcher\ValidRulesFetcherInterface +
  • +
+

If you have anything customized with those classes, please change them accordingly.

+

If you use the PriceCalculator Service directly, you also need to change the call from

+
$this->priceCalculator->getPrice($object, true)
+
+

to

+
$this->priceCalculator->getPrice($object, [
+    'store' => $store,
+    'country' => $country,
+    'customer' => $customer,
+    'currency' $currency,
+    'cart' => $cart
+], true)
+
+

The new second argument, is the Context for which you want to get the Price. This is highly depends on your +need. On a default CoreShop setup, the context can be fetched form the ShopperContext Service like this:

+
return  [
+    'store' => $this->shopperContext->getStore(),
+    'customer' => $this->shopperContext->hasCustomer() ? $this->shopperContext->getCustomer() : null,
+    'currency' => $this->shopperContext->getCurrency(),
+    'country' => $this->shopperContext->getCountry(),
+    'cart' => $this->shopperContext->getCart()
+];
+
+

CoreShop makes that easier for you, you can just use $this->shoppperContext->getContext(). But be aware, the Shopper Context is only in a Web Request available. +When you work on a CLI Level, you have to define the context yourself.

+

If you already have a cart and want to calculate the price for the cart, the context is a bit different, cause it resolves from the cart

+
$context = [
+    'store' => $cart->getStore(),
+    'customer' => $cart->getCustomer() ?: null,
+    'currency' => $cart->getCurrency(),
+    'country' => $cart->getStore()->getBaseCountry(),
+    'cart' => $cart
+];
+
+

Taxation

+

Tax Rule Store relation has been removed as it makes currently no sense.

+

Tracking

+

Tracking bundle has completely been refactored in order to support more use-cases than just ecommerce. If you have any customizations made, please check the current implementation to adapt your changes.

+

Order Invoice

+

Due to changes in adjustments, we also need to change OrderInvoice/OrderInvoiceItem.

+

After you have migrated to the latest version you also have to remove some fields:

+

CoreShopOrderInvoice

+
    +
  • totalTax
  • +
  • baseTotalTax
  • +
  • subtotalTax
  • +
  • baseSubtotalTax
  • +
  • shippingTax
  • +
  • baseShippingTax
  • +
  • taxes
  • +
  • baseTaxes
  • +
  • discountTax
  • +
  • baseDiscountTax
  • +
  • discountNet
  • +
  • discountGross
  • +
  • baseDiscountNet
  • +
  • baseDiscountGross
  • +
  • shippingNet
  • +
  • shippingGross
  • +
  • baseShippingNet
  • +
  • baseShippingGross
  • +
  • shippingTaxRate
  • +
+

CoreShopOrderInvoiceItem

+
    +
  • totalTax
  • +
  • baseTotalTax
  • +
  • taxes
  • +
  • baseTaxes
  • +
+

Adjustments

+
+

BC break / New Feature

+
+

There are several deprecated class fields. +After you have migrated to the latest version you also have to remove them:

+

CoreShopOrder / CoreShopQuote

+
    +
  • shippingGross
  • +
  • shippingNet
  • +
  • shippingTax
  • +
  • discountGross
  • +
  • discountNet
  • +
  • discountTax
  • +
  • baseShippingNet
  • +
  • baseShippingGross
  • +
  • baseShippingTax
  • +
  • baseDiscountNet
  • +
  • baseDiscountGross
  • +
  • totalTax
  • +
  • baseTotalTax
  • +
  • subTotalTax
  • +
  • baseSubtotalTax
  • +
+

CoreShopOrderItem / CoreShopQuoteItem

+
    +
  • totalTax
  • +
  • baseTotalTax
  • +
+

CoreShopCart

+
    +
  • shippingGross
  • +
  • shippingNet
  • +
  • discountGross
  • +
  • discountNet
  • +
+

2.0.0-beta.2 to 2.0.0-beta.3

+
    +
  • +

    BC break Signature of following interfaces changed:

    +
      +
    • +CoreShop\Component\Index\Interpreter\InterpreterInterface: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []);
    • +
    • +CoreShop\Component\Index\Interpreter\LocalizedInterpreterInterface: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []);
    • +
    • +CoreShop\Component\Index\Interpreter\RelationInterpreterInterface: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config, $interpreterConfig = []);
    • +
    • +CoreShop\Component\Customer\Model\UserInterface::ROLE_DEFAULT renamed CoreShop\Component\Customer\Model\UserInterface::CORESHOP_ROLE_DEFAULT +
    • +
    • +CoreShop\Component\Customer\Model\UserInterface::ROLE_SUPER_ADMIN renamed CoreShop\Component\Customer\Model\UserInterface::CORESHOP_ROLE_SUPER_ADMIN +
    • +
    +
  • +
  • +

    BC break Shipment / Invoice Creation via API changed

    +
      +
    • Before adding a new Shipment / Invoice you need to dispatch a request state to your order. Read more about it here and here.
    • +
    +
  • +
  • +

    BC break getName in CoreShop\Component\Index\Model\IndexableInterface has been changed to getIndexableName as getName could eventually conflict with a non localized Pimcore Field

    +
  • +
  • +

    BC break getEnabled in CoreShop\Component\Index\Model\IndexableInterface has been changed to getIndexableEnabled as getEnabled could eventually conflict with a localized Pimcore Field

    +
  • +
+

2.0.0-beta.1 to 2.0.0-beta.2

+
    +
  • Link Generator implemented. If you want to use nice urls, you need to add the link generator service: +
      +
    • CoreShopProduct: add @coreshop.object.link_generator.product as Link Provider
    • +
    • CoreShopCategory: add @coreshop.object.link_generator.category as Link Provider
    • +
    • Change {{ path('') }} to {{ coreshop_path('') }}. You may want to checkout the FrontendBundle to get a deeper insight.
    • +
    +
  • +
  • Deprecated Field Names in - CoreShop\Component\Payment\Model\PaymentInterface`: +
      +
    • getName is now getTitle
    • +
    • getOrderId is now getOrder and directly returns a OrderInterface
    • +
    +
  • +
  • Deprecated Field Names in - CoreShop\Component\Shipping\Model\CarrierInterface: +
      +
    • getLabel is not getTitle
    • +
    • getName is now getIdentifier
    • +
    +
  • +
+

2.0.0-alpha.4 to 2.0.0-beta.1

+
    +
  • +

    BC break Signature of following interfaces changed:

    +
      +
    • +CoreShop\Component\Index\Interpreter\InterpreterInterface: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config);
    • +
    • +CoreShop\Component\Index\Interpreter\LocalizedInterpreterInterface: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config);
    • +
    • +CoreShop\Component\Index\Interpreter\RelationInterpreterInterface: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config);
    • +
    +
  • +
  • +

    BC break CoreShop now takes advantage of the dependent bundle feature introduced in Pimcore 5.1.2. Therefore, +all bundles are now automatically loaded. This is a BC break, as when updating, you might run into issues. +To solve the issues, check following things:

    +
      +
    • remove RegisterBundles entry from app/AppKernel.php +
    • +
    • remove loading CoreShopCoreBundle Configuration in app/config.yml +
    • +
    • enable CoreShopCoreBundle via CLI or manually in var/config/extensions.php: "CoreShop\\Bundle\\CoreBundle\\CoreShopCoreBundle" => TRUE +
    • +
    +
  • +
  • +

    BC break Upgraded Default Layout to Bootstrap 4. This will most certainly cause issues when you just override certain templates. Best would be to copy all templates from before the Bootstrap 4 Upgrade.

    +
  • +
+

2.0.0-alpha.4 to 2.0.0-alpha.5

+
    +
  • +BC break added Component\Core\Model\OrderItem and Component\Core\Model\QuoteItem. If you already customized them, inherit them from the Core Models.
  • +
  • +BC break changed the way CoreShop processes Cart-Rules. If you implemented a custom-condition, inherit from CoreShop\Component\Order\Cart\Rule\Condition\AbstractConditionChecker and implement isCartRuleValid instead of isValid +
  • +
  • Deprecated: remove cart/add-price-rule/ static route.
  • +
+

2.0.0-alpha.3 to 2.0.0-alpha.4

+
    +
  • +BC break decoupled MoneyBundle from CurrencyBundle, therefore the Twig Extension for Money Conversion went to the CurrencyBundle. Therefore the name of that extension was renamed from +coreshop_convert_money to coreshop_convert_currency. If you use it directly in your code, please rename all of them.
  • +
  • Deprecated CoreShopAdminBundle which responsability was only handling installation and deliviering pimcore resources like JS and CSS files. +
      +
    • Installation has been moved to CoreShopCoreBundle
    • +
    • Delivering of resources is now handled by CoreShopResourceBundle, this also makes it easier to use CoreShop Bundles without handling resources yourself.
    • +
    +
  • +
+

2.0.0-alpha.2 to 2.0.0-alpha.3

+
    +
  • +

    BC break getPrice in PurchasableInterface and ProductInterface has been removed. In favor of this a new coreShopStorePrice editable has been introduced, which stores prices for each store. This makes handling of multiple currencies way more elegant.

    +

    If you still want to use the old getPrice, create a new Subclass of \CoreShop\Component\Core\Model\Product, implement \CoreShop\Component\Order\Model\PriceAwarePurchasableInterface and set your class to CoreShopProduct parents.

    +
  • +
+

V1 to V2

+
    +
  • CoreShop 2 is not backward compatible. Due to the framework change, we decided to re-make CoreShop from scratch. If you still have instances running and want to migrate, there is a basic migration way which gets you data from V1 to V2.
  • +
  • +Export from CoreShop1 +
  • +
  • +Import into CoreShop2 +
  • +
+

Within V1

+
    +
  • Nothing available
  • +
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/Getting_Started/index.html b/docs/generated-docs/generated_docs/Getting_Started/index.html new file mode 100644 index 0000000000..b28796fba4 --- /dev/null +++ b/docs/generated-docs/generated_docs/Getting_Started/index.html @@ -0,0 +1,178 @@ + + + + + + + Getting Started - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Automation/index.html b/docs/generated-docs/generated_docs/User_Documentation/Automation/index.html new file mode 100644 index 0000000000..d555c223d6 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Automation/index.html @@ -0,0 +1,194 @@ + + + + + + + Automation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Automation

+

In CoreShop there are several automation mechanism implemented.

+

Order Cancellation

+
+

Execution Time: Once per day via maintenance job

+
+

CoreShop will automatically cancel orders older than 20 days.

+

Change Orders Expiration Date

+
core_shop_order:
+    expiration:
+        order:
+            days: 30
+
+

Expired Carts

+
+

Execution Time: Once per day via maintenance job

+
+
+

Note: By default, this feature is disabled.

+
+

By default, this feature is disabled (days = 0) so no carts will be removed by default. +If you want to remove older carts, just enable it via configuration:

+

Change Cart Expiration Date

+
core_shop_order:
+    expiration:
+        cart:
+            days: 20
+            anonymous: true
+            customer: true
+
+

Expired Rules

+
+

Execution Time: Once per day via maintenance job

+
+

If you're having a lot of active rules in your system, you may want to disable them via automation. +CoreShop already comes with a time-span check, which means all rules with time-span elements will be disabled if they're outdated. +If you want do implement some further availability logic, you could use the coreshop.rule.availability_check Event to define +the availability of the rule. Just use the setAvailability() method to override the system availability suggestion.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Cart/index.html b/docs/generated-docs/generated_docs/User_Documentation/Cart/index.html new file mode 100644 index 0000000000..60f140ad50 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Cart/index.html @@ -0,0 +1,169 @@ + + + + + + + Cart - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart

+

Inventory Change

+

If a customer adds a item to the cart CoreShop will check if product stock is sufficient. If not, a form error will show up.

+

Disable / Delete Products

+

If a product gets disabled or deleted in backend CoreShop will automatically remove this product from all active carts. +A form error will notify every customer in frontend if the cart has been modified.

+

Abandoned Carts

+

No cart gets deleted by default. This allows you to:

+
    +
  • check abandoned cart statistics
  • +
  • build your own business logic in case you want to inform customers within a follow-up email for example
  • +
+

There is a expire cart command to remove abandoned carts, please checkout the development section.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Catalog/Categories.html b/docs/generated-docs/generated_docs/User_Documentation/Catalog/Categories.html new file mode 100644 index 0000000000..fe02f8c542 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Catalog/Categories.html @@ -0,0 +1,158 @@ + + + + + + + Categories - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Categories Documentation

+

Categories in CoreShop provide a way to organize and structure the products in your e-commerce store built on the Pimcore platform. Using categories, you can create a hierarchical navigation system that allows customers to browse and find products easily.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Catalog/Product_Variants.html b/docs/generated-docs/generated_docs/User_Documentation/Catalog/Product_Variants.html new file mode 100644 index 0000000000..5cacffb455 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Catalog/Product_Variants.html @@ -0,0 +1,158 @@ + + + + + + + Product Variants - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Catalog/Products.html b/docs/generated-docs/generated_docs/User_Documentation/Catalog/Products.html new file mode 100644 index 0000000000..4a7dc0047b --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Catalog/Products.html @@ -0,0 +1,158 @@ + + + + + + + Products - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Products Documentation

+

Products are the core of any e-commerce store built on the Pimcore platform. CoreShop provides a flexible and feature-rich system for managing products, including product variants, attributes, images, and more.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Catalog/index.html b/docs/generated-docs/generated_docs/User_Documentation/Catalog/index.html new file mode 100644 index 0000000000..c9e6825d60 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Catalog/index.html @@ -0,0 +1,168 @@ + + + + + + + Catalog - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Geo_IP.html b/docs/generated-docs/generated_docs/User_Documentation/Geo_IP.html new file mode 100644 index 0000000000..e069779e85 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Geo_IP.html @@ -0,0 +1,158 @@ + + + + + + + Geo IP - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop can use GeoIP to locate visitors countries using IP-Addresses.

+

CoreShop uses the already existing Pimcore GeoIP Database located in: /var/config/GeoLite2-City.mmdb

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Inventory/index.html b/docs/generated-docs/generated_docs/User_Documentation/Inventory/index.html new file mode 100644 index 0000000000..c070e8e34e --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Inventory/index.html @@ -0,0 +1,201 @@ + + + + + + + Inventory - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Inventory

+

The Inventory is a complex topic since there is a lot of business logic you need to know about.

+

Product Inventory

+

Every Product object comes with a "Stock" Tab. Let's have a look about the configuration:

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
Is TrackedDefine if a product should get tracked
On HandAmount of available products.
On HoldDefines how many elements are currently locked. Do not change that value unless you know what you're doing.
+

Is Tracked

+

If you want to enable the inventory feature for a product, you need to check this setting. +After that this product is not orderable in frontend if stock is insufficient.

+
+

Note: Only if you enable "Is Tracked" the inventory stock is active! +Otherwise the product is always available regardless of it's stock amount.

+
+

On Hand

+

Define a available amount for each product. +With every successfully order, an arbitrary amount will be subtracted.

+

On Hold

+

This one needs some further explanation: +After the checkout is complete, all ordered items will be removed from "On Hand" and get moved to "On Hold" until the payment is complete:

+
    +
  • If the unpaid order gets cancelled, the reserved "On Hold" amount gets back to "On Hand".
  • +
  • If the order payment status switches to paid, the reserved "On Hold" amount gets subtracted.
  • +
+

Cart / Checkout

+

If a product stock gets insufficient during a customers checkout, the product gets removed from customers cart following by a form error.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/Countries.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/Countries.html new file mode 100644 index 0000000000..63c8633f15 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Localization/Countries.html @@ -0,0 +1,168 @@ + + + + + + + Countries - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Country

+

A Country consists of following values:

+
    +
  • Name
  • +
  • ISO-Code
  • +
  • Active: Determines if customers from this country are able to purchase from your store
  • +
  • Use Store default Currency: If checked, your stores default currency will be applied to the country
  • +
  • Currency
  • +
  • Zone
  • +
  • Stores: Determines for which Stores this Country is available.
  • +
+

Countries

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/Currencies.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/Currencies.html new file mode 100644 index 0000000000..7fe32d283c --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Localization/Currencies.html @@ -0,0 +1,178 @@ + + + + + + + Currencies - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Currencies

+

A Currency consists of following values:

+
    +
  • Name
  • +
  • ISO Code
  • +
  • Numeric ISO Code
  • +
  • Symbol
  • +
  • Exchange Rate: Is used to convert between different currencies
  • +
+

If you are going to use Currency conversion, you need to update exchange ranges regularly.

+

Currencies

+

Automated Exchange Rates

+

CoreShop supports mulitple providers to get exchange ranges from. Currently supported:

+
    +
  • CentralBankOfRepulicTurkey
  • +
  • EuropeanCentralBank
  • +
  • GoogleFinance
  • +
  • NationalBankOfRomania
  • +
  • YahooFinance
  • +
  • WebserviceX
  • +
+

To activate this feature, enable it within CoreShop Settings and choose your provider.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/States.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/States.html new file mode 100644 index 0000000000..575100765c --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Localization/States.html @@ -0,0 +1,165 @@ + + + + + + + States - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/TaxRules.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/TaxRules.html new file mode 100644 index 0000000000..5fc3943955 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Localization/TaxRules.html @@ -0,0 +1,166 @@ + + + + + + + TaxRules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Tax Rules

+

Tax Rules determine which Tax Rate should be used for the customers country/state. This Tax Rule is then applied to a product.

+

A Tax Rule consists of following values:

+
    +
  • Name
  • +
  • Active
  • +
  • Stores: In which Stores this Tax-Rule can be used.
  • +
  • Rules: Which Country and/or State should use which Tax Rate and what should happen when multiple Tax Rates apply.
  • +
+

Tax Rules

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/Taxes.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/Taxes.html new file mode 100644 index 0000000000..62000b9206 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Localization/Taxes.html @@ -0,0 +1,165 @@ + + + + + + + Taxes - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Taxes

+

A Tax Rate consists of following values:

+
    +
  • Localized Name: This name can also be seen in the cart or on invoices
  • +
  • Rate: Tax Rate, for example 20%
  • +
  • Active
  • +
+

Taxes are going to be used in Tax Rules.

+

Taxes

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/Zones.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/Zones.html new file mode 100644 index 0000000000..9581b838b2 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Localization/Zones.html @@ -0,0 +1,164 @@ + + + + + + + Zones - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/index.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/index.html new file mode 100644 index 0000000000..08a1446be2 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Localization/index.html @@ -0,0 +1,177 @@ + + + + + + + Localization - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Comments.html b/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Comments.html new file mode 100644 index 0000000000..aa91f52a1a --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Comments.html @@ -0,0 +1,164 @@ + + + + + + + Order Comments - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Order Comments

+

Comment +Comment

+

CoreShop provides a simple comment interface which allows you to add simple notes to every order. +It's also possible to send the order comment to the customer. Just check "Submit Comment to Customer".

+
+

Note: You need a valid Notification Rule to send comments to user.

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Detail.html b/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Detail.html new file mode 100644 index 0000000000..3450953825 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Detail.html @@ -0,0 +1,310 @@ + + + + + + + Order Detail - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Order Detail

+

State / Price Overview

+

Please read more about the order workflow process here

+

Besides some useful information about the order store and the total order amount, +there're also several order states:

+

State

+

This is the main state and represents the summary of all order states.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newNew order has been placed.
confirmedNew order has been successfully created (after a offline order or a customer returns from payment gateway regardless of its state).
cancelledOrder has been cancelled.
completeOrder is complete.
+

Payment State

+

Global payment states per order and represents the summary of all order payments:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newNew payment has been created.
awaiting_paymentWaiting for payment: User is on payment offsite or payment is offline.
partially_paidSome order payments have been paid.
paidAll payments have been paid.
cancelledOrder is complete.
partially_refundedSome order payments have been refunded.
refundedAll payments have been refunded.
+

Shipment State

+

Global shipment states per order and represents the summary of all order shipments:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newNew shipment has been placed.
cancelledShipment has been cancelled
partially_shippedSome order items have been shipped.
shippedAll items have been shipped.
+

Invoice State

+

Global invoice states per order and represents the summary of all order invoices:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
newNew invoice has been created.
cancelledInvoice has been cancelled
partially_invoicedSome invoices have been invoiced.
invoicedAll invoices have been invoiced.
+

Carrier/Payment Provider Info

+
    +
  • Currency of Order
  • +
  • Overall weight of Order Items
  • +
  • Carrier
  • +
  • Total Amount
  • +
+

Order History

+

The Order History shows you when specific states have been changed.

+

Payments

+

--

+

Shipments

+

--

+

Invoices

+

--

+

Mail Correspondence

+

--

+

Customer

+

--

+

Comments

+

--

+

Additional Data

+

--

+

Products

+

--

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Workflow.html b/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Workflow.html new file mode 100644 index 0000000000..6bb9bc07a9 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Workflow.html @@ -0,0 +1,220 @@ + + + + + + + Order Workflow - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

Order Workflow

+
+

Technical Overview of CoreShop Workflows.

+
+

Change States

+

States can be changed for: Order, Payment, Shipment and Invoice. +If any transition is available, you'll find a colored state button. +Click on that button to change the state.

+

Order Completion

+

In CoreShop a order is complete after the order payment reaches the paid state +and order shipment reaches the shipped state. If you also want to include the order invoice state invoiced +before a order gets completed, you need to enable a configuration flag:

+
## app/config/config.yml
+parameters:
+    coreshop.workflow.include_invoice_state_to_complete_order: true
+
+

Order Cancellation

+

In CoreShop a order rarely gets cancelled. Some reasons are:

+

Front-End Revise +After a customer has cancelled his payment he will reach a so called revise page. +From there he's able to reselect a payment gateway to start over. In revise mode, however, it's possible to cancel the order and restore the cart. +Only than the order gets cancelled.

+

Back-End Revise +In CoreShop it's possible to create orders in Back-End. Instead of adding sensitive payment information, +you're able to provide a revise link to your customer which then works the same as the Front-End revise process +(except that your customer is not able to restore a cart since there never was one).

+

Please read more about the canceling process here

+

Payment Workflow

+

Create a Payment

+

Just use the green bottom on the right top corner to add a new shipment. +A payment creation normally gets created by a frontend payment gateway. +This gateway also handles all the payment state changes.

+

Workflow Rules

+
    +
  • A payment reaches the new state after its creation.
  • +
  • A payment can be canceled as long it's in the new or processing state.
  • +
  • After a payment reaches completed state it only can get refunded.
  • +
+
+

Attention: The Refund process is not implemented yet in Coreshop!

+
+

Shipment Workflow

+

Create a Shipment

+

Just use the green bottom on the right top corner to add a new shipment. +If there are enough shippable items you can create a shipment.

+

Workflow Rules

+
    +
  • A shipment reaches the ready state (triggered by a create transition) after its creation.
  • +
  • A shipment can be canceled as long it's in the ready state
  • +
  • After you provoked the ship state a shipment can't be cancelled anymore.
  • +
+

Invoice Workflow

+

Create Invoice

+

Just use the green bottom on the right top corner to add a new invoice. +If there are enough invoiceable items you can create a invoice.

+

Workflow Rules

+
    +
  • A invoice reaches the ready state (triggered by a create transition) after its creation.
  • +
  • A invoice can be canceled as long it's in the ready state. Please note: Cancelling an invoice is not a refund action. You're allowed to create another invoice after cancelling the previous one.
  • +
  • After you provoked the complete state a invoice can't be cancelled anymore which means the invoice has been finally captured. After that you need to go on with a refund process
  • +
+
+

Attention: The Refund process is not implemented yet in Coreshop!

+
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Order/Orders.html b/docs/generated-docs/generated_docs/User_Documentation/Order/Orders.html new file mode 100644 index 0000000000..f47e951007 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Order/Orders.html @@ -0,0 +1,170 @@ + + + + + + + Orders - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Orders

+

Grid View

+

The default order list is based on the pimcore grid view. +CoreShop comes with a default column configuration:

+
    +
  • On the right side, click "Column configuration" and select "Order Overview".
  • +
  • Now click that button again and select "Set as favorite".
  • +
+

Filters in Grid View

+

It's possible to add custom filter definitions based on your project. +This has to be done via a php service. Read more about it here.

+

Apply Actions in Grid View

+

It's possible to apply custom bulk actions for selected orders. +This has to be done via a php service. Read more about it here.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Order/index.html b/docs/generated-docs/generated_docs/User_Documentation/Order/index.html new file mode 100644 index 0000000000..b63c6a937e --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Order/index.html @@ -0,0 +1,171 @@ + + + + + + + Order - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Actions.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Actions.html new file mode 100644 index 0000000000..83863a9273 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Actions.html @@ -0,0 +1,291 @@ + + + + + + + Actions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Price Rule Actions

+

Get a brief overview of all the available Price Rule Actions in CoreShop.

+

Free Shipping

+
+

Available for: Cart Price Rules

+
+

Add this action to allow free shipping.

+

Gift Product

+
+

Available for: Cart Price Rules

+
+

Add this action to place a gift in customers cart.

+

Options

+ + + + + + + + + + + + + +
NameDescription
Gift ProductNeeds to be a coreshop registered product object
+

Discount Amount

+
+

Available for: Cart Price Rules, Specific Product Price, Product Price

+
+

Set a arbitrary amount of discount.

+

Options

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
AmountDefine Amount
GrossIf given Amount has included VAT, check it
CurrencySet Currency of given amount
Apply OnSelect Between total and subtotal. Note: This option is only available in the cart rule context
+

Discount Percent

+
+

Available for: Cart Price Rules, Specific Product Price, Product Price

+
+

Set a arbitrary percentage amount of discount.

+

Options

+ + + + + + + + + + + + + + + + + +
NameDescription
PercentDefine Amount
Apply OnSelect Between total and subtotal. Note: This option is only available in the cart rule context
+

New Price

+
+

Available for: Specific Product Price, Product Price

+
+

Define a new Price.

+
+

Note: This will be used as a new price in frontend so there is no "special discount price" labelling. +If you need a highlighted discount price, use the Discount Price Action.

+
+

Options

+ + + + + + + + + + + + + + + + + +
NameDescription
PriceSet new Price
CurrencySet Currency of given amount
+

Discount Price

+
+

Available for: Specific Product Price, Product Price

+
+

Define a discount Price.

+

Options

+ + + + + + + + + + + + + + + + + +
NameDescription
PriceSet discount Price
CurrencySet Currency of given amount
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Cart_Price_Rules.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Cart_Price_Rules.html new file mode 100644 index 0000000000..5154896094 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Cart_Price_Rules.html @@ -0,0 +1,216 @@ + + + + + + + Cart Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart Price Rules Documentation

+

Cart price rules in CoreShop provide a flexible way to offer discounts and promotions in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions, such as cart subtotal, specific products, customer groups, or other criteria. This documentation will guide you through creating and managing cart price rules in CoreShop.

+

Cart Price Rules

+

Available Actions

+ +

Available Conditions

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Conditions.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Conditions.html new file mode 100644 index 0000000000..d79cbaa632 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Conditions.html @@ -0,0 +1,435 @@ + + + + + + + Conditions - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Price Rules Conditions

+

Get a brief overview of all the available Price Rule Conditions in CoreShop.

+

Customers

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Define one ore more customers to whom the price rule should get applied.

+

Options

+ + + + + + + + + + + + + +
NameDescription
CustomersOne ore multiple CoreShop Customer Objects
+

Customer Groups

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Define one ore more customer groups to whom the price rule should get applied.

+

Options

+ + + + + + + + + + + + + +
NameDescription
GroupsOne ore multiple CoreShop Customer Group Objects
+

Time Span

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Define a time span in which range the price rule is valid

+

Options

+ + + + + + + + + + + + + + + + + +
NameDescription
Date FromDate/Time Start
Date ToDate/Time End
+

Voucher

+
+

Available for: Cart Price Rules

+
+

Define some Voucher Conditions. Check out the Voucher Section to learn more about Voucher Configuration.

+

Options

+ + + + + + + + + + + + + + + + + +
NameDescription
Max. Usage per CodeDefine how often a voucher code can be used.
Allow only one Voucher per CodeIf checked, only one Voucher per Cart is allowed.
+

Amount

+
+

Available for: Cart Price Rules

+
+

Define a Price range within the price rule should get applied.

+

Options

+ + + + + + + + + + + + + + + + + +
NameDescription
Min AmountThe min amount of cart
Max AmountThe max amount of cart
+

Countries

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Bind a specific country to the price rule. +Important: This Condition is connected with the Country Context Resolver. +This Condition does not implies to use the Users current location since the Resolver could be also store related.

+

Options

+ + + + + + + + + + + + + +
NameDescription
CountriesSelect one or multiple Countries
+

Zones

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Bind a specific zone to the price rule. +Important: This Condition is connected with the Country Context Resolver. +This Condition does not implies to use the Users current location since the Resolver could be also store related.

+

Options

+ + + + + + + + + + + + + +
NameDescription
ZonesSelect one or multiple Zones
+

Stores

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Bind a specific store to the price rule.

+

Options

+ + + + + + + + + + + + + +
NameDescription
StoresSelect one or multiple Stores
+

Currencies

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Define which currencies are valid to apply the price rule

+

Options

+ + + + + + + + + + + + + +
NameDescription
CurrenciesSelect one or multiple Currencies
+

Carriers

+
+

Available for: Cart Price Rules

+
+

Define which carriers are valid to apply the price rule

+

Options

+ + + + + + + + + + + + + +
NameDescription
CarriersSelect one or multiple Carriers
+

Nested Rules

+
+

Available for: Cart Price Rules, Specific Product Prices, Product Price

+
+

Build complex AND, OR and NOT nested conditions. +Within a nested rules it's possible to add any other condition again.

+

Options

+ + + + + + + + + + + + + +
NameDescription
OperatorAND, OR and NOT
+

Products

+
+

Available for: Cart Price Rules, Product Price

+
+

Apply rule only if given products are available.

+

Options

+ + + + + + + + + + + + + +
NameDescription
ProductsOne ore multiple CoreShop Product Objects
+

Categories

+
+

Available for: Cart Price Rules, Product Price

+
+

Apply rule only if products linked with given categories are available.

+

Options

+ + + + + + + + + + + + + +
NameDescription
CategoriesOne ore multiple CoreShop Category Objects
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Product_Price_Rules.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Product_Price_Rules.html new file mode 100644 index 0000000000..d78bc382d4 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Product_Price_Rules.html @@ -0,0 +1,210 @@ + + + + + + + Product Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Product Price Rules Documentation

+

Product price rules in CoreShop offer a flexible way to provide discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions and can apply to specific products, categories, or customer groups. This documentation will guide you through creating and managing product price rules in CoreShop.

+

Cart Price Rules

+

Available Actions

+ +

Available Conditions

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html new file mode 100644 index 0000000000..e0f16147e1 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html @@ -0,0 +1,186 @@ + + + + + + + Quantity Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Quantity Price Rules Documentation

+

CoreShop Quantity Price Rules provide a flexible way to offer volume-based discounts for products in your e-commerce store built on the Pimcore platform. These rules apply to specific products and offer tiered pricing depending on the quantity purchased. This documentation will guide you through creating and managing quantity price rules in CoreShop.

+

Specific Price Rules

+

Available Conditions

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Specific_Price_Rules.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Specific_Price_Rules.html new file mode 100644 index 0000000000..10561c6043 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Specific_Price_Rules.html @@ -0,0 +1,201 @@ + + + + + + + Specific Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Specific Price Rules Documentation

+

Specific price rules in CoreShop provide a flexible way to create targeted discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules apply directly to individual products or variants and can be based on customer groups, currencies, or countries. This documentation will guide you through creating and managing specific price rules in CoreShop.

+

Specific Price Rules

+

Available Actions

+ +

Available Conditions

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Vouchers.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Vouchers.html new file mode 100644 index 0000000000..26cf16cb7c --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Vouchers.html @@ -0,0 +1,264 @@ + + + + + + + Vouchers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Vouchers

+
+

Info: In CoreShop Vouchers are Price Rules too. +To use or generate Vouchers you need to add a Cart Price Rule.

+
+

How to create Vouchers

+

Simple create a new cart price rule and activate "Is Voucher Rule". +With that, the "Voucher Codes" tab gets enabled.

+

Voucher

+

Voucher Condition

+

Voucher

+

If you need more control about handling Vouchers you need to add the "Voucher" Condition:

+ + + + + + + + + + + + + + + + + +
NameDescription
Max. Usage per CodeDefine how often a voucher code can be used.
Allow only one Voucher per CodeIf checked, only one Voucher per Cart is allowed.
+

Voucher Codes

+

Voucher

+

Within the "Voucher Codes" tab you're able to manage codes for the current price rule. +It's also possible to export generated codes to csv file.

+
+

If you need more globally statistics about vouchers please use the voucher report.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
CodeGenerated voucher code
Creation DateVoucher creation date
UsedIf the Voucher has been used you'll see a true statement
UsesAmount of uses per code
ActionIt's possible to delete voucher codes as long they're not in use
+

Create Voucher Code

+

There are two ways to generate Codes:

+

Single Voucher Code

+

Create a single voucher code. +The input field allows any string input, however if you already have added a code with the same string, you'll get a unique error message.

+

Voucher Codes Generator

+

This is the more advanced option to generate voucher codes:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
AmountDefine how many voucher codes should be generated
LengthDefine the Voucher Code Length
FormatVoucher Format. Possible Values: Alphanumeric, Alphabetic, Numeric
PrefixDefine a prefix for each code. For example SHOP-
SuffixDefine a suffix for each code. For example -SHOP
Hyphens all X charactersAdd a Dash (-) after every X character
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/index.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/index.html new file mode 100644 index 0000000000..85dfec0600 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/index.html @@ -0,0 +1,213 @@ + + + + + + + Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Price Rules

+

CoreShop Price Rules are very powerful tools for price calculation. +This section will help you to get a detailed overview about how price calculation works in CoreShop:

+

Types of Price Rules

+

There are three Price Rule Types.

+

1. Cart Price Rules

+

Apply Price Rule to the customers cart.

+

2. Product Price Rules

+

Apply Price Rule globally.

+

3. Specific Product Prices

+

Apply Price Rules to specific products.

+

Global Priority

+
    +
  • Product Price Rules first
  • +
  • Specific Price Rules second
  • +
+

Example 1:

+
    +
  • Given: Product A with price 100,-
  • +
  • Product Price Rule for Product A: New Price 50,-
  • +
  • Specific Price Rule for Product A: New Price: 20,-
  • +
  • Given Price: 20,-
  • +
+

Example 2:

+
    +
  • Given: Product A with price 100,-
  • +
  • Product Price Rule for Product A: Discount Percentage 50%
  • +
  • Specific Price Rule for Product A: New Price: 50,-
  • +
  • Given Price: 25,-
  • +
+

Specific Price Priority

+

Since it's possible to add multiple Specific Price Rules per Product you can adjust the +priority via the priority number field.

+

Automatic Rule Availability Checker

+

Rules with time-span elements included on root level will be disabled automatically if they're outdated. +Read more about automation here.

+

More Information

+ +
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Abandoned_Carts.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Abandoned_Carts.html new file mode 100644 index 0000000000..585506d389 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Reports/Abandoned_Carts.html @@ -0,0 +1,257 @@ + + + + + + + Abandoned Carts - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Abandoned Carts Report

+ + + + + + + + + + + + + +
TypeHas Pagination
ListYes
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Grid Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
Customer NameCustomer name (if available)
EmailCustomer Email (if available)
Selected PaymentName of selected Payment
Creation DateCreation Date
Modification DateModification Date
Items in CartAmount of Items in Cart
ActionOpen Cart Object
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Carrier_Distribution.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Carrier_Distribution.html new file mode 100644 index 0000000000..b1ffa22f8f --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Reports/Carrier_Distribution.html @@ -0,0 +1,221 @@ + + + + + + + Carrier Distribution - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Carrier Distribution Report

+

Carrier Distribution

+ + + + + + + + + + + + + +
TypeHas Pagination
Pie ChartNo
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Chart Fields

+

Carrier Distribution

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Carts.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Carts.html new file mode 100644 index 0000000000..7153bc7d5c --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Reports/Carts.html @@ -0,0 +1,238 @@ + + + + + + + Carts - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Cart/Order Conversion Report

+

Carts Report

+ + + + + + + + + + + + + +
TypeHas Pagination
Cartesian ChartNo
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Chart Fields

+ + + + + + + + + + + + + + + + + +
NameDescription
YAmount (Cart, Order)
XDate
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Categories.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Categories.html new file mode 100644 index 0000000000..697421e94e --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Reports/Categories.html @@ -0,0 +1,250 @@ + + + + + + + Categories - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Categories Report

+

Categories Report

+ + + + + + + + + + + + + +
TypeHas Pagination
ListNo
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Grid Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
NameProduct Name
Order CountAmount of Orders
QuantityQuantity
SalesSales
ProfitProfit
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Customers.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Customers.html new file mode 100644 index 0000000000..af8cfa820e --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Reports/Customers.html @@ -0,0 +1,242 @@ + + + + + + + Customers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Customers Report

+

Customers Report

+ + + + + + + + + + + + + +
TypeHas Pagination
ListNo
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Grid Fields

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
NameCustomer Name
Order CountAmount of Orders
SalesSales
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Payment_Distribution.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Payment_Distribution.html new file mode 100644 index 0000000000..1c247846e8 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Reports/Payment_Distribution.html @@ -0,0 +1,221 @@ + + + + + + + Payment Distribution - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Payment Distribution Report

+

Payment Distribution

+ + + + + + + + + + + + + +
TypeHas Pagination
Pie ChartNo
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Chart Fields

+

Payment Provider Distribution

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Products.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Products.html new file mode 100644 index 0000000000..751dfb981e --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Reports/Products.html @@ -0,0 +1,281 @@ + + + + + + + Products - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Products Report

+

Products Report

+ + + + + + + + + + + + + +
TypeHas Pagination
ListYes
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
Product TypesGroup Filter by Main Products, Variants, Container Products
+

Product Types

+ + + + + + + + + + + + + + + + + + + + + +
NameDescription
Main ProductsOnly show Products without Variant inclusion
VariantsOnly show Variant Product Types
Container ProductsShow Sum of Products and Child-Products. Note: Container Products are bounded to the original pimcore objects. The products will be ignored in this report, if those main-objects have been deleted!
+

Available Grid Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
NameProduct Name
Order CountAmount of Order
QuantityQuantity
Sale PriceSale Price
SalesAmount of Sales
ProfitAmount of Profit
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Sales.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Sales.html new file mode 100644 index 0000000000..f519956915 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Reports/Sales.html @@ -0,0 +1,242 @@ + + + + + + + Sales - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Sales Report

+

Sales Report

+ + + + + + + + + + + + + +
TypeHas Pagination
Cartesian ChartNo
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
Group ByGroup Filter by Day, Month, Year
+

Available Chart Fields

+ + + + + + + + + + + + + + + + + +
NameDescription
YAmount (Sales)
XDate
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Vouchers.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Vouchers.html new file mode 100644 index 0000000000..6fb7c3fe9a --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Reports/Vouchers.html @@ -0,0 +1,245 @@ + + + + + + + Vouchers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Voucher Report

+ + + + + + + + + + + + + +
TypeHas Pagination
ListYes
+

Available Filters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
+

Available Grid Fields

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescription
CodeApplied Code
DiscountAmount of Discount
Price RuleName of applied Price Rule
Applied DateApplied Date
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/index.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/index.html new file mode 100644 index 0000000000..f0e0aa9ba6 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Reports/index.html @@ -0,0 +1,186 @@ + + + + + + + Reports - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Settings.html b/docs/generated-docs/generated_docs/User_Documentation/Settings.html new file mode 100644 index 0000000000..42b2a20812 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Settings.html @@ -0,0 +1,230 @@ + + + + + + + Settings - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop's Settings are divided into each "sub"-shop and some system settings.

+

Shop-Settings

+

Settings can be different for each Store.

+

Settings

+

Base

+
    +
  • Catalog-Mode: With catalog-mode enabled, the cart and checkout are disabled. Products can only be viewed.
  • +
  • Guest-Checkout: Enables or disables guest-checkout feature
  • +
+

Customer Service

+
    +
  • Customer Email Document: Email document used to send customer messages
  • +
  • Customer Re Email Document: Email document used to send customer reply messages
  • +
  • Contact Email Document: Email document used to send contact messages
  • +
  • Contact Sales: Default contact used for sales messages
  • +
  • Contact Technology: Default contact used for technology messages
  • +
+

Stock

+
    +
  • Default Stock Behaviour: Describes the default stock behaviour for products
  • +
+

Tax

+
    +
  • Validate VAT: Describes if the VAT-Number for European Countries should be validated
  • +
  • Disable VAT for Base Country: Disable VAT-Free Shopping for Customers, with valid Vat-Number, in Base Country
  • +
  • Taxation Address: Describes witch address is responsibly for taxation
  • +
+

Prices

+
    +
  • Prices are gross prices: Determines if entered prices in CoreShop are with or without tax included.
  • +
+

Shipping

+
    +
  • Free Shipping starts at weight: Describes free shipping at weight. It's also much faster using this than price-rules
  • +
  • Free Shipping starts at Currency: Describes free shipping at cart value. It's also much faster using this than price-rules
  • +
  • Carrier Sort: Describes how the Carriers should be sorted
  • +
+

Product

+
    +
  • Default Image: Defines an default image for products if no image is available.
  • +
  • Number of days as new: Defines the time of days a product is marked as new.
  • +
+

Category

+
    +
  • Default Image: Defines an default image for categories if no image is available.
  • +
+

Invoice

+
    +
  • Create Invoice for Orders: Defines if invoices are going to be created on an paid order.
  • +
  • Prefix: Prefix string for Order and Invoice numbers
  • +
  • Suffix: Suffix string for Orders and Invoice numbers.
  • +
  • WKHTMLTOPDF Parameters: Parameters which will be passed to WKHTMLTOPDF
  • +
+

Mail Settings

+
    +
  • admin email-addresses to send order notification (CSV): Email addresses which will be notified on new orders
  • +
  • Send OrderStates as BCC to admin email-addresses: Determines if order-state emails should also be sent to admin-emails
  • +
+

Cart

+
    +
  • Activate automatic cart cleanup: Activate automatic cart cleanup -> cleans inactive and empty carts
  • +
+

System - Settings

+

System Settings are defined one time for all shops.

+

System Settings

+

System Settings

+
    +
  • Send Usagelog to CoreShop: Sends an anonymous usagelog to CoreShop Developer
  • +
+

Currency

+
    +
  • Automatic Exchange Rates: Describes if exchange rates should be fetched automatically
  • +
  • Exchange Rate Provider: Describes which exchange rate provider should be used.
  • +
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Shipping/Carriers.html b/docs/generated-docs/generated_docs/User_Documentation/Shipping/Carriers.html new file mode 100644 index 0000000000..a874852f23 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Shipping/Carriers.html @@ -0,0 +1,176 @@ + + + + + + + Carriers - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Carriers Documentation

+

CoreShop Carriers are an essential part of the shipping process in the CoreShop e-commerce framework, built on the Pimcore platform. Carriers represent shipping providers (e.g., UPS, FedEx, or DHL) and are responsible for delivering orders to customers. This documentation will guide you through the process of creating and managing carriers in CoreShop.

+

Creating a Carrier

+

To create a carrier, follow these steps:

+
    +
  • Log in to the CoreShop admin interface.
  • +
  • Navigate to the "Shipping" tab and click on "Carriers."
  • +
  • Click the "Add new" button to create a new carrier.
  • +
  • Enter a name for the carrier and configure the other available options as needed.
  • +
+

Carrier Options

+

When creating a carrier, you can configure various options to customize its behavior:

+
    +
  • Name: A descriptive name for the carrier (e.g., UPS, FedEx, or DHL).
  • +
  • Tracking Url: A string value that indicates the tracking url
  • +
  • Tax Rule Group: The tax rule group applied to shipping costs for this carrier. If you want to apply taxes to shipping costs, you'll need to create a tax rule group and assign it to the carrier.
  • +
  • Shipping Rules: The shipping rules associated with this carrier. Shipping rules define shipping costs based on various conditions such as weight, price, dimensions, and destination. You can assign multiple shipping rules to a carrier, and the system will evaluate them in order of priority to determine the final shipping cost.
  • +
+

Summary

+

CoreShop Carriers provide a robust way to manage shipping providers and their associated services. By creating carriers and configuring their options, you can offer customers a range of shipping choices based on factors such as delivery time and cost. Combined with shipping rules, carriers give you the flexibility to create a tailored shipping experience for your e-commerce store.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Shipping/Shipping_Rules.html b/docs/generated-docs/generated_docs/User_Documentation/Shipping/Shipping_Rules.html new file mode 100644 index 0000000000..c4d6d2f293 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Shipping/Shipping_Rules.html @@ -0,0 +1,201 @@ + + + + + + + Shipping Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Shipping Rules Documentation

+

CoreShop Shipping Rules is a powerful feature within the CoreShop e-commerce framework built on the Pimcore platform. It allows you to create flexible and customizable shipping rules that define shipping costs based on various conditions such as weight, price, dimensions, and shipping destination.

+

Overview

+

Shipping rules in CoreShop can be composed of conditions and actions. Conditions determine whether a rule should be applied, while actions define the changes to the shipping costs.

+

CoreShop provides a user-friendly interface for creating and managing shipping rules. You can create multiple rules, each with different conditions and actions, to cover various scenarios.

+

Creating Shipping Rules

+
    +
  • Navigate to the "Shipping" tab and click on "Shipping Rules."
  • +
  • Click the "Add new" button to create a new shipping rule.
  • +
  • Enter a name for the rule and configure the other available options as needed.
  • +
+

Configuring Conditions

+

Conditions determine whether the shipping rule should be applied to an order. You can create multiple conditions for a single rule, and all conditions must be met for the rule to be applied. CoreShop offers several types of conditions, including:

+
    +
  • Weight: Based on the total weight of the order.
  • +
  • Price: Based on the total price of the order.
  • +
  • Dimension: Based on the dimensions (length, width, and height) of the order.
  • +
  • Quantity: Based on the total quantity of items in the order.
  • +
  • Countries: Based on the shipping destination country.
  • +
  • Zones: Based on the shipping destination zone (a group of countries).
  • +
+

To add a condition to your shipping rule:

+
    +
  • Click the "Add Condition" button in the "Conditions" section of the shipping rule.
  • +
  • Choose the desired condition type from the dropdown menu.
  • +
  • Configure the condition parameters as needed.
  • +
+

For example, if you want to apply a shipping rule only to orders with a total weight of over 10kg, you would add a weight condition and set the minimum weight to 10kg.

+

Configuring Actions

+

Actions define the changes to the shipping costs when a rule is applied. You can create multiple actions for a single rule. CoreShop offers several types of actions, including:

+
    +
  • Discount Amount: Apply a fixed discount amount to the shipping cost.
  • +
  • Discount Percentage: Apply a percentage discount to the shipping cost.
  • +
  • Add Amount: Add a fixed amount to the shipping cost.
  • +
  • Add Percentage: Add a percentage amount to the shipping cost.
  • +
+

To add an action to your shipping rule:

+
    +
  • Click the "Add Action" button in the "Actions" section of the shipping rule.
  • +
  • Choose the desired action type from the dropdown menu.
  • +
  • Configure the action parameters as needed.
  • +
+

For example, if you want to apply a 20% discount to the shipping cost when the rule is applied, you would add a discount percentage action and set the percentage value to 20.

+

Summary

+

CoreShop Shipping Rules offer a powerful and flexible way to define and manage shipping costs for your e-commerce store. By creating various conditions and actions, you can customize shipping costs based on factors such as weight, price, dimensions, and destination. This allows you to cater to different customer needs and provide more accurate shipping estimates.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Shipping/index.html b/docs/generated-docs/generated_docs/User_Documentation/Shipping/index.html new file mode 100644 index 0000000000..d268ef2d7c --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Shipping/index.html @@ -0,0 +1,166 @@ + + + + + + + Shipping - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/Stores.html b/docs/generated-docs/generated_docs/User_Documentation/Stores.html new file mode 100644 index 0000000000..ff735bc941 --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/Stores.html @@ -0,0 +1,180 @@ + + + + + + + Stores - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Stores

+

Every CoreShop Installation is bounded to a default Store. +By default a store is connected with a pimcore Site.

+

Stores

+

Domain based Store

+

This is CoreShops default behaviour. One store for your default page, which is also your default store. +If you have multiple Domains it's possible to add a store to each domain.

+
+

Tip: Learn more about pimcore multi sites: Pimcore Sites

+
+

Custom Store Locator

+

Sometimes you have just one site installation but you want do use different Stores. +Example: /de-at should use a austrian store and /de-de a german one. +For that you need to build a custom store locator to do so, checkout the dev section to find out how this can be achieved.

+

Configure CoreShop Stores

+

Open CoreShop Menu -> "Stores". There should be already a default store, connected to your default (main-domain) site. +To create a new store, click on the "Add" button. Proceed wih configuring your new store.

+

Examples

+

Stores can be used in many ways, checkout the examples to find out which solution suits you most.

+

Example 1: Global Store

+

Use a Store to handle multiple currencies, countries and tax calculations. +Depending on your product and price strategy, it's possible to use it within one store.

+

Example 2: Country Store

+

Use a Store for each Country. This allows you to restrict your shop within a country context.

+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/User_Documentation/index.html b/docs/generated-docs/generated_docs/User_Documentation/index.html new file mode 100644 index 0000000000..ff7968564f --- /dev/null +++ b/docs/generated-docs/generated_docs/User_Documentation/index.html @@ -0,0 +1,298 @@ + + + + + + + User Documentation - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ + + +
+ + Edit on GitHub + +
+ +
+

User Documentation

+

This section provides a quick getting started tutorial for CoreShop and covers the following topics:

+
    +
  1. +Stores +
  2. +
  3. +Settings +
  4. +
  5. +Price Rules +
      +
    1. +Cart Price Rules +
    2. +
    3. +Product Price Rules +
    4. +
    5. +Specific Product Price +
    6. +
    7. +Vouchers +
    8. +
    9. +Available Actions +
    10. +
    11. +Available Conditions +
    12. +
    +
  6. +
  7. +Localization +
      +
    1. +Countries +
    2. +
    3. +States +
    4. +
    5. +Zones +
    6. +
    7. +Taxes +
    8. +
    9. +Taxes +
    10. +
    11. +TaxRules +
    12. +
    +
  8. +
  9. +Shipping +
      +
    1. +Carriers +
    2. +
    3. +Shipping Rules +
    4. +
    +
  10. +
  11. +Cart +
  12. +
  13. +Order +
      +
    1. +Orders +
    2. +
    3. +Order Detail +
    4. +
    5. +Order Workflow +
    6. +
    7. +Order Comments +
    8. +
    +
  14. +
  15. +Catalog +
      +
    1. +Products +
    2. +
    3. +Product Variants +
    4. +
    5. +Categories +
    6. +
    +
  16. +
  17. +Inventory +
  18. +
  19. +GEO IP +
  20. +
  21. +Reports +
      +
    1. +Sales +
    2. +
    3. +Cart/Order Conversion +
    4. +
    5. +Abandoned Carts +
    6. +
    7. +Products +
    8. +
    9. +Categories +
    10. +
    11. +Customers +
    12. +
    13. +Carrier Distribution +
    14. +
    15. +Payment Distribution +
    16. +
    17. +Vouchers +
    18. +
    +
  22. +
  23. +Automation +
  24. +
+
+ + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/generated_docs/index.html b/docs/generated-docs/generated_docs/index.html new file mode 100644 index 0000000000..b8f33f5bec --- /dev/null +++ b/docs/generated-docs/generated_docs/index.html @@ -0,0 +1,193 @@ + + + + + + + CoreShop - Pimcore eCommerce Framework - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Documentation

+
+

This documentation section provides all information you need to use the CoreShop - Pimcore eCommerce Framework

+

We've aimed this part of the documentation at a developer's audience.

+
+

CoreShop provides a fully flexible and extendable eCommerce Solution for Pimcore. If you want to know more about Pimcore, please visit pimcore.com.

+

Documentation Overview

+

The Core Framework documentation is divided into three sections that aim to guide the reader through its first use of the platform:

+
    +
  • See the Getting Started section for an overview and information about the installation process.
  • +
  • See the Bundles section for details about the different Bundles CoreShop provides.
  • +
  • See the User Documentation section for documentation configuration of CoreShop.
  • +
  • See the Development section for documentation about developing with CoreShop.
  • +
+

Additional resources for getting started with CoreShop

+
    +
  • +CoreShop Demo: See CoreShop in action and also use it as a blueprint application for your own implementations.
  • +
+ + +

+ +

Also check out our Pimcore Extensions

+ +
+ + +
+ +
+
Pimcore
+ +

Pimcore

+

Picmore Docs

+ + More Information +
+
+ + +
+ +
+ + +
+
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/index.html b/docs/generated-docs/index.html new file mode 100644 index 0000000000..b8f33f5bec --- /dev/null +++ b/docs/generated-docs/index.html @@ -0,0 +1,193 @@ + + + + + + + CoreShop - Pimcore eCommerce Framework - CoreShop 3.0.x - Pimcore eCommerce - Documentation + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ + + +
+ + Edit on GitHub + +
+ +
+

CoreShop Documentation

+
+

This documentation section provides all information you need to use the CoreShop - Pimcore eCommerce Framework

+

We've aimed this part of the documentation at a developer's audience.

+
+

CoreShop provides a fully flexible and extendable eCommerce Solution for Pimcore. If you want to know more about Pimcore, please visit pimcore.com.

+

Documentation Overview

+

The Core Framework documentation is divided into three sections that aim to guide the reader through its first use of the platform:

+
    +
  • See the Getting Started section for an overview and information about the installation process.
  • +
  • See the Bundles section for details about the different Bundles CoreShop provides.
  • +
  • See the User Documentation section for documentation configuration of CoreShop.
  • +
  • See the Development section for documentation about developing with CoreShop.
  • +
+

Additional resources for getting started with CoreShop

+
    +
  • +CoreShop Demo: See CoreShop in action and also use it as a blueprint application for your own implementations.
  • +
+ + +

+ +

Also check out our Pimcore Extensions

+ +
+ + +
+ +
+
Pimcore
+ +

Pimcore

+

Picmore Docs

+ + More Information +
+
+ + +
+ +
+ + +
+
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/docs/generated-docs/themes/pimcore/config.json b/docs/generated-docs/themes/pimcore/config.json new file mode 100644 index 0000000000..5640881e93 --- /dev/null +++ b/docs/generated-docs/themes/pimcore/config.json @@ -0,0 +1,22 @@ +{ + "favicon": "img/favicon.png", + "css": [], + "js": [ + "js/build/pimcore.min.js" + ], + "fonts": [ + "//fonts.googleapis.com/css?family=Open+Sans:100,200,300,400,500,600,700,800,900" + ], + "variants": { + "core": { + "css": [ + "css/pimcore-core.min.css" + ] + }, + "generic": { + "css": [ + "css/pimcore-generic.min.css" + ] + } + } +} diff --git a/docs/generated-docs/themes/pimcore/css/pimcore-core.min.css b/docs/generated-docs/themes/pimcore/css/pimcore-core.min.css new file mode 100644 index 0000000000..04cf4e0e15 --- /dev/null +++ b/docs/generated-docs/themes/pimcore/css/pimcore-core.min.css @@ -0,0 +1,5 @@ +/*! + * Pimcore Documentation + * License: GPLv3 + */ +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hidden{display:none!important}*,:after,:before{box-sizing:border-box}body{margin:0;padding:0}body,html{height:100%;background-color:#fff;color:#2d2d2d}.Columns__left{background-color:#f7f7f7}.Columns__right__content{padding:10px;background-color:#fff}.Collapsible__content{display:none}.Collapsible__trigger{margin:12px;padding:7px 10px;background-color:transparent;border:none;float:right;background-image:none;filter:none;box-shadow:none}.Collapsible__trigger--bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#0078be;box-shadow:none}.Collapsible__trigger:hover{background-color:#c5c5cb;box-shadow:none}.Collapsible__trigger:hover .Collapsible__trigger--bar{background-color:#3f4657;box-shadow:none}@media screen and (min-width:768px){body{background-color:#0078be}.Navbar{position:fixed;z-index:1030;width:100%}.Collapsible__trigger{display:none!important}.Collapsible__content{display:block!important}.Columns{height:100%}.Columns:after,.Columns:before{content:" ";display:table}.Columns:after{clear:both}.Columns__left,.Columns__right{position:relative;min-height:1px;float:left;overflow:auto;height:100%}.Columns__left{width:25%;border-right:1px solid #e7e7e9;overflow-x:hidden}.Columns__right{width:75%}.Columns__right__content{padding:0 20px 20px;min-height:100%}}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;line-height:1.5}h1,h2,h3,h4,h5,h6{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300}.s-content body{font-size:15px}.s-content h1,.s-content h2,.s-content h3,.s-content h4,.s-content h5,.s-content h6{font-weight:300;-webkit-font-smoothing:antialiased;cursor:text;line-height:1.4em;margin-top:.3em;margin-bottom:.3em}.s-content h1 code,.s-content h1 tt,.s-content h2 code,.s-content h2 tt,.s-content h3 code,.s-content h3 tt,.s-content h4 code,.s-content h4 tt,.s-content h5 code,.s-content h5 tt,.s-content h6 code,.s-content h6 tt{font-size:inherit}.s-content h1 i,.s-content h2 i,.s-content h3 i,.s-content h4 i,.s-content h5 i,.s-content h6 i{font-size:.7em}.s-content h1 p,.s-content h2 p,.s-content h3 p,.s-content h4 p,.s-content h5 p,.s-content h6 p{margin-top:0}.s-content h1{font-size:2.66666667em;color:#000}.s-content h2{font-size:2em;border-bottom:1px solid #eee;color:#000}.s-content h3{font-size:1.73333333em}.s-content h4{font-size:1.46666667em}.s-content h5{font-size:1.2em}.s-content h6{font-size:1.06666667em;color:#555}.s-content a{text-decoration:underline}.s-content p{line-height:1.8em;margin-bottom:20px}.s-content ol,.s-content ul{padding-left:30px}.s-content ul p,.s-content ul ul{margin:0}.s-content dl{padding:0}.s-content dl dt{font-weight:700;font-style:italic;padding:0;margin:15px 0 5px}.s-content dl dt:first-child{padding:0}.s-content dl dd{margin:0 0 15px;padding:0 15px}.s-content blockquote{font-size:1.2em;border-left:4px solid #ddd;padding:7px 15px}.s-content blockquote p{font-size:inherit}.s-content table{width:100%;padding:0;border-collapse:collapse}.s-content table tr{border-top:1px solid #eee;background-color:#fff;margin:0;padding:0}.s-content table tr:nth-child(2n){background-color:#f8f8f8}.s-content table th{font-weight:700;background:#eee}.s-content table td,.s-content table th{border:1px solid #eee;margin:0;padding:6px 13px}.s-content blockquote>:first-child,.s-content dl dd>:first-child,.s-content dl dt>:first-child,.s-content ol>:first-child,.s-content table td>:first-child,.s-content table th>:first-child,.s-content ul>:first-child{margin-top:0}.s-content blockquote>:last-child,.s-content dl dd>:last-child,.s-content dl dt>:last-child,.s-content ol>:last-child,.s-content table td>:last-child,.s-content table th>:last-child,.s-content ul>:last-child{margin-bottom:0}.s-content img{max-width:100%;display:block;margin:0 auto}.s-content code{font-family:Monaco,Menlo,Consolas,Courier New,monospace}.s-content code,.s-content tt{margin:0 2px;padding:0 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px}.s-content pre{background:#fdf6e3;color:#657b83;line-height:1.5em;overflow:auto;padding:20px;margin:0 -20px 20px}.s-content pre code{margin:0;padding:0;white-space:pre}.s-content pre code,.s-content pre tt{background-color:transparent;border:none}.s-content pre{border:none;border-radius:0;padding:10px 30px;margin-left:-20px;margin-right:-20px}@media (min-width:1150px){.Columns__right--float .Columns__right__content{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.Columns__right--float .Columns__right__content article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.Columns__right--float .Columns__right__content article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.Columns__right--float .Page__header,.Columns__right--float .Pager,.Columns__right--float .s-content blockquote,.Columns__right--float .s-content dl,.Columns__right--float .s-content h2,.Columns__right--float .s-content h3,.Columns__right--float .s-content h4,.Columns__right--float .s-content h5,.Columns__right--float .s-content h6,.Columns__right--float .s-content hr,.Columns__right--float .s-content ol,.Columns__right--float .s-content p,.Columns__right--float .s-content table,.Columns__right--float .s-content ul{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%}.Columns__right--float .s-content table{background-color:#fff;white-space:normal}.Columns__right--float .s-content table code,.Columns__right--float .s-content table pre{white-space:normal}.Columns__right--float .s-content blockquote:before,.Columns__right--float .s-content dl:before,.Columns__right--float .s-content h2:before,.Columns__right--float .s-content h3:before,.Columns__right--float .s-content h4:before,.Columns__right--float .s-content h5:before,.Columns__right--float .s-content h6:before,.Columns__right--float .s-content hr:before,.Columns__right--float .s-content ol:before,.Columns__right--float .s-content p:before,.Columns__right--float .s-content ul:before{width:100%;height:10px;display:block;clear:both}.Columns__right--float .s-content blockquote dl,.Columns__right--float .s-content blockquote h2,.Columns__right--float .s-content blockquote h3,.Columns__right--float .s-content blockquote h4,.Columns__right--float .s-content blockquote h5,.Columns__right--float .s-content blockquote h6,.Columns__right--float .s-content blockquote hr,.Columns__right--float .s-content blockquote ol,.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content blockquote ul,.Columns__right--float .s-content dl dl,.Columns__right--float .s-content dl h2,.Columns__right--float .s-content dl h3,.Columns__right--float .s-content dl h4,.Columns__right--float .s-content dl h5,.Columns__right--float .s-content dl h6,.Columns__right--float .s-content dl hr,.Columns__right--float .s-content dl ol,.Columns__right--float .s-content dl p,.Columns__right--float .s-content dl pre,.Columns__right--float .s-content dl ul,.Columns__right--float .s-content h2 dl,.Columns__right--float .s-content h2 h2,.Columns__right--float .s-content h2 h3,.Columns__right--float .s-content h2 h4,.Columns__right--float .s-content h2 h5,.Columns__right--float .s-content h2 h6,.Columns__right--float .s-content h2 hr,.Columns__right--float .s-content h2 ol,.Columns__right--float .s-content h2 p,.Columns__right--float .s-content h2 pre,.Columns__right--float .s-content h2 ul,.Columns__right--float .s-content h3 dl,.Columns__right--float .s-content h3 h2,.Columns__right--float .s-content h3 h3,.Columns__right--float .s-content h3 h4,.Columns__right--float .s-content h3 h5,.Columns__right--float .s-content h3 h6,.Columns__right--float .s-content h3 hr,.Columns__right--float .s-content h3 ol,.Columns__right--float .s-content h3 p,.Columns__right--float .s-content h3 pre,.Columns__right--float .s-content h3 ul,.Columns__right--float .s-content h4 dl,.Columns__right--float .s-content h4 h2,.Columns__right--float .s-content h4 h3,.Columns__right--float .s-content h4 h4,.Columns__right--float .s-content h4 h5,.Columns__right--float .s-content h4 h6,.Columns__right--float .s-content h4 hr,.Columns__right--float .s-content h4 ol,.Columns__right--float .s-content h4 p,.Columns__right--float .s-content h4 pre,.Columns__right--float .s-content h4 ul,.Columns__right--float .s-content h5 dl,.Columns__right--float .s-content h5 h2,.Columns__right--float .s-content h5 h3,.Columns__right--float .s-content h5 h4,.Columns__right--float .s-content h5 h5,.Columns__right--float .s-content h5 h6,.Columns__right--float .s-content h5 hr,.Columns__right--float .s-content h5 ol,.Columns__right--float .s-content h5 p,.Columns__right--float .s-content h5 pre,.Columns__right--float .s-content h5 ul,.Columns__right--float .s-content h6 dl,.Columns__right--float .s-content h6 h2,.Columns__right--float .s-content h6 h3,.Columns__right--float .s-content h6 h4,.Columns__right--float .s-content h6 h5,.Columns__right--float .s-content h6 h6,.Columns__right--float .s-content h6 hr,.Columns__right--float .s-content h6 ol,.Columns__right--float .s-content h6 p,.Columns__right--float .s-content h6 pre,.Columns__right--float .s-content h6 ul,.Columns__right--float .s-content hr dl,.Columns__right--float .s-content hr h2,.Columns__right--float .s-content hr h3,.Columns__right--float .s-content hr h4,.Columns__right--float .s-content hr h5,.Columns__right--float .s-content hr h6,.Columns__right--float .s-content hr hr,.Columns__right--float .s-content hr ol,.Columns__right--float .s-content hr p,.Columns__right--float .s-content hr pre,.Columns__right--float .s-content hr ul,.Columns__right--float .s-content ol dl,.Columns__right--float .s-content ol h2,.Columns__right--float .s-content ol h3,.Columns__right--float .s-content ol h4,.Columns__right--float .s-content ol h5,.Columns__right--float .s-content ol h6,.Columns__right--float .s-content ol hr,.Columns__right--float .s-content ol ol,.Columns__right--float .s-content ol p,.Columns__right--float .s-content ol pre,.Columns__right--float .s-content ol ul,.Columns__right--float .s-content p dl,.Columns__right--float .s-content p h2,.Columns__right--float .s-content p h3,.Columns__right--float .s-content p h4,.Columns__right--float .s-content p h5,.Columns__right--float .s-content p h6,.Columns__right--float .s-content p hr,.Columns__right--float .s-content p ol,.Columns__right--float .s-content p p,.Columns__right--float .s-content p pre,.Columns__right--float .s-content p ul,.Columns__right--float .s-content ul dl,.Columns__right--float .s-content ul h2,.Columns__right--float .s-content ul h3,.Columns__right--float .s-content ul h4,.Columns__right--float .s-content ul h5,.Columns__right--float .s-content ul h6,.Columns__right--float .s-content ul hr,.Columns__right--float .s-content ul ol,.Columns__right--float .s-content ul p,.Columns__right--float .s-content ul pre,.Columns__right--float .s-content ul ul{width:auto;float:none;display:block}.Columns__right--float .s-content hr{border-color:#ddd}.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content li p,.Columns__right--float .s-content li pre{width:100%}.Columns__right--float .s-content pre{float:left;clear:right;width:50%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0}.Columns__right--float .s-content pre code{padding:0 .5em}}a{text-decoration:none;color:#cd1017}a.external:after{content:" " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=)}a.broken{color:red}p{margin:0 0 1em}hr{clear:both;margin:1em 0;border:0;border-top:1px solid #ddd}code{color:#3f4657}.Button{display:inline-block;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;border-radius:4px}.Button--small{font-size:12px;line-height:1.5;border-radius:3px}.Button--default{color:#333;background-color:#fff;border-color:#ccc}.Button--default.Button--active{color:#333;background-color:#e6e6e6;border-color:#adadad}.ButtonGroup{position:relative;display:inline-block;vertical-align:middle}.ButtonGroup .Button+.Button{margin-left:-1px}.ButtonGroup>.Button{position:relative;float:left}.ButtonGroup>.Button:focus,.ButtonGroup>.Button:hover{z-index:2}.ButtonGroup>.Button.Button--active,.ButtonGroup>.Button:active{z-index:3}.ButtonGroup>.Button:not(:first-child):not(:last-child){border-radius:0}.ButtonGroup>.Button:first-child{margin-left:0}.ButtonGroup>.Button:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.ButtonGroup>.Button:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.Brand{display:block;padding:15px 20px;font-size:18px;text-shadow:none;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;color:#0078be}.Brand,.Navbar{background-color:#3f4657}.Navbar{height:50px;box-shadow:0 1px 5px rgba(0,0,0,.25);margin-bottom:0}.Navbar .Brand{float:left;line-height:20px;height:50px}.CodeToggler__text{font-size:12px;line-height:1.5;padding:6px 10px 6px 0;display:inline-block;vertical-align:middle}.Nav{margin:0;padding:0}.Nav__arrow{display:inline-block;position:relative;width:16px;margin-left:-16px}.Nav__arrow:before{position:absolute;display:block;content:"";margin:-.25em 0 0 -.4em;left:50%;top:50%;width:.5em;height:.5em;border-right:.15em solid #3f4657;border-top:.15em solid #3f4657;transform:rotate(45deg);transition-duration:.3s}.Nav__item{display:block}.Nav__item a{display:block;margin:0;padding:6px 15px 6px 20px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#3f4657;font-size:15px;text-shadow:none;border-color:#e7e7e9}.Nav__item a:hover{color:#3f4657;text-shadow:none;background-color:#c5c5cb}.Nav .Nav{display:none;margin-left:15px}.Nav .Nav .Nav__item a{margin:0 0 0 -15px;padding:3px 30px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;color:#2d2d2d;opacity:.7}.Nav .Nav .Nav__item a:hover{opacity:1}.Nav .Nav .Nav__item--active a{color:#3f4657}.Nav__item--active>a,.Nav__item--open>a{background-color:#c5c5cb}.Nav__item--open>.Nav{display:block}.Nav__item--open>a>.Nav__arrow:before{margin-left:-.25em;transform:rotate(135deg)}.Page__header{margin:0 0 10px;padding:0;border-bottom:1px solid #eee}.Page__header:after,.Page__header:before{content:" ";display:table}.Page__header:after{clear:both}.Page__header h1{margin:0;padding:0;line-height:57px}.Page__header--separator{height:.6em}.Page__header a{text-decoration:none}.Links{padding:0 20px}.Links a{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#0078be;line-height:2em}.Search{position:relative}.Search__field{display:block;width:100%;height:34px;padding:6px 30px 6px 20px;color:#555;border-width:0 0 1px;border-bottom:1px solid #ccc;background:#fff;transition:border-color .15s ease-in-out}.Search__field:focus{border-color:#0078be;outline:0}.Search__icon{position:absolute;right:9px;top:9px;width:16px;height:16px}.Navbar .Search{float:right;margin:8px 20px}.Navbar .Search__field{box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-width:0;border-radius:4px;padding-left:10px}.TableOfContents{font-size:16px;padding-left:0;border-left:6px solid #efefef}.TableOfContents p{margin-bottom:0}.TableOfContents a{text-decoration:none}.TableOfContents .TableOfContents{border-left-width:0}.Pager{padding-left:0;margin:1em 0;list-style:none;text-align:center;clear:both}.Pager:after,.Pager:before{content:" ";display:table}.Pager:after{clear:both}.Pager li{display:inline}.Pager li>a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.Pager li>a:focus,.Pager li>a:hover{text-decoration:none;background-color:#eee}.Pager--next>a{float:right}.Pager--prev>a{float:left}.container{margin-right:auto;margin-left:auto}@media (min-width:992px){.container{width:970px}}@media (min-width:768px){.container{width:750px}}@media (min-width:1200px){.container{width:1170px}}.container--inner{width:80%;margin:0 auto}.Homepage{padding-top:60px!important;background-color:#0078be;border-radius:0;border:none;color:#3f4657;overflow:hidden;padding-bottom:0;margin-bottom:0;box-shadow:none}.HomepageTitle h2{width:80%;font-size:30px;margin:20px auto;text-align:center}.HomepageImage img{display:block;max-width:80%;margin:0 auto;height:auto}.HomepageButtons{padding:20px 0;background-color:#c5c5cb;text-align:center}.HomepageButtons .Button--hero{padding:20px 30px;border-radius:0;text-shadow:none;opacity:.8;margin:0 10px;text-transform:uppercase;border:5px solid #3f4657;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;background-image:none;filter:none;box-shadow:none}@media (max-width:768px){.HomepageButtons .Button--hero{display:block;margin-bottom:10px}}.HomepageButtons .Button--hero:hover{opacity:1}.HomepageButtons .Button--hero.Button--secondary{background-color:#c5c5cb;color:#3f4657}.HomepageButtons .Button--hero.Button--primary{background-color:#3f4657;color:#f7f7f7}.HomepageContent{background-color:#fff;padding:40px 0}@media (min-width:769px){.HomepageContent .row{margin:0 -15px}.HomepageContent .col-third{width:33.333333%;float:left;position:relative;min-height:1px;padding-left:15px;padding-right:15px}}.HomepageContent ol li,.HomepageContent ul li{list-style:none;padding-bottom:.5em}.HomepageContent ol li:before,.HomepageContent ul li:before{content:"";width:0;height:0;border:3px solid transparent;border-left-color:#0078be;float:left;display:block;margin:6px 6px 6px -12px}.HomepageContent .lead{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300;font-size:16px;margin-bottom:20px;line-height:1.4}@media (min-width:768px){.HomepageContent{padding:40px 20px}.HomepageContent .lead{font-size:21px}}.HomepageFooter{background-color:#3f4657;border-radius:0;color:#0078be;border:none;box-shadow:none}@media (max-width:768px){.HomepageFooter{padding:0 20px;text-align:center}.HomepageFooter .HomepageFooter__links{padding-left:0;list-style-type:none}}@media (min-width:769px){.HomepageFooter .HomepageFooter__links{float:left}.HomepageFooter .HomepageFooter__twitter{float:right}}.HomepageFooter__links{margin:40px 0}.HomepageFooter__links li a{line-height:32px;font-size:16px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700}.HomepageFooter__links li a:hover{color:#0078be;text-decoration:underline}.HomepageFooter__twitter{margin:40px 0}.HomepageFooter .Twitter{margin-bottom:20px}.s-content code{text-rendering:auto;-webkit-font-smoothing:initial;font-size:13px}.s-content pre{margin:20px -20px;background:#002b36}.s-content pre code{font-size:13px}.code-section pre{margin-top:0}.code-section .tab-pane{display:none}.code-section .tab-pane.active{display:block}.code-section .nav-tabs{list-style:none;border-bottom:none;padding-left:0;clear:left;margin-bottom:0}.code-section .nav-tabs:after,.code-section .nav-tabs:before{content:" ";display:table}.code-section .nav-tabs:after{clear:both}.code-section .nav-tabs li{float:left}.code-section .nav-tabs li a{display:block;background-color:#ddd;border-radius:4px 4px 0 0;border-color:#eee #eee #ddd;color:#333;padding:7px 12px;margin-right:4px}.code-section .nav-tabs li.active>a,.code-section .nav-tabs li.active>a:focus,.code-section .nav-tabs li.active>a:hover{background-color:#002b36;border-color:#222;color:#fff}.hljs{display:block;overflow-x:auto;padding:.5em;background:#002b36;color:#839496}.hljs-comment,.hljs-quote{color:#586e75}.hljs-addition,.hljs-keyword,.hljs-selector-tag{color:#859900}.hljs-doctag,.hljs-literal,.hljs-meta .hljs-meta-string,.hljs-number,.hljs-regexp,.hljs-string{color:#2aa198}.hljs-name,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-title{color:#268bd2}.hljs-attr,.hljs-attribute,.hljs-class .hljs-title,.hljs-template-variable,.hljs-type,.hljs-variable{color:#b58900}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-meta .hljs-keyword,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-subst,.hljs-symbol{color:#cb4b16}.hljs-built_in,.hljs-deletion{color:#dc322f}.hljs-formula{background:#073642}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.alert{color:#464a4e;background:#e7e8ea;border-left:5px solid #dddfe2;min-height:20px;margin:15px 0;padding:15px;position:relative}.alert.alert-note{color:#004085;background:#cce5ff;border-color:#b8daff}.alert.alert-success{color:#155724;background:#d4edda;border-color:#c3e6cb}.alert.alert-warning{color:#856404;background:#fff3cd;border-color:#ffeeba}.alert.alert-danger,.alert.alert-error{color:#721c24;background:#f8d7da;border-color:#f5c6cb}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-before:auto}blockquote,pre{border:1px solid #999;font-style:italic}blockquote,img,pre{page-break-inside:avoid}img{border:0}a,a:visited{text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}q{quotes:none}q:before{content:""}q:after{content:" (" attr(cite) ")"}.page-break{display:block;page-break-before:always}.hidden-print,.Pager,aside{display:none}.Columns__right{width:100%!important}.s-content a:after{content:" (" attr(href) ")";font-size:80%;word-wrap:break-word}.s-content a[href^="#"]:after{content:""}h1 a[href]:after{font-size:50%}}body{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif}.Brand{background:#222;color:#fff}.Brand .Brand__logo{color:transparent;display:block;max-width:170px;height:50px;background:transparent url(../img/logo-white.svg) no-repeat 0}.Brand .subtitle{margin-top:5px;margin-bottom:0}.Pager{margin:30px 0 10px}.breadcrumbs,.s-content h2{margin-top:25px}.s-content a{text-decoration:none}.s-content img{margin:0}@media screen and (min-width:768px){.s-content img.img-narrow{max-width:50%}}.s-content table{margin-top:15px;margin-bottom:15px}.s-content blockquote{font-size:16px;border-color:#ffeaae;background:#fffdf6;color:#666;margin-left:0;margin-right:0}.s-content h1 .headerlink,.s-content h2 .headerlink,.s-content h3 .headerlink,.s-content h4 .headerlink,.s-content h5 .headerlink,.s-content h6 .headerlink{color:transparent;font-size:75%;font-weight:400;line-height:1;margin:0;padding:0 0 0 6px}.s-content h1:hover .headerlink,.s-content h2:hover .headerlink,.s-content h3:hover .headerlink,.s-content h4:hover .headerlink,.s-content h5:hover .headerlink,.s-content h6:hover .headerlink{color:#c5c5cb}.s-content h1:hover .headerlink:hover,.s-content h2:hover .headerlink:hover,.s-content h3:hover .headerlink:hover,.s-content h4:hover .headerlink:hover,.s-content h5:hover .headerlink:hover,.s-content h6:hover .headerlink:hover{color:#0078be}.disqus-separator{margin:15px 0 20px}.Columns__landing .Nav{padding-left:15px}.ribbon-box{position:relative}.ribbon-box .ribbon{position:absolute;right:-5px;top:-5px;z-index:1;overflow:hidden;width:86px;height:86px;text-align:right}.ribbon-box.navigation .ribbon{right:-26px;top:-78px}.ribbon-box .ribbon span{font-size:10px;font-weight:700;color:#fff;text-transform:uppercase;text-align:center;line-height:20px;transform:rotate(45deg);-webkit-transform:rotate(45deg);width:115px;display:block;background:linear-gradient(#2989d8,#1e5799);box-shadow:0 3px 10px -5px #000;position:absolute;top:24px;right:-23px}.ribbon-box .ribbon span:before{left:0;border-color:#1e5799 transparent transparent #1e5799}.ribbon-box .ribbon span:after,.ribbon-box .ribbon span:before{content:"";position:absolute;top:100%;z-index:-1;border-style:solid;border-width:3px}.ribbon-box .ribbon span:after{right:0;border-color:#1e5799 #1e5799 transparent transparent}@media screen and (max-width:768px){.ribbon-box.navigation .ribbon{top:44px;pointer-events:none}}.extension-card{border:1px solid #e7e7e9;border-radius:4px;padding:20px;height:100%;position:relative}.extension-card .button{display:inline-block;padding:5px 14px;border:1px solid #e7e7e9;border-radius:15px}.extension-card .button:hover{background-color:#e7e7e9}.action-box{font-size:12px;float:right}.action-box .edit_on{color:grey;margin-left:3px;display:block;text-align:right}.action-box .version-switcher{font-size:16px;display:block;margin-bottom:5px}.action-box .version-switcher select{margin-left:3px}.column{margin:20px 0}@media screen and (min-width:768px){.Columns__landing{display:flex;flex-wrap:wrap}.Columns__landing .column{width:48%}.Columns__landing .column:nth-child(2n){margin-left:4%}}aside.Collapsible .version-info{font-size:11px;margin-bottom:25px}.SearchResults .SearchResults__highlight{font-weight:400;background:#bee7ff}.SearchResults .SearchResults__text,.SearchResults .SearchResults__title,.SearchResults .SearchResults__url,.SearchResults .SearchResults__warning{font-weight:400}.SearchResults .SearchResults__text a,.SearchResults .SearchResults__title a,.SearchResults .SearchResults__url a,.SearchResults .SearchResults__warning a{color:#0078be}.landingpage .Nav__item--open>a{background:transparent!important}.landingpage .Columns__landing div>.Nav li a{background:none;line-height:1.5}.landingpage .Columns__landing div>.Nav>li>a{display:block;color:#0078be;padding-left:0;font-size:16px;margin-top:15px}.landingpage .Columns__landing div>.Nav>li ul>li>a{padding-left:16px}.Banner{margin:40px 0 10px}.Banner .img{width:100%}.lightbox{display:none;position:fixed;z-index:999;top:0;left:0;right:0;bottom:0;padding:1em;background:rgba(0,0,0,.8)}.lightbox:target{display:block}.lightbox img{width:100%;height:100%;object-fit:scale-down}.image-as-lightbox+p>img,img.lightbox-thumbnail{max-width:50%;max-height:350px} \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/css/pimcore-generic.min.css b/docs/generated-docs/themes/pimcore/css/pimcore-generic.min.css new file mode 100644 index 0000000000..c16cdddad7 --- /dev/null +++ b/docs/generated-docs/themes/pimcore/css/pimcore-generic.min.css @@ -0,0 +1,5 @@ +/*! + * Pimcore Documentation + * License: GPLv3 + */ +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hidden{display:none!important}*,:after,:before{box-sizing:border-box}body{margin:0;padding:0}body,html{height:100%;background-color:#fff;color:#2d2d2d}.Columns__left{background-color:#f7f7f7}.Columns__right__content{padding:10px;background-color:#fff}.Collapsible__content{display:none}.Collapsible__trigger{margin:12px;padding:7px 10px;background-color:transparent;border:none;float:right;background-image:none;filter:none;box-shadow:none}.Collapsible__trigger--bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#0078be;box-shadow:none}.Collapsible__trigger:hover{background-color:#c5c5cb;box-shadow:none}.Collapsible__trigger:hover .Collapsible__trigger--bar{background-color:#3f4657;box-shadow:none}@media screen and (min-width:768px){body{background-color:#0078be}.Navbar{position:fixed;z-index:1030;width:100%}.Collapsible__trigger{display:none!important}.Collapsible__content{display:block!important}.Columns{height:100%}.Columns:after,.Columns:before{content:" ";display:table}.Columns:after{clear:both}.Columns__left,.Columns__right{position:relative;min-height:1px;float:left;overflow:auto;height:100%}.Columns__left{width:25%;border-right:1px solid #e7e7e9;overflow-x:hidden}.Columns__right{width:75%}.Columns__right__content{padding:0 20px 20px;min-height:100%}}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;line-height:1.5}h1,h2,h3,h4,h5,h6{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300}.s-content body{font-size:15px}.s-content h1,.s-content h2,.s-content h3,.s-content h4,.s-content h5,.s-content h6{font-weight:300;-webkit-font-smoothing:antialiased;cursor:text;line-height:1.4em;margin-top:.3em;margin-bottom:.3em}.s-content h1 code,.s-content h1 tt,.s-content h2 code,.s-content h2 tt,.s-content h3 code,.s-content h3 tt,.s-content h4 code,.s-content h4 tt,.s-content h5 code,.s-content h5 tt,.s-content h6 code,.s-content h6 tt{font-size:inherit}.s-content h1 i,.s-content h2 i,.s-content h3 i,.s-content h4 i,.s-content h5 i,.s-content h6 i{font-size:.7em}.s-content h1 p,.s-content h2 p,.s-content h3 p,.s-content h4 p,.s-content h5 p,.s-content h6 p{margin-top:0}.s-content h1{font-size:2.66666667em;color:#000}.s-content h2{font-size:2em;border-bottom:1px solid #eee;color:#000}.s-content h3{font-size:1.73333333em}.s-content h4{font-size:1.46666667em}.s-content h5{font-size:1.2em}.s-content h6{font-size:1.06666667em;color:#555}.s-content a{text-decoration:underline}.s-content p{line-height:1.8em;margin-bottom:20px}.s-content ol,.s-content ul{padding-left:30px}.s-content ul p,.s-content ul ul{margin:0}.s-content dl{padding:0}.s-content dl dt{font-weight:700;font-style:italic;padding:0;margin:15px 0 5px}.s-content dl dt:first-child{padding:0}.s-content dl dd{margin:0 0 15px;padding:0 15px}.s-content blockquote{font-size:1.2em;border-left:4px solid #ddd;padding:7px 15px}.s-content blockquote p{font-size:inherit}.s-content table{width:100%;padding:0;border-collapse:collapse}.s-content table tr{border-top:1px solid #eee;background-color:#fff;margin:0;padding:0}.s-content table tr:nth-child(2n){background-color:#f8f8f8}.s-content table th{font-weight:700;background:#eee}.s-content table td,.s-content table th{border:1px solid #eee;margin:0;padding:6px 13px}.s-content blockquote>:first-child,.s-content dl dd>:first-child,.s-content dl dt>:first-child,.s-content ol>:first-child,.s-content table td>:first-child,.s-content table th>:first-child,.s-content ul>:first-child{margin-top:0}.s-content blockquote>:last-child,.s-content dl dd>:last-child,.s-content dl dt>:last-child,.s-content ol>:last-child,.s-content table td>:last-child,.s-content table th>:last-child,.s-content ul>:last-child{margin-bottom:0}.s-content img{max-width:100%;display:block;margin:0 auto}.s-content code{font-family:Monaco,Menlo,Consolas,Courier New,monospace}.s-content code,.s-content tt{margin:0 2px;padding:0 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px}.s-content pre{background:#fdf6e3;color:#657b83;line-height:1.5em;overflow:auto;padding:20px;margin:0 -20px 20px}.s-content pre code{margin:0;padding:0;white-space:pre}.s-content pre code,.s-content pre tt{background-color:transparent;border:none}.s-content pre{border:none;border-radius:0;padding:10px 30px;margin-left:-20px;margin-right:-20px}@media (min-width:1150px){.Columns__right--float .Columns__right__content{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.Columns__right--float .Columns__right__content article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.Columns__right--float .Columns__right__content article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.Columns__right--float .Page__header,.Columns__right--float .Pager,.Columns__right--float .s-content blockquote,.Columns__right--float .s-content dl,.Columns__right--float .s-content h2,.Columns__right--float .s-content h3,.Columns__right--float .s-content h4,.Columns__right--float .s-content h5,.Columns__right--float .s-content h6,.Columns__right--float .s-content hr,.Columns__right--float .s-content ol,.Columns__right--float .s-content p,.Columns__right--float .s-content table,.Columns__right--float .s-content ul{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%}.Columns__right--float .s-content table{background-color:#fff;white-space:normal}.Columns__right--float .s-content table code,.Columns__right--float .s-content table pre{white-space:normal}.Columns__right--float .s-content blockquote:before,.Columns__right--float .s-content dl:before,.Columns__right--float .s-content h2:before,.Columns__right--float .s-content h3:before,.Columns__right--float .s-content h4:before,.Columns__right--float .s-content h5:before,.Columns__right--float .s-content h6:before,.Columns__right--float .s-content hr:before,.Columns__right--float .s-content ol:before,.Columns__right--float .s-content p:before,.Columns__right--float .s-content ul:before{width:100%;height:10px;display:block;clear:both}.Columns__right--float .s-content blockquote dl,.Columns__right--float .s-content blockquote h2,.Columns__right--float .s-content blockquote h3,.Columns__right--float .s-content blockquote h4,.Columns__right--float .s-content blockquote h5,.Columns__right--float .s-content blockquote h6,.Columns__right--float .s-content blockquote hr,.Columns__right--float .s-content blockquote ol,.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content blockquote ul,.Columns__right--float .s-content dl dl,.Columns__right--float .s-content dl h2,.Columns__right--float .s-content dl h3,.Columns__right--float .s-content dl h4,.Columns__right--float .s-content dl h5,.Columns__right--float .s-content dl h6,.Columns__right--float .s-content dl hr,.Columns__right--float .s-content dl ol,.Columns__right--float .s-content dl p,.Columns__right--float .s-content dl pre,.Columns__right--float .s-content dl ul,.Columns__right--float .s-content h2 dl,.Columns__right--float .s-content h2 h2,.Columns__right--float .s-content h2 h3,.Columns__right--float .s-content h2 h4,.Columns__right--float .s-content h2 h5,.Columns__right--float .s-content h2 h6,.Columns__right--float .s-content h2 hr,.Columns__right--float .s-content h2 ol,.Columns__right--float .s-content h2 p,.Columns__right--float .s-content h2 pre,.Columns__right--float .s-content h2 ul,.Columns__right--float .s-content h3 dl,.Columns__right--float .s-content h3 h2,.Columns__right--float .s-content h3 h3,.Columns__right--float .s-content h3 h4,.Columns__right--float .s-content h3 h5,.Columns__right--float .s-content h3 h6,.Columns__right--float .s-content h3 hr,.Columns__right--float .s-content h3 ol,.Columns__right--float .s-content h3 p,.Columns__right--float .s-content h3 pre,.Columns__right--float .s-content h3 ul,.Columns__right--float .s-content h4 dl,.Columns__right--float .s-content h4 h2,.Columns__right--float .s-content h4 h3,.Columns__right--float .s-content h4 h4,.Columns__right--float .s-content h4 h5,.Columns__right--float .s-content h4 h6,.Columns__right--float .s-content h4 hr,.Columns__right--float .s-content h4 ol,.Columns__right--float .s-content h4 p,.Columns__right--float .s-content h4 pre,.Columns__right--float .s-content h4 ul,.Columns__right--float .s-content h5 dl,.Columns__right--float .s-content h5 h2,.Columns__right--float .s-content h5 h3,.Columns__right--float .s-content h5 h4,.Columns__right--float .s-content h5 h5,.Columns__right--float .s-content h5 h6,.Columns__right--float .s-content h5 hr,.Columns__right--float .s-content h5 ol,.Columns__right--float .s-content h5 p,.Columns__right--float .s-content h5 pre,.Columns__right--float .s-content h5 ul,.Columns__right--float .s-content h6 dl,.Columns__right--float .s-content h6 h2,.Columns__right--float .s-content h6 h3,.Columns__right--float .s-content h6 h4,.Columns__right--float .s-content h6 h5,.Columns__right--float .s-content h6 h6,.Columns__right--float .s-content h6 hr,.Columns__right--float .s-content h6 ol,.Columns__right--float .s-content h6 p,.Columns__right--float .s-content h6 pre,.Columns__right--float .s-content h6 ul,.Columns__right--float .s-content hr dl,.Columns__right--float .s-content hr h2,.Columns__right--float .s-content hr h3,.Columns__right--float .s-content hr h4,.Columns__right--float .s-content hr h5,.Columns__right--float .s-content hr h6,.Columns__right--float .s-content hr hr,.Columns__right--float .s-content hr ol,.Columns__right--float .s-content hr p,.Columns__right--float .s-content hr pre,.Columns__right--float .s-content hr ul,.Columns__right--float .s-content ol dl,.Columns__right--float .s-content ol h2,.Columns__right--float .s-content ol h3,.Columns__right--float .s-content ol h4,.Columns__right--float .s-content ol h5,.Columns__right--float .s-content ol h6,.Columns__right--float .s-content ol hr,.Columns__right--float .s-content ol ol,.Columns__right--float .s-content ol p,.Columns__right--float .s-content ol pre,.Columns__right--float .s-content ol ul,.Columns__right--float .s-content p dl,.Columns__right--float .s-content p h2,.Columns__right--float .s-content p h3,.Columns__right--float .s-content p h4,.Columns__right--float .s-content p h5,.Columns__right--float .s-content p h6,.Columns__right--float .s-content p hr,.Columns__right--float .s-content p ol,.Columns__right--float .s-content p p,.Columns__right--float .s-content p pre,.Columns__right--float .s-content p ul,.Columns__right--float .s-content ul dl,.Columns__right--float .s-content ul h2,.Columns__right--float .s-content ul h3,.Columns__right--float .s-content ul h4,.Columns__right--float .s-content ul h5,.Columns__right--float .s-content ul h6,.Columns__right--float .s-content ul hr,.Columns__right--float .s-content ul ol,.Columns__right--float .s-content ul p,.Columns__right--float .s-content ul pre,.Columns__right--float .s-content ul ul{width:auto;float:none;display:block}.Columns__right--float .s-content hr{border-color:#ddd}.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content li p,.Columns__right--float .s-content li pre{width:100%}.Columns__right--float .s-content pre{float:left;clear:right;width:50%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0}.Columns__right--float .s-content pre code{padding:0 .5em}}a{text-decoration:none;color:#0078be}a.external:after{content:" " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=)}a.broken{color:red}p{margin:0 0 1em}hr{clear:both;margin:1em 0;border:0;border-top:1px solid #ddd}code{color:#3f4657}.Button{display:inline-block;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;border-radius:4px}.Button--small{font-size:12px;line-height:1.5;border-radius:3px}.Button--default{color:#333;background-color:#fff;border-color:#ccc}.Button--default.Button--active{color:#333;background-color:#e6e6e6;border-color:#adadad}.ButtonGroup{position:relative;display:inline-block;vertical-align:middle}.ButtonGroup .Button+.Button{margin-left:-1px}.ButtonGroup>.Button{position:relative;float:left}.ButtonGroup>.Button:focus,.ButtonGroup>.Button:hover{z-index:2}.ButtonGroup>.Button.Button--active,.ButtonGroup>.Button:active{z-index:3}.ButtonGroup>.Button:not(:first-child):not(:last-child){border-radius:0}.ButtonGroup>.Button:first-child{margin-left:0}.ButtonGroup>.Button:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.ButtonGroup>.Button:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.Brand{display:block;padding:15px 20px;font-size:18px;text-shadow:none;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;color:#0078be}.Brand,.Navbar{background-color:#3f4657}.Navbar{height:50px;box-shadow:0 1px 5px rgba(0,0,0,.25);margin-bottom:0}.Navbar .Brand{float:left;line-height:20px;height:50px}.CodeToggler__text{font-size:12px;line-height:1.5;padding:6px 10px 6px 0;display:inline-block;vertical-align:middle}.Nav{margin:0;padding:0}.Nav__arrow{display:inline-block;position:relative;width:16px;margin-left:-16px}.Nav__arrow:before{position:absolute;display:block;content:"";margin:-.25em 0 0 -.4em;left:50%;top:50%;width:.5em;height:.5em;border-right:.15em solid #3f4657;border-top:.15em solid #3f4657;transform:rotate(45deg);transition-duration:.3s}.Nav__item{display:block}.Nav__item a{display:block;margin:0;padding:6px 15px 6px 20px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#3f4657;font-size:15px;text-shadow:none;border-color:#e7e7e9}.Nav__item a:hover{color:#3f4657;text-shadow:none;background-color:#c5c5cb}.Nav .Nav{display:none;margin-left:15px}.Nav .Nav .Nav__item a{margin:0 0 0 -15px;padding:3px 30px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;color:#2d2d2d;opacity:.7}.Nav .Nav .Nav__item a:hover{opacity:1}.Nav .Nav .Nav__item--active a{color:#3f4657}.Nav__item--active>a,.Nav__item--open>a{background-color:#c5c5cb}.Nav__item--open>.Nav{display:block}.Nav__item--open>a>.Nav__arrow:before{margin-left:-.25em;transform:rotate(135deg)}.Page__header{margin:0 0 10px;padding:0;border-bottom:1px solid #eee}.Page__header:after,.Page__header:before{content:" ";display:table}.Page__header:after{clear:both}.Page__header h1{margin:0;padding:0;line-height:57px}.Page__header--separator{height:.6em}.Page__header a{text-decoration:none}.Links{padding:0 20px}.Links a{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#0078be;line-height:2em}.Search{position:relative}.Search__field{display:block;width:100%;height:34px;padding:6px 30px 6px 20px;color:#555;border-width:0 0 1px;border-bottom:1px solid #ccc;background:#fff;transition:border-color .15s ease-in-out}.Search__field:focus{border-color:#0078be;outline:0}.Search__icon{position:absolute;right:9px;top:9px;width:16px;height:16px}.Navbar .Search{float:right;margin:8px 20px}.Navbar .Search__field{box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-width:0;border-radius:4px;padding-left:10px}.TableOfContents{font-size:16px;padding-left:0;border-left:6px solid #efefef}.TableOfContents p{margin-bottom:0}.TableOfContents a{text-decoration:none}.TableOfContents .TableOfContents{border-left-width:0}.Pager{padding-left:0;margin:1em 0;list-style:none;text-align:center;clear:both}.Pager:after,.Pager:before{content:" ";display:table}.Pager:after{clear:both}.Pager li{display:inline}.Pager li>a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.Pager li>a:focus,.Pager li>a:hover{text-decoration:none;background-color:#eee}.Pager--next>a{float:right}.Pager--prev>a{float:left}.container{margin-right:auto;margin-left:auto}@media (min-width:992px){.container{width:970px}}@media (min-width:768px){.container{width:750px}}@media (min-width:1200px){.container{width:1170px}}.container--inner{width:80%;margin:0 auto}.Homepage{padding-top:60px!important;background-color:#0078be;border-radius:0;border:none;color:#3f4657;overflow:hidden;padding-bottom:0;margin-bottom:0;box-shadow:none}.HomepageTitle h2{width:80%;font-size:30px;margin:20px auto;text-align:center}.HomepageImage img{display:block;max-width:80%;margin:0 auto;height:auto}.HomepageButtons{padding:20px 0;background-color:#c5c5cb;text-align:center}.HomepageButtons .Button--hero{padding:20px 30px;border-radius:0;text-shadow:none;opacity:.8;margin:0 10px;text-transform:uppercase;border:5px solid #3f4657;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;background-image:none;filter:none;box-shadow:none}@media (max-width:768px){.HomepageButtons .Button--hero{display:block;margin-bottom:10px}}.HomepageButtons .Button--hero:hover{opacity:1}.HomepageButtons .Button--hero.Button--secondary{background-color:#c5c5cb;color:#3f4657}.HomepageButtons .Button--hero.Button--primary{background-color:#3f4657;color:#f7f7f7}.HomepageContent{background-color:#fff;padding:40px 0}@media (min-width:769px){.HomepageContent .row{margin:0 -15px}.HomepageContent .col-third{width:33.333333%;float:left;position:relative;min-height:1px;padding-left:15px;padding-right:15px}}.HomepageContent ol li,.HomepageContent ul li{list-style:none;padding-bottom:.5em}.HomepageContent ol li:before,.HomepageContent ul li:before{content:"";width:0;height:0;border:3px solid transparent;border-left-color:#0078be;float:left;display:block;margin:6px 6px 6px -12px}.HomepageContent .lead{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300;font-size:16px;margin-bottom:20px;line-height:1.4}@media (min-width:768px){.HomepageContent{padding:40px 20px}.HomepageContent .lead{font-size:21px}}.HomepageFooter{background-color:#3f4657;border-radius:0;color:#0078be;border:none;box-shadow:none}@media (max-width:768px){.HomepageFooter{padding:0 20px;text-align:center}.HomepageFooter .HomepageFooter__links{padding-left:0;list-style-type:none}}@media (min-width:769px){.HomepageFooter .HomepageFooter__links{float:left}.HomepageFooter .HomepageFooter__twitter{float:right}}.HomepageFooter__links{margin:40px 0}.HomepageFooter__links li a{line-height:32px;font-size:16px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700}.HomepageFooter__links li a:hover{color:#0078be;text-decoration:underline}.HomepageFooter__twitter{margin:40px 0}.HomepageFooter .Twitter{margin-bottom:20px}.s-content code{text-rendering:auto;-webkit-font-smoothing:initial;font-size:13px}.s-content pre{margin:20px -20px;background:#002b36}.s-content pre code{font-size:13px}.code-section pre{margin-top:0}.code-section .tab-pane{display:none}.code-section .tab-pane.active{display:block}.code-section .nav-tabs{list-style:none;border-bottom:none;padding-left:0;clear:left;margin-bottom:0}.code-section .nav-tabs:after,.code-section .nav-tabs:before{content:" ";display:table}.code-section .nav-tabs:after{clear:both}.code-section .nav-tabs li{float:left}.code-section .nav-tabs li a{display:block;background-color:#ddd;border-radius:4px 4px 0 0;border-color:#eee #eee #ddd;color:#333;padding:7px 12px;margin-right:4px}.code-section .nav-tabs li.active>a,.code-section .nav-tabs li.active>a:focus,.code-section .nav-tabs li.active>a:hover{background-color:#002b36;border-color:#222;color:#fff}.hljs{display:block;overflow-x:auto;padding:.5em;background:#002b36;color:#839496}.hljs-comment,.hljs-quote{color:#586e75}.hljs-addition,.hljs-keyword,.hljs-selector-tag{color:#859900}.hljs-doctag,.hljs-literal,.hljs-meta .hljs-meta-string,.hljs-number,.hljs-regexp,.hljs-string{color:#2aa198}.hljs-name,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-title{color:#268bd2}.hljs-attr,.hljs-attribute,.hljs-class .hljs-title,.hljs-template-variable,.hljs-type,.hljs-variable{color:#b58900}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-meta .hljs-keyword,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-subst,.hljs-symbol{color:#cb4b16}.hljs-built_in,.hljs-deletion{color:#dc322f}.hljs-formula{background:#073642}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.alert{color:#464a4e;background:#e7e8ea;border-left:5px solid #dddfe2;min-height:20px;margin:15px 0;padding:15px;position:relative}.alert.alert-note{color:#004085;background:#cce5ff;border-color:#b8daff}.alert.alert-success{color:#155724;background:#d4edda;border-color:#c3e6cb}.alert.alert-warning{color:#856404;background:#fff3cd;border-color:#ffeeba}.alert.alert-danger,.alert.alert-error{color:#721c24;background:#f8d7da;border-color:#f5c6cb}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-before:auto}blockquote,pre{border:1px solid #999;font-style:italic}blockquote,img,pre{page-break-inside:avoid}img{border:0}a,a:visited{text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}q{quotes:none}q:before{content:""}q:after{content:" (" attr(cite) ")"}.page-break{display:block;page-break-before:always}.hidden-print,.Pager,aside{display:none}.Columns__right{width:100%!important}.s-content a:after{content:" (" attr(href) ")";font-size:80%;word-wrap:break-word}.s-content a[href^="#"]:after{content:""}h1 a[href]:after{font-size:50%}}body{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif}.Brand{background:#222;color:#fff}.Brand .Brand__logo{color:transparent;display:block;max-width:170px;height:26.4px;background:transparent url(../img/logo-white.svg) no-repeat 0}.Brand .subtitle{margin-top:5px;margin-bottom:0}.Pager{margin:30px 0 10px}.breadcrumbs,.s-content h2{margin-top:25px}.s-content a{text-decoration:none}.s-content img{margin:0}@media screen and (min-width:768px){.s-content img.img-narrow{max-width:50%}}.s-content table{margin-top:15px;margin-bottom:15px}.s-content blockquote{font-size:16px;border-color:#ffeaae;background:#fffdf6;color:#666;margin-left:0;margin-right:0}.s-content h1 .headerlink,.s-content h2 .headerlink,.s-content h3 .headerlink,.s-content h4 .headerlink,.s-content h5 .headerlink,.s-content h6 .headerlink{color:transparent;font-size:75%;font-weight:400;line-height:1;margin:0;padding:0 0 0 6px}.s-content h1:hover .headerlink,.s-content h2:hover .headerlink,.s-content h3:hover .headerlink,.s-content h4:hover .headerlink,.s-content h5:hover .headerlink,.s-content h6:hover .headerlink{color:#c5c5cb}.s-content h1:hover .headerlink:hover,.s-content h2:hover .headerlink:hover,.s-content h3:hover .headerlink:hover,.s-content h4:hover .headerlink:hover,.s-content h5:hover .headerlink:hover,.s-content h6:hover .headerlink:hover{color:#0078be}.disqus-separator{margin:15px 0 20px}.Columns__landing .Nav{padding-left:15px}.ribbon-box{position:relative}.ribbon-box .ribbon{position:absolute;right:-5px;top:-5px;z-index:1;overflow:hidden;width:86px;height:86px;text-align:right}.ribbon-box.navigation .ribbon{right:-26px;top:-78px}.ribbon-box .ribbon span{font-size:10px;font-weight:700;color:#fff;text-transform:uppercase;text-align:center;line-height:20px;transform:rotate(45deg);-webkit-transform:rotate(45deg);width:115px;display:block;background:linear-gradient(#2989d8,#1e5799);box-shadow:0 3px 10px -5px #000;position:absolute;top:24px;right:-23px}.ribbon-box .ribbon span:before{left:0;border-color:#1e5799 transparent transparent #1e5799}.ribbon-box .ribbon span:after,.ribbon-box .ribbon span:before{content:"";position:absolute;top:100%;z-index:-1;border-style:solid;border-width:3px}.ribbon-box .ribbon span:after{right:0;border-color:#1e5799 #1e5799 transparent transparent}@media screen and (max-width:768px){.ribbon-box.navigation .ribbon{top:44px;pointer-events:none}}.extension-card{border:1px solid #e7e7e9;border-radius:4px;padding:20px;height:100%;position:relative}.extension-card .button{display:inline-block;padding:5px 14px;border:1px solid #e7e7e9;border-radius:15px}.extension-card .button:hover{background-color:#e7e7e9}.action-box{font-size:12px;float:right}.action-box .edit_on{color:grey;margin-left:3px;display:block;text-align:right}.action-box .version-switcher{font-size:16px;display:block;margin-bottom:5px}.action-box .version-switcher select{margin-left:3px}.column{margin:20px 0}@media screen and (min-width:768px){.Columns__landing{display:flex;flex-wrap:wrap}.Columns__landing .column{width:48%}.Columns__landing .column:nth-child(2n){margin-left:4%}}aside.Collapsible .version-info{font-size:11px;margin-bottom:25px}.SearchResults .SearchResults__highlight{font-weight:400;background:#bee7ff}.SearchResults .SearchResults__text,.SearchResults .SearchResults__title,.SearchResults .SearchResults__url,.SearchResults .SearchResults__warning{font-weight:400}.SearchResults .SearchResults__text a,.SearchResults .SearchResults__title a,.SearchResults .SearchResults__url a,.SearchResults .SearchResults__warning a{color:#0078be}.landingpage .Nav__item--open>a{background:transparent!important}.landingpage .Columns__landing div>.Nav li a{background:none;line-height:1.5}.landingpage .Columns__landing div>.Nav>li>a{display:block;color:#0078be;padding-left:0;font-size:16px;margin-top:15px}.landingpage .Columns__landing div>.Nav>li ul>li>a{padding-left:16px}.Banner{margin:40px 0 10px}.Banner .img{width:100%}.lightbox{display:none;position:fixed;z-index:999;top:0;left:0;right:0;bottom:0;padding:1em;background:rgba(0,0,0,.8)}.lightbox:target{display:block}.lightbox img{width:100%;height:100%;object-fit:scale-down}.image-as-lightbox+p>img,img.lightbox-thumbnail{max-width:50%;max-height:350px} \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.eot b/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.eot new file mode 100644 index 0000000000000000000000000000000000000000..4e88b6cfeb0c6dcef692a784ed7a62e322634273 GIT binary patch literal 39370 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 J_r)5b{{l>b;dlT5 literal 0 HcmV?d00001 diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.svg b/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.svg new file mode 100644 index 0000000000..0c830531b5 --- /dev/null +++ b/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.svg @@ -0,0 +1,688 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.ttf b/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b5120e7f3caa028717c7440eaaf6edd7846ce08c GIT binary patch literal 39120 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%0A0+ao8+W(Tg8N8ykwxbQ$0a#nur&_ zV$A33DWs_*g%p!-Yts@m#VI5qyo z`bLL3O>CxbF#I;q_gm{D*AfjAI=`{qnuw4SSt}N3=&kyGDPo4NRKJ6?l1*M0_|GIP zWD@@%izdV)urQhha}NkH1Qv*ZZCWh24g>-P!ICkcTf&hp_8WuVg2)IFk418qz1S`r zQGkZ`Qod{ULjBc~-|HXn(60yHoTo$&Dg1iK3$Fg|u_M=2ygT@Zl*M(I-*C$%m)@dE zm+G%RKM0A$kMX#7k8?{_x-xJ{;k9!wvL=TevQ>4PKer{nbHRqi7vJ;IL$tmekY|50 zc(H@#4SE=4s4GA_ zP5Y}Jwi*Qt*-!LQvl9-stM@=n674b7W)&bUSy%;BRakLRyP}9~!2Y85?JNWBU?Fh5 zT{|fx0ZHhM7g{etXu;CEIix~iTUY&6^@Y8bMp?ODB~euV>0R$ z_};GGh0vbkFIX>jz$W*rv11x&8kE97KEnm-6}aE7-hKF=xlF9w<00%)rNUd!-9 zs_-PM;DIL71$!Qa#fq-`{jNse1%9@+p|P1|3FOJ^ST|Wu2_(io>*vFSkWEw_@Ue-w zef2$BWAOxU>}V_W{z1TAWT7GrHpWUmNHAnB!0q3@3q-nO?qHM!QT^^#dY^(kq~*x7 zqx>n@cj5Xc-!7!0b5f`v1B=YNHdYKA{i`%8e**U3rBS8uJvmE8{zVoQa`;-ddn(UO zqtX)39_Wxp1w1t1vbzIZ0P}94WGy-eD(y+cd2k_!6J%&Eu{Me4-wD68*kzw~n`p~F z3~;AS-$UN1}${*x?<&X(Y0kQ&hr z!>0U*{WY5nwIaGal)UgVuvu7GIwhv2BzEc4g`$C@+$rd7WEi4>L57g8>qH!lLu~9x zc0%FjL$FC(o;D(DwB5$$Y-dM}U0kmJq;KOxd3fdWq4E}EpSH8XJ?544oY#Hj<}Lm$ z+k!**Anc=&i(^n|kl4DdWkyht{Ifaa`JMXPPrX1iZY*@DU!g;#uv}%4 z1u5SWpE_Ei48y@y)q~ond=Ki^Z&3SmLtbU1fCJ}Jg$+*F_}bavX0k^O8{gmA;Mz=n z?X7Txdt`_6LX!n&Dg)#shOkR1T&jQrogDA!-sP_?}vwcFau#+2+SaOJCSHr_P4Z+6D`TSt3x&|ceq z>QFEdE7-Pi`v3D8=5vEouY4l+60t`QO7)g1_U&<2oA3GC_*A@ija0Ah^1rv)cyA4B zZvOlCFos6?NB)pjf~Dc#PabbDv7bEsZwA<^pc8jBUNmGy=Pth~J0^WvjqT*ey@dCA z%J1{VA}8A735P`j-~~;_J_xjNK7v)nPW1VF@$^C1iT+o$e)8d}p_Qw~@1c1r*PrK0 zd2(Bu|5w?S07q4%;lJN8Gf5_sNd|I}V{%UJWG2@nff$kyARrRJkSGWtBqUT4AOwgk zi$oEE2m;~?hD;>PYG+;I6*=__5Z2nRR9oiXunXV?^k>tBR!HV+3>g2;jv5_8b5 z_oUN;PMrH$WH$Lii=Eq74TjVHw>9o(V)MHv#~R&i^sneYvt*7=h`d7kQ&= z+|u^^8JYd_<`-UfeYyremU?aA?9%?(vz&96vM$#+*2OLu7O(X8|H{wIOkW$;|6#rF z6&7yxyI{6#ddhD-S57X`NcmZX>vHl#J85_)FaZ0#pex#j9iV!kz{T!Q{}?P#QtQYLmUUKIDhWpM!btgc?*E9ktp6f<2*+DDp@1l>OTzt zBNpS6AZBC&OAP#+9>R_gJ~ZW>9ibW;L8CZY3%vHiD1tMzkK&PA`q8xQ?$NLO_n)KI zO-&j;@BX?vY1IoicdT%&U2${!M!ES=`N6Z1;THpgCsdbfot&4sE)sNhUPeA_pmic> zjp6947?g?Vs0i>Idl1C(5${7IPh#vBD2C1q(-C|$0AMB8w_pi~;rpB{(OxJGVvgXJ zS`?^L5JiEn>sPRZd-JC(~W2+&rU8D1k^Znr1eq3q>iMxI^hD zzl#k2=?o`TnZ)M?pu@!g9WK1zSio!X2vK`4OFw}^tXIVQ0&!(S_iNC=JSWhL8GwW` zqmE?Afa`dHwk;@m@iQ5*`-xbEH~NP>BffwKaa}Lr;o*hhg$4P!;B$Ld6UbRTotj=Ov;Alm-_K8km#Kbq)$Dq+)2u2Njrj=42T4 zDvA!P@By}pQ{m_9rs6(O;LPRI@o6cxIKf&J0*wa93-g=o1(~0wtlJI^xCuBOji0!| zUJyuNjss=@oRV}5enR2L%>7_R?VkAgWB0(%-xWQN9jm?9rAvrA32}$`BJTeO@4oUk z@b2v7Z{Xb}zHTjt$WiDcnNj!sj8Iq(8u$qmsOvTyBLv0JHodf?uI{L--j}^`)HU&l z4s^b_eEC8tP;&8|dt(0zWaa+pw*j|0WOAt;x4d4%Y>)kL&m_Nr*D2B<{OrH#4@?cw zu`eFD(A(q6G}P#ygFge>BKHqra8_(9t{uHSy$1|6A|~ynu&zs&sg%3e4P3qy&xD)( zO!H(D&IsE=Hmss$tIv^LaZxJ!fR;;dQ?=AXgXA?7t(23U{fF}9bb3ParViEXC zs*#sbq0&UD*rt%BJWjDnDel|pVZ>zzdZR>{gHJKeb7nYmMZQM)N-h0P(Nlwbk|Omc za;Wc9qFPQ)HJ!55Ct!z>6Z<-y>TpWe4JN1bG36?oDMHR>=jedtpkb1U0Gvd8<$Z$ttZSn>4=n3*}3=SCCad3-R_NtFnOZQ%+DK@?0W6 zLS;$>)kwck3V0W#JVTMX>EP!Z@VA#jl{Bi7R+5c%(PC*i`KZY>mCFGTqQ}9n(aL(t zQ`gZL^-)U1SbB+anjQp?R_P+BT&|@@6DLp%YXc2d(VF~&85REhi#Ekq+!y0sY^O1d&>!O zv0Np$$ldbiN}=+qa$YS~-%`)%3U#mR_UpdZx%9F6Lj5X3ilN1D#4FaT$!mw#RqtWm zYrXgSn0y}bS?hDrm|$!&?({YIPWSCGk*UnI$kc;9Fys8z`0eyN?DvB?*z7QmH1F~^ z`cL-X9S{&u8L-=;vp6ktE&DB(`i<$gq2G!AS^b~xe;_bEus(2e;Q640pqW9tgMJ9k z2_6}|D)>n7iQr#CCWPz`jSXEA+BIO*fR+K*!m7d+gmr~|6h1n3nSJ= zoR18P%!zD>TpYPK@{%>)io=(qyrY~^^-&w5K94p;4~*UjJ%!GgnK4^pzKu1<=EP2p z?TkGi7Zz6(H#Kf$+`hPr@y7Ty@%!Sh*sQkEwuQEX3D$&-31QirEVU(dL+atwYiaRmYt#0nT~3ckADP~sej-E3NXS@c z53m>8r`p%qkKE&b&VJeclOxdKaEx*^IXWG$JN7xQWSTP__*Z5w%v^>4k68&>`B}rV zHf3GQ&dQ#f-I={J`$kS^PP}N*uVao$rD1$|jYiW%YC#G3iH-qWgD(Ke5zsB@K4V^p zV|+9>gO0pH&5ea=g5ntAN5&fV1kJ6Gm7dbvDs85>G`9}A2cgJc_}5c8o2j|Iu*GY) z=Jug}>?6%>qKnBzSxBC(rnPg zDYhd0G?)zh9h3uF3htnbyW8-u2R(BHbqxsT&SwH@dYR^lNRRVzB;M5` ztrpzZAyq5*)gn^od2d4;T;79G9%|sveb+Zk3f})(HV$w$LzJ90gv^J&iFBOI%KvGI z=XP9aprI9|Djht(laASVG7|f%N-(M(g>p3noOQ=}cm8=w+}+>aE<@vynr_A#* zlmVH!b3PXKOyq`_Y<|rJ<=mYQKY4iKF7>&PNS*M>X?K^#+qGyc%>oA-@un4in$V(X z{mq-Fz}36`uH(CiIR%ckMJ)x?60-={(1IBxZ}garm_;#R)NDq*55Vjnpmk`Qf`Il4 z!B}AcR#?ML=wDR^CmvW2fN#w{Zth5I3a2heg>p!AGIOZXt9Js!G*s<9UJFj~Wj zSR?klax^LjRyYq0C&R)$}=i zhL*g6zN3H9G8}5y2-!4)>n-#$WIPMfjduaohh4sU3&`;{5cQ-zlSa2gDw2Q7XDyoY45W&J4dr~HQTA#p7;j4 z@9kQ=cDr|dkM&|T~@;FvSK$Kumv5k1s$-n3?kbO z$1O*;=Shyok?V0dM|Ag$soKie%IbFws0FpwZWdG8Eyv944jN*$j_5X3jOf;leWNd+i|jDcw>`={7(yleQUkxb(xNdYh8qHDpZbHY4_5Zq>2Ut+A}L nqN=;7vr62>^SfONxo@lS+r@gH>{eE6RmJF!RloaE9nt>)I}*Rq literal 0 HcmV?d00001 diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.woff b/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..9e98b2d356be062c31c97ec55f36eabafe514c44 GIT binary patch literal 23812 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 literal 0 HcmV?d00001 diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.woff2 b/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a0e46d686e5410b7bdf6a084d7a33b31957fb5d4 GIT binary patch literal 18720 zcmV)9K*hgzPew8T0RR9107)PK6951J0GQAK07$a{0RR9100000000000000000000 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

_eRa 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 z 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 j{xNC$epx7z7L`7PLiqVVV_#6U@HC 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 literal 0 HcmV?d00001 diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.svg b/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.svg new file mode 100644 index 0000000000..bf7f6a7372 --- /dev/null +++ b/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.svg @@ -0,0 +1,687 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.ttf b/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..067e1e58b0729e758f737c5c1cc70cace6f4c734 GIT binary patch literal 40392 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 Chiqg3 literal 0 HcmV?d00001 diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.woff b/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.woff new file mode 100644 index 0000000000000000000000000000000000000000..1cbe7902b7c7722c5f984d2933a76f962248ed21 GIT binary patch literal 24224 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 OD;59%0a>}9VE_OV(@IGI literal 0 HcmV?d00001 diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.woff2 b/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b954cfdc867b95a2755e7cd6601cab227c4091f6 GIT binary patch literal 19112 zcmV)7K*zs#Pew8T0RR9107|F;6951J0G+%507^Ol0RR9100000000000000000000 z0000#Mn+Uk92zPcp8yVuyQlUF-;NGB>t;rJm+i>Rj71| zzhYnik|dML3 zTS5W{g2x+jnrZOcuf(tkvmwsW!xZIYOPVmnIE+^CO7#LjhfH&!RX2igtjrt%?SGjf zq;0+HFkSyb!byyvF+oo4iBTQ)4$Jnf?Z7;j?9)tedj2xE?LGk|(ty^!f1Txwz%V25 z@+JKGG;NCRgY8`tAA#j*B)hY2%U}uE1A-v{|Nok{1uE*0)I9N_vNfbMl{P1dsIk3U zQ&N;1b=B37edvAy^8_|b@ByaPi@W<-X4zD_>vaCs<`PO*8~~EE!7Ae_&>FDhcjx~< zGw|mR$TNcqMUnx@5nyiws90d@4FmF`vZZ!y>kLRXxU;pkoU+H9l527}TuO)k@2`ws z-E4Y*L&0wtvesWW3%_chY}A+)cY^>AZ8m_zW9I3f2o*y#(!Ef7gGpk;*vm^7B00EAH^7B8u1uTGZ}|@eqXzK*_H#n)QqY? zi9$A_8}8R_xawH3UeD~sDpWmz1iJGNp#Xk(%Tyu&eDP1H9{~L5XMr!ZkM06E3ednn zya%!C1E`O_0|Ur7uB;%La9-Fo&DDakK+WjQ@b zeEpqd0*BOU(q+JiTBn@%)UN*^w&h&JI#4lcC5S`lqq(;F&!+m%W0!sl5lIRJCO9yA zvw)gLktqfvn_qCxccAAJh>E-b<)4ot^9}?#uN)`2v^d`fib_^RI*I9HDnDJq-Dc%Q zPxDBCp;SAcZg8?N+@X-OiB6$Mj zx(wx#^O?7i2RxQLVE!w#-6;eyKLN&nUXKbV5( za^{l%<$h!lq7^AtqEwl3m8u+8tww_;M>T8Fs@o+CmOS&^x)&gg2oBhVHrvuELPeLL zs%2$Wb<~>$1P2(7(3~miZY&iYprS~jth24s%WX#4bem_{hBeOH!SKpDpShV$NtQDeqUn=$K*vuQ5x zTyW8Rx|BB-@|E0n6?rX+UczQkj829XDORFXnesYFc3I_+ZI0RHoHgBJ1D)~mU$xd!yM$%4>e7eckxC%ul zMBVaoI?6ej&#oqmHN{YM>XH)a?4C~ngaAP-*AY`#g|J2gKGO{(ouU-?R(J!RA8l#5>+_9TD{bT>pu*KT?q75#00!^DsO;IH#v4%ifQQAb&fze0=BN!p4)x}E$ zYXZU6$`VRaNJ&dV@{*B4RiW^!L^1}}_`~g5LqdtCk}w4Z1vTN8l2cG&1x;0abQKjT zhnCg|2^(sgGD1ipB@-$!exbVJ=FF3Vp-8AJH3(OYk+Un~iKi4rm6%Wx6Dm+r77)Zx z1nhSP;EY+3V8;cT7auB#G*_3Qp$(;(JkpN8+Jp9n6}tPajJ50L6olNvr#&m+pDhRT z?1p*fB{H9vqW<-se$F%FXok0AaS*B-C?x5B>G${B1w{h+m+@!Vuqq=6@Y(9|KpjqR z`uDIJsQ&!tpt%|DKEM$GFL-52DgfGl;YilT0XVwl4f^k=|9|}X zjh9znF1)<_^5UGI$r+xWDI3S1Ev-L(`U&x#`(m$R7)*d8fJ5J3Ks*0c0gxi`e9Vs*u`?S-fVYh`@`{czFcqj$J6u6>)ZRs=a(atO*0o#X=9xa z%ew6`o1-?KWE`9 zuik9$?0x`QKY0mCo-VGbI#O3(d$buey}Pr0art^G0AG6zsC=)$Y}R;A0G0!WJ+Q@u z^#8BUE4_ak57H=)|K=@kd}WdpV3wN80J0Y1{ShiZK=sGu&Aa*{ZVr;?GCOhDSr1=x zLQ)S4y7zW`Vsj>L8o|4vE>*v`BECtbCoVmSac9~G`?E{-90!=G#(AOeSRv#lWev6~fr#HGNJMsPFZdc&F%xevcTAibh*|## z`p@L;C|yWwQ7xH->vahvynT{dfW7>X?2~;Dq`ZBYwvV^S&fl3wYiHab{eJ39XW3vI ziA@IVK)NzT8a_|lgB&QhL4H3l#0^_8 zY!YC^nFj({00LPA0$BnA zSq1`G0RmA#2zOZh$8Vrng{;xCt)tN=gZhZ*R6bBL+MuhzDog8<@I2b^##A5E78u>O zKv&9*Il*eBjz2m5As^0FXM4C}y<{@a@Dldb3Yhmr%MeWbf~sFXw>PcAaYleif8)Tr z1=#jYV2!&wePG=X1nu0oj16uACLXENI-tH`IydY0kCxz|G~+LWmvLkras1{0{Wckx zfb@TOw;_H#xv1+(>Z_l;tzD|R!YAm5M6{lW<`P=)@-Y1rOV^g%M9XV4IbPJU(5fm+ z+18$jP0)EofcX(+C~R36o*fnkX-yv7Of28EaG(BzNlY;%;=z^G0?HMlY9LqcN*;^qsCTY`e4~-3yXOvB zxr8vO@bJ>9H}6V*i>PBe#*XL>X_M?^fqHIW^WMV)3e{-|>6Zf8j?x59oI%hY z@`IkHUY)(6rJQo2-npaK?2PMLh_3T$+5jIiYqQ|>l#Lf)`@_Vlsnc3zz~@SDno=^hjH{<34sd*B zxT%1k*dr1cK-qv3(J&P-6hSO7fU^NR;$bQfD1t1&0ILl+kPW5+J4KKP43KQVnPiv> z6pA1f7@*mJJ?StN7!*Muk-+$E6b~%MSd3niC#*a3LB@v0Bn%|R7SQVPmLeS(l+hv3 zSfEG1oNOtwo-k;fLZI4AF_QThBo2K?WDQDbTT%)I!kuu&DNF9iTyhe%%Uay`Fw$rf zeXMOn%Q4Vy=rO1Udp{&Y^)Z=^H9WqvK_Z6FA2P>HNw#+Z`@0XP5y;)%T5Vvx$rCIK zQ?y(2Y&q+x*;g4?rQ5UZlB8=pb*}bwyQb<@^B{!4AveI#=(Wnay+y{WM#4aj zh5)S_q3}E|o+>fX#oxvrISsQ6TRTQ-BnHWOrG8qEgamtY#8zZHVR`!6?FQSG#y|P1 zBK!aL5h-#HgaK2d(G|wuz5alqL;iLZ{m!$D9|cHQ2&=Q~Ysu}FAC18MD*Y(Xw_t$+ zQo#eSS(#u0bG&2GjP}N!>T2pApc)~|=KQ#L%h(?wfp*Lnn}M$b{vT@(``3SlD))o_ z1@dtG_l3kz45B7u~T7$#c|`Ek+v;i@y_@pG3A$L;+bb6!Sew?Dca0xEIm_}xJ?4*fcnPB zUKnZ6j_UpZIS_q729WaXS)jGJZ1RBJaFZxGCL#3g3l&^(NscEhr7Q93aL5Gw!+|1K zGKW-X4S(xHq%(_3G+WWZaY12nJtt58na)Lqu(h-4qcjnE`gkHw$1}H(Yc4`8qtSjw zi8>$551{u_!lOt?`x23aNq{WWq8U%9Zb&6Dvk2AC_}~?B0t|G8uVS}~?4FG0rI#`k zuIC0qK_f%>T#>4xHzE=fW$6cxI=Ue@20x!{gBX(}nkMrVl#qC0^R0P>-4KNmy$zTG zAM*4-*VZFrHsy0Qg0CYl`VVXcEOZiMra(?4p|N`7L1GX>PyoSGY%%p)E;+B??RLkf z6^TVyT$iZtAvu8LXASO+PpmZ{q8SxJ?$FxwF|g0wk();9ge*V$d30)r>HUFgm|ux} zU!OcvEn*}Sw1??lu%$Q}Et}W^1`Nkads&aw&XraqX{$(JDP9%nmW?c)10qhnp)NG6 zuV~mE>Lx>sRHtr`h0JGV8VNWIvi>wUkkrm6LJZ_l3_qv(H6QEl6S6CtS6~|06NkEB zK?6DVVKv)XkT4Ck#rJ&2G}(*kqv37`BOB0uC(ea<9(9{3u)PS>k@JeZB;~GzjCyOA z4OBrrj$!BxC|z{78VT3-Uvra?U!guwVBJds0{sgXYF4k>pKuHqP?66GIWlltgReN` zlX+FDAn(nFkn8guO;K7cgg~b_%&i!_fGbl~TVSkvd91ENQPpaZrae?YBI`cXc%}#g z){PS}h1&db?zJKpisZAPhuzxLqK+c2)2hY(-_v08>VNm$ufLHX?w-LjDgMn{rz@1&6K8{IH)IvF1?*$$%fzL(HM?*Up>Ha_s`-K}<2GRO8heDQN zS#2YkOny55l~p*olG0A(x5lKqV921rHZF0?#&Qigk?@_nXp;b?!`jx_w;z%W7(v_a z1l7ThyHi46;S*?P8JU;+#0@;hQBk0Zd@{v#=OePSoxE*&pXu6edDqkP>DUojjyI1fNZ5n2ug@CASHlRgSwC~2N?!VFBC>=&Z9`FJKXX?9bLgK4xVmYl+ z{n#O&YkbZg-KM|=gbX#Hd{jELwn*54+CB}M#ltHGi0>}>jRsF>Jo5{sD&c?|Wjqdi zokmsOVIUw3%#6pOd-@FaV+jGwP~7uXeCE-7tJy?;O?Y1jzC`u$YEAhaR~+0M^52j3 z>Csux2MT${(s#XZza`QWog}uDyuDP0q=GOF-(u#SPTZF6A#|Lg-9hbSl znwymRa0hmOANS<-V>R_7ty%Du=DfDi{QTZhUO;Z!NNz!UIU0qQ6-kZBq6AQAIpN`o zP;?jYx&Pcke*0)HDetNkw2kD&P-xkaR9Y656hX^~2&ZL+-+S+CY9vV6pYo1Mf2jt= z68p#<6T`=92fMQ(sQDqT?HR2v%)G3|8Qgr|RgbXQ$C!$Ys*r$d!D;utuAUOr&X+Mx zT#Ov^_H=LGAg~m+QlbKnx@HdzK;g#j&NVIp6NMvYG~2+0xM&uqzzyXYs)P0xleo!J z=KCjMT!vzhDn7NWM>75xe_iF;L={iu2m_55sJwF&VDQ6?AZ0=g^D&Bu@qLb|WIp~! z3_3wmbV))gZ@uwP+7s)a3FF6$2|RLfvBZ@1eWA`PW;aYi9Mw~{&hyT1iZ)O2PTd#n zlQoU>8+Uc|!kf4m6$Dlb<%D+Y%ylKz^1gC(QZ`!$Y0O5uYFnv(G+kZ!Y^LI=^3i-{ z^|QH(P~qj!=iZ(ZUtT1wk9_a$Iq~g8l(Vo@wP`;ZxuLesKQfqiIpo&*Gy;u3)kxZYEmrlo%=%oxL47Wi8!D51;BQ$73d$0K0O+Q^CLsU1FK?*YLDdLvc z%|!e;AE!yX^s?dOg0z1T(5~U7iDh`~DN>8uIy73emsYfSYOU??^taIyLodBGHE?c8YDl^=rE>8n zvuMj8GZ*O;?B<^6j=0&fme>PgmgS{P+S4^FI~|pzicC^R#@B;G`mD&1L=K}_kY8Gv zn_g1}1Y9h%Z)I-a^z~~arA2o$_$#UrF>>`4trbp577&R?t4_B`2~0Vv<-yj2afPKH z(N`4zeQz-sm10G(Lcz?PBnkr$+En-blDLX43LHx$^gNW$Luaz@+fE)LhW9o7e%&%X znBDmmJ&roQf)JLLZ4wSi$h8K~#DrCbTJjNMFcZz6BvsRr@ee`PNV2x5y- z;wZTiLeFZE=W&xzSfywe)M+TvLf>j)>z@nryxe~Fo+73GYeftH+*@g-^hoclCoi=( z{R=g}d#0nNaNu}nU2I^-NJVMIOvQu+iMaJ9O8&VW;Y>*8_dRqKtcrT4nYjjN%e=_`6XptBB7m=__n6ZnAi}CE#_iTIsuge7@xU9}-@!dmU z)NA$q%_c?v8--c1cRfeU`K1wo(Nb5YeX73ZTTWAg(`p>yX=LggwMW{^(M!5t*h`g) zdq|6&qupoE9b3c{nR?;R;)P#=dpwFK4%Lk=?Y=vI>%#;14J@zYcu!mL@MQC7B#mm8 z=|d4;1KXvyj+J86qtrYpah7@BAt_2HrCdysxa@Oo^zkkl6~!$_iTCwYMn~^}z1Au; zSZnd0AW5NSCXknNZr4hKBDET!ZYd3E+C;3TW+14a5I?ycl$%N%WduLD8I<+;=b~yH za{snZRI4(Ea?D%7o7{#`j&Ac7LevzZ-oKWPQp0M-Lw zzhX8{-z82?PFGf)o}D5(NA!MLZ6%gR8a+JV@BN0r$2dy8i46=q$KUjttW;_B3lYlON z%gW;nF=ul5m>_wwZr$dc!}lA<$JB1EwMlY9n1AT>iksi9fQ*rqqdCHpP0#HTIVm0ca$A*-vmBU{ANQVrZkA%Ou|R(X{@*j(#}4+esXf-+PSnwOHKQz{r9_9 z8vlIwsZ6iXSapY7DygzJOg#o!%_^9%$HRh}N#%*}=_m2`Op&N>FMjYmldxuUC$s)Yz$~kt-$2uT)-PQR)$D zmV`#H-FS{7(;5tmObLlPk&#vnA8!_}>pim7%6Ccet2zs=CQJ1`$ld!aU$D;lYC%0G z1PfT401Zjc_xnZlWBsG6)|tnt1`nxKSg^RI9*@+BS9i{5^79B+QtLaL_8E?8MH8nb z0`(n2mbf{cqrFv4kny!oHG+o1lJEvI6^U8~_|BHyUGMbMPo{=2T1LbqBqciJ&=sL! z^ph{WmrLTvqC~2z`JcaLxJ$y}XiJK84-3pwE%ez?W)*&%E?9VG4a>OG32n=5&e|LE zRyV36S=iS8dePP-P&ieZk%)yi{<_xx{ENv)gWWHt&vNcWxdy@Cv(OiRR69qE4g8uj znD74|!Aic(D&#~&>gA_eU$L;K){Ff9Xlt_CfOx)udAdiMBAfr;V%zJE)YdqIaB%#o zDOJ?b0lj1Igt;kY@Y?2$r1{*^*5CJ8|7c8K{@KB8cgnEXf9H&!gu=f?lhv0|udb0F1MQwU~7Ow+Jho&~i<1*ESsQ`O!y_h-}YaJmo!ZfjTFr{Do&)UquTYZ#vRi6Z9j0>P9!FXLfYKZYRTb zE>cyGTE(1B5)Ds3cwsGfBHM|I=FF_Ve4WI`ewqpzU`ZkONOP-FT>Z^8K=t#4gF^iy zl;fR~HG6z#rDL}f6vG*rBIB_t31KJd6Pd|guqV$a8be1?bMls?_+@=>gp!nO3LhyP zuN=Dd`oSB$aiz!qeAPAJsT))o$y4~~(Ku0dzv!JUFN)(o> z`f{t9PNK@iWu*3|d?L(Z^#7>oeT!@l%A^XVLk&KSRfLNzZGYxd0g)oP(Uvgez=N z#bl3LQ-^4&ol3-ZxgIG)VOD`R`}s8imHl|}b}y_WqbX%ygt#81l__ZNdB4DjQRp&8 zyuL{5FsaT2Fa@5`GLW!rP3jL$ZdJE$#$wyM4qkJt0a;$3(!fvc=z!m$DH7~uPsnzr!1l;;zYyqufNL_OH)gPX;({zv&*`KxP;CYX=2O|teOizGuAJjXI5socaPAmPx6 zWcXJBk)-EX$U=rBC7Dh*nv3GjJx58l^ZK^I5myT-*5?$r6kumpWEdw2Qh^a1ZL&?R zGVBINoGPH^ONgD^SAawpS{6!B)2)%Q#L?^_8BEbz$Wj!$k%Y%lGA2jlFaSlmXFics-!$U!E)_(a(H*d-UyxW9?oV>`eL5G?r#|;SS~Qpsvf!e=~t>Z zdC}eUzv$XLeE8e7g5_L271EUTv5&*sncNa#ypUU#xjEFjJ8i8WpuJtteNIHF^&*qL zbF6Fw<3+ItWeeMrmUG z?Rm^y-RB0+?&{2ApNpO)NR3i$J;$$G`als=(o>eOoq-&`&AK6}d-K7YQ)kcJhK}yz zHk6kMbB>I6O6o4K=8@w`7MEUB>j}?`a?knVAm3$DGIxnY@@Z`k3GL`|2y$6S<`HhV z>_0vf64rkr!2Oa>QsQM_lKbFr7N9ySf3v*4$dZc2!d{x!>(W~;G)cE{i7!jC#Te>y>$NRx-lSGB=W+%=gIKW!UXMU-#k?A zEvHBq2ttyEa$L=)6h_-eSK7wf#}o-YAy`;rUwgyRsg*I|$kfB54gKw~25baBnUk2D zIZz-f%Ir%{VkZgkFN>Af`EUp)UkS_3g~Gdb2*#m(Tu=8eFbBtulRA3sC&@{d$_CU3 znS@|rK}KRiTWZscQ|N)nz(|IlH$xl?r}Y(-WY<*}+gnJHpT-7x6%w86rVqvwZQTRB z+;#2U4hhvK6Ad+#A|6ZKy%2|Z|8Cw2h@~HZ*0<+m5`1VLnjXpy3I4WvVs1t9tRh&D zfprMcmwGOIDljR?Cp6MGwJQ)`9N0nYK#MKjVAa$!>DBeD_`}rgt*EAML}DO0D%d?1i->6} zFUmeF;`>Ksuwovb+jrbldHWzG*wfX4>PPXXdD;K_5fIfa6c)D#*bZKizkIO%G2Wbk zj1tj^0M5ZOU6_Hv;Y@!w|42eq7BvLDdbNJvFIW;9J87SB=WusMd1Ja-a>v4hW~UWN zO17GY91G`A${mc{B+|#&OVn!*Y>#wr;yVcR-W@3X?FI<{sgtVV+`EEhV#{rvY*qR_ zP7;qH1xK{A>yZJ}Oh*U1{YG(OYPtI&nmHHikx^j3l~_Z1!`RvS#-81fw#&2iqI@Ge ziCvf!mt2&X7SAn?kLTzSr)KTppCR54Ib;wQ5zOY%no{yhD)Z86${+$B7Sgvm*FU*@ zZKUMToy?R4wa6H`hRS1=PR`C=WH)aMa)AV%Ns7TIiQjZr#09W?RigYsymy7tPWXNr zLWlPzh*7e^-*d5b zBp8vLV%cF)q`*e6rO8n&Hi^VcicLa>q=5S6(MPSlEaQjbtF~k5Y@O3E{2IoLS@~M* zFNzmjU@`dmr-hJ)pzl6`LAonaV>PBBh#dnH(uBynJo)Y|eO+9?OwF$4y;c|KH=-ZyFa* zf0&Lt=K8}lYOlLyTMgB>cFA@1EXyx=q-=IHE=|u^Liu z;VaHCl7LCwDJ^ard6){0p%ii|tLxYjH-O z;O39(p4Qsu+GnrU<>BJZXD z9+vuhf1-H<$NP_Sup7_m>f-%Ip7af&ilLWLy?g5CN!mL_iAHpbN45b#>{W`o@OGRk+%&B@!s)ZH*YXiOxB z!X`vhdW-{b9V6(J5cM~OL-e*sRLWOdjR1s17P(#|*VYL;mUVlGq$Cby4$3+X| z?APSAekcr51{VgYgZsYAYOmQQ%l&sJ1oF_fBTKKBbhWA43)+D$SCoUg3h=$vLDfDg zQNshs(E+jwh7Vd+d{;U=^TnO+kB#Rt()K|F5c&qBo~EC!7`<@rgnPM$mpYm?o2urU znO%@s!RZXX)Ss#DYF+F-8@GxT1CLc7uH-1um2{TXchEaHXP?}-6gH_Hu4M%LLcBlU z%#Fs49$)u*4lf^v4D#^e_OrVQnFMPIZy90_jYHjsv%UC~cd1*{e}7CIi0yGS_zntz zJ&pqke*vf!DCDcxu+RqI-9Y~MjphCHnko{YCO|I$0odAt71_3TUyE%QA#0kRt<8RK zBtV;O33_Zh`)S#!{ZRUOjC=+@t+{=X;Wo)e#2ArFq<>o7Pia?4K@SRMN%UNg7N1 zaP2-4-I9hRe_Udsrc%*txuT24u9r$3G`9akV&E9|aE`A^Ow|6W0JdE574)$S1__Ks zIJ>C?;>By{X^1v4QN=)=m-WN!7I6JxbiQI=tl;uq^GTSXiH~JhNd5ZFDZTT~I+}Xvo!-<*vEx{f)hsWHd5Q6<# zX>FgV4k5pN%a$nY-*tz4K{f4Bw8_L3?tTBxP*isIj|%}i`<)~X=xME+#9Yx%b?Xs9 zi`{#%SYpK3-d5oBGN-$ZReHSp76?Agb;5x?;N2s+z>`lF$@F2hhYonA?Bn?#(AWrL z&$Q>ude8lq2BuEB?_{agxP3sO+e}wtke>SYf6Q)Mg|?zUAVT}+5Y@W%2Kw(%uJ!5v zzt`VsuK4!=c(xhXR>7j9hCkfMojMTTv9;za zVjr>Z*iV*)f{QuYM(}QJ5*G6H#DydF5&O<)filqcpHGEno18yy(B0&gx!%{pFP$^^ z1LK?LBN`oBbMAnB$i5X!w#!UNfiI5O8|=EBsLAF}TpcE9CbWXfAAj1IdvIY0nCeGi zVuqUWVvvfLs!1W04FKa7eS(1Xy2Y5ld&|9#!1Vl61+M;ki}xks`8L&{J}3J&Q*^%H zQ%5zQ`2P|;tg+JofP2Vci%ol^QM>A85i|~`PC+1>VF7F>=h%&ibjSTw!cEyAfrev} zIc(<*xyL?N6|vY(kt288u5Ie7Eb>eW&M0nDLW-^9VlQDq>O~q)WB2y!Tm1chw*sgT zW1^{&Z`l5OV}AgM(1}Su5MPygch3Fx$R5qsTwQP&(niT@HVc=2gJhr3qNdvfbn!$` z(#r`O4gkyVz+@a~tjhhSy5ed+4_CNt5^%NM#I`ej^NeU2JUviwkr0Met*>` zbJDW1vvKP!00h}&M#GM$F;lF32&>pZ_CJV1coKw=Mw2bC~zQE%pA#7=Rt zT@a5T2W~+FBpw=J!@~LYG4Ny*H;4DCx+DRQv#Gge%h@DcJtnSLJSiI15J6$0B}?Q4Py*!y zX(()O!CO*Jif=SCLsu|BA^1R|tD$3w*1VoO;=^`@0mk{+E!_15pImz!3%XfL3W)M2 z4iEDQB8+hY$UTwcC%&Ant3n5OCS=JyXfzF6)m!tO)}r`ilh7Ix3O(dfhj9q}uCd{4 z!K)g=zb-H1vRO)==9;)Kt6F{SZ$e%{F6DX{?@vhEV;i>CZtG6gklxn``Y)wI829(V zm$DRW6td8XxF?X)wX#{kP^Q))^0)`M!H_NT9?laD3mzc|P<$<%u)|?#cC*;JC%j%2 z+J#dCCw-L&dK6S(k$OR?zm1=@2%Z84fPfK4)FS&P+ffS-bn5$A;uwDhV+6hp!a$n> z3s|^Y(T4AdkG=z`Z8lit8XVbbHVW7Oe4Vn}%U4gKhI{WVT}$XqeeFg)aB8v49R~rd z{0)?HTP~{on|pp3YmDaIPeqGx!6coAk(91Cc7#vkLUcU@7`8UWHdo3`nb!e&O^`I7 zld`seW#)AX5W0!X_-5 zZXh$GxTGP(OY@E9g`Iy{*%%ESDYb$1{7ZM0o?{)tMN$dQLQkvZzZzKI<~67OYL zABDx7@NhM`6*r_mZZ?q;hKKnP$rD?KEvZT}{ko@YB0>G1(`!+HbVJh#%AQE%p@u9? zIWY*&IAV*c&&HL?bu6kHb}PhNoNIAIB_8iZE;vb@xf+BU{hO)6{%x~f9fFlUKQ>nO6BVhU?=5<$C!AEdzdagzhLlTn(zRdB^jC=zvx@&ZNP z9{~1<29d#h2tk8I!oH6}XilRvE0qhKr-k0l1zJAOq$_t}Z(h+3yLN0`uh>@i`=aWi z1T3()J-jQprm;N3Igq9&R%H>#S}IIUMFbfpN77YM0V8%RN^QnS$RhH08Rr!SWjxu}?PFuvqjr++p9>a+61XibC|+C6 zDGSEtOTt$oOsi|&8=xX-@#Ne?dt%`cy=|fLiozJy7zJ>Myn2v2I2?no-Z9FP(leTt z0nf-W2{7v)T@v6kxu$$M?_t?c#LI||ITK!y3Lz-sPm7Fw5V6#j?zA8FKoj9AJ2s<_ zQ`(jE6nR=^y;wnOU=+*eXs(9F9%FeUeRCmu8cGt0yEGgG+M&h;hb%Q*lOz%8Qh@?4;@w`w7R!U$Iu~`JyTv%*Lg>b>evhQr44`q8jesxhv+Z$tdZRvl?Xn< zo*Wu9G5~-Hc0^}O`38x5D313kfXPCJ$pHS}M!LrDb3>sT%xNA=Epp+pUMf=5a0Off zCx{xXrwX)!O-8GV$bFVMzH!8bVt`|pJJ16#%M3~cK{XN#mt}4cH;owG;2OaheUdKHvxsed+3=+7s`a&B$+U=i zaxHiQng5YsYlBnC{n*CLj}EEr`{V@oSQxD37!k`x4Ty4{*M+#eFM670uV`W|vuIvH zEngekdP(tVwwirhWdwJ29Okd$>RJTjdNuFP1IPbKme_623;mrO{9l){L( znZ-2)cx%ZVz(rbjHh^4gr;LtWP+f4oRy8kj?co+sc@wi>@mSxCv|_$3j}4ogyT(~r zsp(`A&asz7v%K+bBbM4gj=gW^&4c@v{Lad2itc!@gc+4V@456f@popb;7;?_5tzsLd?cId|L0< zi2iRE(ixfQhIHGc=j1UT`_5(5n@pSv8*)2g>2~1&yCEOgS$>5Fc5{)=17j@bL@XOi z%P79iR^yz7IT}`i_Fbzrg>nkA#TBI&u4_cNiE+S%dW=;*XTxlz%^)l8SFtG{k5C+F zQi~FKRuYN5*EdQVEi8!60~!;rr!3U>&MgkZY!)!S_&8n2K5!%#138t`SuNP8DVTzQ zJ@MPnO)P4(E5t>RF)jww4Wgial?!jQt{iL%(8w)lwX3&Ev3pKHZ`wp=%|NtGi=jcJ13Y= zd|k7`$NLZ~C(N(K95W=?<{cpr;D$iL3NS?QYkE!bYW*bxqQ*g>c4C1ho-knF_0J^3 z*C%U+WHyDm={D?N&!J?Vv3oPzX`WRHzR1NJ;TESuP{Ma_7-1BH9!PrXx+(<+^Gn3@ za;etW{`H^)3cS=OAfa$gTms#nfeP7)x#GDPLm1Fs5Bh%W%X&!I`%z7W zv;-F2Y$UtyE`5SR3VawSXf8VzT{rZfG~XS@x}p@iDwJvV15E&&1b=LRii38bWH=0V zyWFz)mKRXs@^$MAeV}Mn4+PXlfbetP-%`0h*sPXDDZZMH!g0)P-cYN}GmHjO-2@Se zsi?yyzsYln0O>ffg|EQ8SkdkWZnvs;@cy%sn4<=;%_X`~-0El&u9yiA^?Z>codHo? z2>d+N;NaXOPAVl)0KiK(<5q3KA>R3ksDTK z#M$7?*8*BeMWqFIeo=W3aT2rXPzfE`Lj1LlxvLMDbeQ79VX_&u5WQ0IJ@8!rBT1>~ z^rlQE`>ErIS$-8yj5+Z1pT(zV3l0geiCxkwxAoX}b(!YAD}h(#Rj=sYJdz|r6p6|@ zuyi0>C~Jyu+``*kf(*oOmpZ`XtefUis}fhpONj>@W`qlB06gevcx-ge?Yxr{H#BN8 zQUrn)j1o$-Z~5n`n^yIBImngc1IXSiHOE2 zS!zzaqmMJ6_|RkMPo(u_*wP)i-7*8eF%L7DNPErDVbeEgZLFq=6(|eKV@+5KI zEn`Q0WWphZeDN|~#jI2&N*=|ru4+nY;IC9e2`e=xI3Egj*<>90{@R!$Ql1T` zSNJZnw+^0l~d9%v&6Ac?X#7V+(&p@X!^0Os5j!DTTdyOH}d5NAm1=H~c87qR4 zO%F>~Jb{Xibb@o)zpGc#w<$c6*rI-5uwX#1q^FuCoC(f2^l0L?3@D@Wq=Y7)Bjs7- z>#<1x_J{6jF%6Kn2T(5=M9Da@a1}o#)?F4zSGGg6zvpmaewHHGhI0braVGRLKQ52_ zDC$DIj+{Wk&y?ZoJsH+R>r1jRo@Y<8!o(iU%!SG=H2D%KFVg;5dr}aF*@K7ncC>pm zSIO>~2-6uBq%8iR zQ(40&dw?voKyg&u_@Jn(_#&K&w7!O$I1a6OF_?4J@S@sqK86v_%xJKr&~hSh!rsP{ zSxf-B-jKOYu>M*SH()-}`wp9z&e$J1AG%Yy%Ckf4b(a>>Je}n%boKf3{j9rV(xLaN)yrdK&~<&D4xYXr zVhVor;eO-7M?8tI{2k*(@3X#W>NjXQJI`AD2LAWMeZD?#xNS0V?d;vBtuH0j2I`na zd73q3<_E9w(rYRO2Wct7+V5XaM+jg2k^MdUd;EHQIlZixMh{(8Fp|U)cvF7e`r5BE zhZ0Hf&An%3blX@NYQ^vNrFK-U6JrL(?Xnv@eEMaItXIoLRY*b8(QPGss<3aa;=i%* zSnT&(+5s&rNzRTGd&rgna0-w0`3jW`W72Mt0q$BWZD!&SIeA`;QKMn&FAHyik87J^ zD2IyKa_R~ZiL8o6Hg&J+7h3MdTb+@?vR5U#p9$@5pIC zAhOH0=^Lgvn%sAPHA@cH9)nn|2r$XvqBiRDS`tEO9p|L z5HjinWe}s-VHRjGwHS{*)ba{bUj_l4k!=MV%3sDH^Y#qd%l_}L0(mRUKm!~CHBMJs z@gPdi&Lz6M%z`;szGN4nG*O$sM9BvTkdr}HLzqScJ;3-`DA_@HbjLPRybA{Dn3$Z0 z(A?LlPJ&tsM{%_=LX2W5Ap?36@2TBmA6H>y^{EA)m)p4jLo^*B5X6zX$2Ww~uEVcH zU3G6N@RVq*haMGc8K!=;XC^$-CsM-84VFE!&NXfUGNEIp3*3qb(^BcGl!6D2RU(?q zU@39zhSq{*`9T@!5m%C4ICz5h%0yvvuzqR7VdT1NQ$pKG2%@mWjRtux!fx!K3LBac zsGL2yUr(Jw+_aWAbWw{V6}$d;8HZ}R4Xv|ujWMA}VGEQGeX|!V0CYtwLOGwLolVTA z622NiaFbc1b2GfkH~L@_BUY2=lg-GBe*Cx)$VEcW5I*x_)vSi1r}?6GfbtBh!`J>B z*u$;!WGVINTV#zqPOZu^fAOnc#+^1)N_Rccb)%~RoKj1Q64U+|$y%oUrBGM)4S<(V z&A#7*HS79t{g_pF5w0}VmB%O2XQ^=^>vSv_p*LXj9RwaKuS)&d`EftLTwbg-R&%oh zn2!)vRbEEmL4(`z+94Dt)DckQ`jsgU%fu!iJW4-N3lyobBpW?0SS(}@I92WmQ)`ee zGkgW($^El=gD$6vQK(fs*yxhW@9me`+7 zU%?QZTSMdQM*f;h#UXY*GpTZ;eixD^tn9S8g4Pk+jV9Ze4lzuL)yp*34a3$6@o%cJ z=Pc6LDGrdxyTuki3sA%jdL4A-DO&4&a!1iyrb~RD(Ww%QpaWnC^9*05(N&?}-@rCx zmPdVkNhDsxzY{hmy)1d*T#TlXv>CNGgc`7>>ZPwU2;kn0AW~fGMcM<5jI#e?NYN1S z?7nL|60KbkK{7wU!a&zU)z7^T>rPj^iQ0JSjlpMQORx?QQa<~)l* z3QjqRhm2fjqPj@8jC}%W1}wI-mNL>$eEI$L<#Au-;@d5)P7V)rv%<*A$Z+MJi;(7Q zZkaRlqx$faNR=u>c`t_`<%G@?R+{O$Zo3m z13oUml%M69f~r4zi>dP@@^5F>xzs&>lo{ono(~hQf$>g&A3xtP;vqT5zl-nL0RUgC zV8TCN{}0=Vm;%`0`X}B3KFy8{Eu6djnc}|aUxOp|cjzv{jrNm!(duDdUsuzX42*Ry z!xw3uB4GRgel^WN%a+p8NcCCVM+V<2!?CMqt^1C2O<=r@jP8OmB6$xIuhELjFcCRo zWsC^K5to%t5mLnzRw-`%zy8&!A2>O^9hViwW8Pvj4R}vaaWkXc1PQ#yyN#gv<^uE+77 zy8K5zv@wd?5TSJ&)Byp4wzgUME|XD+>C%er7{qrpWyDr3?+h+AL{pnZZN|uu{g(c! z>ftJTR6&?iM9(-5bxYHjBedVtyf}#LNfP@}f(J!LhWn8ZTHAY%0n2D(TaIDs>tSd{^U$Xj0HQ;Q_erozi_KvOUV8MIN$q0EE>-9GtB#~?u${%n3N zibDn=_>N<$ke`(GG%0JgcurTSYl&}FRP+Jz`We9bB7nweuLkPJKwZ!j^#`C{3wS0F z4*`ZVPveqIP;B(9l5^4Mw^;O+fYA1@5<4lKC|0O( z0~rzkxDZ%*AruP^HBgd5YG6!6*T8A3szDeuR)d7Auo^Lbm2Rg+y5>w&}SjlFh9KO}jlL%Vzdh%{69ScJ6iJJq&PTM)v|ws!{Dhyl^EG zz==g8XqJz|z{QgxMS?i-2Cp}6U0obDCL9Z9%;6otMJGn!#R;b0(a;fHGV;;bTkaHl zPx-haJq%NdR0)hDIOa?mVpflB!5W?eFSH^8im}k7`D=-n5T=oybY@K0v0NZ)VqElR zuwh9bZiBEDwe4ui5Y%Gs^7c*5=2WCLTQWkTU88a+IS3)IYn)S%u>`4b@)JR6OcRTV zgC<21_K%Adg`p-JI$DMi+&HG#{wk$1MdZtaCz9ZW z%NT=7xj`loLvEvEB|ZW*)6iIJKNAlWzwq0zU)gChW0hVp8%dZ}lq>JPxsorX_+Wf# z66QOkU}9g1?F9e-RIKXS{T+a65EujwK>!%|Ya6xBhj=B0SgGw(#_v2XWR@3YRX1(d z52Mn?E|yUDpX(M5D9SDQDw!mVZ9_lhao?}ckmPR z7szdPgKvhAcU<&FYpXSH1$fK051>2`8QN*qSFLb>)hOt}H|jB44ONmqK9*TZ*Mr z%1$|L+Kfe$rd&~KxKvzl(fLv>HB~+d+SuCJJ2*NyySP?1BaWTHi#HF_k`v7ABDAc9 z#qKk1C*H)mH@IJcZHUF*JhA4i1&e1bSu56>wP9@qUlz9pb2E%|P7TX~_gv=lDc-{K$ec)4?cExXO`sJr6l++?x+I>~C1^(32{!q$Ik`S+X};_v)F zgpju-P_5vpZ%o$GHu-HA_3u9nW&cC>R_Irg&;!)}e_H?mi@F(x literal 0 HcmV?d00001 diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.eot b/docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..10a7a2b6d2d836dcd1501f7d8fec3dcaba773e9c GIT binary patch literal 39066 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.ttf b/docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9c36f36071729ae3ea3e8d5f1875a09729b44301 GIT binary patch literal 38804 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 T{)-s=)*i$Cru4ietXLB-{nSbtg zzk9!X?>{MBwKB%fJJ6fOV)@0z;z{7lW)4pe@M|t8cmhsd#@MxH7RzTAbGWc7tLCv- z9;>ygR7KExv-2xg1Kd=f$+G!s!%SB?oV#EXjtJTW43i-52BY?$XG2;V4c))^ZUT?4vHlD$}$ms#6%%n+c zv}kDqoAF3w(s>pM2Sn>gLvK_nCmkEi6Ji0`1UAAbfccO>uV-=_w>Ddns8?Z3X>C@m zH&TKm%1q~(ND7!QdIeVG1LlbwegRmKPZ=zea3KHBgPlBTa?;M2XVQ(!q$UNFj?x2v zW{?v+nUFD?w$SEm`X^jZJ{}i>ApmM&I8Ej;uHtYB2dwbbS~Z3%@NlUN4}(Rh42Bh9 zQV5mHQ6Y}Q;X*Ma4Rd1S3}y>qASowS3$T<>NM(tsa9)^@M0qGlAv{7Pqd97!>-NDHt3zVIlsf zv6{rPXp^1*{iD?r8cJX^XgKW2@?dgWN1FgKh)&3K{zRcDlQy4HN1JFpd%Sfq?G*Ck zXebVWa*1&<0!oL9oKq+iv_*}76N28<-;2_a;JW>S(!=UjzF z%R@ytgyOJ}nJck4G)yR0h-7kHAwy9)68&7*O?=lA4BzOmszuA%RStAEZ&{pPn$ z_*pOX&TT$?wXVqLguj4LwMTMw!&}T3-J3G!-|2YjVjC*{Y zH$O7yWz0FXu3hH)<^9zJ8e9frx)fipf#Wld5iZ~0jUs6Afxhjf_PKqz*0OJj1M{l5 zU*L5qGfuzfvLpjO1&0hhUs!wlR_e}6C+1IY?_JP*qjmqR$drWby*q~1{mw07$4L6Z zgKdpQog(0lBCVunZZp4XUO!=Ld9xwtO1ayDiWvi~?sg>?nLe~6f#-Id;BNH&Ze2f@ z_v}=e$o_VQ_1;)~dg(4WC@N#);MT;Bi*Quo;UQuA=HbWsu3sh3T%}NUy?Lf+#;vi% z>5F-q4OMhk_@eXHKQ--sH$0`F_Uw&WMtngU^6W>udjKhKZ*lqXLVtIcW_jcVZ{Lb_ z51R_6jka+t{?I^aa!uDo*fok=ccZtuNRr$C;jQTn4Oh?F1C|Vat}{Tv?f)p4_QB4f z>ZHy8;?}=)_eev!zu#T-am7D-9{;i2>zMKIlh0pXD=Hea`&7qQjH!({ld>B)|PeV06m4;neN#+T%J0rXw$6L#l6f6#9{E z&9W73+=8K}i4vC%a_{v4^=IR^>WhU)~i3bU2o~?sd@fP z|8V$GdA_~G{iV1wz6C1W8~>YomD^Il5N=(~+uoJV&x3+CQ)dhop24d-pfg zj+(w|`D$BH;QhG7N^3&R)^b&pY3$d>yU5x@mp$2`0X{WN@4J1p`@tE}gGGm~Zp`?z z>&}a#F1F#~ + + + + coreshopWon rgb + + + \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/js/build/pimcore.js b/docs/generated-docs/themes/pimcore/js/build/pimcore.js new file mode 100644 index 0000000000..a3e8f4950d --- /dev/null +++ b/docs/generated-docs/themes/pimcore/js/build/pimcore.js @@ -0,0 +1,340 @@ +/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; + +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"

","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m(" + + + + + +
+ insert('theme::partials/version_info', ['params' => $params]); ?> + + + + +
+
+
+ section('content'); ?> +
+
+
+ diff --git a/docs/generated-docs/themes/pimcore/templates/partials/change_version.php b/docs/generated-docs/themes/pimcore/templates/partials/change_version.php new file mode 100644 index 0000000000..297a804114 --- /dev/null +++ b/docs/generated-docs/themes/pimcore/templates/partials/change_version.php @@ -0,0 +1,52 @@ + + + + + + + Version: + + + + + + + \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/templates/partials/disqus.php b/docs/generated-docs/themes/pimcore/templates/partials/disqus.php new file mode 100644 index 0000000000..e4f295a8ed --- /dev/null +++ b/docs/generated-docs/themes/pimcore/templates/partials/disqus.php @@ -0,0 +1,26 @@ + + +
+ +
+ + + + diff --git a/docs/generated-docs/themes/pimcore/templates/partials/edit_on.php b/docs/generated-docs/themes/pimcore/templates/partials/edit_on.php new file mode 100644 index 0000000000..8e311200ac --- /dev/null +++ b/docs/generated-docs/themes/pimcore/templates/partials/edit_on.php @@ -0,0 +1,7 @@ +getHTML()->getEditOn(); +if ($edit_on) { ?> + + Edit on + + diff --git a/docs/generated-docs/themes/pimcore/templates/partials/navbar_content.php b/docs/generated-docs/themes/pimcore/templates/partials/navbar_content.php new file mode 100644 index 0000000000..da94f86183 --- /dev/null +++ b/docs/generated-docs/themes/pimcore/templates/partials/navbar_content.php @@ -0,0 +1,23 @@ + + + + +

+ + + + + +
+ + + + \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/templates/partials/version_info.php b/docs/generated-docs/themes/pimcore/templates/partials/version_info.php new file mode 100644 index 0000000000..f73137e621 --- /dev/null +++ b/docs/generated-docs/themes/pimcore/templates/partials/version_info.php @@ -0,0 +1,34 @@ + + +
+ Built + + $params['build_versions']['source'], + '{short_commit_hash}' => substr($params['build_versions']['source'], 0, 6) + ]; + + $from = 'from '; + $from .= sprintf( + '%s', + str_replace(array_keys($replacements), array_values($replacements), $versionInfo['source_url']), + str_replace(array_keys($replacements), array_values($replacements), $versionInfo['source_name']) + ); + + echo $from; + } + ?> + + with + + + pimcore-docs@ + + . +
+ + diff --git a/docs/generated-docs/tipuesearch/tipuesearch.css b/docs/generated-docs/tipuesearch/tipuesearch.css new file mode 100644 index 0000000000..56106049f1 --- /dev/null +++ b/docs/generated-docs/tipuesearch/tipuesearch.css @@ -0,0 +1,177 @@ +/* +Tipue Search 5.0 +Copyright (c) 2015 Tipue +Tipue Search is released under the MIT License +http://www.tipue.com/search +*/ + +body.with-search { + overflow: hidden; +} + +.SearchResults { + background: #fff; + max-width: 650px; + padding: 15px; + margin: 0; + + z-index: 100; + position:absolute; + top: 0; + left: 0; + bottom: 0; + + overflow: auto; +} + +.SearchResultsBackdrop { + z-index: 90; + + width:100%; + + position:absolute; + top: 0; + left: 0; + bottom: 0; + + background: #000; + opacity: .6; +} + + +.homepage .SearchResults, +.homepage .SearchResultsBackdrop { + top: 50px; +} + +.homepage .SearchResults .Search__field { + display: none; +} + +.SearchResults .Search__field { + width: 40%; + float: left; +} + +.SearchResults__warning { + font-weight:300; + font-size:15px; + line-height: 1.6; + color: #555; + margin: 7px 0; +} + +.SearchResults__warning a { + color: #396; + text-decoration: none; +} + +.SearchResults__warning a:hover { + color: #555; +} + +.SearchResults__count { + font-weight:300; + font-size:15px; + line-height: 1.7; + color: #555; +} + +.SearchResults__close { + border: 0 transparent solid; + background: none; + + float: right; + font-size: 2em; + cursor: pointer; + padding: 0; + margin: 0; + line-height: .8em; +} + +.SearchResults__title { + font-weight:300; + font-size:21px; + line-height: 1.7; + margin-top: 23px; +} + +.SearchResults__title a { + color: #333; + text-decoration: none; +} + +.SearchResults__title a:hover { + color: #555; +} + +.SearchResults__url { + font-weight:300; + font-size:14px; + line-height: 1.9; + word-wrap: break-word; + hyphens: auto; +} + +.SearchResults__url a { + color: #396; + text-decoration: none; +} + +.SearchResults__url a:hover { + color: #555; +} + +.SearchResults__text { + font-weight:300; + font-size:15px; + line-height: 1.6; + color: #555; + word-wrap: break-word; + hyphens: auto; + margin-top: 3px; +} + +.SearchResults__debug { + font-weight:300; + font-size:13px; + line-height: 1.6; + color: #555; + margin: 5px 0; +} + +.SearchResults__highlight { + color: #333; + font-weight: 400; +} + +.SearchResults__footer { + margin: 51px 0 21px 0; + padding: 0 10px; +} + +.SearchResults__footer__links li { + margin: 0 4px; +} + +.SearchResults__footer__links li.current { + display: inline-block; + padding: 5px 14px; + border-radius: 15px; + + color: #333; + background: #f6f6f6; + border: 1px solid #e2e2e2; +} + + +/* spinner */ + +@media (min-width: 650px) { + .SearchResults { + width: 650px; + + left: 50%; + margin-left: -325px; + } +} diff --git a/docs/generated-docs/tipuesearch/tipuesearch.js b/docs/generated-docs/tipuesearch/tipuesearch.js new file mode 100644 index 0000000000..45342acf09 --- /dev/null +++ b/docs/generated-docs/tipuesearch/tipuesearch.js @@ -0,0 +1,374 @@ +/* + Tipue Search 5.0 + Copyright (c) 2015 Tipue + Tipue Search is released under the MIT License + http://www.tipue.com/search + */ + + +(function ($) { + + var originalTitle = document.title; + + // Stop words (list from http://www.ranks.nl/stopwords) + var tipuesearch_stop_words = ["a", "about", "above", "after", "again", "against", "all", "am", "an", "and", "any", "are", "aren't", "as", "at", "be", "because", "been", "before", "being", "below", "between", "both", "but", "by", "can't", "cannot", "could", "couldn't", "did", "didn't", "do", "does", "doesn't", "doing", "don't", "down", "during", "each", "few", "for", "from", "further", "had", "hadn't", "has", "hasn't", "have", "haven't", "having", "he", "he'd", "he'll", "he's", "her", "here", "here's", "hers", "herself", "him", "himself", "his", "how", "how's", "i", "i'd", "i'll", "i'm", "i've", "if", "in", "into", "is", "isn't", "it", "it's", "its", "itself", "let's", "me", "more", "most", "mustn't", "my", "myself", "no", "nor", "not", "of", "off", "on", "once", "only", "or", "other", "ought", "our", "ours", "ourselves", "out", "over", "own", "same", "shan't", "she", "she'd", "she'll", "she's", "should", "shouldn't", "so", "some", "such", "than", "that", "that's", "the", "their", "theirs", "them", "themselves", "then", "there", "there's", "these", "they", "they'd", "they'll", "they're", "they've", "this", "those", "through", "to", "too", "under", "until", "up", "very", "was", "wasn't", "we", "we'd", "we'll", "we're", "we've", "were", "weren't", "what", "what's", "when", "when's", "where", "where's", "which", "while", "who", "who's", "whom", "why", "why's", "with", "won't", "would", "wouldn't", "you", "you'd", "you'll", "you're", "you've", "your", "yours", "yourself", "yourselves"]; + + // Internal strings + var tipuesearch_string_one_result = window.searchTranslation.Search_one_result; + var tipuesearch_string_results = window.searchTranslation.Search_results; + var tipuesearch_string_prev = window.searchTranslation.Link_previous; + var tipuesearch_string_next = window.searchTranslation.Link_next; + var tipuesearch_string_no_results = window.searchTranslation.Search_no_results; + var tipuesearch_string_common_words_ignored = window.searchTranslation.Search_common_words_ignored; + var tipuesearch_string_too_short = window.searchTranslation.Search_too_short; + var tipuesearch_string_one_character_or_more = window.searchTranslation.Search_one_character_or_more; + var tipuesearch_string_should_be_x_or_more = window.searchTranslation.Search_should_be_x_or_more; + + // Main containers + var tipue_container, tipue_backdrop; + + function getURLP(name) { + return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search) || [, ""])[1].replace(/\+/g, '%20')) || null; + } + + function closeSearch() { + document.title = originalTitle; + + $(document).off("keyup", keyUpHandler); + + $("body").removeClass("with-search"); + tipue_container.hide(); + tipue_backdrop.hide(); + } + + function keyUpHandler(e) { + if (e.which == 27) { //escape + closeSearch(); + } + } + + function getSearchString(searchFor) { + var standard = true; + var hasStopWords = false; + if ((searchFor.match("^\"") && searchFor.match("\"$")) || (searchFor.match("^'") && searchFor.match("'$"))) { + standard = false; + } + + if (standard) { + var d_w = searchFor.split(' '); + searchFor = ''; + for (var i = 0; i < d_w.length; i++) { + var isStopWord = false; + for (var f = 0; f < tipuesearch_stop_words.length; f++) { + if (d_w[i] == tipuesearch_stop_words[f]) { + isStopWord = true; + hasStopWords = true; + } + } + if (!isStopWord) { + searchFor = searchFor + ' ' + d_w[i]; + } + } + searchFor = $.trim(searchFor); + } else { + searchFor = searchFor.substring(1, searchFor.length - 1); + } + + return { + hasStopWords: hasStopWords, + isStandard: standard, + searchFor: searchFor + }; + } + + function getScore(searchFor, page) { + var score = 0; + var pat = new RegExp(searchFor, 'gi'); + + if (page.title.search(pat) != -1) { + score += (20 * page.title.match(pat).length); + } + + if (page.text.search(pat) != -1) { + score += (20 * page.text.match(pat).length); + } + + if (page.tags.search(pat) != -1) { + score += (10 * page.tags.match(pat).length); + } + + if (page.url.search(pat) != -1) { + score += 20; + } + + return score; + } + + function makeResult(score, page, text) { + return { + "score": score, + "title": page.title, + "desc": text, + "url": page.url + } + } + + window.tipuesearch = function (options) { + var settings = $.extend( + { + 'field': $('#tipue_search_input'), + 'show': 10, + 'showURL': true, + 'showTitleCount': true, + 'minimumLength': 3, + 'descriptiveWords': 25, + 'highlightTerms': true, + 'highlightEveryTerm': false, + 'contentLocation': 'tipuesearch/tipuesearch_content.json', + 'debug': false + }, options); + + var tipuesearch_in = { + pages: [] + }; + + $.ajax( + { + dataType: "json", + url: settings.base_url + settings.contentLocation, + async: false + }) + .done( + function (json) { + tipuesearch_in = $.extend({}, json); + }); + + + if (getURLP('q')) { + settings.field.val(getURLP('q')); + getTipueSearch(0, true); + } + + settings.field.keyup( + function (event) { + if (event.keyCode == '13') { + getTipueSearch(0, true); + } + }); + + + function highlightText(search, text) { + if (settings.highlightTerms) { + var pattern = new RegExp('(' + search + ')', settings.highlightEveryTerm ? 'gi' : 'i'); + text = text.replace(pattern, "$1"); + } + + return text; + } + + function getResults(searchFor, standard) { + var found = []; + + var pages = tipuesearch_in.pages; + + // If a searchLanguage is set, filter out all other pages + if (window.searchLanguage) { + pages = pages.filter(function(item) { + return item.url.indexOf(window.searchLanguage + "/") === 0; + }) + } + + if (standard) { + var d_w = searchFor.split(' '); + for (var i = 0; i < pages.length; i++) { + var score = 0; + var text = pages[i].text; + for (var f = 0; f < d_w.length; f++) { + if (d_w[f].match('^-')) { + var pat = new RegExp(d_w[f].substring(1), 'i'); + if (pages[i].title.search(pat) != -1 || pages[i].text.search(pat) != -1 || pages[i].tags.search(pat) != -1) { + score = 0; + } + } else { + score += getScore(d_w[f], pages[i]); + text = highlightText(d_w[f], text); + } + } + + if (score != 0) { + found.push(makeResult(score, pages[i], text)); + } + } + } else { + for (var i = 0; i < pages.length; i++) { + var score = getScore(searchFor, pages[i]); + if (score != 0) { + found.push(makeResult(score, pages[i], highlightText(searchFor, pages[i].text))); + } + } + } + + found.sort(function (a, b) { + return b.score - a.score + }); + + return found + } + + function getTipueSearch(start, replace) { + + if (!tipue_container) { + tipue_container = $(document.createElement("div")); + tipue_container.addClass('SearchResults'); + document.body.appendChild(tipue_container.get(0)); + + tipue_backdrop = $(document.createElement("div")); + tipue_backdrop.addClass("SearchResultsBackdrop"); + document.body.appendChild(tipue_backdrop.get(0)); + + tipue_container.on('click', '.SearchResults__close', closeSearch); + tipue_container.on('click', '.SearchResults__footer__link', function () { + var id_v = $(this).attr('id'); + var id_a = id_v.split('_'); + + getTipueSearch(parseInt(id_a[0]), id_a[1]); + + tipue_container.scrollTop(0); + }); + + tipue_container.on('keyup paste', '.Search__field', function(event) { + settings.field.val($(this).val()); + + if (event.keyCode == '13') { + getTipueSearch(0, true); + } + }) + } + + $(document).keyup(keyUpHandler); + + var output = ''; + + var search = getSearchString($.trim(settings.field.val().toLowerCase())); + var searchFor = search.searchFor; + + if (searchFor.length >= settings.minimumLength) { + var found = getResults(search.searchFor, search.isStandard); + var counter = found.length; + + + if (counter == 0) { + output += '
' + tipuesearch_string_no_results + '
'; + } else { + if (settings.showTitleCount) { + document.title = '(' + counter + ') ' + originalTitle; + } + + if (counter == 1) { + output += '
' + tipuesearch_string_one_result + '
'; + } else { + output += '
' + tipuesearch_string_results.replace('!count', counter) + '
'; + } + + var l_o = 0; + for (var i = 0; i < found.length; i++) { + if (l_o >= start && l_o < settings.show + start) { + output += ''; + + if (settings.debug) { + output += '
Score: ' + found[i].score + '
'; + } + + if (settings.showURL) { + var s_u = found[i].url.toLowerCase(); + if (s_u.indexOf('http://') == 0) { + s_u = s_u.slice(7); + } + output += ''; + } + + if (found[i].desc) { + var t = found[i].desc; + var t_d = ''; + var t_w = t.split(' '); + if (t_w.length < settings.descriptiveWords) { + t_d = t; + } else { + for (var f = 0; f < settings.descriptiveWords; f++) { + t_d += t_w[f] + ' '; + } + } + t_d = $.trim(t_d); + if (t_d.charAt(t_d.length - 1) != '.') { + t_d += ' ...'; + } + output += '
' + t_d + '
'; + } + } + l_o++; + } + + if (counter > settings.show) { + var pages = Math.ceil(counter / settings.show); + var page = (start / settings.show); + output += ''; + } + } + } else { + if (search.hasStopWords) { + output += '
' + tipuesearch_string_no_results + '. ' + tipuesearch_string_common_words_ignored + '
'; + } else { + output += '
' + tipuesearch_string_too_short + '
'; + if (settings.minimumLength == 1) { + output += '
' + tipuesearch_string_one_character_or_more + '
'; + } else { + output += '
' + tipuesearch_string_should_be_x_or_more.replace("!min", settings.minimumLength) + '
'; + } + } + } + + $("body").addClass("with-search").scrollTop(0); + tipue_backdrop.show(); + tipue_container.scrollTop(0); + tipue_container.show().html(output); + } + + }; + +})(jQuery); diff --git a/docs/generated-docs/tipuesearch/tipuesearch_content.json b/docs/generated-docs/tipuesearch/tipuesearch_content.json new file mode 100644 index 0000000000..173f5b8213 --- /dev/null +++ b/docs/generated-docs/tipuesearch/tipuesearch_content.json @@ -0,0 +1 @@ +{"pages":[{"title":"CoreShop - Pimcore eCommerce Framework","text":"CoreShop Documentation This documentation section provides all information you need to use the CoreShop - Pimcore eCommerce Framework We've aimed this part of the documentation at a developer's audience. CoreShop provides a fully flexible and extendable eCommerce Solution for Pimcore. If you want to know more about Pimcore, please visit pimcore.com. Documentation Overview The Core Framework documentation is divided into three sections that aim to guide the reader through its first use of the platform: See the Getting Started section for an overview and information about the installation process. See the Bundles section for details about the different Bundles CoreShop provides. See the User Documentation section for documentation configuration of CoreShop. See the Development section for documentation about developing with CoreShop. Additional resources for getting started with CoreShop CoreShop Demo: See CoreShop in action and also use it as a blueprint application for your own implementations.","tags":"","url":"index.html"},{"title":"Getting Started","text":"Getting Started with CoreShop This section provides a quick getting started tutorial for CoreShop and covers the following topics: Installation of Pimcore Architecture Overview Upgrade Notes Difference to the eCommerce Framework UI Documentation Developer Documentation","tags":"","url":"Getting_Started\/index.html"},{"title":"Installation","text":"CoreShop Installation You need a running instance of Pimcore on your system before you can install CoreShop. You can setup your own example: Install with composer composer require coreshop\/core-shop ^3.0 Run enable Bundle command php bin\/console pimcore:bundle:enable CoreShopCoreBundle Run Install Command php bin\/console coreshop:install Optional: Install Demo Data php bin\/console coreshop:install:demo Messenger CoreShop also uses Symfony Messenger for async tasks like sending E-Mails or Processing DataObjects for the Index. Please run these 2 transports to process the data bin\/console messenger:consume coreshop_notification coreshop_index --time-limit=300 Payment CoreShop uses Payum for Payment. Checkout Payums Documentation on how to add payment providers. Payment providers are implemented as Pimcore Plugin. They can be installed using composer. Here you can find all available payment modules via composer Payum Documentation","tags":"","url":"Getting_Started\/Installation.html"},{"title":"Architecture Overview","text":"CoreShop Architecture CoreShop is completely open source (GPl license) and free, maintained by diverse and creative community of developers and companies. What are our core values and what makes us different from other solutions? Components based approach Unlimited flexibility and simple customization Developer-friendly, using latest technologies Highest quality of code The Three Natures of CoreShop CoreShop is constructed from fully decoupled and flexible e-commerce components for PHP. It is also a set of Symfony bundles, which integrate the components into the full-stack framework. On top of that, CoreShop is also a complete eCommerce suite crafted from all these building blocks. It is your choice how to use CoreShop, you can benefit from the components with any framework, integrate selected bundles into existing or new Pimcore app or built your application on top of CoreShop Suite. CoreShop Suite This book is about our full-stack eCommerce suite, which is a standard Pimcore Bundle providing the most common webshop and a foundation for custom systems. Leveraging Symfony Bundles If you prefer to build your very custom system step by step and from scratch, you can integrate the standalone Symfony bundles. For the installation instructions, please refer to the appropriate bundle documentation. Difference to the official Pimcore eCommerce Framework The eCommerce Framework provides you with a basic Toolset for eCommerce Development. CoreShop gives you a feature-rich Toolset of common needed Tools for rich and complex eCommerce Solutions. Example I: the Framework does'nt give you the full opportunity for calculating complex Shipping Prices. You need to code it by yourself. CoreShop provides you with Carriers and Shipping Rules to do that. CoreShops Bundles are build to be used individually. The CoreBundle combines all the Features. Architecture Overview CoreShop Suite is build on CoreShop Components and Bundles. The CoreBundle and CoreComponent glues all different Bundles and Components into one eCommerce Suite for B2B and B2C Solutions.","tags":"","url":"Getting_Started\/Architecture_Overview.html"},{"title":"Upgrade Notes","text":"CoreShop Upgrade Notes Always check this page for some important upgrade notes before updating to the latest coreshop build. 2.0.0-beta.3 to 2.0.0-beta.4 BC break: All occurrences of parameters coreshop.all.stack.pimcore_class_ids, "application".model."class".pimcore_class_id, coreshop.all.pimcore_classes.ids have been removed. Inject the corresponding Repository and use classId function instead Pimcore: CoreShop now requires at least Pimcore 5.4.0. You need to update Pimcore to the at least 5.4.0 in order to use\/update CoreShop. Product Price Calculation In order to allow custom price calculation on API Level, we changed the way CoreShop calculates product prices by introducing a new parameter to every PriceCalculation Interface. Price Calculator Conditions are not anymore using a Live context, instead it gets passed via API. Following interfaces have changed: CoreShop\\Component\\Core\\Product\\TaxedProductPriceCalculatorInterface CoreShop\\Component\\Order\\Calculator\\PurchasableDiscountCalculatorInterface CoreShop\\Component\\Order\\Calculator\\PurchasableDiscountPriceCalculatorInterface CoreShop\\Component\\Order\\Calculator\\PurchasablePriceCalculatorInterface CoreShop\\Component\\Order\\Calculator\\PurchasableRetailPriceCalculatorInterface CoreShop\\Component\\Product\\Calculator\\ProductDiscountCalculatorInterface CoreShop\\Component\\Product\\Calculator\\ProductDiscountPriceCalculatorInterface CoreShop\\Component\\Product\\Calculator\\ProductPriceCalculatorInterface CoreShop\\Component\\Product\\Calculator\\ProductRetailPriceCalculatorInterface CoreShop\\Component\\Product\\Rule\\Action\\ProductDiscountActionProcessorInterface CoreShop\\Component\\Product\\Rule\\Action\\ProductDiscountPriceActionProcessorInterface CoreShop\\Component\\Product\\Rule\\Action\\ProductDiscountPriceActionProcessorInterface CoreShop\\Component\\Product\\Rule\\Action\\ProductPriceActionProcessorInterface CoreShop\\Component\\Product\\Rule\\Fetcher\\ValidRulesFetcherInterface If you have anything customized with those classes, please change them accordingly. If you use the PriceCalculator Service directly, you also need to change the call from $this->priceCalculator->getPrice($object, true) to $this->priceCalculator->getPrice($object, [ 'store' => $store, 'country' => $country, 'customer' => $customer, 'currency' $currency, 'cart' => $cart ], true) The new second argument, is the Context for which you want to get the Price. This is highly depends on your need. On a default CoreShop setup, the context can be fetched form the ShopperContext Service like this: return [ 'store' => $this->shopperContext->getStore(), 'customer' => $this->shopperContext->hasCustomer() ? $this->shopperContext->getCustomer() : null, 'currency' => $this->shopperContext->getCurrency(), 'country' => $this->shopperContext->getCountry(), 'cart' => $this->shopperContext->getCart() ]; CoreShop makes that easier for you, you can just use $this->shoppperContext->getContext(). But be aware, the Shopper Context is only in a Web Request available. When you work on a CLI Level, you have to define the context yourself. If you already have a cart and want to calculate the price for the cart, the context is a bit different, cause it resolves from the cart $context = [ 'store' => $cart->getStore(), 'customer' => $cart->getCustomer() ?: null, 'currency' => $cart->getCurrency(), 'country' => $cart->getStore()->getBaseCountry(), 'cart' => $cart ]; Taxation Tax Rule Store relation has been removed as it makes currently no sense. Tracking Tracking bundle has completely been refactored in order to support more use-cases than just ecommerce. If you have any customizations made, please check the current implementation to adapt your changes. Order Invoice Due to changes in adjustments, we also need to change OrderInvoice\/OrderInvoiceItem. After you have migrated to the latest version you also have to remove some fields: CoreShopOrderInvoice totalTax baseTotalTax subtotalTax baseSubtotalTax shippingTax baseShippingTax taxes baseTaxes discountTax baseDiscountTax discountNet discountGross baseDiscountNet baseDiscountGross shippingNet shippingGross baseShippingNet baseShippingGross shippingTaxRate CoreShopOrderInvoiceItem totalTax baseTotalTax taxes baseTaxes Adjustments BC break \/ New Feature There are several deprecated class fields. After you have migrated to the latest version you also have to remove them: CoreShopOrder \/ CoreShopQuote shippingGross shippingNet shippingTax discountGross discountNet discountTax baseShippingNet baseShippingGross baseShippingTax baseDiscountNet baseDiscountGross totalTax baseTotalTax subTotalTax baseSubtotalTax CoreShopOrderItem \/ CoreShopQuoteItem totalTax baseTotalTax CoreShopCart shippingGross shippingNet discountGross discountNet 2.0.0-beta.2 to 2.0.0-beta.3 BC break Signature of following interfaces changed: CoreShop\\Component\\Index\\Interpreter\\InterpreterInterface: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []); CoreShop\\Component\\Index\\Interpreter\\LocalizedInterpreterInterface: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []); CoreShop\\Component\\Index\\Interpreter\\RelationInterpreterInterface: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config, $interpreterConfig = []); CoreShop\\Component\\Customer\\Model\\UserInterface::ROLE_DEFAULT renamed CoreShop\\Component\\Customer\\Model\\UserInterface::CORESHOP_ROLE_DEFAULT CoreShop\\Component\\Customer\\Model\\UserInterface::ROLE_SUPER_ADMIN renamed CoreShop\\Component\\Customer\\Model\\UserInterface::CORESHOP_ROLE_SUPER_ADMIN BC break Shipment \/ Invoice Creation via API changed Before adding a new Shipment \/ Invoice you need to dispatch a request state to your order. Read more about it here and here. BC break getName in CoreShop\\Component\\Index\\Model\\IndexableInterface has been changed to getIndexableName as getName could eventually conflict with a non localized Pimcore Field BC break getEnabled in CoreShop\\Component\\Index\\Model\\IndexableInterface has been changed to getIndexableEnabled as getEnabled could eventually conflict with a localized Pimcore Field 2.0.0-beta.1 to 2.0.0-beta.2 Link Generator implemented. If you want to use nice urls, you need to add the link generator service: CoreShopProduct: add @coreshop.object.link_generator.product as Link Provider CoreShopCategory: add @coreshop.object.link_generator.category as Link Provider Change {{ path('') }} to {{ coreshop_path('') }}. You may want to checkout the FrontendBundle to get a deeper insight. Deprecated Field Names in - CoreShop\\Component\\Payment\\Model\\PaymentInterface`: getName is now getTitle getOrderId is now getOrder and directly returns a OrderInterface Deprecated Field Names in - CoreShop\\Component\\Shipping\\Model\\CarrierInterface: getLabel is not getTitle getName is now getIdentifier 2.0.0-alpha.4 to 2.0.0-beta.1 BC break Signature of following interfaces changed: CoreShop\\Component\\Index\\Interpreter\\InterpreterInterface: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config); CoreShop\\Component\\Index\\Interpreter\\LocalizedInterpreterInterface: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config); CoreShop\\Component\\Index\\Interpreter\\RelationInterpreterInterface: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config); BC break CoreShop now takes advantage of the dependent bundle feature introduced in Pimcore 5.1.2. Therefore, all bundles are now automatically loaded. This is a BC break, as when updating, you might run into issues. To solve the issues, check following things: remove RegisterBundles entry from app\/AppKernel.php remove loading CoreShopCoreBundle Configuration in app\/config.yml enable CoreShopCoreBundle via CLI or manually in var\/config\/extensions.php: "CoreShop\\\\Bundle\\\\CoreBundle\\\\CoreShopCoreBundle" => TRUE BC break Upgraded Default Layout to Bootstrap 4. This will most certainly cause issues when you just override certain templates. Best would be to copy all templates from before the Bootstrap 4 Upgrade. 2.0.0-alpha.4 to 2.0.0-alpha.5 BC break added Component\\Core\\Model\\OrderItem and Component\\Core\\Model\\QuoteItem. If you already customized them, inherit them from the Core Models. BC break changed the way CoreShop processes Cart-Rules. If you implemented a custom-condition, inherit from CoreShop\\Component\\Order\\Cart\\Rule\\Condition\\AbstractConditionChecker and implement isCartRuleValid instead of isValid Deprecated: remove cart\/add-price-rule\/ static route. 2.0.0-alpha.3 to 2.0.0-alpha.4 BC break decoupled MoneyBundle from CurrencyBundle, therefore the Twig Extension for Money Conversion went to the CurrencyBundle. Therefore the name of that extension was renamed from coreshop_convert_money to coreshop_convert_currency. If you use it directly in your code, please rename all of them. Deprecated CoreShopAdminBundle which responsability was only handling installation and deliviering pimcore resources like JS and CSS files. Installation has been moved to CoreShopCoreBundle Delivering of resources is now handled by CoreShopResourceBundle, this also makes it easier to use CoreShop Bundles without handling resources yourself. 2.0.0-alpha.2 to 2.0.0-alpha.3 BC break getPrice in PurchasableInterface and ProductInterface has been removed. In favor of this a new coreShopStorePrice editable has been introduced, which stores prices for each store. This makes handling of multiple currencies way more elegant. If you still want to use the old getPrice, create a new Subclass of \\CoreShop\\Component\\Core\\Model\\Product, implement \\CoreShop\\Component\\Order\\Model\\PriceAwarePurchasableInterface and set your class to CoreShopProduct parents. V1 to V2 CoreShop 2 is not backward compatible. Due to the framework change, we decided to re-make CoreShop from scratch. If you still have instances running and want to migrate, there is a basic migration way which gets you data from V1 to V2. Export from CoreShop1 Import into CoreShop2 Within V1 Nothing available","tags":"","url":"Getting_Started\/Upgrade_Notes.html"},{"title":"Difference to ecommerce Framework","text":"CoreShop vs. eCommerce Framework The idea behind CoreShop is totally different to the eCommerce framework. The eCommerce framework gives you skeleton for building eCommerce applications and heavily depends on you doing all the things. CoreShop, on the other hand, comes full-featured with a rich toolset of optional Components which you can use, or not use, for your ecommerce Application. In other words: CoreShop is the framework on steroids :) Feature Comparison Feature eCommerce Framework CoreShop Product Management \u221a \u221a Product Restrictions X \u221a Product Variants \u221a \u221a Category Management \u221a \u221a Customer Management X \u221a Customer Address Management X \u221a Localization X \u221a Currency Management X \u221a Country Management X \u221a Taxation \u221a \u221a Payment Management \u221a \u221a Supported Payment Providers - Wirecard Qpay \u221a \u221a - Wirecard Seamless \u221a \u221a - Datatrans \u221a \u221a - Klarna \u221a \u221a - Recurring Payments \u221a \u221a - PayPal Express X \u221a - PayPal Pro Checkout X \u221a - PayPal Pro Hosted X \u221a - PayPal Masspay X \u221a - PayPal Rest X \u221a - Stripe.js X \u221a - Stripe Checkout X \u221a - Authorize.NET AIM X \u221a - Be2Bill Credit Card X \u221a - Be2Bill Offsite X \u221a - Payex X \u221a - Offline X \u221a - Payum and Omnipay X \u221a Voucher Codes \u221a \u221a Catalog Price Rules \u221a \u221a Product Specific Price Rules X \u221a Product Facet Index \u221a \u221a Multi Theme Supported X \u221a Carrier Management X \u221a Shipping Calculation X \u221a Order Management \u221a \u221a Order Workflow X \u221a Order Invoice Generation X \u221a Order Shipment Generation X \u221a Quotes Management X \u221a Reporting X \u221a Multi Store\/Tenant \u221a \u221a eCommerce Tracking \u221a \u221a Configurable Mail Rules X \u221a Backend Functionality - Country Management X \u221a - Currency Management X \u221a - Taxation Management X \u221a - Taxation Management X \u221a - Index Management X \u221a - Filter Management X \u221a - Order Management X (partial) \u221a - Voucher Rules \u221a \u221a - Price Rules \u221a \u221a - Order Overview X (partial) \u221a - Quote Overview X \u221a - Order Detail X (partial) \u221a - Quote Detail X \u221a - Order Creation X \u221a - Quote Creation X \u221a Checkout Manager \u221a \u221a Modular\/Componentized X (partial) \u221a Extendable \u221a \u221a To be fair, both Systems have their purpose and you can do the same with both systems. The ecommerce Framework is designed to be very good extendable but you still need to implement a lot of stuff yourself. CoreShop gives you a lot of out-of-the-box features to quickly create rich ecommerce systems.","tags":"","url":"Getting_Started\/Difference_to_ecommerce_Framework.html"},{"title":"Bundles","text":"CoreShop Bundles CoreShop is a set of Bundles that provide different functionality. Each Bundle is supposed to be independent and can be used without the other Bundles. Glued together, they provide a full e-commerce solution. Address Bundle Configuration Bundle Core Bundle Currency Bundle Customer Bundle Fixture Bundle Frontend Bundle Index Bundle Inventory Bundle Locale Bundle Money Bundle Messenger Bundle ! Money Bundle ! Notification Bundle ! Optimistic Entity Lock Bundle ! Order Bundle Payment Bundle Payum Payment Bundle ! Product Bundle Product Quantity Price Rules Bundle Resource Bundle Rule Bundle SEO Bundle Sequence Bundle Shipping Bundle Storage List Bundle Store Bundle Taxation Bundle Theme Bundle Tracking Bundle User Bundle Variant Bundle Wishlist Bundle Workflow Bundle","tags":"","url":"Bundles\/index.html"},{"title":"Address Bundle","text":"CoreShop Address Bundle CoreShop Address Bundle provides a basic set of data for Addressing Information like: Country State Address This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Address_Bundle.html"},{"title":"Configuration Bundle","text":"CoreShop Configuration Bundle Installation $ composer require coreshop\/configuration-bundle:^3.0 Usage Configuration Component helps you store your configurations in database. $service = new CoreShop\\Component\\Configuration\\Service\\ConfigurationService($doctrineEntityManager, $configRepo, $configFactory); $service->set('key', 'value'); $service->get('key');","tags":"","url":"Bundles\/Configuration_Bundle.html"},{"title":"Core Bundle","text":"CoreShop Core Bundle Core Bundle glues all independent CoreShop Bundles into one e-commerce suite and extends certain parts accordingly. This Bundle is not advised to be installed seperately!","tags":"","url":"Bundles\/Core_Bundle.html"},{"title":"Currency Bundle","text":"CoreShop Currency Bundle Currency Bundle provides you with Models for persisting Currencies and resolving Currency Contexts. Symfony Profiler Pimcore Core Extensions Doctrine Mappings Symfony Forms Money Formatter Twig Extensions Currency Formatting Currency Conversion Currency Code to Symbol Installation $ composer require coreshop\/currency-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\CurrencyBundle\\CoreShopCurrencyBundle(), ]); } Updating database schema Run the following command. $ php bin\/console doctrine:schema:update --force Usage This Bundle integrates Currency Component into Symfony and Doctrine The Currency Bundle provides you with basic information needed for Currencies: Currency, Exchange Rates, Conversion and Formatting Doctrine Entities Currency Pimcore UI Currency Exchange Rate How to use? coreshop.global.resource.open('coreshop.currency', 'currency'); coreshop.global.resource.open('coreshop.currency', 'exchange_rate');","tags":"","url":"Bundles\/Currency_Bundle.html"},{"title":"Customer Bundle","text":"CoreShop Customer Bundle Installation $ composer require coreshop\/customer-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\CustomerBundle\\CoreShopCustomerBundle(), ]); } Updating database schema Run the following command. $ php bin\/console doctrine:schema:update --force Install Pimcore Entities $ php bin\/console coreshop:resources:install Learn more about overriding Pimcore Classes here) Usage This Bundle integrates Customer Component into Symfony and Doctrine The Customer Bundle provides you with basic information needed for a Customer: Customer and CustomerGroup The Bundle also introduces an Customer Context, which helps you determine the current Customer. Pimcore Entities Customer (CoreShopCustomer) CustomerGroup (CoreShopCustomerGroup)","tags":"","url":"Bundles\/Customer_Bundle.html"},{"title":"Fixture Bundle","text":"CoreShop Fixture Bundle Fixture Bundle allows us to Install certain data needed for runtime of CoreShop or for the Demo. Installation $ composer require coreshop\/fixture-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\FixtureBundle\\CoreShopFixtureBundle(), ]); } Updating database schema Run the following command. $ php bin\/console doctrine:schema:update --force Creating a new Fixture Create a new File in your Bundle within the Namespace Fixtures\\Data\\Application for app fixtures and Fixtures\\Data\\Demo for Demo fixtures. The FixtureBundle will automatically recognize your fixtures. <?php namespace CoreShop\\Bundle\\CoreBundle\\Fixtures\\Application; use CoreShop\\Bundle\\FixtureBundle\\Fixture\\VersionedFixtureInterface; use Doctrine\\Common\\DataFixtures\\AbstractFixture; use Doctrine\\Common\\Persistence\\ObjectManager; use Symfony\\Component\\DependencyInjection\\ContainerAwareInterface; use Symfony\\Component\\DependencyInjection\\ContainerInterface; class ConfigurationFixture extends AbstractFixture implements ContainerAwareInterface, VersionedFixtureInterface { \/** * @var ContainerInterface *\/ private $container; \/** * {@inheritdoc} *\/ public function getVersion() { return '2.0'; } \/** * {@inheritdoc} *\/ public function setContainer(ContainerInterface $container = null) { $this->container = $container; } \/** * {@inheritdoc} *\/ public function load(ObjectManager $manager) { $configurations = [ 'system.guest.checkout' => true, 'system.category.list.mode' => 'list', 'system.category.list.per_page' => [12, 24, 36], 'system.category.list.per_page.default' => 12, 'system.category.grid.per_page' => [5, 10, 15, 20, 25], 'system.category.grid.per_page.default' => 10, 'system.category.variant_mode' => 'hide', 'system.order.prefix' => 'O', 'system.order.suffix' => '', 'system.quote.prefix' => 'Q', 'system.quote.suffix' => '', 'system.invoice.prefix' => 'IN', 'system.invoice.suffix' => '', 'system.invoice.wkhtml' => '-T 40mm -B 15mm -L 10mm -R 10mm --header-spacing 5 --footer-spacing 5', 'system.shipment.prefix' => 'SH', 'system.shipment.suffix' => '', 'system.shipment.wkhtml' => '-T 40mm -B 15mm -L 10mm -R 10mm --header-spacing 5 --footer-spacing 5', ]; foreach ($configurations as $key => $value) { $this->container->get('coreshop.configuration.service')->set($key, $value); } } }","tags":"","url":"Bundles\/Fixture_Bundle.html"},{"title":"Frontend Bundle","text":"CoreShop Frontend Bundle CoreShop FrontendBundle provides some FrontendControllers as well as a default Implementation for the Frontend. This Bundle is not advised to be installed seperately!","tags":"","url":"Bundles\/Frontend_Bundle.html"},{"title":"Index Bundle","text":"CoreShop Index Bundle Installation $ composer require coreshop\/index-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\IndexBundle\\CoreShopIndexBundle(), ]); } Updating database schema Run the following command. $ php bin\/console doctrine:schema:update --force Usage This Bundle integrates Index Component into Symfony and Doctrine The Index Bundle provides you with basic information needed for a Indexing Pimcore Models: Index, Filters and Conditions It also provides you with ListingServices and FilterServices Get Listing from Index How to get a Listing from an Index? $filter = $this->get('coreshop.repository.filter')->find(1); \/\/Get Filter by ID 1 $filteredList = $this->get('coreshop.factory.filter.list')->createList($filter, $request->request); $filteredList->setVariantMode(ListingInterface::VARIANT_MODE_HIDE); $filteredList->setCategory($category); $this->get('coreshop.filter.processor')->processConditions($filter, $filteredList, $request->query); $filteredList->load(); Pimcore UI Index Configuration Filter Configuration How to use? coreshop.global.resource.open('coreshop.index', 'index'); coreshop.global.resource.open('coreshop.index', 'filter');","tags":"","url":"Bundles\/Index_Bundle.html"},{"title":"Inventory Bundle","text":"CoreShop Inventory Bundle CoreShop Inventory Bundle provides a Basic implementation to handle Inventory for a Product. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Inventory_Bundle.html"},{"title":"Locale Bundle","text":"CoreShop Locale Bundle CoreShop Locale Bundle provides a basic set of data for Locale Information. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Locale_Bundle.html"},{"title":"Menu Bundle","text":"CoreShop Menu Bundle Menu Bundle makes it easy creating Pimcore Menus based on permissions. Installation $ composer require coreshop\/menu-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\MenuBundle\\CoreShopMenuBundle(), ]); } Usage Create a new Menu by creating a new Class, let's call it MyMenuBuilder namespace AppBundle\\Menu; use CoreShop\\Bundle\\MenuBundle\\Builder\\MenuBuilderInterface; use Knp\\Menu\\FactoryInterface; use Knp\\Menu\\ItemInterface; class MyMenuBuilder implements MenuBuilderInterface { public function buildMenu(ItemInterface $menuItem, FactoryInterface $factory, string $type) { \/\/Create a new direct sub-menu item $menuItem ->addChild('my-menu-item') ->setLabel('my-menu-item') ->setAttribute('permission', 'my_menu_item') ->setAttribute('iconCls', 'pimcore_icon_delete') ; } } You then need to register your class to the symfony container: app.my_menu: class: AppBundle\\Menu\\MyMenuBuilder tags: - { name: coreshop.menu, type: my_menu, menu: my_menu } Where the menu attribute defines your unique identifier for your menu. You can also register multiple Builders for your Menu with the same menu attribute, this will load them one after another. Now, lets do the ExtJs Javascript part. In your Bundle. I assume you already have a working Bundle for that. In your Bundle.php file, add this file to the jsPaths array: '\/admin\/coreshop\/coreshop.my_menu\/menu.js' Where my_menu here again is your defined identifier. This will load a basic helper file that will build your menu. Now, let's actually build the menu. You should already have a startup.js somehwere in your Bundle. In there, you can instantiate the menu by calling: new coreshop.menu.coreshop.my_menu(); That will build the menu automatically for you. In order now to do something when a menu-item is clicked, you can attach to the event that is fired: pimcore.eventDispatcher.registerTarget('coreshopMenuOpen', new (Class.create({ coreshopMenuOpen: function(type, item) { if (item.id === 'my-menu-item') { alert('My Menu Item has been clicked'); } } })));","tags":"","url":"Bundles\/Menu_Bundle.html"},{"title":"Messenger Bundle","text":"CoreShop Messenger Bundle CoreShop Messenger Bundle provides you with a nice UI to see what Messenger Tasks are queued in which queues: Installation $ composer require coreshop\/messenger-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\MessengerBundle\\CoreShopMessengerBundle(), ]); }","tags":"","url":"Bundles\/Messenger_Bundle.html"},{"title":"Money Bundle","text":"CoreShop Money Bundle Installation $ composer require coreshop\/money-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\MoneyBundle\\CoreShopMoneyBundle(), ]); } Usage Money Bundle adds a new core-extension to pimcore which allows you to store currency values as integer. You also get a Twig Extension to format money values. {{ value|coreshop_format_money('\u20ac', 'de'); }}","tags":"","url":"Bundles\/Money_Bundle.html"},{"title":"Notification Bundle","text":"CoreShop Notification Bundle CoreShop Notification Bundle handles all communication between CoreShop and the outside world. It provides a basic set of data for Notifications like: Notification Rules Notification Rule Conditions Notification Rule Actions This Bundle can be used separately, but doesn't provide any detail information how to use it. Usage Notifications run async in a Symfony messenger queue: bin\/console messenger:consume coreshop_notification coreshop_index --time-limit=300","tags":"","url":"Bundles\/Notification_Bundle.html"},{"title":"OptimisticEntityLock Bundle","text":"CoreShop Optimistic Entity Lock Bundle The CoreShop Optimistic Entity Lock Bundle is a package for the CoreShop e-commerce framework, based on the Pimcore platform, designed to handle optimistic entity locking. This bundle helps prevent conflicts when multiple users try to edit the same entity concurrently by implementing an optimistic locking strategy. Installation $ composer require optimistic-entity-lock-bundle Adding required bundles to kernel You need to enable the bundle inside the kernel. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\OptimisticEntityLockBundle\\CoreShopOptimisticEntityLockBundle(), ]); } Usage Your Pimcore DataObject Class needs to implement the Interface CoreShop\\Bundle\\OptimisticEntityLockBundle\\Model\\OptimisticLockedInterface. You can therefore add the field optimisticLockVersion to your Pimcore Class Definition. From now on, everytime the DataObject gets saved, CoreShop compares the Versions and increases it before saving. If the version is different, someone else saved the entity before you and you get a exception.","tags":"","url":"Bundles\/OptimisticEntityLock_Bundle.html"},{"title":"Order Bundle","text":"CoreShop Order Bundle CoreShop Order Bundle provides a basic set of data for Orders. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Order_Bundle.html"},{"title":"Payment Bundle","text":"CoreShop Payment Bundle Installation $ composer require coreshop\/payment-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\PaymentBundle\\CoreShopPaymentBundle(), ]); } Updating database schema Run the following command. $ php bin\/console doctrine:schema:update --force Usage This Bundle integrates Payment Component into Symfony and Doctrine The Payment Bundle provides you with basic information needed for payment: Payment The Bundle also introduces an Address Formatter, which formats addresses in country based formats. Doctrine Entities Payment Pimcore UI Payment Provider How to use? coreshop.global.resource.open('coreshop.payment', 'payment_provider');","tags":"","url":"Bundles\/Payment_Bundle.html"},{"title":"Payum Bundle","text":"CoreShop Payum Bundle Handles the Payum Integration with CoreShop. This Bundle requires the Core and can only be used in the full installation. This Bundle is not advised to be installed seperately!","tags":"","url":"Bundles\/Payum_Bundle.html"},{"title":"PayumPayment Bundle","text":"CoreShop Payum Payment Bundle Integrates CoreShop Payment Bundle with Payum.","tags":"","url":"Bundles\/PayumPayment_Bundle.html"},{"title":"Pimcore Bundle","text":"CoreShop Pimcore Bundle Installation $ composer require coreshop\/pimcore-bundle:^3.0 Activating Bundle You need to enable the bundle inside the kernel or with the Pimcore Extension Manager. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\PimcoreBundle\\CoreShopPimcoreBundle() ]); } Usage The CoreShopPimcoreBundle integrates the CoreShop Pimcore Component into Symfony automatically registers a lot of services for you. JS\/CSS Resource Loading With Pimcore, every bundle needs to take care about loading static assets themselve. PimcoreBundle helps you out here, follow these steps to use it: Create a DependencyInjection Extension class like: <?php namespace AppBundle\\DependencyInjection; use CoreShop\\Bundle\\ResourceBundle\\DependencyInjection\\Extension\\AbstractModelExtension; use Symfony\\Component\\Config\\FileLocator; use Symfony\\Component\\DependencyInjection\\ContainerBuilder; use Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader; class AppExtension extends AbstractModelExtension { public function load(array $config, ContainerBuilder $container) { $config = $this->processConfiguration($this->getConfiguration([], $container), $config); $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'\/..\/Resources\/config')); $loader->load('services.yml'); $this->registerPimcoreResources('coreshop', $config['pimcore_admin'], $container); } } Create a DependencyInjection Configuration class like: <?php namespace AppBundle\\DependencyInjection; use Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition; use Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder; use Symfony\\Component\\Config\\Definition\\ConfigurationInterface; final class Configuration implements ConfigurationInterface { \/** * {@inheritdoc} *\/ public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('app'); $this->addPimcoreResourcesSection($rootNode); return $treeBuilder; } \/** * @param ArrayNodeDefinition $node *\/ private function addPimcoreResourcesSection(ArrayNodeDefinition $node) { $node->children() ->arrayNode('pimcore_admin') ->addDefaultsIfNotSet() ->children() ->arrayNode('js') ->addDefaultsIfNotSet() ->ignoreExtraKeys(false) ->children() ->scalarNode('test')->defaultValue('\/bundles\/app\/pimcore\/js\/test.js')->end() ->end() ->end() ->arrayNode('css') ->addDefaultsIfNotSet() ->ignoreExtraKeys(false) ->children() ->scalarNode('test')->defaultValue('\/bundles\/app\/pimcore\/css\/pimcore.css')->end() ->end() ->end() ->end() ->end() ->end(); } } That's it, PimcoreBundle now takes care about loading your resources and also bundles them in non DEV-Mode. DataObject Extensions Serialized Data This extension allows you to store SerializedData inside a Pimcore DataObject. Slug Pimcore comes with quite useful objects slugs. But it doesn't come with a Slug Generator. CoreShop for the rescue. In Order to use it, your class needs to implement CoreShop\\Component\\Pimcore\\Slug\\SluggableInterface and CoreShop automatically generates slugs for you. Extensions \/ Influence the slug generation If you want to change the generated slug or prefix it, you can use the CoreShop\\Component\\Pimcore\\Event\\SlugGenerationEvent Event. <?php declare(strict_types=1); namespace App\\EventListener; use CoreShop\\Component\\Pimcore\\Event\\SlugGenerationEvent; use Pimcore\\Model\\DataObject\\PressRelease; use Pimcore\\Model\\Document; use Symfony\\Component\\EventDispatcher\\EventSubscriberInterface; final class SlugEventListener implements EventSubscriberInterface { public static function getSubscribedEvents() { return [ SlugGenerationEvent::class => 'onGenerate', ]; } public function onGenerate(SlugGenerationEvent $event): void { $event->setSlug($event->getSlug() . '-bar'); } } Data Object Features Class Converter and Data Migrate Class converter is a small utility, which lets you migrate all Data from one class to another. Usage: <?php use CoreShop\\Component\\Pimcore\\Migrate; $currentClassName = 'Product'; $newClassName = 'NewProduct'; $options = [ 'delete_existing_class' => true, 'parentClass' => 'AppBundle\\Model\\MyProduct' ]; \/\/Copies $currentClassName Definition to $newClassName \/\/$options can overwrite some properties like parentClass Migrate::migrateClass($currentClassName, $newClassName, $options); \/\/This function migrates all data from $currentClassName to $newClassName \/\/It uses SQL Commands to increase performance of migration Migrate::migrateData($currentClassName, $newClassName); Class Installer Class Installer helps you importing Classes\/FieldCollections\/ObjectBricks into Pimcore based of a JSON Definition: use CoreShop\\Component\\Pimcore\\ClassInstaller; $installer = new ClassInstaller(); \/\/ For Bricks use $installer->createBrick($pathToJson, $brickName); \/\/ For Classes use $installer->createClass($pathToJson, $className, $updateExistingClass); \/\/ For FieldCollections use $installer->createFieldCollection($pathToJson, $fcName); Class\/Brick\/Field Collection Updater Definition Updaters help you in migrating your Pimcore Class\/Bricks or Field Collection Definitions to be properly migrated from Release to Release. To update a Pimcore class use it like this: use CoreShop\\Component\\Pimcore\\DataObject\\ClassUpdate; $classUpdater = new ClassUpdate('Product'); \/\/Your JSON Definition from Pimcore $payment = [ 'fieldtype' => 'coreShopSerializedData', 'phpdocType' => 'array', 'allowedTypes' => [ ], 'maxItems' => 1, 'name' => 'paymentSettings', 'title' => 'Payment Settings', 'tooltip' => '', 'mandatory' => false, 'noteditable' => true, 'index' => false, 'locked' => null, 'style' => '', 'permissions' => null, 'datatype' => 'data', 'columnType' => null, 'queryColumnType' => null, 'relationType' => false, 'invisible' => false, 'visibleGridView' => false, 'visibleSearch' => false, ]; \/\/Check if field exists if (!$classUpdater->hasField('paymentSettings')) { \/\/If not insert field after a specific field and save the definition $classUpdater->insertFieldAfter('paymentProvider', $payment); $classUpdater->save(); } Thats it, the same works for FieldCollections with the class CoreShop\\Component\\Pimcore\\DataObject\\FieldCollectionDefinitionUpdate and for Bricks with the class CoreShop\\Component\\Pimcore\\DataObject\\BrickDefinitionUpdate Inheritance Helper Inhertiance Helper is a small little but very useful helper class to enable Pimcore inheritance only with a closure function like this: use CoreShop\\Component\\Pimcore\\DataObject\\InheritanceHelper; $inheritedValue = InheritanceHelper::useInheritedValues(function() use($object) { return $object->getValueInherited(); }, true); Version Helper Version Helper is a small little but very useful helper class to disabling or enablind Pimcore Versioning. use CoreShop\\Component\\Pimcore\\DataObject\\VersionHelper; VersionHelper::useVersioning(function() use($object) { \/\/Object will be saved without creating a new Version $object->save(); }, false); Unpublished Helper Unpublsihed Helper is a small little but very useful helper class to get unpublished objects in Pimcore Frontend. use CoreShop\\Component\\Pimcore\\DataObject\\UnpublishedHelper; $allProducts = UnpublishedHelper::hideUnpublished(function() use($object) { \/\/Will return all products, even the unpbulished ones return $object->getProducts(); }, false); Expression Language Features CoreShop adds some features to the Symfony Expression language like: PimcoreLanguageProvider: to get Pimcore Objects, Assets or Documents inside a Expression Language Query Migration Features Pimcore Shared Translations Helps you to install new Shared Translations during Migration: use CoreShop\\Component\\Pimcore\\Migration\\SharedTranslation; SharedTranslation::add('key', 'en', 'value');","tags":"","url":"Bundles\/Pimcore_Bundle.html"},{"title":"Product Bundle","text":"CoreShop Product Bundle CoreShop Product Bundle is responsible for the Product Management. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Product_Bundle.html"},{"title":"ProductQuantityPriceRules Bundle","text":"CoreShop Product Quantity Price Rules Bundle This Bundle implements the Quantity Price Rules for CoreShop. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/ProductQuantityPriceRules_Bundle.html"},{"title":"Resource Bundle","text":"CoreShop Resource Bundle Resource Bundle is the Heart of CoreShops Model. It handles saving\/deleting\/updating\/creating of CoreShop Models. It handles Doctrine ORM Mappings and Translations. As well as Routing, Event Dispatching, Serialization and CRUD. Resource Bundle also takes care about installation of Pimcore Class Definitions, Object Brick Definitions, Field Collection Definitions, Static Routes and SQL. You can use Resource Bundle as base for all your Custom Pimcore Entities. Installation $ composer require coreshop\/resource-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\JMS\\SerializerBundle\\JMSSerializerBundle(), new \\CoreShop\\Bundle\\ResourceBundle\\CoreShopResourceBundle(), new \\Doctrine\\Bundle\\DoctrineCacheBundle\\DoctrineCacheBundle(), new \\Stof\\DoctrineExtensionsBundle\\StofDoctrineExtensionsBundle() ]); }","tags":"","url":"Bundles\/Resource_Bundle\/index.html"},{"title":"CustomEntities","text":"Adding a new custom entity Create Translatable Entity First of all, we need to create our Entity Class. In this case, we create a Translatable Entity. <?php \/\/AppBundle\/Model\/CustomEntityInterface.php interface CustomEntityInterface extends ResourceInterface, TranslatableInterface { public function getName($language = null); public function setName($name, $language = null); } <?php \/\/AppBundle\/Model\/CustomEntity.php class CustomEntity implements CustomEntityInterface { use TranslatableTrait { __construct as private initializeTranslationsCollection; } protected $id; protected $name; public function __construct() { $this->initializeTranslationsCollection(); } public function getId() { return $this->id; } public function getName($language = null) { return $this->getTranslation($language)->getName(); } public function setName($name, $language = null) { $this->getTranslation($language, false)->setName($name); return $this; } protected function createTranslation() { return new CustomEntityTranslation(); } } Since our Entity is Translatable, we need to add our Translation Entity as well. <?php \/\/AppBundle\/Model\/CustomEntityTranslationInterface.php interface CustomEntityTranslationInterface extends ResourceInterface, TimestampableInterface { \/** * @return string *\/ public function getName(); \/** * @param string $name *\/ public function setName($name); } <?php \/\/AppBundle\/Model\/CustomEntityTranslation.php class CustomEntityTranslation extends AbstractTranslation implements CustomEntityTranslationInterface { protected $id; protected $name; public function getId() { return $this->id; } public function getName() { return $this->name; } public function setName($name) { $this->name = $name; } } Create Doctrine Configuration # AppBundle\/Resources\/config\/doctrine\/model\/CustomEntity.orm.yml AppBundle\\Model\\CustomEntity: type: mappedSuperclass table: app_custom_entity fields: id: type: integer column: id id: true generator: strategy: AUTO Our Translation Doctrine definition: # AppBundle\/Resources\/config\/doctrine\/model\/CustomEntityTranslation.orm.yml AppBundle\\Model\\CustomEntityTranslation: type: mappedSuperclass table: app_custom_entity_translation fields: id: type: integer column: id id: true generator: strategy: AUTO name: type: string column: name Create DI Configuration <?php \/\/AppBundle\/DependencyInjection\/Configuration.php namespace CoreShop\\Bundle\\AddressBundle\\DependencyInjection; final class Configuration implements ConfigurationInterface { \/** * {@inheritdoc} *\/ public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('app'); $rootNode ->children() ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end() ->end() ; $this->addModelsSection($rootNode); return $treeBuilder; } \/** * @param ArrayNodeDefinition $node *\/ private function addModelsSection(ArrayNodeDefinition $node) { $node ->children() ->arrayNode('resources') ->addDefaultsIfNotSet() ->children() ->arrayNode('custom_entity') ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() ->scalarNode('permission')->defaultValue('custom_entity')->cannotBeOverwritten()->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() ->scalarNode('model')->defaultValue(CustomEntity::class)->cannotBeEmpty()->end() ->scalarNode('interface')->defaultValue(CustomEntityInterface::class)->cannotBeEmpty()->end() ->scalarNode('admin_controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end() ->scalarNode('factory')->defaultValue(TranslatableFactory::class)->cannotBeEmpty()->end() ->scalarNode('repository')->defaultValue(CustomEntityRepository::class)->cannotBeEmpty()->end() ->scalarNode('form')->defaultValue(CustomEntityType::class)->cannotBeEmpty()->end() ->end() ->end() ->arrayNode('translation') ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() ->scalarNode('model')->defaultValue(CustomEntityTranslation::class)->cannotBeEmpty()->end() ->scalarNode('interface')->defaultValue(CustomEntityTranslationInterface::class)->cannotBeEmpty()->end() ->scalarNode('controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end() ->scalarNode('repository')->cannotBeEmpty()->end() ->scalarNode('factory')->defaultValue(Factory::class)->end() ->scalarNode('form')->defaultValue(CustomEntityTranslationType::class)->cannotBeEmpty()->end() ->end() ->end() ->end() ->end() ->end() ->end() ->end() ->end() ->end() ; } } <?php \/\/AppBundle\/DependencyInjection\/AppExtension.php final class AppExtension extends AbstractModelExtension { \/** * {@inheritdoc} *\/ public function load(array $config, ContainerBuilder $container) { $config = $this->processConfiguration($this->getConfiguration([], $container), $config); \/\/'app' is the application name $this->registerResources('app', $config['driver'], $config['resources'], $container); } } <?php \/\/AppBundle\/DependencyInjection\/AppExtension.php final class AppBundle extends AbstractResourceBundle { public function getSupportedDrivers() { return [ CoreShopResourceBundle::DRIVER_DOCTRINE_ORM, ]; } protected function getModelNamespace() { return 'AppBundle\\Model'; } } Create Serialization Definition if you want to serialize your Entity # AppBundle\/Resources\/config\/serializer\/Model.CustomEntity.yml AppBundle\\Model\\CustomEntity: exclusion_policy: ALL xml_root_name: custom_entity properties: id: expose: true type: integer groups: [List, Detailed] translations: expose: true type: array groups: [Detailed] virtual_properties: getName: serialized_name: name groups: [List, Detailed] # AppBundle\/Resources\/config\/serializer\/Model.CustomEntityTranslation.yml AppBundle\\Model\\CustomEntityTranslation: exclusion_policy: ALL xml_root_name: custom_entity_translation properties: name: expose: true type: string groups: [Detailed] Create Routes to ResourceController # AppBundle\/Resources\/config\/pimcore\/routing.yml app_custom_entity: type: coreshop.resources resource: | alias: app.custom_entity This will create all CRUD routes: (app is the application name specified in AppExtension.php) GET: \/admin\/app\/custom_entity\/list GET: \/admin\/app\/custom_entity\/get POST: \/admin\/app\/custom_entity\/add POST: \/admin\/app\/custom_entity\/save DELETE: \/admin\/app\/custom_entity\/delete","tags":"","url":"Bundles\/Resource_Bundle\/CustomEntities.html"},{"title":"PimcoreEntities","text":"Adding a new Pimcore Entity with automated installation Add a new Pimcore Class in Pimcore. Add a Parent Class to your Pimcore Entity Export Class Definition to AppBundle\/Resources\/install\/pimcore\/classes\/PimcoreEntity.json Create Parent Class <?php \/\/AppBundle\/Model\/PimcoreEntityInterface.php interface PimcoreEntityInterface extends ResourceInterface public function getName($language = null); public function setName($name, $language = null); } <?php \/\/AppBundle\/Model\/PimcoreEntity.php class PimcoreEntity extends AbstractPimcoreModel implements PimcoreEntityInterface, PimcoreModelInterface { public function getName($language = null) { throw new ImplementedByPimcoreException(__CLASS__, __METHOD__); } public function setName($name, $language = null) { throw new ImplementedByPimcoreException(__CLASS__, __METHOD__); } } Create Dependency Injection Configuration <?php \/\/AppBundle\/DependencyInjection\/Configuration.php namespace AppBundle\\DependencyInjection; final class Configuration implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('app_custom'); $this->addModelsSection($rootNode); return $treeBuilder; } private function addModelsSection(ArrayNodeDefinition $node) { $node ->children() ->arrayNode('pimcore') ->addDefaultsIfNotSet() ->children() ->arrayNode('pimcore_entity') ->addDefaultsIfNotSet() ->children() ->variableNode('PimcoreEntity')->end() ->arrayNode('options') ->scalarNode('path')->defaultValue('path\/within\/pimcore')->end() ->scalarNode('permission')->defaultValue('pimcore_entity')->cannotBeOverwritten()->end() ->addDefaultsIfNotSet() ->children() ->scalarNode('model')->defaultValue('Pimcore\\Model\\Object\\PimcoreEntity')->cannotBeEmpty()->end() ->scalarNode('interface')->defaultValue(PimcoreEntity::class)->cannotBeEmpty()->end() ->scalarNode('factory')->defaultValue(PimcoreFactory::class)->cannotBeEmpty()->end() ->scalarNode('repository')->cannotBeEmpty()->end() ->scalarNode('admin_controller')->cannotBeEmpty()->end() ->scalarNode('install_file')->defaultValue('@AppBundle\/Resources\/install\/pimcore\/classes\/PimcoreEntity.json')->end() ->scalarNode('type')->defaultValue(CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT)->cannotBeOverwritten(true)->end() ->end() ->end() ->end() ->end() ->end() ->end() ->end() ; } } <?php \/\/AppBundle\/DependencyInjection\/AppBundleExtension.php namespace AppBundle\\DependencyInjection; final class AppBundleExtension extends AbstractModelExtension { public function load(array $config, ContainerBuilder $container) { $this->registerPimcoreModels('app', $config['pimcore'], $container); } } Use your Pimcore Entity You can either use Pimcore Listing Classes like: $list = new Pimcore\\Model\\Object\\PimcoreEntity\\Listing(); or use automated generated Factory\/Repository Classes $pimcoreEntityObject = $container->get('app.repository.pimcore_entity')->findBy($id); $list = $container->get('app.repository.pimcore_entity')->getList();","tags":"","url":"Bundles\/Resource_Bundle\/PimcoreEntities.html"},{"title":"Installation","text":"Adding new files that needs to be installed Resource Bundles takes care about installing your resources. It can handle following types: - Object Classes - Field Collection Classes - Objectbrick Classes - Routes - Permissions - SQL Files Object Classes, Field Collections and Objectbrick Classes To install object classes, you need to configure your classes inside your Bundle and register them to Resource Bundle. (as described here) Routes, SQL and Permissions To install routes, permissions or execute sql files, configure them in your Bundle likes this: <?php namespace AppBundle\\DependencyInjection; final class Configuration implements ConfigurationInterface { \/** * {@inheritdoc} *\/ public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('AppBundle'); $this->addPimcoreResourcesSection($rootNode); return $treeBuilder; } private function addPimcoreResourcesSection(ArrayNodeDefinition $node) { $node->children() ->arrayNode('pimcore_admin') ->addDefaultsIfNotSet() ->children() ->arrayNode('install') ->addDefaultsIfNotSet() ->children() ->scalarNode('routes')->defaultValue(['@AppBundle\/Resources\/install\/pimcore\/routes.yml'])->end() ->scalarNode('sql')->defaultValue(['@AppBundle\/Resources\/install\/pimcore\/data.sql'])->end() ->end() ->end() ->scalarNode('permissions') ->cannotBeOverwritten() ->defaultValue(['name_of_permission']) ->end() ->end() ->end() ->end(); } } Routes Example File yeah_route: pattern: "\/(\\\\w+)\\\\\/yeah-route\/" reverse: "\/%_locale\/yeah\\-route" module: AppBundle controller: "@app.frontend.controller.controller" action: doSomething variables: _locale priority: 2","tags":"","url":"Bundles\/Resource_Bundle\/Installation.html"},{"title":"Rule Bundle","text":"CoreShop Rule Bundle CoreShop Rule Bundle is the base Bundle for all Rule Based Systems in CoreShop. It provides a basic set of data for Rules like: Rule Conditions Rule Actions This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Rule_Bundle.html"},{"title":"SEO Bundle","text":"CoreShop SEO Bundle Installation $ composer require coreshop\/seo-bundle:^3.0 Activating Bundle You need to enable the bundle inside the kernel or with the Pimcore Extension Manager. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\SEOBundle\\CoreShopSEOBundle() ]); } Usage The SEO Bundle provides you with services to make SEO more manageable. It depends on Pimcore's HeadLink and HeadMeta Helper. There are multiple ways of making use of this bundle: Implement SEO interfaces provided with this bundle Implement Custom Extractors and add them to the SEOMetadata Model To update the SEO Information, you need to use the service coreshop.seo.presentation: \/\/From a Controller $this->get('coreshop.seo.presentation')->updateSeoMetadata($object); Implement SEO Interfaces SEO Bundle comes with 3 SEO Aware interfaces you can take advantage of: CoreShop\\Component\\SEO\\Model\\SEOAwareInterface for meta-title and meta-description CoreShop\\Component\\SEO\\Model\\SEOImageAwareInterface for og-image attribute CoreShop\\Component\\SEO\\Model\\SEOImageAwareInterface for og-title, og-type and pg-description attribute Implement SEO Extractors To add a new Extractor, you need to implement the interface CoreShop\\Component\\SEO\\Extractor\\ExtractorInterface and register your class with the tag coreshop.seo.extractor: Example Let's implement a custom extractor for our Product class with a Video. <?php \/\/src\/AppBundle\/SEO\/Extractor\/ProductVideoExtractor.php namespace AppBundle\\SEO\\Extractor; use Pimcore\\Model\\DataObject\\Product; use Pimcore\\Tool; final class ProductVideoExtractor implements ExtractorInterface { \/** * {@inheritdoc} *\/ public function supports($object) { return $object instanceof Product && $object->getVideoUrl(); } \/** * {@inheritdoc} *\/ public function updateMetadata($object, SEOMetadataInterface $seoMetadata) { \/** * @var $object Product *\/ $seoMetadata->addExtraProperty('og:video', Tool::getHostUrl() . $object->getVideoUrl()); } } Now we need to register the service # src\/AppBundle\/Resources\/config\/services.yml services: AppBundle\\SEO\\Extractor: tags: - { name: coreshop.seo.extractor, type: product_video }","tags":"","url":"Bundles\/SEO_Bundle.html"},{"title":"Sequence Bundle","text":"CoreShop Sequence Bundle Installation $ composer require coreshop\/sequence-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\SequenceBundle\\CoreShopSequenceBundle(), ]); } Updating database schema Run the following command. $ php bin\/console doctrine:schema:update --force Usage This Bundle integrates Sequence Component into Symfony and Doctrine The sequence Bundle provides you with basic information needed for sequence generation. Doctrine Entities Sequence Get a new Sequence $container->get('coreshop.sequence.generator')->getNextSequenceForType('my_sequence');","tags":"","url":"Bundles\/Sequence_Bundle.html"},{"title":"Shipping Bundle","text":"CoreShop Shipping Bundle CoreShop Shipping Bundle is responsible for Shipping Calculations. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Shipping_Bundle.html"},{"title":"StorageList Bundle","text":"CoreShop Storage List Bundle Storage List Component helps you with Lists\/Collections of Objects like a Cart, Wishlist or Compare List. Usage To use it you need to have 3 models: a Storage List: the collection (CoreShop\\Component\\StorageList\\Model\\StorageListInterface) a Storage Item: the item within the collection which could store additional information (eg. prices for a cart) (CoreShop\\Component\\StorageList\\Model\\StorageListItemInterface) a Storage Product: the actual product (eg. object) being stored inside the Item. (CoreShop\\Component\\StorageList\\Model\\StorageListProductInterface) The component already provides you with a basic implementation of Storage List and Storage Item. You need to implement the StorageListProduct yourself. To now mutate lists, the component gives you a Storage List Modifier, which takes care about creating and persisting the List. Basic usage, Wishist example For now, lets create a very basic Session based Wishlist: We need to have following things: A Factory class for the Wishlist A Factory class for the Wishlist Item A StorageListManager to get the current list (more like a repository actually) A StoreListModifier CoreShop gives you Basic classes for these 4 things, we just need to instantiate them: use Symfony\\Component\\HttpFoundation\\Session\\Session; use CoreShop\\Component\\StorageList\\Model\\StorageList; use CoreShop\\Component\\StorageList\\Model\\StorageListItem; use CoreShop\\Component\\Resource\\Factory\\Factory; use CoreShop\\Component\\StorageList\\SessionStorageManager; use CoreShop\\Component\\StorageList\\SessionStorageListModifier; $session = new Session(); $session->start(); $wishlistFactory = new Factory(StorageList::class); $wishlistItemFactory = new Factory(StorageListItem::class); $wishlistManager = new SessionStorageManager($session, 'wishlist', $wishlistFactory); $wishlistModifier = new SessionStorageListModifier($wishlistItemFactory, $wishlistManager); \/\/Now we can start putting data into our List $list = $wishlistManager->getStorageList(); \/\/Fetch our Product which implements CoreShop\\Component\\StorageList\\Model\\StorageListProductInterface $product = $productRepository->find(1); $listItem = $wishlistItemFactory->createNew(); $listItem->setProduct($product); $listItem->setQuantity($quantity); \/\/Lets add our Product $wishlistModifier->addToList($list, $listItem); \/\/If we now want to remove it, we can either use the $listItem, or the Product \/\/To do that with our item, we simply call $wishlistModifier->removeFromList($list, $listItem);","tags":"","url":"Bundles\/StorageList_Bundle.html"},{"title":"Store Bundle","text":"CoreShop Store Bundle CoreShop Store Bundle provides the abstraction of a Pimcore Website and a CoreShop Store. It handles the configuration for base-currencies and themes. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Store_Bundle.html"},{"title":"Taxation Bundle","text":"CoreShop Taxation Bundle CoreShop Taxation Bundle is responsible for Tax Calculations. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Taxation_Bundle.html"},{"title":"Theme Bundle","text":"CoreShop Theme Bundle CoreShop Theme Bundle provides you with a flexible and extensible way of having multiple themes in a Pimcore installation. Installation $ composer require coreshop\/theme-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\ThemeBundle\\CoreShopThemeBundle(), ]); } Configuration Per Default, no Theme Resolver is enabled, you can enable on or multiples like: core_shop_theme: default_resolvers: pimcore_site: true pimcore_document_property: true Pimcore Site Resolves the Theme based on the Key of the Root Document of a Pimcore Site. So if the Site's Root Document is called "demo" it tries to find a theme called the same. Pimcore Document Property Resolves the Theme based on a Document Property of the Site. The Property is called "theme". Custom Resolvers You can also add custom resolvers like: <?php declare(strict_types=1); namespace App\\Theme; use CoreShop\\Bundle\\ThemeBundle\\Service\\ThemeNotResolvedException; use CoreShop\\Bundle\\ThemeBundle\\Service\\ThemeResolverInterface; use CoreShop\\Component\\Store\\Context\\StoreNotFoundException; final class CustomThemeResolver implements ThemeResolverInterface { public function resolveTheme(): string { if(rand() === 1) { \/\/ if you cannot resolve the theme, throw an exception throw new ThemeNotResolvedException(); } return "custom\/custom"; } } You also need to Register the Theme Resolver: services: App\\Theme\\CustomThemeResolver: tags: - { name: coreshop.theme.resolver, type: custom, priority: 20 }","tags":"","url":"Bundles\/Theme_Bundle.html"},{"title":"Tracking Bundle","text":"CoreShop Tracking Bundle Installation $ composer require coreshop\/tracking-bundle:^3.0 Usage See here for more.","tags":"","url":"Bundles\/Tracking_Bundle.html"},{"title":"User Bundle","text":"CoreShop User Bundle CoreShop User Bundle is responsible for the User Management. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/User_Bundle.html"},{"title":"Variant Bundle","text":"CoreShop Variant Bundle CoreShop Variant Bundle allows you to manage different Variants of a Product. Installation composer require coreshop\/variant-bundle Adding required bundles to kernel You need to enable the bundle inside the kernel. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\VariantBundle\\CoreShopVariantBundle(), ]); } Abstract Pimcore already supports variants. But it doesn't define what a Variant is, or how a variant differs from the Parent Product or other Variants. In classical e-commerce scenarios, you usually have different Variation Types like Size and Color with different Values like XL or Red. CoreShop describes these two types of entities as Group (CoreShop\\Component\\Variant\\Model\\AttributeGroupInterface) and Value (CoreShop\\Component\\Variant\\Model\\AttributeValueInterface The "Product" itself than is a sort-of abstract entity that is used to define what Attribute Groups are allowed. The Pimcore Variants then, need to have the values of thse Groups filled. Example: AttributeGroup Color -AttributeValue Red -AttributeValue Blue product (defines allowed groups for color) variant-red (defines the AttributeValue Red in attributes) variant-blue (defines the AttributeValue Blue in attributes) Usage CoreShop Variant Bundle does NOT come with a Installer for certain Resources it requires. That is on purpose and you need to manually install what you need. Per Default, it comes with 3 different Classes: CoreShopAttributeGroup CoreShopAttributeColor CoreShopAttributeValue Whereas Color and Value are two Value types and Group is a Group type. You can manually import the classes from this dir vendor\/coreshop\/variant-bundle\/Resources\/install\/pimcore\/classes To create a "Product" Class, you need to implement the interface CoreShop\\Component\\Variant\\Model\\ProductVariantAwareInterface. The Class requires you to have these fields: attributes - ManyToManyObjectRelation for CoreShopAttributeColor\/CoreShopAttributeValue allowedAttributeGroups - ManyToManyObjectRelation for CoreShopAttributeGroup mainVariant - ManyToOneRelation for Product (eg. your Class where you implemented the interface)","tags":"","url":"Bundles\/Variant_Bundle.html"},{"title":"Wishlist Bundle","text":"CoreShop Order Bundle CoreShop Order Wishlist provides a basic set of data for Wishlists. It is based on StorageList Bundle and shows how that can be integrated into a Pimcore Project. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Wishlist_Bundle.html"},{"title":"Workflow Bundle","text":"CoreShop Workflow Bundle CoreShop Workflow Bundle is a extension of Symfony Workflow and adds some configuration features to it. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Workflow_Bundle.html"},{"title":"User Documentation","text":"User Documentation This section provides a quick getting started tutorial for CoreShop and covers the following topics: Stores Settings Price Rules Cart Price Rules Product Price Rules Specific Product Price Vouchers Available Actions Available Conditions Localization Countries States Zones Taxes Taxes TaxRules Shipping Carriers Shipping Rules Cart Order Orders Order Detail Order Workflow Order Comments Catalog Products Product Variants Categories Inventory GEO IP Reports Sales Cart\/Order Conversion Abandoned Carts Products Categories Customers Carrier Distribution Payment Distribution Vouchers Automation","tags":"","url":"User_Documentation\/index.html"},{"title":"Stores","text":"CoreShop Stores Every CoreShop Installation is bounded to a default Store. By default a store is connected with a pimcore Site. Domain based Store This is CoreShops default behaviour. One store for your default page, which is also your default store. If you have multiple Domains it's possible to add a store to each domain. Tip: Learn more about pimcore multi sites: Pimcore Sites Custom Store Locator Sometimes you have just one site installation but you want do use different Stores. Example: \/de-at should use a austrian store and \/de-de a german one. For that you need to build a custom store locator to do so, checkout the dev section to find out how this can be achieved. Configure CoreShop Stores Open CoreShop Menu -> "Stores". There should be already a default store, connected to your default (main-domain) site. To create a new store, click on the "Add" button. Proceed wih configuring your new store. Examples Stores can be used in many ways, checkout the examples to find out which solution suits you most. Example 1: Global Store Use a Store to handle multiple currencies, countries and tax calculations. Depending on your product and price strategy, it's possible to use it within one store. Example 2: Country Store Use a Store for each Country. This allows you to restrict your shop within a country context.","tags":"","url":"User_Documentation\/Stores.html"},{"title":"Settings","text":"CoreShop's Settings are divided into each "sub"-shop and some system settings. Shop-Settings Settings can be different for each Store. Base Catalog-Mode: With catalog-mode enabled, the cart and checkout are disabled. Products can only be viewed. Guest-Checkout: Enables or disables guest-checkout feature Customer Service Customer Email Document: Email document used to send customer messages Customer Re Email Document: Email document used to send customer reply messages Contact Email Document: Email document used to send contact messages Contact Sales: Default contact used for sales messages Contact Technology: Default contact used for technology messages Stock Default Stock Behaviour: Describes the default stock behaviour for products Tax Validate VAT: Describes if the VAT-Number for European Countries should be validated Disable VAT for Base Country: Disable VAT-Free Shopping for Customers, with valid Vat-Number, in Base Country Taxation Address: Describes witch address is responsibly for taxation Prices Prices are gross prices: Determines if entered prices in CoreShop are with or without tax included. Shipping Free Shipping starts at weight: Describes free shipping at weight. It's also much faster using this than price-rules Free Shipping starts at Currency: Describes free shipping at cart value. It's also much faster using this than price-rules Carrier Sort: Describes how the Carriers should be sorted Product Default Image: Defines an default image for products if no image is available. Number of days as new: Defines the time of days a product is marked as new. Category Default Image: Defines an default image for categories if no image is available. Invoice Create Invoice for Orders: Defines if invoices are going to be created on an paid order. Prefix: Prefix string for Order and Invoice numbers Suffix: Suffix string for Orders and Invoice numbers. WKHTMLTOPDF Parameters: Parameters which will be passed to WKHTMLTOPDF Mail Settings admin email-addresses to send order notification (CSV): Email addresses which will be notified on new orders Send OrderStates as BCC to admin email-addresses: Determines if order-state emails should also be sent to admin-emails Cart Activate automatic cart cleanup: Activate automatic cart cleanup -> cleans inactive and empty carts System - Settings System Settings are defined one time for all shops. System Settings Send Usagelog to CoreShop: Sends an anonymous usagelog to CoreShop Developer Currency Automatic Exchange Rates: Describes if exchange rates should be fetched automatically Exchange Rate Provider: Describes which exchange rate provider should be used.","tags":"","url":"User_Documentation\/Settings.html"},{"title":"Price Rules","text":"CoreShop Price Rules CoreShop Price Rules are very powerful tools for price calculation. This section will help you to get a detailed overview about how price calculation works in CoreShop: Types of Price Rules There are three Price Rule Types. 1. Cart Price Rules Apply Price Rule to the customers cart. 2. Product Price Rules Apply Price Rule globally. 3. Specific Product Prices Apply Price Rules to specific products. Global Priority Product Price Rules first Specific Price Rules second Example 1: Given: Product A with price 100,- Product Price Rule for Product A: New Price 50,- Specific Price Rule for Product A: New Price: 20,- Given Price: 20,- Example 2: Given: Product A with price 100,- Product Price Rule for Product A: Discount Percentage 50% Specific Price Rule for Product A: New Price: 50,- Given Price: 25,- Specific Price Priority Since it's possible to add multiple Specific Price Rules per Product you can adjust the priority via the priority number field. Automatic Rule Availability Checker Rules with time-span elements included on root level will be disabled automatically if they're outdated. Read more about automation here. More Information Cart Price Rules Product Price Rules Specific Product Prices Vouchers Available Actions Available Conditions","tags":"","url":"User_Documentation\/Price_Rules\/index.html"},{"title":"Cart Price Rules","text":"CoreShop Cart Price Rules Documentation Cart price rules in CoreShop provide a flexible way to offer discounts and promotions in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions, such as cart subtotal, specific products, customer groups, or other criteria. This documentation will guide you through creating and managing cart price rules in CoreShop. Available Actions Free Shipping Gift Product Discount Amount Discount Percent Available Conditions Customers Customer Groups Time Span Voucher Amount Countries Zones Stores Currencies Carriers Nested Rules Products Categories","tags":"","url":"User_Documentation\/Price_Rules\/Cart_Price_Rules.html"},{"title":"Product Price Rules","text":"CoreShop Product Price Rules Documentation Product price rules in CoreShop offer a flexible way to provide discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions and can apply to specific products, categories, or customer groups. This documentation will guide you through creating and managing product price rules in CoreShop. Available Actions Price Discount Price Discount Amount Discount Percent Available Conditions Customers Customer Groups Time Span Voucher Countries Zones Stores Currencies Nested Rules Products Categories","tags":"","url":"User_Documentation\/Price_Rules\/Product_Price_Rules.html"},{"title":"Specific Price Rules","text":"CoreShop Specific Price Rules Documentation Specific price rules in CoreShop provide a flexible way to create targeted discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules apply directly to individual products or variants and can be based on customer groups, currencies, or countries. This documentation will guide you through creating and managing specific price rules in CoreShop. Available Actions Price Discount Price Discount Amount Discount Percent Available Conditions Customers Customer Groups Time Span Countries Zones Stores Currencies Nested Rules","tags":"","url":"User_Documentation\/Price_Rules\/Specific_Price_Rules.html"},{"title":"Quantity Price Rules","text":"CoreShop Quantity Price Rules Documentation CoreShop Quantity Price Rules provide a flexible way to offer volume-based discounts for products in your e-commerce store built on the Pimcore platform. These rules apply to specific products and offer tiered pricing depending on the quantity purchased. This documentation will guide you through creating and managing quantity price rules in CoreShop. Available Conditions Customers Customer Groups Time Span Countries Zones Stores Currencies Nested Rules","tags":"","url":"User_Documentation\/Price_Rules\/Quantity_Price_Rules.html"},{"title":"Vouchers","text":"CoreShop Vouchers Info: In CoreShop Vouchers are Price Rules too. To use or generate Vouchers you need to add a Cart Price Rule. How to create Vouchers Simple create a new cart price rule and activate "Is Voucher Rule". With that, the "Voucher Codes" tab gets enabled. Voucher Condition If you need more control about handling Vouchers you need to add the "Voucher" Condition: Name Description Max. Usage per Code Define how often a voucher code can be used. Allow only one Voucher per Code If checked, only one Voucher per Cart is allowed. Voucher Codes Within the "Voucher Codes" tab you're able to manage codes for the current price rule. It's also possible to export generated codes to csv file. If you need more globally statistics about vouchers please use the voucher report. Name Description Code Generated voucher code Creation Date Voucher creation date Used If the Voucher has been used you'll see a true statement Uses Amount of uses per code Action It's possible to delete voucher codes as long they're not in use Create Voucher Code There are two ways to generate Codes: Single Voucher Code Create a single voucher code. The input field allows any string input, however if you already have added a code with the same string, you'll get a unique error message. Voucher Codes Generator This is the more advanced option to generate voucher codes: Name Description Amount Define how many voucher codes should be generated Length Define the Voucher Code Length Format Voucher Format. Possible Values: Alphanumeric, Alphabetic, Numeric Prefix Define a prefix for each code. For example SHOP- Suffix Define a suffix for each code. For example -SHOP Hyphens all X characters Add a Dash (-) after every X character","tags":"","url":"User_Documentation\/Price_Rules\/Vouchers.html"},{"title":"Actions","text":"CoreShop Price Rule Actions Get a brief overview of all the available Price Rule Actions in CoreShop. Free Shipping Available for: Cart Price Rules Add this action to allow free shipping. Gift Product Available for: Cart Price Rules Add this action to place a gift in customers cart. Options Name Description Gift Product Needs to be a coreshop registered product object Discount Amount Available for: Cart Price Rules, Specific Product Price, Product Price Set a arbitrary amount of discount. Options Name Description Amount Define Amount Gross If given Amount has included VAT, check it Currency Set Currency of given amount Apply On Select Between total and subtotal. Note: This option is only available in the cart rule context Discount Percent Available for: Cart Price Rules, Specific Product Price, Product Price Set a arbitrary percentage amount of discount. Options Name Description Percent Define Amount Apply On Select Between total and subtotal. Note: This option is only available in the cart rule context New Price Available for: Specific Product Price, Product Price Define a new Price. Note: This will be used as a new price in frontend so there is no "special discount price" labelling. If you need a highlighted discount price, use the Discount Price Action. Options Name Description Price Set new Price Currency Set Currency of given amount Discount Price Available for: Specific Product Price, Product Price Define a discount Price. Options Name Description Price Set discount Price Currency Set Currency of given amount","tags":"","url":"User_Documentation\/Price_Rules\/Actions.html"},{"title":"Conditions","text":"CoreShop Price Rules Conditions Get a brief overview of all the available Price Rule Conditions in CoreShop. Customers Available for: Cart Price Rules, Specific Product Prices, Product Price Define one ore more customers to whom the price rule should get applied. Options Name Description Customers One ore multiple CoreShop Customer Objects Customer Groups Available for: Cart Price Rules, Specific Product Prices, Product Price Define one ore more customer groups to whom the price rule should get applied. Options Name Description Groups One ore multiple CoreShop Customer Group Objects Time Span Available for: Cart Price Rules, Specific Product Prices, Product Price Define a time span in which range the price rule is valid Options Name Description Date From Date\/Time Start Date To Date\/Time End Voucher Available for: Cart Price Rules Define some Voucher Conditions. Check out the Voucher Section to learn more about Voucher Configuration. Options Name Description Max. Usage per Code Define how often a voucher code can be used. Allow only one Voucher per Code If checked, only one Voucher per Cart is allowed. Amount Available for: Cart Price Rules Define a Price range within the price rule should get applied. Options Name Description Min Amount The min amount of cart Max Amount The max amount of cart Countries Available for: Cart Price Rules, Specific Product Prices, Product Price Bind a specific country to the price rule. Important: This Condition is connected with the Country Context Resolver. This Condition does not implies to use the Users current location since the Resolver could be also store related. Options Name Description Countries Select one or multiple Countries Zones Available for: Cart Price Rules, Specific Product Prices, Product Price Bind a specific zone to the price rule. Important: This Condition is connected with the Country Context Resolver. This Condition does not implies to use the Users current location since the Resolver could be also store related. Options Name Description Zones Select one or multiple Zones Stores Available for: Cart Price Rules, Specific Product Prices, Product Price Bind a specific store to the price rule. Options Name Description Stores Select one or multiple Stores Currencies Available for: Cart Price Rules, Specific Product Prices, Product Price Define which currencies are valid to apply the price rule Options Name Description Currencies Select one or multiple Currencies Carriers Available for: Cart Price Rules Define which carriers are valid to apply the price rule Options Name Description Carriers Select one or multiple Carriers Nested Rules Available for: Cart Price Rules, Specific Product Prices, Product Price Build complex AND, OR and NOT nested conditions. Within a nested rules it's possible to add any other condition again. Options Name Description Operator AND, OR and NOT Products Available for: Cart Price Rules, Product Price Apply rule only if given products are available. Options Name Description Products One ore multiple CoreShop Product Objects Categories Available for: Cart Price Rules, Product Price Apply rule only if products linked with given categories are available. Options Name Description Categories One ore multiple CoreShop Category Objects","tags":"","url":"User_Documentation\/Price_Rules\/Conditions.html"},{"title":"Localization","text":"CoreShop Localization Countries States Zones Currencies Taxes TaxRules","tags":"","url":"User_Documentation\/Localization\/index.html"},{"title":"Countries","text":"CoreShop Country A Country consists of following values: Name ISO-Code Active: Determines if customers from this country are able to purchase from your store Use Store default Currency: If checked, your stores default currency will be applied to the country Currency Zone Stores: Determines for which Stores this Country is available.","tags":"","url":"User_Documentation\/Localization\/Countries.html"},{"title":"States","text":"CoreShop State A State\/County consists of following values: Name Iso Code Active Country","tags":"","url":"User_Documentation\/Localization\/States.html"},{"title":"Zones","text":"CoreShop Zone A Country consists of following values: Name Active Zones are basically just a group of countries and can be used for Price Rules and Shipping Rules.","tags":"","url":"User_Documentation\/Localization\/Zones.html"},{"title":"Currencies","text":"CoreShop Currencies A Currency consists of following values: Name ISO Code Numeric ISO Code Symbol Exchange Rate: Is used to convert between different currencies If you are going to use Currency conversion, you need to update exchange ranges regularly. Automated Exchange Rates CoreShop supports mulitple providers to get exchange ranges from. Currently supported: CentralBankOfRepulicTurkey EuropeanCentralBank GoogleFinance NationalBankOfRomania YahooFinance WebserviceX To activate this feature, enable it within CoreShop Settings and choose your provider.","tags":"","url":"User_Documentation\/Localization\/Currencies.html"},{"title":"Taxes","text":"CoreShop Taxes A Tax Rate consists of following values: Localized Name: This name can also be seen in the cart or on invoices Rate: Tax Rate, for example 20% Active Taxes are going to be used in Tax Rules.","tags":"","url":"User_Documentation\/Localization\/Taxes.html"},{"title":"TaxRules","text":"CoreShop Tax Rules Tax Rules determine which Tax Rate should be used for the customers country\/state. This Tax Rule is then applied to a product. A Tax Rule consists of following values: Name Active Stores: In which Stores this Tax-Rule can be used. Rules: Which Country and\/or State should use which Tax Rate and what should happen when multiple Tax Rates apply.","tags":"","url":"User_Documentation\/Localization\/TaxRules.html"},{"title":"Shipping","text":"CoreShop Shipping CoreShop provides a comprehensive shipping management system that allows you to define and configure various aspects of shipping, such as carriers, shipping rules, and carrier services. Carriers Shipping Rules","tags":"","url":"User_Documentation\/Shipping\/index.html"},{"title":"Carriers","text":"CoreShop Carriers Documentation CoreShop Carriers are an essential part of the shipping process in the CoreShop e-commerce framework, built on the Pimcore platform. Carriers represent shipping providers (e.g., UPS, FedEx, or DHL) and are responsible for delivering orders to customers. This documentation will guide you through the process of creating and managing carriers in CoreShop. Creating a Carrier To create a carrier, follow these steps: Log in to the CoreShop admin interface. Navigate to the "Shipping" tab and click on "Carriers." Click the "Add new" button to create a new carrier. Enter a name for the carrier and configure the other available options as needed. Carrier Options When creating a carrier, you can configure various options to customize its behavior: Name: A descriptive name for the carrier (e.g., UPS, FedEx, or DHL). Tracking Url: A string value that indicates the tracking url Tax Rule Group: The tax rule group applied to shipping costs for this carrier. If you want to apply taxes to shipping costs, you'll need to create a tax rule group and assign it to the carrier. Shipping Rules: The shipping rules associated with this carrier. Shipping rules define shipping costs based on various conditions such as weight, price, dimensions, and destination. You can assign multiple shipping rules to a carrier, and the system will evaluate them in order of priority to determine the final shipping cost. Summary CoreShop Carriers provide a robust way to manage shipping providers and their associated services. By creating carriers and configuring their options, you can offer customers a range of shipping choices based on factors such as delivery time and cost. Combined with shipping rules, carriers give you the flexibility to create a tailored shipping experience for your e-commerce store.","tags":"","url":"User_Documentation\/Shipping\/Carriers.html"},{"title":"Shipping Rules","text":"CoreShop Shipping Rules Documentation CoreShop Shipping Rules is a powerful feature within the CoreShop e-commerce framework built on the Pimcore platform. It allows you to create flexible and customizable shipping rules that define shipping costs based on various conditions such as weight, price, dimensions, and shipping destination. Overview Shipping rules in CoreShop can be composed of conditions and actions. Conditions determine whether a rule should be applied, while actions define the changes to the shipping costs. CoreShop provides a user-friendly interface for creating and managing shipping rules. You can create multiple rules, each with different conditions and actions, to cover various scenarios. Creating Shipping Rules Navigate to the "Shipping" tab and click on "Shipping Rules." Click the "Add new" button to create a new shipping rule. Enter a name for the rule and configure the other available options as needed. Configuring Conditions Conditions determine whether the shipping rule should be applied to an order. You can create multiple conditions for a single rule, and all conditions must be met for the rule to be applied. CoreShop offers several types of conditions, including: Weight: Based on the total weight of the order. Price: Based on the total price of the order. Dimension: Based on the dimensions (length, width, and height) of the order. Quantity: Based on the total quantity of items in the order. Countries: Based on the shipping destination country. Zones: Based on the shipping destination zone (a group of countries). To add a condition to your shipping rule: Click the "Add Condition" button in the "Conditions" section of the shipping rule. Choose the desired condition type from the dropdown menu. Configure the condition parameters as needed. For example, if you want to apply a shipping rule only to orders with a total weight of over 10kg, you would add a weight condition and set the minimum weight to 10kg. Configuring Actions Actions define the changes to the shipping costs when a rule is applied. You can create multiple actions for a single rule. CoreShop offers several types of actions, including: Discount Amount: Apply a fixed discount amount to the shipping cost. Discount Percentage: Apply a percentage discount to the shipping cost. Add Amount: Add a fixed amount to the shipping cost. Add Percentage: Add a percentage amount to the shipping cost. To add an action to your shipping rule: Click the "Add Action" button in the "Actions" section of the shipping rule. Choose the desired action type from the dropdown menu. Configure the action parameters as needed. For example, if you want to apply a 20% discount to the shipping cost when the rule is applied, you would add a discount percentage action and set the percentage value to 20. Summary CoreShop Shipping Rules offer a powerful and flexible way to define and manage shipping costs for your e-commerce store. By creating various conditions and actions, you can customize shipping costs based on factors such as weight, price, dimensions, and destination. This allows you to cater to different customer needs and provide more accurate shipping estimates.","tags":"","url":"User_Documentation\/Shipping\/Shipping_Rules.html"},{"title":"Cart","text":"CoreShop Cart Inventory Change If a customer adds a item to the cart CoreShop will check if product stock is sufficient. If not, a form error will show up. Disable \/ Delete Products If a product gets disabled or deleted in backend CoreShop will automatically remove this product from all active carts. A form error will notify every customer in frontend if the cart has been modified. Abandoned Carts No cart gets deleted by default. This allows you to: check abandoned cart statistics build your own business logic in case you want to inform customers within a follow-up email for example There is a expire cart command to remove abandoned carts, please checkout the development section.","tags":"","url":"User_Documentation\/Cart\/index.html"},{"title":"Order","text":"CoreShop Order Orders Order Detail Order Workflow Order Comments","tags":"","url":"User_Documentation\/Order\/index.html"},{"title":"Orders","text":"CoreShop Orders Grid View The default order list is based on the pimcore grid view. CoreShop comes with a default column configuration: On the right side, click "Column configuration" and select "Order Overview". Now click that button again and select "Set as favorite". Filters in Grid View It's possible to add custom filter definitions based on your project. This has to be done via a php service. Read more about it here. Apply Actions in Grid View It's possible to apply custom bulk actions for selected orders. This has to be done via a php service. Read more about it here.","tags":"","url":"User_Documentation\/Order\/Orders.html"},{"title":"Order Detail","text":"Order Detail State \/ Price Overview Please read more about the order workflow process here Besides some useful information about the order store and the total order amount, there're also several order states: State This is the main state and represents the summary of all order states. Name Description new New order has been placed. confirmed New order has been successfully created (after a offline order or a customer returns from payment gateway regardless of its state). cancelled Order has been cancelled. complete Order is complete. Payment State Global payment states per order and represents the summary of all order payments: Name Description new New payment has been created. awaiting_payment Waiting for payment: User is on payment offsite or payment is offline. partially_paid Some order payments have been paid. paid All payments have been paid. cancelled Order is complete. partially_refunded Some order payments have been refunded. refunded All payments have been refunded. Shipment State Global shipment states per order and represents the summary of all order shipments: Name Description new New shipment has been placed. cancelled Shipment has been cancelled partially_shipped Some order items have been shipped. shipped All items have been shipped. Invoice State Global invoice states per order and represents the summary of all order invoices: Name Description new New invoice has been created. cancelled Invoice has been cancelled partially_invoiced Some invoices have been invoiced. invoiced All invoices have been invoiced. Carrier\/Payment Provider Info Currency of Order Overall weight of Order Items Carrier Total Amount Order History The Order History shows you when specific states have been changed. Payments -- Shipments -- Invoices -- Mail Correspondence -- Customer -- Comments -- Additional Data -- Products --","tags":"","url":"User_Documentation\/Order\/Order_Detail.html"},{"title":"Order Workflow","text":"Order Workflow Technical Overview of CoreShop Workflows. Change States States can be changed for: Order, Payment, Shipment and Invoice. If any transition is available, you'll find a colored state button. Click on that button to change the state. Order Completion In CoreShop a order is complete after the order payment reaches the paid state and order shipment reaches the shipped state. If you also want to include the order invoice state invoiced before a order gets completed, you need to enable a configuration flag: ## app\/config\/config.yml parameters: coreshop.workflow.include_invoice_state_to_complete_order: true Order Cancellation In CoreShop a order rarely gets cancelled. Some reasons are: Front-End Revise After a customer has cancelled his payment he will reach a so called revise page. From there he's able to reselect a payment gateway to start over. In revise mode, however, it's possible to cancel the order and restore the cart. Only than the order gets cancelled. Back-End Revise In CoreShop it's possible to create orders in Back-End. Instead of adding sensitive payment information, you're able to provide a revise link to your customer which then works the same as the Front-End revise process (except that your customer is not able to restore a cart since there never was one). Please read more about the canceling process here Payment Workflow Create a Payment Just use the green bottom on the right top corner to add a new shipment. A payment creation normally gets created by a frontend payment gateway. This gateway also handles all the payment state changes. Workflow Rules A payment reaches the new state after its creation. A payment can be canceled as long it's in the new or processing state. After a payment reaches completed state it only can get refunded. Attention: The Refund process is not implemented yet in Coreshop! Shipment Workflow Create a Shipment Just use the green bottom on the right top corner to add a new shipment. If there are enough shippable items you can create a shipment. Workflow Rules A shipment reaches the ready state (triggered by a create transition) after its creation. A shipment can be canceled as long it's in the ready state After you provoked the ship state a shipment can't be cancelled anymore. Invoice Workflow Create Invoice Just use the green bottom on the right top corner to add a new invoice. If there are enough invoiceable items you can create a invoice. Workflow Rules A invoice reaches the ready state (triggered by a create transition) after its creation. A invoice can be canceled as long it's in the ready state. Please note: Cancelling an invoice is not a refund action. You're allowed to create another invoice after cancelling the previous one. After you provoked the complete state a invoice can't be cancelled anymore which means the invoice has been finally captured. After that you need to go on with a refund process Attention: The Refund process is not implemented yet in Coreshop!","tags":"","url":"User_Documentation\/Order\/Order_Workflow.html"},{"title":"Order Comments","text":"Order Comments CoreShop provides a simple comment interface which allows you to add simple notes to every order. It's also possible to send the order comment to the customer. Just check "Submit Comment to Customer". Note: You need a valid Notification Rule to send comments to user.","tags":"","url":"User_Documentation\/Order\/Order_Comments.html"},{"title":"Catalog","text":"CoreShop Catalog Products Product Variants Categories","tags":"","url":"User_Documentation\/Catalog\/index.html"},{"title":"Products","text":"CoreShop Products Documentation Products are the core of any e-commerce store built on the Pimcore platform. CoreShop provides a flexible and feature-rich system for managing products, including product variants, attributes, images, and more.","tags":"","url":"User_Documentation\/Catalog\/Products.html"},{"title":"Product Variants","text":"Product Variants CoreShop has the Variant Bundle to handle Variants, see here.","tags":"","url":"User_Documentation\/Catalog\/Product_Variants.html"},{"title":"Categories","text":"CoreShop Categories Documentation Categories in CoreShop provide a way to organize and structure the products in your e-commerce store built on the Pimcore platform. Using categories, you can create a hierarchical navigation system that allows customers to browse and find products easily.","tags":"","url":"User_Documentation\/Catalog\/Categories.html"},{"title":"Geo IP","text":"CoreShop can use GeoIP to locate visitors countries using IP-Addresses. CoreShop uses the already existing Pimcore GeoIP Database located in: \/var\/config\/GeoLite2-City.mmdb","tags":"","url":"User_Documentation\/Geo_IP.html"},{"title":"Inventory","text":"CoreShop Inventory The Inventory is a complex topic since there is a lot of business logic you need to know about. Product Inventory Every Product object comes with a "Stock" Tab. Let's have a look about the configuration: Name Description Is Tracked Define if a product should get tracked On Hand Amount of available products. On Hold Defines how many elements are currently locked. Do not change that value unless you know what you're doing. Is Tracked If you want to enable the inventory feature for a product, you need to check this setting. After that this product is not orderable in frontend if stock is insufficient. Note: Only if you enable "Is Tracked" the inventory stock is active! Otherwise the product is always available regardless of it's stock amount. On Hand Define a available amount for each product. With every successfully order, an arbitrary amount will be subtracted. On Hold This one needs some further explanation: After the checkout is complete, all ordered items will be removed from "On Hand" and get moved to "On Hold" until the payment is complete: If the unpaid order gets cancelled, the reserved "On Hold" amount gets back to "On Hand". If the order payment status switches to paid, the reserved "On Hold" amount gets subtracted. Cart \/ Checkout If a product stock gets insufficient during a customers checkout, the product gets removed from customers cart following by a form error.","tags":"","url":"User_Documentation\/Inventory\/index.html"},{"title":"Reports","text":"CoreShop Reports Sales Cart\/Order Conversion Abandoned Carts Products Categories Customers Carrier Distribution Payment Distribution Vouchers","tags":"","url":"User_Documentation\/Reports\/index.html"},{"title":"Sales","text":"CoreShop Sales Report Type Has Pagination Cartesian Chart No Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Group By Group Filter by Day, Month, Year Available Chart Fields Name Description Y Amount (Sales) X Date","tags":"","url":"User_Documentation\/Reports\/Sales.html"},{"title":"Carts","text":"CoreShop Cart\/Order Conversion Report Type Has Pagination Cartesian Chart No Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Chart Fields Name Description Y Amount (Cart, Order) X Date","tags":"","url":"User_Documentation\/Reports\/Carts.html"},{"title":"Abandoned Carts","text":"CoreShop Abandoned Carts Report Type Has Pagination List Yes Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Grid Fields Name Description Customer Name Customer name (if available) Email Customer Email (if available) Selected Payment Name of selected Payment Creation Date Creation Date Modification Date Modification Date Items in Cart Amount of Items in Cart Action Open Cart Object","tags":"","url":"User_Documentation\/Reports\/Abandoned_Carts.html"},{"title":"Products","text":"CoreShop Products Report Type Has Pagination List Yes Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Product Types Group Filter by Main Products, Variants, Container Products Product Types Name Description Main Products Only show Products without Variant inclusion Variants Only show Variant Product Types Container Products Show Sum of Products and Child-Products. Note: Container Products are bounded to the original pimcore objects. The products will be ignored in this report, if those main-objects have been deleted! Available Grid Fields Name Description Name Product Name Order Count Amount of Order Quantity Quantity Sale Price Sale Price Sales Amount of Sales Profit Amount of Profit","tags":"","url":"User_Documentation\/Reports\/Products.html"},{"title":"Categories","text":"CoreShop Categories Report Type Has Pagination List No Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Grid Fields Name Description Name Product Name Order Count Amount of Orders Quantity Quantity Sales Sales Profit Profit","tags":"","url":"User_Documentation\/Reports\/Categories.html"},{"title":"Customers","text":"CoreShop Customers Report Type Has Pagination List No Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Grid Fields Name Description Name Customer Name Order Count Amount of Orders Sales Sales","tags":"","url":"User_Documentation\/Reports\/Customers.html"},{"title":"Carrier Distribution","text":"CoreShop Carrier Distribution Report Type Has Pagination Pie Chart No Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Chart Fields Carrier Distribution","tags":"","url":"User_Documentation\/Reports\/Carrier_Distribution.html"},{"title":"Payment Distribution","text":"CoreShop Payment Distribution Report Type Has Pagination Pie Chart No Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Chart Fields Payment Provider Distribution","tags":"","url":"User_Documentation\/Reports\/Payment_Distribution.html"},{"title":"Vouchers","text":"CoreShop Voucher Report Type Has Pagination List Yes Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Grid Fields Name Description Code Applied Code Discount Amount of Discount Price Rule Name of applied Price Rule Applied Date Applied Date","tags":"","url":"User_Documentation\/Reports\/Vouchers.html"},{"title":"Automation","text":"CoreShop Automation In CoreShop there are several automation mechanism implemented. Order Cancellation Execution Time: Once per day via maintenance job CoreShop will automatically cancel orders older than 20 days. Change Orders Expiration Date core_shop_order: expiration: order: days: 30 Expired Carts Execution Time: Once per day via maintenance job Note: By default, this feature is disabled. By default, this feature is disabled (days = 0) so no carts will be removed by default. If you want to remove older carts, just enable it via configuration: Change Cart Expiration Date core_shop_order: expiration: cart: days: 20 anonymous: true customer: true Expired Rules Execution Time: Once per day via maintenance job If you're having a lot of active rules in your system, you may want to disable them via automation. CoreShop already comes with a time-span check, which means all rules with time-span elements will be disabled if they're outdated. If you want do implement some further availability logic, you could use the coreshop.rule.availability_check Event to define the availability of the rule. Just use the setAvailability() method to override the system availability suggestion.","tags":"","url":"User_Documentation\/Automation\/index.html"},{"title":"Development","text":"CoreShop The Developer\u2019s guide to leveraging the flexibility of CoreShop. Here you will find all the concepts used in CoreShop. Introduction CoreShop Resources CoreShop uses Doctrine ORM for Custom Resources. ORM enables us great flexibility and extendability for simple models like Currencies and Countries. CoreShop currently implements these Resources as ORM Model: Currency Country and State Tax Rate and Tax Rules Price Rules Carrier Shipping Rules Index and Filter Configuration Notification Rule Configuration Stores Payments Everytime something is called a Resource, we talk about ORM Models. CoreShop Pimcore Models CoreShop also takes advantage of Pimcores flexible data-model. Objects that are heavily used and changed are implemented using Data Objects: Product Product Category Manufacturer Cart Order Order Invoice Order Shipment Quote Customer Customer Group Addresses Everytime we talk about Objects, we talk about Pimcore Data Objects.","tags":"","url":"Development\/index.html"},{"title":"Extend CoreShop Resources","text":"Extend CoreShop Resources All models in Coreshop are placed in the Coreshop\\Component\\*ComponentName*\\Model namespaces alongside with their interfaces. Many models in CoreShop are extended in the Core component. If the model you are willing to override exists in the Core you should be extending the Core one, not the base model from the component. How to Customize a Model First things first: If you want to extend coreshop models your Bundle must extend the AbstractResourceBundle. Next you have set your supported drivers. Just add the following lines of code to your bundle class: public function getSupportedDrivers(); array { return [ CoreShopResourceBundle::DRIVER_DOCTRINE_ORM ]; } After that have to tell the bundle where your models are. For that, add the override the following method in your bundle class and return the model namespace. Here is an example for the AppBundle protected function getModelNamespace(): string { return "AppBundle\\Model"; } Here a quick overview for you which dictories are important for you, when customizing CoreShop models. Folder Description AcmeBundle\/Model or AcmeBundle\/Entity Where your models are living AcmeBundle\/config\/doctrine\/model Put your doctrine .yml config files in here AcmeBundle\/config\/serializer The serializer configs for the models Let\u2019s take the CoreShop\\Component\\Currency\\Model\\Currency as an example. This one is extended in Core. How can you check that? First of all, you need to find the current used class by doing following: $ php bin\/console debug:container --parameter=coreshop.model.currency.class As a result you will get the CoreShop\\Component\\Core\\Model\\Currency - this is the class that you need to be extending. Assuming you want to add a field called flag 1. The first thing to do is to write your own class which will extend the base Currency class <?php namespace AppBundle\\Entity; use CoreShop\\Component\\Core\\Model\\Currency as BaseCurrency; class Currency extends BaseCurrency { \/** * @var bool *\/ private $flag; \/** * @return bool *\/ public function getFlag() { return $this->flag; } \/** * @param bool $flag *\/ public function setFlag($flag) { $this->flag = $flag; } } 2. Next define your entity\u2019s mapping. The file should be placed in AppBundle\/Resources\/config\/doctrine\/Currency.orm.yml AppBundle\\Entity\\Currency: type: mappedSuperclass table: coreshop_currency fields: flag: type: boolean nullable: true 3. Finally you\u2019ll need to override the model\u2019s class in the app\/config\/config.yml. Under the core_shop_* where * is the name of the bundle of the model you are customizing, in our case it will be the CoreShopCurrencyBundle -> core_shop_currency. core_shop_currency: resources: currency: classes: model: AppBundle\\Entity\\Currency 4. Update the database. There are two ways to do it. via direct database schema update: $ php bin\/console doctrine:schema:update --force via migrations: Which we strongly recommend over updating the schema. $ php bin\/console doctrine:migrations:diff $ php bin\/console doctrine:migrations:migrate","tags":"","url":"Development\/Extending_Guide\/Extend_CoreShop_Resources.html"},{"title":"Extend CoreShop Forms","text":"Customizing Forms The forms in CoreShop are placed in the CoreShop\\Bundle\\*BundleName*\\Form\\Type namespaces and the extensions will be placed in AppBundle\\Form\\Extension. Why would you customize a Form? There are plenty of reasons to modify forms that have already been defined in CoreShop. Your business needs may sometimes slightly differ from our internal assumptions. You can: add completely new fields, modify existing fields, make them required, change their HTML class, change labels etc., remove fields that are not used. How to customize a CoreShop Resource Form? If you want to modify the form for the Store in your system there are a few steps that you should take. Assuming that you would like to (for example): Add a contactHours field, These will be the steps that you will have to take to achieve that: 1. If your are planning to add new fields remember that beforehand they need to be added on the model that the form type is based on. In case of our example if you need to have the contactHours on the model and the entity mapping for the Store resource. To get to know how to prepare that go there 2. Create a Form Extension. Your form has to extend a proper base class. How can you check that? For the StoreType run: $ php bin\/console debug:container coreshop.form.type.store As a result you will get the CoreShop\\Bundle\\StoreBundle\\Form\\Type\\StoreType - this is the class that you need to be extending. <?php namespace AppBundle\\Form\\Extension; use CoreShop\\Bundle\\StoreBundle\\Form\\Type\\StoreType; use Symfony\\Component\\Form\\AbstractTypeExtension; use Symfony\\Component\\Form\\Extension\\Core\\Type\\TextType; use Symfony\\Component\\Form\\FormBuilderInterface; final class StoreTypeExtension extends AbstractTypeExtension { public function buildForm(FormBuilderInterface $builder, array $options): void { \/\/ Adding new fields works just like in the parent form type. $builder->add('contactHours', TextType::class, [ 'required' => false ]); } public static function getExtendedTypes(): array { return [StoreType::class]; } } 3. After creating your class, register this extension as a service in the AppBundle\/Resources\/config\/services.yml: services: app.form.extension.type.customer_profile: class: AppBundle\\Form\\Extension\\StoreTypeExtension tags: - { name: form.type_extension, extended_type: CoreShop\\Bundle\\StoreBundle\\Form\\Type\\StoreType } In our case you will need to extend the ExtJs Form as well: src\/AppBundle\/Resources\/public\/pimcore\/js\/store.js. In ExtJs your new store file need to like like this: coreshop.store.item = Class.create(coreshop.store.item, { getFormPanel: function ($super) { var panel = $super(); panel.down("fieldset").add( [ { xtype: 'textfield', fieldLabel: 'Contact Hours', name: 'contactHours' } ] ); return this.formPanel; } }); And you need to configure it to be loaded as well: core_shop_store: pimcore_admin: js: custom_store: '\/bundles\/app\/pimcore\/js\/store.js'","tags":"","url":"Development\/Extending_Guide\/Extend_CoreShop_Forms.html"},{"title":"Extend CoreShop DataObjects","text":"Extending CoreShop CoreShop Data Objects (like CoreShopProduct or CoreShopOrder) can be changed directly within Pimcore. Replace CoreShop Object Classes with your own Classes CoreShop uses Pimcore Parameters to determine the Pimcore Object Class. To change it, simply add this to your config.yml core_shop_order: pimcore: order: classes: model: 'Pimcore\\Model\\DataObject\\MyOrderClass' install_file: '@AppBundle\/Resources\/install\/pimcore\/classes\/MyOrderClass.json' repository: AppBundle\\Repository\\OrderRepository factory: AppBundle\\Factory\\OrderFactory","tags":"","url":"Development\/Extending_Guide\/Extend_CoreShop_DataObjects.html"},{"title":"Extending Rule Actions","text":"Custom Price-Rule\/Shipping-Rule\/Notification-Rule Actions Adding Price-, Shipping- or Notification-Rule Actions is the same for all of these types. Their only difference is the tag you use and Interface you need to implement for them. Action Type Tag Interface Cart Price Rule coreshop.cart_price_rule.action CoreShop\\Component\\Order\\Cart\\Rule\\Action\\CartPriceRuleActionProcessorInterface Product Price Rule coreshop.product_price_rule.action CoreShop\\Component\\Product\\Rule\\Action\\ProductPriceActionProcessorInterface Product Specific Price coreshop.product_specific_price_rule.action CoreShop\\Component\\Product\\Rule\\Action\\ProductPriceActionProcessorInterface Shipping Rule coreshop.shipping_rule.action CoreShop\\Component\\Shipping\\Rule\\Action\\CarrierPriceActionProcessorInterface Notification Rule coreshop.notification_rule.action CoreShop\\Component\\Notification\\Rule\\Action\\NotificationRuleProcessorInterface Example Adding a new Action Now, lets add a new Action for Product Price Rules. To do so, we first need to create a new class and implement the interface listed in the table above. For Product Price Rules, we need to use CoreShop\\Component\\Product\\Rule\\Action\\ProductPriceActionProcessorInterface \/\/AppBundle\/CoreShop\/CustomAction.php namespace AppBundle\\CoreShop; final class CustomAction implements \\CoreShop\\Component\\Product\\Rule\\Action\\ProductPriceActionProcessorInterface { public function getPrice($subject, array $context, array $configuration): int { \/\/If your action gives the product a new Price, put your calculation here return $configuration['some_value']; } } We also need a FormType for the actions configurations: \/\/AppBundle\/Form\/Type\/CustomActionType.php namespace AppBundle\\Form\\Type; use Symfony\\Component\\Form\\AbstractType; use Symfony\\Component\\Form\\FormBuilderInterface; use Symfony\\Component\\Form\\Extension\\Core\\Type\\TextType; final class CustomActionType extends AbstractType { \/** * {@inheritdoc} *\/ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('some_value', TextType::class) ; } } With configuration, comes a Javascript file as well: \/\/AppBundle\/Resources\/public\/pimcore\/js\/custom_action.js pimcore.registerNS('coreshop.product.pricerule.actions.custom'); coreshop.product.pricerule.actions.custom = Class.create(coreshop.rules.actions.abstract, { type: 'custom', getForm: function () { var some_value = 0; var me = this; if (this.data) { some_value = this.data.some_value \/ 100; } var some_valueField = new Ext.form.NumberField({ fieldLabel: t('custom'), name: 'some_value', value: some_value, decimalPrecision: 2 }); this.form = new Ext.form.Panel({ items: [ some_valueField ] }); return this.form; } }); Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony structure, omit the web. bin\/console assets:install web Registering the Custom Action to the Container and load the Javascript File We now need to create our Service Definition for our Custom Action: app.product_price_rule.custom: class: AppBundle\\CoreShop\\CustomAction tags: - { name: coreshop.product_price_rule.action, type: custom, form-type: AppBundle\\Form\\Type\\CustomActionType } and add this to your config.yml: core_shop_product: pimcore_admin: js: custom_action: '\/bundles\/app\/pimcore\/js\/custom_action.js'","tags":"","url":"Development\/Extending_Guide\/Extending_Rule_Actions.html"},{"title":"Extending Rule Conditions","text":"Custom Price-Rule\/Shipping-Rule\/Notification-Rule Conditions Adding Price-, Shipping- or Notification-Rule Conditions is the same for all of these types. They're only difference is the tag you use and Interface you need to implement for them. Action Type Tag Interface\/AbstractClass Cart Price Rule coreshop.cart_price_rule.condition CoreShop\\Component\\Order\\Cart\\Rule\\Condition\\AbstractConditionChecker Product Price Rule coreshop.product_price_rule.condition CoreShop\\Component\\Rule\\Condition\\ConditionCheckerInterface Product Specific Price coreshop.product_specific_price_rule.condition CoreShop\\Component\\Rule\\Condition\\ConditionCheckerInterface Shipping Rule coreshop.shipping_rule.condition CoreShop\\Component\\Shipping\\Rule\\Condition\\CategoriesConditionChecker Notification Rule coreshop.notification_rule.condition CoreShop\\Component\\Notification\\Rule\\Condition\\AbstractConditionChecker Example Adding a new Condition Now, lets add a new Condition for Product Price Rules. To do so, we first need to create a new class and implement the interface listed in the table above. For Product Price Rules, we need to use CoreShop\\Component\\Rule\\Condition\\ConditionCheckerInterface \/\/AppBundle\/CoreShop\/CustomCondition.php namespace AppBundle\\CoreShop; use CoreShop\\Component\\Resource\\Model\\ResourceInterface; use CoreShop\\Component\\Rule\\Model\\RuleInterface; final class CustomCondition implements \\CoreShop\\Component\\Rule\\Condition\\ConditionCheckerInterface { public function isValid(ResourceInterface $subject, RuleInterface $rule, array $configuration, array $params = []): bool { \/\/return true if valid, false if not return true; } } We also need a FormType for the conditions configurations: \/\/AppBundle\/Form\/Type\/CustomConditionType.php namespace AppBundle\\Form\\Type; final class CustomConditionType extends AbstractType { \/** * {@inheritdoc} *\/ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('some_value', TextType::class) ; } } With configuration, comes a Javascript file as well: \/\/AppBundle\/Resources\/public\/pimcore\/js\/custom_condition.js pimcore.registerNS('coreshop.product.pricerule.conditions.custom'); coreshop.product.pricerule.conditions.custom = Class.create(coreshop.rules.conditions.abstract, { type: 'custom', getForm: function () { var some_value = 0; var me = this; if (this.data) { some_value = this.data.some_value \/ 100; } var some_valueField = new Ext.form.NumberField({ fieldLabel: t('custom'), name: 'some_value', value: some_value, decimalPrecision: 2 }); this.form = new Ext.form.Panel({ items: [ some_valueField ] }); return this.form; } }); Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony structure, omit the web. bin\/console assets:install web Registering the Custom Condition to the Container and load the Javascript File We now need to create our Service Definition for our Custom Condition: app.product_price_rule.custom_condition: class: AppBundle\\CoreShop\\CustomCondition tags: - { name: coreshop.product_price_rule.condition, type: custom, form-type: AppBundle\\Form\\Type\\CustomConditionType } and add this to your config.yml: core_shop_product: pimcore_admin: js: custom_condition: '\/bundles\/app\/pimcore\/js\/custom_condition.js'","tags":"","url":"Development\/Extending_Guide\/Extending_Rule_Conditions.html"},{"title":"Localization","text":"CoreShop Localization CoreShop provides you with a set of tools for better localization of your eCommerce. These tools exist of following parts: Currencies Countries States Zones Taxes","tags":"","url":"Development\/Localization\/index.html"},{"title":"Currencies","text":"CoreShop Currencies CoreShop is a multi-currency able eCommerce Framework. Therefore it is possible to create and use different currencies. Create, Update, Read, Delete Currency Context","tags":"","url":"Development\/Localization\/Currencies\/index.html"},{"title":"CRUD","text":"CoreShop Currencies Create If you want to create a Currency via API, you can do following: $newCurrency = $container->get('coreshop.factory.currency')->createNew(); Now you have a new Currency, if you want to persist it, you need to do following: $container->get('coreshop.manager.currency')->persist($newCurrency); $container->get('coreshop.manager.currency')->flush(); You now have a new persisted Currency. Read If you want to query for Currencies, you can do following: $currencyRepository = $container->get('coreshop.repository.currency'); $queryBuilder = $currencyRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $currencies = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Currency, you need to do following: \/\/ Fetch Currency $currency = $currencyRepository->findById(1); $currency->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.currency')->persist($currency); $container->get('coreshop.manager.currency')->flush(); Delete If you want to update and existing Currency, you need to do following: \/\/ Fetch Currency $currency = $currencyRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.currency')->remove($currency); $container->get('coreshop.manager.currency')->flush();","tags":"","url":"Development\/Localization\/Currencies\/CRUD.html"},{"title":"Context","text":"CoreShop Currency Context For CoreShop to determine the current currency it uses a concept called context and context resolver. Context Name Priority Tag Description FixedCurrencyContext default coreshop.context.currency Used for testing purposes StorageBasedCurrencyContext default coreshop.context.currency check if a currency has been changed during a frontend request CountryAwareCurrencyContext default coreshop.context.currency Mostly this context will apply since it will get the currency based on the current country context These Contexts take care about finding the correct currency for the current request. Create a Custom Resolver A Currency Context needs to implement the interface CoreShop\\Component\\Currency\\Context\\CurrencyContextInterface. This interface consists of one method called getCurrency which returns a CoreShop\\Component\\Currency\\Model\\CurrencyInterface or throws an CoreShop\\Component\\Currency\\Context\\CurrencyNotFoundException To register your context, you need to use the tag: coreshop.context.currency with an optional priority attribute.","tags":"","url":"Development\/Localization\/Currencies\/Context.html"},{"title":"Countries","text":"CoreShop Countries CoreShop is a multi-country able eCommerce Framework. Therefore it is possible to create and use different Countries. Create, Update, Read, Delete Country Context","tags":"","url":"Development\/Localization\/Countries\/index.html"},{"title":"CRUD","text":"CoreShop Countries Create If you want to create a Country via API, you can do following: $newCountry = $container->get('coreshop.factory.country')->createNew(); Now you have a new Country, if you want to persist it, you need to do following: $container->get('coreshop.manager.country')->persist($newCountry); $container->get('coreshop.manager.country')->flush(); You now have a new persisted Country. Read If you want to query for Countries, you can do following: $countryRepository = $container->get('coreshop.repository.country'); $queryBuilder = $countryRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $countries = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Country, you need to do following: \/\/ Fetch Country $country = $countryRepository->findById(1); $country->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.country')->persist($country); $container->get('coreshop.manager.country')->flush(); Delete If you want to update and existing Country, you need to do following: \/\/ Fetch Country $country = $countryRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.country')->remove($country); $container->get('coreshop.manager.country')->flush();","tags":"","url":"Development\/Localization\/Countries\/CRUD.html"},{"title":"Context","text":"CoreShop Country Context For CoreShop to determine the current country the visitor or customer comes from, it uses a concept called context and context resolver. Context Name Priority Tag Description FixedCountryContext default coreshop.context.country Used for testing purposes CountryContext default coreshop.context.country Check for a country within the country request resolver StoreAwareCountryContext default coreshop.context.country Check if current country is available in current store context Resolver Name Priority Tag Description GeoLiteBasedRequestResolver 10 coreshop.context.country.request_based.resolver This Resolver tries to determinate the users location by using the Geo Lite Database. These resolver takes care about finding the correct country for the current request. Create a Custom Resolver A Country Context needs to implement the interface CoreShop\\Component\\Address\\Context\\CountryContextInterface. This interface consists of one method called getCountry which returns a CoreShop\\Component\\Address\\Model\\CountryInterface or throws an CoreShop\\Component\\Address\\Context\\CountryNotFoundException. To register your context, you need to use the tag: coreshop.context.country with an optional priority attribute. Create a Request based Resolver CoreShop already implements Request based country context resolver. So if your Context depends on the current request, you can create a custom RequestBased Resolver. To do that, implement the interface CoreShop\\Component\\Address\\Context\\RequestBased\\RequestResolverInterface with the method findCountry. This method either returns a country or null. To register this resolver, use the tag: coreshop.context.country.request_based.resolver with an optional priority attribute. Example We want to a CountryContext to be based on the Pimcore Document. So if we are on site \/de, we want to resolve to Austria, if we are on page \/en we want to resolve to Country Great Britain: 1: First of all we need to create our RequestBased Country Context: <?php namespace AppBundle\\CoreShop\\Address\\Context; use CoreShop\\Component\\Address\\Context\\RequestBased\\RequestResolverInterface; use CoreShop\\Component\\Address\\Repository\\CountryRepositoryInterface; use Pimcore\\Http\\Request\\Resolver\\DocumentResolver; use Symfony\\Component\\HttpFoundation\\Request; final class DocumentBasedRequestRequestResolver implements RequestResolverInterface { \/** * @var DocumentResolver *\/ private $pimcoreDocumentResolver; \/** * @var CountryRepositoryInterface *\/ private $countryRepository; \/** * @param DocumentResolver $pimcoreDocumentResolver * @param CountryRepositoryInterface $countryRepository *\/ public function __construct(DocumentResolver $pimcoreDocumentResolver, CountryRepositoryInterface $countryRepository) { $this->pimcoreDocumentResolver = $pimcoreDocumentResolver; $this->countryRepository = $countryRepository; } public function findCountry(Request $request) { $doc = $this->pimcoreDocumentResolver->getDocument($request); if (substr($doc->getFullPath(), 0, 3) === '\/en') { return $this->countryRepository->findByCode('GB'); } if (substr($doc->getFullPath(), 0, 3) === '\/de') { return $this->countryRepository->findByCode('AT'); } return null; } } Now we need to configure the service in src\/AppBundle\/Resources\/config\/services.yml services: app.coreshop.country.context.request.document_based: class: AppBundle\\CoreShop\\Address\\Context\\DocumentBasedRequestRequestResolver arguments: - '@Pimcore\\Http\\Request\\Resolver\\DocumentResolver' - '@coreshop.repository.country' tags: - { name: coreshop.context.country.request_based.resolver } CoreShop now tries to resolve the current country based on the Pimcore Site we are on.","tags":"","url":"Development\/Localization\/Countries\/Context.html"},{"title":"States","text":"CoreShop States Create, Update, Read, Delete","tags":"","url":"Development\/Localization\/States\/index.html"},{"title":"CRUD","text":"States Create If you want to create a State via API, you can do following: $newState = $container->get('coreshop.factory.state')->createNew(); Now you have a new State, if you want to persist it, you need to do following: $container->get('coreshop.manager.state')->persist($newState); $container->get('coreshop.manager.state')->flush(); You now have a new persisted State. Read If you want to query for States, you can do following: $stateRepository = $container->get('coreshop.repository.state'); $queryBuilder = $stateRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $states = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing State, you need to do following: \/\/ Fetch State $state = $stateRepository->findById(1); $state->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.state')->persist($state); $container->get('coreshop.manager.state')->flush(); Delete If you want to update and existing State, you need to do following: \/\/ Fetch State $state = $stateRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.state')->remove($state); $container->get('coreshop.manager.state')->flush();","tags":"","url":"Development\/Localization\/States\/CRUD.html"},{"title":"Zones","text":"CoreShop Zones Create, Update, Read, Delete","tags":"","url":"Development\/Localization\/Zones\/index.html"},{"title":"CRUD","text":"Zones Create If you want to create a Zone via API, you can do following: $newZone = $container->get('coreshop.factory.zone')->createNew(); Now you have a new Zone, if you want to persist it, you need to do following: $container->get('coreshop.manager.zone')->persist($newZone); $container->get('coreshop.manager.zone')->flush(); You now have a new persisted Zone. Read If you want to query for Zones, you can do following: $zoneRepository = $container->get('coreshop.repository.zone'); $queryBuilder = $zoneRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $zones = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Zone, you need to do following: \/\/ Fetch Zone $zone = $zoneRepository->findById(1); $zone->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.zone')->persist($zone); $container->get('coreshop.manager.zone')->flush(); Delete If you want to update and existing Zone, you need to do following: \/\/ Fetch Zone $zone = $zoneRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.zone')->remove($zone); $container->get('coreshop.manager.zone')->flush();","tags":"","url":"Development\/Localization\/Zones\/CRUD.html"},{"title":"Taxes","text":"CoreShop Taxes Taxes are divided into Tax Rates and Tax Rules. Tax Rules are responsible for the real Tax Rate determination based on Country and State. Tax Rates Tax Rules","tags":"","url":"Development\/Localization\/Taxes\/index.html"},{"title":"Tax Rate","text":"CoreShop Tax Rate The Tax Rate only represents a single Tax Rate Number. For example: 20%. Create, Update, Read, Delete","tags":"","url":"Development\/Localization\/Taxes\/Tax_Rate\/index.html"},{"title":"CRUD","text":"Tax Rates Create If you want to create a Zone via API, you can do following: $newZone = $container->get('coreshop.factory.tax_rate')->createNew(); Now you have a new Zone, if you want to persist it, you need to do following: $container->get('coreshop.manager.tax_rate')->persist($newZone); $container->get('coreshop.manager.tax_rate')->flush(); You now have a new persisted Zone. Read If you want to query for Tax Rates, you can do following: $rateRepository = $container->get('coreshop.repository.tax_rate'); $queryBuilder = $rateRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $rates = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Zone, you need to do following: \/\/ Fetch Zone $rate = $rateRepository->findById(1); $rate->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.tax_rate')->persist($rate); $container->get('coreshop.manager.tax_rate')->flush(); Delete If you want to update and existing Zone, you need to do following: \/\/ Fetch Zone $rate = $rateRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.tax_rate')->remove($rate); $container->get('coreshop.manager.tax_rate')->flush();","tags":"","url":"Development\/Localization\/Taxes\/Tax_Rate\/CRUD.html"},{"title":"Tax Rule","text":"CoreShop Tax Rule The Tax Rule handles different Taxes based on Country and State. Create, Update, Read, Delete","tags":"","url":"Development\/Localization\/Taxes\/Tax_Rule\/index.html"},{"title":"CRUD","text":"Tax Rules Create If you want to create a Tax Rule via API, you can do following: $newTaxRule = $container->get('coreshop.factory.tax_rule')->createNew(); Now you have a new Tax Rule, if you want to persist it, you need to do following: $container->get('coreshop.manager.tax_rule')->persist($newTaxRule); $container->get('coreshop.manager.tax_rule')->flush(); You now have a new persisted Tax Rule. Read If you want to query for Tax Rules, you can do following: $ruleRepository = $container->get('coreshop.repository.tax_rule'); $queryBuilder = $ruleRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $rules = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Tax Rule, you need to do following: \/\/ Fetch Tax Rule $rule = $ruleRepository->findById(1); $rule->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.tax_rule')->persist($rule); $container->get('coreshop.manager.tax_rule')->flush(); Delete If you want to update and existing Tax Rule, you need to do following: \/\/ Fetch Tax Rule $rule = $ruleRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.tax_rule')->remove($rule); $container->get('coreshop.manager.tax_rule')->flush();","tags":"","url":"Development\/Localization\/Taxes\/Tax_Rule\/CRUD.html"},{"title":"Tax Factory","text":"","tags":"","url":"Development\/Localization\/Taxes\/Tax_Rule\/Tax_Factory.html"},{"title":"Products","text":"CoreShop Products This guide should lead you through how CoreShop handles Product information and how it does price calculations. Create, Read, Update, Delete Price Calculation Price Rules Configuration Multiple Product DataObjects Product Units Product Unit Definitions","tags":"","url":"Development\/Products\/index.html"},{"title":"CRUD","text":"CoreShop Product CoreShop uses Pimcore Data Objects to persist Product Information. But, it adds a little wrapper around it to be more dynamic and configurable. It uses a Factory and Repository Pattern to do that. Create If you want to create a new Product, we need to get our Factory Service for that: $productFactory = $container->get('coreshop.factory.product'); $product = $productFactory->createNew(); No we have our product and we can set all needed values. If you now want to save it, just call the save function $product->save(); Read To get products, you need to use the Repository Service CoreShop provides you. $repository = $container->get('coreshop.repository.product'); \/\/ Query by ID $productWithIdOne = $repository->findById(1); \/\/ Get a Listing how you know it from Pimcore $list = $repository->getList(); $list->setCondition("active = 1"); $products = $list->getObjects(); Update Update works the same as you are used to in Pimcore $repository = $container->get('coreshop.repository.product'); \/\/ Query by ID $productWithIdOne = $repository->findById(1); \/\/ Change values $productWithIdOne->setName('test'); $productWithIdOne->save(); Delete Delete works the same as you are used to in Pimcore $repository = $container->get('coreshop.repository.product'); \/\/ Query by ID $productWithIdOne = $repository->findById(1); $productWithIdOne->delete();","tags":"","url":"Development\/Products\/CRUD.html"},{"title":"Price Calculation","text":"CoreShop Product Price Calculation CoreShop uses multiple Price Calculators to determine the correct price for a product. Per default following Calculators are used Price Rule Calculator which uses Prices from Catalog Price Rules and Specific Price Rules Store Product Price Calculator These two are only the default implementations, if you need a custom Calculator, you need to implement the Interface CoreShop\\Component\\Product\\Calculator\\ProductPriceCalculatorInterface and register your service with the tag coreshop.product.price_calculator, a type attribute and a priority What prices does CoreShop calculate? CoreShop Price Calculation consists of 3 different prices: Retail Price: Base Price without any discounts Discount Price: Special Price for promotions. Needs to return a price smaller than retail price, otherwise retail price is valid Discount: Discount from promotions Price: Retail Price or Discount Price (if available) minus discount rules The default is always to use store values prices. Calculator Service If you want to calculate the Price for a Product, you need to use a special service to do that. There are two options: 1: coreshop.product.price_calculator which calculates prices without any tax regards. 2: coreshop.product.taxed_price_calculator which calculates prices with tax or without. (recommended one to use) Templating If you want to calculate the price within a Template, you can do so by using the filter coreshop_product_price {{ (product|coreshop_product_price(true)) }} Custom Price Calculator Example Our Example Service will take the Property "price" - 1 as Product Price and -1 as Discount, therefore the price stays the same. This example is only a show-case of how to add a new calculator. CoreShop Price calculation always depends on a context. The context per default consists of following values: Store Country Currency Customer (if logged in) Cart <?php namespace AppBundle\\CoreShop\\Product; use CoreShop\\Component\\Product\\Calculator\\ProductPriceCalculatorInterface; use CoreShop\\Component\\Product\\Model\\ProductInterface; final class CustomPriceCalculator implements ProductPriceCalculatorInterface { \/** * Used to determine a retail price *\/ public function getPrice(ProductInterface $subject, array $context, bool $withDiscount = true): int { $price = $this->getRetailPrice($subject, $context); return $withDiscount ? $this->getDiscount($subject, $price) : $price; } \/** * Used to determine a retail price *\/ public function getRetailPrice(ProductInterface $subject, array $context): int { return $subject->getStorePrice($context['store']); } \/** * Used to determine a discount *\/ public function getDiscount(ProductInterface $subject, array $context, int $price): int { return 0; } \/** * Used to determine a discounted price *\/ public function getDiscountPrice(ProductInterface $subject, array $context): int { return 0; } } Now we need to register our service to the container and add the calculator tag: app.coreshop.product.price_calculator.custom: class: AppBundle\\CoreShop\\Product\\CustomPriceCalculator tags: - { name: coreshop.product.price_calculator, type: custom, priority: 1 } CoreShop now uses our service for all Product Price Calculations.","tags":"","url":"Development\/Products\/Price_Calculation.html"},{"title":"Price Rules","text":"CoreShop Product Price Rules CoreShop gives you the ability of very complex price calculation methods. Price Rules always consist of Conditions and Actions. Price Rule Types Product Price Rules Checkout all available product price rules here Product price rules are applied to multiple products based on conditions like category or manufacturer. Specific Price Rules Checkout all available specific price rules here Specific price rules are applied to a single product based on conditions like customer or customer group. Quantity Price Rules Checkout all available quantity price rules here Quantity price rules are applied to a single product based on conditions like the quantity of a cart item. These rules apply only in the calculation of cart item prices. If you have only quantity rules configured, the default price calculation of CoreShop will return zero outside of cart context. Extending Conditions and Actions Click here to see how you can add custom Actions Click here to see how you can add custom Conditions Template Helper Get Formatted Price with all applied Rules {% import '@CoreShopFrontend\/Common\/Macro\/currency.html.twig' as currency %} {% import '@CoreShopFrontend\/Common\/Macro\/product_price.html.twig' as product_price %} <div class="price"> <span class="price-head">{{ 'coreshop.ui.price'|trans }}:<\/span> {{ product_price.display_product_price(product) }} <\/div> <div class="tax"> {{ 'coreshop_product_tax_inc'|trans|format(product|coreshop_product_tax_rate) }} ({{ currency.convertAndFormat(product|coreshop_product_tax_amount) }}) <\/div> Get Active Price Rules {{ dump(product|coreshop_product_price_rules) }}","tags":"","url":"Development\/Products\/Price_Rules\/index.html"},{"title":"Configuration","text":"CoreShop Product Configuration core_shop_product: pimcore: product: path: coreshop\/products classes: repository: CoreShop\\Bundle\\CoreBundle\\Pimcore\\Repository\\ProductRepository install_file: '@CoreShopCoreBundle\/Resources\/install\/pimcore\/classes\/CoreShopProductBundle\/CoreShopProduct.json' model: Pimcore\\Model\\DataObject\\CoreShopProduct interface: CoreShop\\Component\\Product\\Model\\ProductInterface factory: CoreShop\\Component\\Resource\\Factory\\PimcoreFactory type: object","tags":"","url":"Development\/Products\/Configuration.html"},{"title":"Multiple Product DataObjects","text":"CoreShop Multiple Product DataObjects CoreShop comes with one pre-installed Product Class (CoreShopProduct), which in most cases is enough. In some cases, you might want to use separated classes with different purposes. For example a ProductSet, which consists of multiple Products but also needs to be available for complex price calculations like Price Rules. First of all, we need to create a new DataObject Class in Pimcore. A basic Purchasable Product only needs to implement \\CoreShop\\Component\\Order\\Model\\PurchasableInterface but since we want to allow complex price calculation, we need to implement CoreShop\\Component\\Core\\Model\\ProductInterface. Note If your Product is very simple and you do not need complex price calculations you then only need to implement \\CoreShop\\Component\\Order\\Model\\PurchasableInterface Easiest way to create the new class is: 1: Open Pimcore DataObject Editor 2: Add a new Class called ProductSet 3: Import CoreShop Default Product Class (CoreShopProduct.json) 4: Adapt to your needs 5: Register your ProductSet Class to CoreShop: <?php \/\/src\/AppBundle\/DependencyInjection\/Configuration.php namespace AppBundle\\DependencyInjection; use CoreShop\\Bundle\\ProductBundle\\Pimcore\\Repository\\ProductRepository; use CoreShop\\Bundle\\ResourceBundle\\CoreShopResourceBundle; use CoreShop\\Component\\Product\\Model\\ProductInterface; use CoreShop\\Component\\Resource\\Factory\\PimcoreFactory; use Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition; use Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder; use Symfony\\Component\\Config\\Definition\\ConfigurationInterface; final class Configuration implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('app'); $rootNode ->children() ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end() ->end() ; $this->addModelsSection($rootNode); return $treeBuilder; } \/\/Add your configuration here private function addModelsSection(ArrayNodeDefinition $node) { $node ->children() ->arrayNode('pimcore') ->addDefaultsIfNotSet() ->children() ->arrayNode('product_set') ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() ->scalarNode('path')->defaultValue('products')->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() ->scalarNode('model')->defaultValue('Pimcore\\Model\\DataObject\\ProductSet')->cannotBeEmpty()->end() ->scalarNode('interface')->defaultValue(ProductInterface::class)->cannotBeEmpty()->end() ->scalarNode('factory')->defaultValue(PimcoreFactory::class)->cannotBeEmpty()->end() ->scalarNode('repository')->defaultValue(ProductRepository::class)->cannotBeEmpty()->end() ->scalarNode('install_file')->defaultValue('@CoreShopProductBundle\/Resources\/install\/pimcore\/classes\/CoreShopProduct.json')->end() ->scalarNode('type')->defaultValue(CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT)->cannotBeOverwritten(true)->end() ->end() ->end() ->end() ->end() ->end() ->end() ->end() ; } } <?php \/\/src\/AppBundle\/DependencyInjection\/AppExtension.php namespace AppBundle\\DependencyInjection; use CoreShop\\Bundle\\ResourceBundle\\DependencyInjection\\Extension\\AbstractModelExtension; use Symfony\\Component\\Config\\FileLocator; use Symfony\\Component\\DependencyInjection\\ContainerBuilder; use Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader; class AppExtension extends AbstractModelExtension { public function load(array $config, ContainerBuilder $container) { $config = $this->processConfiguration($this->getConfiguration([], $container), $config); $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'\/..\/Resources\/config')); \/\/Register the model to the container $this->registerPimcoreModels('app', $config['pimcore'], $container); \/\/Alternative you can do it manually like: $this->registerPimcoreModels('app', [ 'product_set' => [ 'path' => '\/product-sets', 'classes' => [ 'model' => 'Pimcore\\Model\\DataObject\\ProductSet', 'interface' => ProductInterface::class, 'factory' => PimcoreFactory::class, 'type' => CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT ] ] ], $container); $loader->load('services.yml'); } } 6: You can now use the new ObjectClass as you wish, CoreShop automatically recognises it as ProductClass and your are allowed to use it in PriceRules. Note: For the Class to be allowed as href\/multihref in Pimcore, you need to adapt following classes as well: CoreShopCartItem CoreShopOrderItem CoreShopQuoteItem Check for the product field and add your new ProductSet there as allowed references.","tags":"","url":"Development\/Products\/Multiple_Product_DataObjects.html"},{"title":"Units","text":"CoreShop Product Units Units for Products can be defined globally in the Pimcore Backend on CoreShopMenu > Product > Product Units. Each Product can have different units. Also each product\/unit relation can have an own precision that differs to other relations. To archive that, the relation between products and units consists of three objects: ProductUnit ProductUnitDefinition ProductUnitDefinitions As already said, the ProductUnit can be created in Pimcore Backend and consists mainly of the key for unit like PCS, CNT etc. and some localized fields for rendering in frontend. To connect a ProductUnit to a CoreShopProduct in Backend you need to get the ProductUnit via repository and create a ProductUnitDefinition. use CoreShop\\Component\\Product\\Model\\Product; use CoreShop\\Component\\Product\\Model\\ProductUnitInterface; use CoreShop\\Component\\Product\\Model\\ProductUnitDefinition; $product = Product::getById(1); \/** @var ProductUnitInterface $unit *\/ $unit = $this->unitRepository->findOneBy(['name' => '']); $unitDefinition = new ProductUnitDefinition(); $unitDefinition->setConversionRate(1.0); \/\/ optional $unitDefinition->setPrecision(0); \/\/ optional $unitDefinition->setUnit($unit); $product->getUnitDefinitions()->setDefaultUnitDefinition($unitDefinition); $product->save(); To add multiple units for a product use $product->addUnitDefinition($unitDefinition). To change a unit override the default one $product->getUnitDefinitions()->getDefaultUnitDefinition()->setUnit($otherUnit).","tags":"","url":"Development\/Products\/Units.html"},{"title":"Unit Definitions","text":"CoreShop Product Unit Definitions CoreShop has a great new feature for product units. E.g. you can sell items "per meter" etc. First, add some product units in Pimcore > CoreShop > Product > Product Units. Click "Add" and fill all the fields. Then you can add product-units directly in the product-objects inside Pimcore (take a look at the "Price"-tab). There, you can also add multiple product units (eg: 1 box contains of 12 items - CoreShop will show you different order-possibilities in the add-to-cart section in the webshop) Using the API for product units: Create Default UnitDefinition If you want to create a new Product, we need to get our Factory Service for that: \/** @var DataObject\\CoreShopProduct $product *\/ $product = DataObject::getById(1); $unitRepository = $container->get('coreshop.repository.product_unit'); \/** @var ProductUnitDefinitionInterface $defaultUnitDefinition *\/ $defaultUnitDefinition = $container->get('coreshop.factory.product_unit_definition')->createNew(); $defaultUnitDefinition->setUnit($unitRepository->findByName('Kubikmeter')); \/** @var ProductUnitDefinitionsInterface $unitDefinitions *\/ $unitDefinitions = $container->get('coreshop.factory.product_unit_definitions')->createNew(); $unitDefinitions->setDefaultUnitDefinition($defaultUnitDefinition); $unitDefinitions->setProduct($product); $product->setUnitDefinitions($unitDefinitions); $product->save(); Update Default UnitDefinition \/** @var DataObject\\CoreShopProduct $product *\/ $product = DataObject::getById(1); $unitRepository = $container->get('coreshop.repository.product_unit'); $defaultUnitDefinition = $product->getUnitDefinitions()->getDefaultUnitDefinition(); $defaultUnitDefinition->setUnit($unitRepository->findByName('Liter')); $unitDefinitionsRepository = $container->get('coreshop.repository.product_unit_definitions'); \/** @var ProductUnitDefinitions $unitDefinitions *\/ $unitDefinitions = $unitDefinitionsRepository->findOneForProduct($product); $unitDefinitions->setDefaultUnitDefinition($defaultUnitDefinition); $product->setUnitDefinitions($unitDefinitions); $product->save(); Delete UnitDefinition Deleting a UnitDefiniton from a product is done by finding the UnitDefinitions for the product in the product_unit_definitions repository and then deleting it. \/** @var DataObject\\CoreShopProduct $product *\/ $product = DataObject::getById(1); $unitDefinitionsRepository = $container->get('coreshop.repository.product_unit_definitions'); $item = $unitDefinitionsRepository->findOneForProduct($product); $unitDefinitionsRepository->remove($item);","tags":"","url":"Development\/Products\/Unit_Definitions.html"},{"title":"Cart","text":"CoreShop Cart This guide should lead you through how CoreShop handles the Cart. Create, Read, Update, Delete Cart Manager Cart Modifier Cart Processor Commands Cart Context Introduction The CoreShop Cart is stateless. Which means that every change on the cart triggers the Cart Processor which then calculates all necessary prices.","tags":"","url":"Development\/Cart\/index.html"},{"title":"CRUD","text":"CoreShop Cart CoreShop uses Pimcore Data Objects to persist Cart Information. But, it adds a little wrapper around it to be mire dynamic and configurable. It uses a Factory and Repository Pattern to do that. Create If you want to create a new Cart, we need to get our Factory Service for that: $factory = $container->get('coreshop.factory.cart'); $cart = $factory->createNew(); No we have a new Cart and we can set all needed values. If you now want to save it, just call the save function $cart->save(); Read To get carts, you need to use the Repository Service CoreShop provides you. $repository = $container->get('coreshop.repository.cart'); \/\/ Query by ID $cartWithIdOne = $repository->findById(1); \/\/ Get a Listing how you know it from Pimcore $list = $repository->getList(); $list->setCondition("total > 100"); $carts = $list->getObjects(); Update Update works the same as you are used to in Pimcore $repository = $container->get('coreshop.repository.cart'); \/\/ Query by ID $cartWithIdOne = $repository->findById(1); \/\/ Change values $cartWithIdOne->setCustomer($customer); $cartWithIdOne->save(); Delete Delete works the same as you are used to in Pimcore $repository = $container->get('coreshop.repository.cart'); \/\/ Query by ID $cartWithIdOne = $repository->findById(1); $cartWithIdOne->delete();","tags":"","url":"Development\/Cart\/CRUD.html"},{"title":"Cart Manager","text":"CoreShop Cart Manager The Cart Manager helps you managing Carts. It handles: Persisting a Cart The Cart Manager implements the Interface CoreShop\\Component\\Order\\Manager\\CartManagerInterface and is implemented in the Service coreshop.cart.manager:","tags":"","url":"Development\/Cart\/Cart_Manager.html"},{"title":"Cart Modifier","text":"CoreShop Cart Modifier CoreShop provides you with a helper service to modify the cart. It handles following for you: adding items removing items change quantity of items The Modifier implements the interface CoreShop\\Component\\Order\\Cart\\CartModifierInterface and is implemented by the service coreshop.cart.modifier The Cart Modifier itself, uses the Storage List Component","tags":"","url":"Development\/Cart\/Cart_Modifier.html"},{"title":"Cart Processor","text":"CoreShop Cart Processor The Cart Processor takes care about refreshing the state and prices of carts for you. Everytime the persistCart function of the Cart-Manager is called on a Cart, it gets triggered and re-calculates the cart. Following Processors are implemented by default: Cart Adjustment Clearer Item Processor Item Tax Processor Cart Price Rule Voucher Processor Cart Rule Auto Processor Cart Shipping Processor Cart Tax Processor These Processors calculate all necessary prices of the cart. If you need to extend the Cart and change calculations, you need to create a new Processor. Creating a Cart Processor A Cart Processor needs to implement the Interface CoreShop\\Component\\Order\\Processor\\CartProcessorInterface and registered into the container with the tag coreshop.cart_processor and a priority attribute. Example of a Cart Processor For example, we create a Cart Processor, which calculates a custom field in our Cart. <?php namespace AppBundle\\CoreShop\\Order\\Cart\\Processor; use CoreShop\\Component\\Order\\Model\\OrderInterface; use CoreShop\\Component\\Order\\Processor\\CartProcessorInterface; final class CustomCartProcessor implements CartProcessorInterface { public function process(OrderInterface $cart): void { $cart->setCustomField(uniqid()); } } We now only need to register the class: app.coreshop.cart.processor.custom: class: AppBundle\\CoreShop\\Order\\Cart\\Processor\\CustomCartProcessor tags: - { name: coreshop.cart_processor, priority: 200 } On every Cart Update, our service now gets called a the custom field gets a new unique id.","tags":"","url":"Development\/Cart\/Cart_Processor.html"},{"title":"Commands","text":"CoreShop Cart Commands Expire Abandoned Carts # Delete only anonymous carts $ bin\/console coreshop:cart:expire --anonymous # Delete only user carts $ bin\/console coreshop:cart:expire --user # Delete carts older than 20 days $ bin\/console coreshop:cart:expire --days=20 Expire Abandoned Carts via Maintenance Mode By default, this feature is disabled. If you want to swipe abandoned carts by default you need to define a expiration date: core_shop_order: expiration: cart: days: 20 anonymous: true customer: true Read more about automation here.","tags":"","url":"Development\/Cart\/Commands.html"},{"title":"Context","text":"CoreShop Cart Context For CoreShop to determine the current cart it uses a concept called context and context resolver. The Cart Context implements the Interface CoreShop\\Component\\Order\\Context\\CartContextInterface and is implemented in the Service coreshop.context.cart: Getting the current Cart If you want to get the current cart, you simply use the service: $cartContext = $container->get('coreshop.context.cart'); \/\/ Get current cart, if none exists, it creates a new one $cart = $cartContext->getCart(); Context Name Priority Description FixedCartContext -100 Used for testing purposes or for backend order creation SessionAndStoreBasedCartContext -555 Search for a valid session cart in given store context CustomerAndStoreBasedCartContext -777 Search for a cart based on a customer. Note: This context only triggers after a user has been successfully logged in. It searches for the last available cart a user may has left. CartContext -999 If all other context classes failed finally this context will create a fresh cart Create a Custom Resolver To register your context, you need to use the tag: coreshop.context.cart with an optional priority attribute.","tags":"","url":"Development\/Cart\/Context.html"},{"title":"Checkout","text":"CoreShop Checkout This guide should lead you through how CoreShop handles the Checkout. Checkout Manager Checkout Step","tags":"","url":"Development\/Checkout\/index.html"},{"title":"Checkout Manager","text":"CoreShop Checkout Manager CoreShop Checkout CoreShop uses a CheckoutManager to handle Checkout steps. The default installation comes with following Steps: Cart Customer Address Shipping Payment Summary Create a Custom CheckoutManager If you want to modify the Checkout Manager, you have two options: Create a total different Checkout Manager configuration Modify the default configuration Create a total different Checkout Manager # app\/config\/config.yml core_shop_core: checkout_manager: my_custom_manager checkout: my_custom_manager: steps: customer: step: coreshop.checkout.step.customer priority: 10 address: step: coreshop.checkout.step.address priority: 20 shipping: step: coreshop.checkout.step.shipping priority: 30 payment: step: coreshop.checkout.step.payment priority: 40 summary: step: coreshop.checkout.step.summary priority: 50 Modify the default configuration # app\/config\/config.yml core_shop_core: checkout: default: steps: payment: false # disables the payment step shipping: false # disables the shipping step payment_shipping: # adds a new PaymentShiping Step step: app_bundle.coreshop.checkout.payment_shipping # This is your service-id, the service needs to implement CoreShop\\Component\\Order\\Checkout\\CheckoutStepInterface priority: 40 # Priority of this step","tags":"","url":"Development\/Checkout\/Checkout_Manager.html"},{"title":"Checkout Step","text":"CoreShop Checkout Step If you want to implement a custom checkout step, you need to implement the interface CoreShop\\Component\\Order\\Checkout\\CheckoutStepInterface and register your step into your Cart Manager: # app\/config\/config.yml core_shop_core: checkout: default: steps: custom: step: app.coreshop.checkout.custom priority: 50 The Checkout Controller takes care about handling the Checkout for you then. Optional Checkout Step If you have an optional checkout step - depending on the cart, your Checkout Step can implement the interface CoreShop\\Component\\Order\\Checkout\\OptionalCheckoutStepInterface. You need to implement the function isRequired(OrderInterface $cart) Optional Checkout Step Example <?php namespace CoreShop\\Bundle\\CoreBundle\\Checkout\\Step; use CoreShop\\Bundle\\CoreBundle\\Form\\Type\\Checkout\\PaymentType; use CoreShop\\Component\\Order\\Checkout\\CheckoutException; use CoreShop\\Component\\Order\\Checkout\\CheckoutStepInterface; use CoreShop\\Component\\Order\\Checkout\\OptionalCheckoutStepInterface; use CoreShop\\Component\\Order\\Checkout\\ValidationCheckoutStepInterface; use CoreShop\\Component\\Order\\Manager\\CartManagerInterface; use CoreShop\\Component\\Order\\Model\\OrderInterface; use CoreShop\\Component\\Payment\\Model\\PaymentProviderInterface; use CoreShop\\Component\\Store\\Context\\StoreContextInterface; use Symfony\\Component\\Form\\FormFactoryInterface; use Symfony\\Component\\HttpFoundation\\Request; class PaymentCheckoutStep implements CheckoutStepInterface, OptionalCheckoutStepInterface, ValidationCheckoutStepInterface { private FormFactoryInterface $formFactory; private StoreContextInterface $storeContext; private CartManagerInterface $cartManager; public function __construct( FormFactoryInterface $formFactory, StoreContextInterface $storeContext, CartManagerInterface $cartManager ) { $this->formFactory = $formFactory; $this->storeContext = $storeContext; $this->cartManager = $cartManager; } public function getIdentifier(): string { return 'payment'; } public function doAutoForward(OrderInterface $cart): bool { return $cart->getTotal() > 0; } public function doAutoForward(OrderInterface $cart): bool { return false; } public function validate(OrderInterface $cart): bool { return $cart->hasItems() && $cart->getPaymentProvider() instanceof PaymentProviderInterface; } public function commitStep(OrderInterface $cart, Request $request): bool { $form = $this->createForm($request, $cart); if ($form->isSubmitted()) { if ($form->isValid()) { $cart = $form->getData(); $this->cartManager->persistCart($cart); return true; } else { throw new CheckoutException('Payment Form is invalid', 'coreshop.ui.error.coreshop_checkout_payment_form_invalid'); } } return false; } public function prepareStep(OrderInterface $cart, Request $request): array { return [ 'form' => $this->createForm($request, $cart)->createView(), ]; } private function createForm(Request $request, OrderInterface $cart) { $form = $this->formFactory->createNamed('', PaymentType::class, $cart, [ 'payment_subject' => $cart ]); if ($request->isMethod('post')) { $form = $form->handleRequest($request); } return $form; } }","tags":"","url":"Development\/Checkout\/Checkout_Step.html"},{"title":"Order","text":"CoreShop Order This guide should lead you through how CoreShop handles Orders. Order Creation Transformer Order Workflow Invoice Shipment Template\/Twig Helper Extend Order with additional data CoreShop Order List Order List: Add Custom Filter Order List: Add Custom Actions","tags":"","url":"Development\/Order\/index.html"},{"title":"Order Creation","text":"CoreShop Order Creation Orders are usually getting created through the Checkout Step. If you ever need to create an Order manually, there are multiple ways. Order CRUD You can always use the Pimcore API to create Orders, in CoreShop you would do it through the Factory: $factory = $container->get('coreshop.factory.order')->createNew(); You can now fill the Order with all necessary information. The more usual way to create Orders is through Carts or Quotes. Therefore CoreShop implements Transformer for that.","tags":"","url":"Development\/Order\/Order_Creation.html"},{"title":"Transformer","text":"CoreShop Transfomers Transfomers, as the name say, transform Data from different formats. A transformer converts between Object Types. For example: Cart -> Order. Following implementation do exist right now: an Order into an Invoice an Order into an Shipment The base transformer interface for all "Proposals" is CoreShop\\Component\\Order\\Transformer\\ProposalTransformerInterface Extending Transfomers If you ever have the need to adapt the transfomer, eg. hook into it and store some custom data into the order, you can do so by decorating the default service. Following Services are used by CoreShop for all different Transfomers: From To Service Order Invoice coreshop.order.transformer.order_to_invoice OrderItem InvoiceItem coreshop.order_invoice.transformer.cart_item_to_order_item Order Shipment coreshop.order.transformer.order_to_invoice OrderItem ShipmentItem coreshop.order_invoice.transformer.order_item_to_shipment_item","tags":"","url":"Development\/Order\/Transformer.html"},{"title":"Order Workflow","text":"CoreShop Order Workflow CoreShop uses Symfony Workflow to apply states. Here is the detail information about the State Machine.","tags":"","url":"Development\/Order\/Order_Workflow.html"},{"title":"Invoice","text":"CoreShop Invoice CoreShop comes with an Invoice creation feature. This means, it can create Invoices for Orders based on Workflow States.","tags":"","url":"Development\/Order\/Invoice\/index.html"},{"title":"Invoice Creation","text":"CoreShop Invoice Creation See Order Transformer for more. Add a Invoice to an Order \/** * Note: * * The TRANSITION_REQUEST_INVOICE transition can only be applied once. * Only dispatch it with the creation of the first invoice. * This transition will inform the order invoice workflow that it's ready to initiate the invoice processing. *\/ $workflow = $this->getStateMachineManager()->get($order, 'coreshop_order_invoice'); $workflow->apply($order, OrderInvoiceTransitions::TRANSITION_REQUEST_INVOICE); $order = ''; \/** @var InvoiceInterface $invoice *\/ $invoice = $this->container->get('coreshop.factory.order_invoice')->createNew(); $invoice->setState(InvoiceStates::STATE_NEW); $items = []; $invoice = $this->get('coreshop.order.transformer.order_to_invoice')->transform($order, $invoice, $items);","tags":"","url":"Development\/Order\/Invoice\/Invoice_Creation.html"},{"title":"Purchasable","text":"CoreShop Order Purchasable Items, you want to add to your Cart\/Order\/Quote, need to implement CoreShop\\Component\\Order\\Model\\PurchasableInterface. The concept of Purchasable allows us to decouple CoreShops Order Component from the Product Component and makes the Cart\/Quote\/Order more flexible in ways of which object types can be used. A Purchasable does not a have Price directly You need create a class that implements CoreShop\\Component\\Order\\Calculator\\PurchasablePriceCalculatorInterface. in order to calculate price Implementation of a new Purchasable Price Calculator To implement a new custom Purchasable Price Calculator, you need to implement the interface CoreShop\\Component\\Order\\Calculator\\PurchasablePriceCalculatorInterface. As an example, we create a ProductSetCalculator, which takes prices of each consisting Product: <?php namespace AppBundle\\CoreShop\\Order\\Calculator; use CoreShop\\Component\\Order\\Calculator\\PurchasablePriceCalculatorInterface; use CoreShop\\Component\\Order\\Exception\\NoPurchasablePriceFoundException;use CoreShop\\Component\\Order\\Model\\PurchasableInterface; use Pimcore\\Model\\Product\\ProductSet; final class ProductSetCalculator implements PurchasablePriceCalculatorInterface { private PurchasablePriceCalculatorInterface $purchasablePriceCalculator; public function __construct(PurchasablePriceCalculatorInterface $purchasablePriceCalculator) { $this->purchasablePriceCalculator = $purchasablePriceCalculator; } public function getPrice(PurchasableInterface $purchasable, array $context, bool $includingDiscounts = false): int { if ($purchasable instanceof ProductSet) { $price = 0; foreach ($purchasable->getProducts() as $product) { $price .= $this->purchasablePriceCalculator->getPrice($product); } return $price; } throw new NoPurchasablePriceFoundException($this); } } Now we need to register our Service to the Container: app.coreshop.order.purchasable.price_calculator.product_set: class: AppBundle\\CoreShop\\Order\\Calculator\\ProductSetCalculator arguments: - '@coreshop.order.purchasable.price_calculator' tags: - { name: coreshop.order.purchasable.price_calculator, type: product_set, priority: 20 }","tags":"","url":"Development\/Order\/Purchasable.html"},{"title":"Shipment","text":"CoreShop Shipment CoreShop comes with an Shipment (Delivery Slip) creation feature. This means, it can create Shipments for Orders based on Workflow States.","tags":"","url":"Development\/Order\/Shipment\/index.html"},{"title":"Shipment Creation","text":"CoreShop Shipment Creation See Order Transformer for more. Add a Shipment to an Order \/** * Note: * * The TRANSITION_REQUEST_SHIPMENT transition can only be applied once. * Only dispatch it with the creation of the first shipment. * This transition will inform the order shipment workflow that it's ready to initiate the shipment processing. *\/ $workflow = $this->getStateMachineManager()->get($order, 'coreshop_order_shipment'); $workflow->apply($order, OrderShipmentTransitions::TRANSITION_REQUEST_SHIPMENT); $order = ''; \/** @var ShipmentInterface $shipment *\/ $shipment = $this->container->get('coreshop.factory.order_shipment')->createNew(); $shipment->setState(ShipmentStates::STATE_NEW); $items = []; $shipment = $this->get('coreshop.order.transformer.order_to_shipment')->transform($order, $shipment, $items);","tags":"","url":"Development\/Order\/Shipment\/Shipment_Creation.html"},{"title":"Filter","text":"CoreShop Order List Filter This comes in handy if you need some special filtered data in your Order List. Your Customer is able to filter orders on specific conditions. Register Filter Service AppBundle\\CoreShop\\OrderList\\Filter\\DemoFilter: tags: - { name: coreshop.grid.filter, type: demo } Create PHP Class In this example we want to filter orders with available shipments in state "ready". <?php namespace AppBundle\\CoreShop\\OrderList\\Filter; use CoreShop\\Component\\Pimcore\\DataObject\\Grid\\GridFilterInterface; use Pimcore\\Db\\ZendCompatibility\\QueryBuilder; use Pimcore\\Model\\DataObject; class DemoFilter implements GridFilterInterface { public function getName(): string { return 'coreshop.order_filter.shipment_apply'; } public function filter(DataObject\\Listing $list, array $context): DataObject\\Listing { $list->onCreateQuery(function (QueryBuilder $select) use ($list) { $select->join( ['shipment' => 'object_query_4'], 'shipment.order__id = object_' . $list->getClassId() . '.o_id' ); }); $list->addConditionParam('orderState = ?', 'confirmed'); $list->addConditionParam('shipment.state = ?', 'ready'); return $list; } public function supports(string $listType): bool { return $listType === 'coreshop_order'; } }","tags":"","url":"Development\/Order\/OrderList\/Filter.html"},{"title":"Action","text":"CoreShop Order List Actions Actions allows you to process orders rapidly, right in the order grid view. Register Filter Service AppBundle\\CoreShop\\OrderList\\Action\\Demo: arguments: $stateMachineManager: '@coreshop.state_machine_manager' $shipmentRepository: '@coreshop.repository.order_shipment' tags: - { name: coreshop.grid.action, type: demo } Create PHP Class In this example we want to apply the shipment transition "ship" to selected orders. <?php namespace AppBundle\\CoreShop\\OrderList\\Action; use CoreShop\\Component\\Order\\Repository\\OrderShipmentRepositoryInterface; use CoreShop\\Bundle\\WorkflowBundle\\Manager\\StateMachineManagerInterface; use CoreShop\\Component\\Pimcore\\DataObject\\Grid\\GridActionInterface; use Pimcore\\Model\\DataObject\\CoreShopOrder; class DemoAction implements GridActionInterface { protected $stateMachineManager; protected $shipmentRepository; public function __construct( StateMachineManagerInterface $stateMachineManager, OrderShipmentRepositoryInterface $shipmentRepository ) { $this->stateMachineManager = $stateMachineManager; $this->shipmentRepository = $shipmentRepository; } public function getName(): string { return 'coreshop.order.demo'; } public function apply(array $processIds): string { $message = ''; $transition = 'ship'; $shipmentIds = []; foreach ($processIds as $id) { $m = []; $order = CoreShopOrder::getById($id); $shipments = $this->shipmentRepository->getDocuments($order); if (count($shipments) === 0) { $m[] = sprintf('- no shipments for order %s found. skipping....', $order->getId()); } else { foreach ($shipments as $shipment) { if ($shipment->getState() === 'shipped') { $m[] = sprintf('- transition "%s" for shipment %s already applied. skipping...', $transition, $shipment->getId()); continue; } $workflow = $this->stateMachineManager->get($shipment, 'coreshop_shipment'); if (!$workflow->can($shipment, $transition)) { $m[] = sprintf('- transition "%s" for shipment %s not allowed.', $transition, $shipment->getId()); } else { try { $workflow->apply($shipment, $transition); $shipmentIds[] = $shipment->getId(); $m[] = sprintf('- transition "%s" for shipment id %s successfully applied.', $transition, $shipment->getId()); } catch (\\Exception $e) { $m[] = sprintf('- error while applying transition "%s" to shipment with id %s: %s.', $transition, $shipment->getId(), $e->getMessage()); } } } } $message .= sprintf('<strong>Order %s:<\/strong><br>%s<br>', $id, join('<br>', $m)); } if (count($shipmentIds) > 0) { $packingListUrl = '\/admin\/your-packing-list-generator-url?ids=' . join(',', $shipmentIds); $message .= sprintf('<br><a href="%s" target="_blank">%s<\/a><br>', $packingListUrl, 'packing list'); } return $message; } public function supports(string $listType): bool { return $listType === 'coreshop_order'; } }","tags":"","url":"Development\/Order\/OrderList\/Action.html"},{"title":"TemplateHelper","text":"CoreShop Order Template\/Twig Helper Order State There is one Filter which returns you the current state for an order: {{ dump(order|coreshop_order_state) }}","tags":"","url":"Development\/Order\/TemplateHelper.html"},{"title":"AdditionalData","text":"Additional Data in Order Sometimes you need to implement additional information in your order (Besides the comment field, which is available by default in the shipping checkout step). Note: To add custom fields you need a custom checkout step. Create your custom brick and apply it to the classes: Cart (additionalData) Order (additionalData) Quote (additionalData) Add fields to your custom checkout step (createForm()): $form->add('af_secretField', TextType::class, [ 'required' => false, 'label' => 'coreshop.ui.your_secret_field' ]); $form->add('af_secondSecretField', TextType::class, [ 'required' => false, 'label' => 'coreshop.ui.your_second_secret_field' ]); Store data in cart (commitStep()) use Pimcore\\Model\\DataObject\\Objectbrick\\Data\\AdditionalField; if ($form->isSubmitted()) { if ($form->isValid()) { $formData = $form->getData(); if(!empty($formData['af_secretField'])) { $brick = new AdditionalField($cart); $brick->setSecretField($formData['af_secretField']); $brick->setSecondSecretField($formData['af_secondSecretField']); $cart->getAdditionalData()->setAdditionalField($brick); } $cart->save(); return true; } } That's it - your additional data is now available in backend. If you want to display those fields in the overview, you need to add some JS: core_shop_core: pimcore_admin: js: filter_condition_relational_multi_select: '\/bundles\/app\/additionalData.js' This file has to extend coreshop.order.sale.detail.abstractBlock and requires several methods: initBlock, updateSale, getPanel, getPriority and getPosition. pimcore.registerNS('coreshop.order.order.detail.blocks.yourBlockName'); coreshop.order.order.detail.blocks.yourBlockName = Class.create(coreshop.order.sale.detail.abstractBlock, { saleInfo: {}, hasItems: true, initBlock: function () { this.saleInfo = Ext.create('Ext.panel.Panel', { title: t('coreshop_order_additional_data'), margin: '0 20 20 0', border: true, flex: 8 }); }, updateSale: function () { var items = [], subItems = []; \/\/console.log(this.sale.additionalData); var items = [], subItems = []; Ext.Array.each(this.sale.additionalData, function (block, i) { var data = block.data; subItems.push({ xtype: 'label', style: 'font-weight:bold;display:block', text: 'Title for your custom field A' }, { xtype: 'label', style: 'display:block', html: data.secretField }); subItems.push({ xtype: 'label', style: 'font-weight:bold;display:block', text: 'Title for your custom field B' }, { xtype: 'label', style: 'display:block', html: data.secondSecretField }) }); if (subItems.length === 0) { this.hasItems = false; return; } items.push({ xtype: 'panel', bodyPadding: 10, margin: '0 0 10px 0', items: subItems }); \/\/ remove all before adding new ones \/\/ otherwise they will append during a refresh this.saleInfo.removeAll(); this.saleInfo.add(items); }, getPanel: function () { return this.hasItems ? this.saleInfo : null; }, getPriority: function () { return 10; }, getPosition: function () { return 'right'; } });","tags":"","url":"Development\/Order\/AdditionalData.html"},{"title":"Shipping","text":"CoreShop Shipping This guide should lead you through how CoreShop handles Shipping and Shipping Calculation. Carriers Shipping Rules","tags":"","url":"Development\/Shipping\/index.html"},{"title":"Carrier","text":"CoreShop Carrier This guide should lead you through how CoreShop handles Carriers. Create, Read, Update, Delete Carrier Discovery Price Calculation","tags":"","url":"Development\/Shipping\/Carrier\/index.html"},{"title":"CRUD","text":"CoreShop Carrier Create If you want to create a Carrier via API, you can do following: $newCarrier = $container->get('coreshop.factory.carrier')->createNew(); Now you have a new Carrier, if you want to persist it, you need to do following: $container->get('coreshop.manager.carrier')->persist($newCarrier); $container->get('coreshop.manager.carrier')->flush(); You now have a new persisted Carrier. Read If you want to query for Carriers, you can do following: $carrierRepository = $container->get('coreshop.repository.carrier'); $queryBuilder = $carrierRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $carriers = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Carrier, you need to do following: \/\/ Fetch Carrier $carrier = $carrierRepository->findById(1); $carrier->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.carrier')->persist($carrier); $container->get('coreshop.manager.carrier')->flush(); Delete If you want to update and existing Carrier, you need to do following: \/\/ Fetch Carrier $carrier = $carrierRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.carrier')->remove($carrier); $container->get('coreshop.manager.carrier')->flush();","tags":"","url":"Development\/Shipping\/Carrier\/CRUD.html"},{"title":"Carrier Discovery","text":"CoreShop Carrier Discovery CoreShop uses a Service to discover available Carriers for a given Shippable. These Service implements the Interface CoreShop\\Bundle\\ShippingBundle\\Discover\\ShippableCarriersDiscoveryInterface. The Interface is implemented by Service with ID coreshop.carrier.discovery","tags":"","url":"Development\/Shipping\/Carrier\/Carrier_Discovery.html"},{"title":"Price Calculation","text":"CoreShop Carrier Price Calculation CoreShop Shipping\/Carrier Calculation uses multiple Calculation methods to calculate the price for a given Carrier on a given Cart. A Calculator needs to implement the Interface CoreShop\\Component\\Shipping\\Calculator\\CarrierPriceCalculatorInterface and registered to the container using the tag coreshop.shipping.price_calculator, a type attribute and a priority Default Implementation The Default Implementation calculates the Price based on Shipping Rules.","tags":"","url":"Development\/Shipping\/Carrier\/Price_Calculation.html"},{"title":"Shipping Rules","text":"CoreShop Shipping Rules Default Conditions and Actions CoreShop comes with a set of default action and condition implementations: Default Conditions Currencies Customer Groups Customers Stores Zones Amount Categories Countries Dimension Post Codes Products Shipping Rule Weight Nested Default Actions Addition Amount Addition Percent Discount Amount Discount Percent Price Shipping Rule Extending Conditions and Actions Click here to see how you can add custom Actions Click here to see how you can add custom Conditions","tags":"","url":"Development\/Shipping\/Shipping_Rules\/index.html"},{"title":"Index and Filters","text":"CoreShop Index and Filter This guide should lead you through how CoreShop handles Indices and Filters. Indices Filters","tags":"","url":"Development\/Index_and_Filters\/index.html"},{"title":"Index","text":"CoreShop Index To create a rich layered navigation (faceted navigation), you need to create an index of your Products. Create a new Index CoreShop currently supports two type of indexes: Mysql ~~Elasticsearch~~ Add Fields To add a new field, simply drag'n'drop the field from the left tree to the right tree. Field Properties Every field has some properties that needs to be configured Field Description Key Pimcore Field Name Name Name in the Index Getter Class Getter Class is important for field-types like "Localized Fields", "Classification Store", "Object Brick" and "Field Collection". CoreShop needs it to get the right value for the index Interpreter Using Interpreters helps you to transform values before they get stored in the index. For example: Resolving dependencies, create a similarity Index Type Type of the field in the index, depends on which Index-Type you are using. MySql or Elasticsearch Getter Config Configuration depends on Getter, for example: Language for Localized Fields Re-Index If you make changes to the index, you need to re-index all of your products. To do that, there is a CLI command. $ php bin\/console coreshop:index If you don't want to re-index all of your indices, you can pass the corresponding IDs or names of the indices separated with a space as arguments to the CLI command. The following example will only re-index indices with IDs 1 and 2 and name "Products". If none of those indices exist, nothing will be re-indexed. $ php bin\/console coreshop:index 1 2 Products","tags":"","url":"Development\/Index_and_Filters\/Index\/index.html"},{"title":"Interpreter","text":"CoreShop Index Interpreter To prepare your index and transform data, you use one of the existing Interpreter or create one yourself. CoreShop currently has following Interpreters: Object: converts an object or and object array to relations. It saves the values to the relations inex ObjectId: converts an object to its ID ObjectIdSum: calculates the sum of all IDs. (Could be used for similar products) ObjectProperty: calls a getter method of the value Soundex: calls PHP soundex function (Could be used for similar products) Create a Custom Interpreter 1 We need to create 2 new files: FormType for processing the Input Data And a InterpreterInterface, which interprets the data namespace AppBundle\\Index\\Form\\Type; use Symfony\\Component\\Form\\AbstractType; use Symfony\\Component\\Form\\Extension\\Core\\Type\\IntegerType; use Symfony\\Component\\Form\\FormBuilderInterface; use Symfony\\Component\\Validator\\Constraints\\NotBlank; use Symfony\\Component\\Validator\\Constraints\\Type; final class MyInterpreterType extends AbstractType { \/** * {@inheritdoc} *\/ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('myInterpreterData', IntegerType::class, [ 'constraints' => [ new NotBlank(['groups' => ['coreshop']]), new Type(['type' => 'numeric', 'groups' => ['coreshop']]), ], ]) ; } } namespace AppBundle\\CoreShop\\Index\\Interpreter; use CoreShop\\Component\\Index\\Interpreter\\InterpreterInterface; class MyInterpreter implements InterpreterInterface { public function interpret($value, IndexableInterface $indexable, IndexColumnInterface $config, array $interpreterConfig = []) { \/\/Do some interpretation here return $value; } } 2:Register MyInterpreter as service with tag coreshop.index.interpreter, type and form app.index.interpreter.my_interpreter: class: AppBundle\\CoreShop\\Index\\Interpreter\\MyInterpreter tags: - { name: coreshop.index.interpreter, type: my_interpreter, form-type: AppBundle\\Index\\Form\\Type\\MyInterpreterType}","tags":"","url":"Development\/Index_and_Filters\/Index\/Interpreter.html"},{"title":"Extension","text":"CoreShop Index Extension In order to make the index more flexible, it is possible for you to write extensions. Extensions allow you to do following things: - Add more "default" columns and corresponding data - Pre Filter an mysql index To create a new extension, you need to implement either the interface CoreShop\\Component\\Index\\Extension\\IndexColumnsExtensionInterface for column extensions or the interface CoreShop\\Bundle\\IndexBundle\\Extension\\MysqlIndexQueryExtensionInterface for mysql query extensions. You then need to register your service using the tag coreshop.index.extension","tags":"","url":"Development\/Index_and_Filters\/Index\/Extension.html"},{"title":"Filter","text":"CoreShop Filter After creating the index, you can configure the Filters. Create a new Filter You can create different Filters for different Categories. A filter exists of different settings, pre-conditions, filters and similar products. You can even create Custom Filters Filter Settings Field Description Name Name of the Filter-Set Index Which Index should be used Order Order of the products Order Key Order key (index-field) to sort from Results per Page How many products should be displayed per page, you can use Shop Settings, or override it Pre-Conditions You can define pre-filters for the index. Conditions Here you can define different kind of filters. These filters will be displayed on the front-page for customers to find products. CoreShop currently supports 4 types of filters: Select Multiselect Range Boolean Select Condition A select condition is basically just a simple dropdown field where customer can select one field. Multiselect Condition A multi-select condition is basically a list of fields where customer can select multiple entries. Range Condition A Range Condition is a slider of two ranges. The ranges are calculated automatically using MIN and MAX values. Boolean Condition Boolean is a Condition where the customer can check different values.","tags":"","url":"Development\/Index_and_Filters\/Filter\/index.html"},{"title":"Custom Filter","text":"CoreShop Filter - Create Custom Filter 1. We need to create 2 new files: - FormType for processing the Input Data - And a FilterConditionProcessorInterface, which checks if a cart fulfills the condition. namespace AppBundle\\Filter\\Form\\Type\\Condition; use Symfony\\Component\\Form\\AbstractType; use Symfony\\Component\\Form\\Extension\\Core\\Type\\IntegerType; use Symfony\\Component\\Form\\FormBuilderInterface; use Symfony\\Component\\Validator\\Constraints\\NotBlank; use Symfony\\Component\\Validator\\Constraints\\Type; final class MyFilterCondition extends AbstractType { \/** * {@inheritdoc} *\/ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('myData', IntegerType::class, [ 'constraints' => [ new NotBlank(['groups' => ['coreshop']]), new Type(['type' => 'numeric', 'groups' => ['coreshop']]), ], ]) ; } } namespace AppBundle\\Filter; use CoreShop\\Component\\Address\\Model\\AddressInterface; use CoreShop\\Component\\Core\\Model\\CarrierInterface; class MyFilterCondition extends FilterConditionProcessorInterface { public function prepareValuesForRendering(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter) { \/\/Prepare values for rendering HTML } public function addCondition(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter, ParameterBag $parameterBag, $isPrecondition = false) { \/\/Add Condition to Listing return $currentFilter; } } 2. Register MyFilterCondition as service with tag coreshop.filter.condition_type, type and form app.coreshop.shipping_rule.condition.my_rule: class: AppBundle\\Shipping\\Rule\\Condition\\MyRuleConditionChecker tags: - { name: coreshop.shipping_rule.condition, type: my_rule, form-type: AppBundle\\Shipping\\Form\\Type\\Condition\\MyRuleConfigurationType } app.filter.condition_type.my_filter_condition: class: AppBundle\\Filter\\MyFilterCondition tags: - { name: coreshop.filter.condition_type, type: app-my-filter, form-type: AppBundle\\Filter\\Form\\Type\\Condition\\MyFilterCondition}","tags":"","url":"Development\/Index_and_Filters\/Filter\/Custom_Filter.html"},{"title":"Notification Rules","text":"CoreShop Notification Rules Notification Rules are responsible for all types of notification triggered by CoreShop. It handles notification for following types: order quote invoice shipment user payment Overview Let's checkout each notification type: Order Allowed Conditions Name Description Invoice State Dispatch if given Invoice State is active Invoice Transition Dispatch if given Invoice Transition has been applied Payment State Dispatch if given Payment State is active Payment Transition Dispatch if given Payment Transition has been applied Shipping State Dispatch if given Shipping State is active Shipping Transition Dispatch if given Shipping Transition has been applied Order State Dispatch if given Order State is active Order Transition Dispatch if given Order Transition has been applied Carriers Dispatch if given Carrier has been selected in Order Comment Dispatch if a Comment Action has been applied. Available Types: create comment Allowed Actions Name Description Order Email Email with Order Object Email Default Email without Order Object Available Placeholders keys for email templates Key Value object Object of type OrderInterface fromState State identifier from which it is transitioning away from toState State identifier from which it is transitioning to transition Used transition _locale Used locale recipient Customer E-Mail Address firstname Customer Firstname lastname Customer Lastname orderNumber Order Number Available Placeholders keys for email templates for comment Key Value object Object of type OrderInterface _locale Used locale recipient Customer E-Mail Address firstname Customer Firstname lastname Customer Lastname orderNumber Order Number type Type of comment submitAsEmail should comment be sent as mail comment contents of the comment Shipment Allowed Conditions Name Description Shipping State Dispatch if given Shipping State is active Shipping Transition Dispatch if given Shipping Transition has been applied Allowed Actions Name Description Order Email Email with Order Object Email Default Email without Order Object Available Placeholders keys for email templates Key Value object Object of type OrderShipmentInterface order Object of type OrderInterface fromState State identifier from which it is transitioning away from toState State identifier from which it is transitioning to transition Used transition Invoice Allowed Conditions Name Description Invoice State Dispatch if given Invoice State is active Invoice Transition Dispatch if given Invoice Transition has been applied Allowed Actions Name Description Order Email Email with Order Object Email Default Email without Order Object Available Placeholders keys for email templates Key Value object Object of type OrderInvoiceInterface order Object of type OrderInterface fromState State identifier from which it is transitioning away from toState State identifier from which it is transitioning to transition Used transition Payment Allowed Conditions Name Description Payment State Dispatch if given Payment State is active Payment Transition Dispatch if given Payment Transition has been applied Allowed Actions Name Description Order Email Email with Order Object Email Default Email without Order Object Available Placeholders keys for email templates Key Value object Object of type PaymentInterface order Object of type OrderInterface paymentState State of the Payment User Allowed Conditions Name Description User Type Dispatch if given Type has been applied. Allowed Types: new account, password reset Allowed Actions Name Description Email Default Email without Order Object Available Placeholders keys for email templates Key Value object Object of type CustomerInterface recipient Customer E-Mail Address gender Customer Gender firstname Customer Firstname lastname Customer Lastname email Customer E-Mail type type of customer notification Additional Placeholders keys for Password Reset Key Value resetLink Link where customer can reset his Password Additional Placeholders keys for Request Newsletter Key Value confirmLink Link where customer can confirm his Newsletter subscription token Confirmation Token Quote Allowed Conditions Name Description Carriers Dispatch if given Carrier has been selected in Order Allowed Actions Name Description Email Default Email without Order Object Available Placeholders keys for email templates Key Value object Object of type QuoteInterface Custom Implementation It's also easy to implement custom notification rules. Read more about this here Extend CoreShop Notification Rules Custom Actions Custom Conditions Custom Types Triggering Notifications","tags":"","url":"Development\/Notification_Rules\/index.html"},{"title":"Custom Actions","text":"CoreShop Notification Rule Custom Actions Click here to see how you can add custom Actions","tags":"","url":"Development\/Notification_Rules\/Custom_Actions.html"},{"title":"Custom Conditions","text":"CoreShop Notification Rule Custom Conditions Click here to see how you can add custom Conditions","tags":"","url":"Development\/Notification_Rules\/Custom_Conditions.html"},{"title":"Custom Types","text":"CoreShop Notification Rule Custom Type Notification Types are registered dynamically by using tag-attributes on conditions and actions. If you want to have your own type, you can do so by adding a new condition or action and specify your own type: services: app.coreshop.notification_rule.condition.order.custom_notification_condition: class: AppBundle\\CoreShop\\Notification\\CustomNotificationCondition tags: - { name: coreshop.notification_rule.condition, type: custom_condition, notification-type: custom, form-type: AppBundle\\Form\\Type\\CoreShop\\CustomConditionType }","tags":"","url":"Development\/Notification_Rules\/Custom_Types.html"},{"title":"Triggering","text":"CoreShop Notification Trigger Notifications Triggering Notification events is quite easy, you can use the CoreShop\\Component\\Notification\\Processor\\RulesProcessorInterface implemented by service @coreshop.notification_rule.processor You also need to add different kinds of parameters based on your Notification Type. In our case, we trigger an Order event. $this->rulesProcessor->applyRules('order', $event->getProposal(), [ 'fromState' => $event->getMarking()->getPlaces(), 'toState' => $event->getTransition()->getTos(), '_locale' => $order->getLocaleCode(), 'recipient' => $customer->getEmail(), 'firstname' => $customer->getFirstname(), 'lastname' => $customer->getLastname(), 'orderNumber' => $order->getOrderNumber(), 'transition' => $event->getTransition()->getName() ]); The rest is now handled by CoreShop Notifications.","tags":"","url":"Development\/Notification_Rules\/Triggering.html"},{"title":"Payment","text":"CoreShop Payment CoreShop contains a very flexible payments management system with support for many gateways (payment providers). We are using a payment abstraction library - Payum, which handles all sorts of capturing, refunding and recurring payments logic. On CoreShop side, we integrate it into our checkout and manage all the payment data. Available Payment Gateways for CoreShop Name State Link Support Offsite Supports Server-Notification Supports Refund Heidelpay stable Github PayPal, Klarna Sofort, Credit Card No Yes No SaferPay stable Github Supported Payment Methods Yes Yes Partially PostFinance stable Github PostFinance Card, PostFinance E-Finance, Visa, MasterCard, Diners Club, American Express, JCB, PayPal, TWINT Yes Yes No PowerPay dev Github invoice, automatic credit check No No (not required) No CuraBill dev Github invoice, instalments via iframe No No (not required) No Payment Every payment in CoreShop, successful or failed, is represented by the payment model, which contains basic information and a reference to appropriate order. Create a Payment programmatically As usually, use a factory to create a new PaymentMethod and give it a unique code. $payment = $this->container->get('coreshop.factory.payment')->createNew(); $payment->setOrder($order); $payment->setCurrencyCode('EUR'); $this->container->get('coreshop.repository.payment')->add($payment); More Payment Provider Ominpay Bridge Payum Providers","tags":"","url":"Development\/Payment\/index.html"},{"title":"Payment Provider","text":"CoreShop Payment Providers A Payment Provider represents a way that your customer pays during the checkout process. It holds a reference to a specific gateway with custom configuration. A gateway is configured for each payment method separately using the payment method form. Payment Gateway configuration Payment Gateways that already have a CoreShop bridge First you need to create the configuration form type for your gateway. Have a look at the configuration form types of Paypal and Sofort. Then you should register its configuration form type with coreshop.gateway_configuration_type tag. After that it will be available in the admin panel in the gateway choice dropdown. If you are not sure how your configuration form type should look like, head to Payum documentation. Other Payment Gateways Learn more about integrating payment gateways in the Payum docs. You\u2019ll probably need also this kind of configuration in your app\/config\/config.yml for the gateway\u2019s factory: payum: gateways: yourgateway: factory: yourgateway As an example, we add Sofort as a payment gateway factory. To add a new gateway configuration you need to add 2 files: A new FormType for configuration values A new Javascript File for ExtJs Form 1: Form Type for Configuration Values: namespace AppBundle\\CoreShop\\Form\\Type; use Symfony\\Component\\Form\\AbstractType; use Symfony\\Component\\Form\\Extension\\Core\\Type\\TextType; use Symfony\\Component\\Form\\FormBuilderInterface; use Symfony\\Component\\Form\\FormEvent; use Symfony\\Component\\Form\\FormEvents; use Symfony\\Component\\Validator\\Constraints\\NotBlank; final class SofortGatewayConfigurationType extends AbstractType { \/** * {@inheritdoc} *\/ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('config_key', TextType::class, [ 'constraints' => [ new NotBlank([ 'groups' => 'coreshop', ]), ], ]) ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { $data = $event->getData(); $data['payum.http_client'] = '@coreshop.payum.http_client'; }) ; } } Now we register the FormType into the container services: app.coreshop.form.type.gateway_configuration.sofort: class: AppBundle\\Form\\Type\\SofortGatewayConfigurationType tags: - { name: coreshop.gateway_configuration_type, type: sofort } - { name: form.type } 2: Create the corresponding ExtJs Form: You need to use the type attribute as identifier here pimcore.registerNS('coreshop.provider.gateways.sofort'); coreshop.provider.gateways.sofort = Class.create(coreshop.provider.gateways.abstract, { getLayout: function (config) { return [ { xtype: 'textfield', fieldLabel: t('config_key'), name: 'gatewayConfig.config.config_key', length: 255, value: config.config_key ? config.config_key : "" } ]; } }); Next we need to register our new Gateway JS file to be loaded: core_shop_payment: pimcore_admin: js: sofort_gateway: '\/bundles\/app\/pimcore\/js\/sofort.js' Thats it, now after reloading Pimcore, you'll see a new Factory.","tags":"","url":"Development\/Payment\/Payment_Provider.html"},{"title":"Omnipay Bridge","text":"CoreShop Payum Ominpay Bridge Here is a list of all available Omnipay Payment Providers. As of now, Omnipay is not compatible with Symfony 3. They are already working on it, but will need some time to be finished. But: You can use the dev-master Version Omnipay to add the Bridge To add the Omnipay Bridge, do following: $ composer require payum\/omnipay-v3-bridge:dev-master This will install the Bridge for you. Now you still need to create your Gateway Configuration as described here. Example of Omnipay Gateway Configuration As example we add omnipay-worldpay: Worldpay is currently in PR and I don't know when it is getting merged 1: add FormType for Worldpay Configuration: <?php namespace AppBundle\\Form\\Type; use Symfony\\Component\\Form\\AbstractType; use Symfony\\Component\\Form\\Extension\\Core\\Type\\PasswordType; use Symfony\\Component\\Form\\Extension\\Core\\Type\\TextType; use Symfony\\Component\\Form\\FormBuilderInterface; use Symfony\\Component\\Form\\FormEvent; use Symfony\\Component\\Form\\FormEvents; use Symfony\\Component\\Validator\\Constraints\\NotBlank; final class WorldpayType extends AbstractType { \/** * {@inheritdoc} *\/ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('serviceKey', TextType::class, [ 'constraints' => [ new NotBlank([ 'groups' => 'coreshop', ]), ], ]) ->add('clientKey', PasswordType::class, [ 'constraints' => [ new NotBlank([ 'groups' => 'coreshop', ]), ], ]) ->add('merchantId', TextType::class, [ 'constraints' => [ new NotBlank([ 'groups' => 'coreshop', ]), ], ]) ->add('factory', TextType::class, [ 'data' => 'omnipay', 'empty_data' => 'omnipay' ]) ->add('type', TextType::class, [ 'data' => 'WorldPay\\\\Json', 'empty_data' => 'WorldPay\\\\Json' ]) ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { $data = $event->getData(); $data['payum.http_client'] = '@coreshop.payum.http_client'; }) ; } } Register into the container: services: app.form.type.gateway_configuration.worldpay: class: AppBundle\\Form\\Type\\WorldpayType tags: - { name: coreshop.gateway_configuration_type, type: omnipay_worldpay } - { name: form.type } Its important that it starts with omnipay_ here 2: Add ExtJs Form: pimcore.registerNS('coreshop.provider.gateways.omnipay_worldpay'); coreshop.provider.gateways.omnipay_worldpay = Class.create(coreshop.provider.gateways.abstract, { getLayout: function (config) { return [ { xtype: 'textfield', fieldLabel: t('coreshop_worldpay_service_key'), name: 'gatewayConfig.config.serviceKey', length: 255, value: config.serviceKey ? config.serviceKey : "" }, { xtype: 'textfield', fieldLabel: t('coreshop_worldpay_client_key'), name: 'gatewayConfig.config.clientKey', length: 255, value: config.clientKey }, { xtype: 'textfield', fieldLabel: t('coreshop_worldpay_merchant_id'), name: 'gatewayConfig.config.merchantId', length: 255, value: config.merchantId } ]; } }); Register JS File for CoreShop to be loaded: core_shop_payment: pimcore_admin: js: worldpay: \/bundles\/app\/pimcore\/static\/js\/payment\/provider\/worldpay.js Thats it, now you can create a new Payment Provider in the Backend and use Omnipay WorldPay as Payment Provider.","tags":"","url":"Development\/Payment\/Omnipay_Bridge.html"},{"title":"Payum Providers","text":"CoreShop Payum Providers Here is a list of all available Payum Payment Providers.","tags":"","url":"Development\/Payment\/Payum_Providers.html"},{"title":"Stores","text":"CoreShop Stores CoreShop Stores help you create a multi-store based eCommerce System with different Themes across these Stores. Create, Read, Update, Delete Store Context Theming","tags":"","url":"Development\/Stores\/index.html"},{"title":"CRUD","text":"CoreShop Stores Create If you want to create a Store via API, you can do following: $newStore = $container->get('coreshop.factory.store')->createNew(); Now you have a new Store, if you want to persist it, you need to do following: $container->get('coreshop.manager.store')->persist($newStore); $container->get('coreshop.manager.store')->flush(); You now have a new persisted Store. Read If you want to query for Stores, you can do following: $storeRepository = $container->get('coreshop.repository.store'); $queryBuilder = $storeRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $stores = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Store, you need to do following: \/\/ Fetch Store $store = $storeRepository->findById(1); $store->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.store')->persist($store); $container->get('coreshop.manager.store')->flush(); Delete If you want to update and existing Store, you need to do following: \/\/ Fetch Store $store = $storeRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.store')->remove($store); $container->get('coreshop.manager.store')->flush();","tags":"","url":"Development\/Stores\/CRUD.html"},{"title":"Context","text":"CoreShop Store Context For CoreShop to determine the current store the visitor or customer comes from it uses a concept called context and context resolver. Context Name Priority Tag Description FixedStoreContext 2 coreshop.context.store Used for testing purposes StoreContext 1 coreshop.context.store Load a store from given request resolver Resolver Name Priority Tag Description SiteBasedRequestResolver 100 coreshop.context.store.request_based.resolver Determines a store by a given pimcore frontend site PimcoreAdminSiteBasedRequestResolver 200 coreshop.context.store.request_based.resolver Determines a store by a given document in backend These resolver take care about finding the correct store for the current request. Create a Custom Resolver A Store Context needs to implement the interface CoreShop\\Component\\Store\\Context\\StoreContextInterface. This interface consists of one method called getStore which returns a CoreShop\\Component\\Store\\Model\\StoreInterface or throws an CoreShop\\Component\\Store\\Context\\StoreNotFoundException. To register your context, you need to use the tag coreshop.context.store with an optional priority attribute. Create a Request based Resolver CoreShop already implements Request based store context resolver. So if your context depends on the current request, you can create a custom RequestBased resolver. To do that, implement the interface CoreShop\\Component\\Store\\Context\\RequestBased\\RequestResolverInterface with the method findStore. This method either returns a store or null. To register this resolver, use the tag: coreshop.context.store.request_based.resolver with an optional priority attribute. Example We want to a StoreContext to be based on the Pimcore Document. So if we are on site \/de, we want to resolve to Store DE, if we are on page \/en we want to resolve to Store Store EN: 1: First of all we need to create our RequestBased Store Context: <?php namespace AppBundle\\CoreShop\\Store\\Context; use CoreShop\\Component\\Store\\Context\\RequestBased\\RequestResolverInterface; use CoreShop\\Component\\Store\\Repository\\StoreRepositoryInterface; use Pimcore\\Http\\Request\\Resolver\\DocumentResolver; use Symfony\\Component\\HttpFoundation\\Request; final class DocumentBasedRequestRequestResolver implements RequestResolverInterface { private StoreRepositoryInterface $storeRepository; public function __construct(StoreRepositoryInterface $storeRepository) { $this->storeRepository = $storeRepository; } public function findStore(Request $request): ?StoreInterface { if (substr($request->getPathInfo(), 0, 3) === '\/en') { return $this->storeRepository->find(1); } if (substr($request->getPathInfo(), 0, 3) === '\/de') { return $this->storeRepository->find(2); } return null; } } Now we need to configure the service in src\/AppBundle\/Resources\/config\/services.yml services: app.coreshop.store.context.request.document_based: class: AppBundle\\CoreShop\\Store\\Context\\DocumentBasedRequestRequestResolver arguments: - '@coreshop.repository.store' tags: - { name: coreshop.context.store.request_based.resolver, priority: 300 } CoreShop now tries to resolve the current Store based on the Pimcore Site we are on.","tags":"","url":"Development\/Stores\/Context.html"},{"title":"Theme","text":"CoreShop Stores Theming CoreShop Stores are designed to allow different Themes. Therefore you can have a true Multi-Store Environment with different Themes. CoreShop uses Sylius Theme Bundle for templates, read more at their docs on how it works: https:\/\/docs.sylius.com\/en\/1.9\/book\/themes\/themes.html","tags":"","url":"Development\/Stores\/Theme.html"},{"title":"Customers","text":"CoreShop Customer This guide should lead you through how CoreShop handles Customer Information. Create, Read, Update, Delete Customer Context Registration Service Registration Types Company Extension","tags":"","url":"Development\/Customers\/index.html"},{"title":"CRUD","text":"CoreShop Custom CoreShop uses Pimcore Data Objects to persist Customer Information. But, it adds a little wrapper around it to be mire dynamic and configurable. It uses a Factory and Repository Pattern to do that. Create If you want to create a new Custom, we need to get our Factory Service for that: $customerFactory = $container->get('coreshop.factory.customer'); $customer = $customerFactory->createNew(); No we have our customer and we can set all needed values. If you now want to save it, just call the save function $customer->save(); Read To get customers, you need to use the Repository Service CoreShop provides you. $repository = $container->get('coreshop.repository.customer'); \/\/ Query by ID $customerWithIdOne = $repository->findById(1); \/\/ Get a Listing how you know it from Pimcore $list = $repository->getList(); $list->setCondition("active = 1"); $customers = $list->getObjects(); Update Update works the same as you are used to in Pimcore $repository = $container->get('coreshop.repository.customer'); \/\/ Query by ID $customerWithIdOne = $repository->findById(1); \/\/ Change values $customerWithIdOne->setName('test'); $customerWithIdOne->save(); Delete Delete works the same as you are used to in Pimcore $repository = $container->get('coreshop.repository.customer'); \/\/ Query by ID $customerWithIdOne = $repository->findById(1); $customerWithIdOne->delete();","tags":"","url":"Development\/Customers\/CRUD.html"},{"title":"Context","text":"CoreShop Customer Context CoreShop Customer Security uses Symfony Firewall to handle authentication. CoreShop implemented a Context based Wrapper around that to be more flexible. Currently CoreShop implements these Contexts for Customer determination: Security Token Based Create a Custom Resolver A Store Context needs to implement the interface CoreShop\\Component\\Customer\\Context\\CustomerContextInterface. This interface consists of one function called "getCustomer" which returns a CoreShop\\Component\\Customer\\Model\\CustomerInterface or throws an CoreShop\\Component\\Customer\\Context\\CustomerNotFoundException To register your context, you need to use the tag: coreshop.context.customer with an optional priority attribute. The use case of changing this is quite rare. But if you need to, you can create a Custom Resolver if you wish.","tags":"","url":"Development\/Customers\/Context.html"},{"title":"Customer Manager","text":"CoreShop Customer Manager CoreShop already implements a Customer Manager which handles creating a Customer with Addresses. The Customer Manager implements the Interface CoreShop\\Bundle\\CoreBundle\\Customer\\CustomerManagerInterface and CoreShop implements it using the service coreshop.customer.manager. Usage To use the Service, you need to pass a Customer. In our example, we gonna do that from a Controller with a FormType. $customer = $this->getCustomer(); if ($customer instanceof CustomerInterface && null === $customer->getUser()) { return $this->redirectToRoute('coreshop_customer_profile'); } $form = $this->get('form.factory')->createNamed('customer', CustomerRegistrationType::class, $this->get('coreshop.factory.customer')->createNew()); $redirect = $this->getParameterFromRequest($request, '_redirect', $this->generateUrl('coreshop_customer_profile')); if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) { $form = $form->handleRequest($request); if ($form->isValid()) { $customer = $form->getData(); $customer->setLocaleCode($this->get('coreshop.context.locale')->getLocaleCode()); $this->get('coreshop.customer.manager')->persistCustomer($customer); return $this->redirect($redirect); } } return $this->render($this->templateConfigurator->findTemplate('Register\/register.html'), [ 'form' => $form->createView(), ]);","tags":"","url":"Development\/Customers\/Customer_Manager.html"},{"title":"Registration Types","text":"CoreShop Customer Registration Types By default, a customer needs to provide a unique and valid email address to pass a registration. Register By Email This is the default setting! To switch to registration by a unique and valid email address, you need set the identifier: core_shop_customer: login_identifier: 'email' Register By Username First, you need to make sure your customer object provides a username field. By default, coreshop does not install this field to prevent unnecessary confusion. To implement the username field, just open your class editor and add a text field called username and you're good to go! To switch to registration by a unique username, you need change the identifier: core_shop_customer: login_identifier: 'username' Security Form (Frontend) CoreShop comes with a preinstalled constraint which will tell your customer, if an email address or username - depending on your settings - is valid or not. Backend \/ API Plus, if you're going to update a customer by API or Backend, coreshop also checks if your customer entity has unique data. Note: Both checks only apply to non-guest entities!","tags":"","url":"Development\/Customers\/Registration_Types.html"},{"title":"Company Extension","text":"CoreShop Customer Company Extension The Company Entity allows you to append customers to a given company. After a customer has been connected to a company by using the 1to1 relation company, it's possible to share addresses between company and the self-assigned addresses. Access Types Note! This is only available if a customer already is connected to a valid company! Own Only If set, the customer can create, edit and delete own addresses and choose them in checkout as well. This is the default behaviour. Company Only If set, the customer can create, edit und delete company addresses and choose them in checkout as well. He's not able to add addresses to himself. Own And Company If set, the customer can create, edit and delete company and private addresses and choose them in checkout as well. Plus, the own_and_company mode allows the customer to define and modify the allocation of the address. To do so, coreshop renders an additional choice type to the address creation\/modification form. Note: If a customer switches the allocation after it has been created, the address also physically gets moved to its desired location. In this example, the customer changes the allocation from own to company: Before: - company A - addresses - customer A - addresses - address A After: - company A - addresses - address A - customer A - addresses Read more about this feature here.","tags":"","url":"Development\/Customers\/Company_Extension.html"},{"title":"Ecommerce Tracking","text":"CoreShop eCommerce Tracking CoreShop currently implements Tracking for Analytics and Google Tag Manager. Tracking is automatically available (but not enabled), as soon as you enable Tag Manager or Analytics in Pimcore. Per default configuration, all the ecommerce trackers are disabled. You need to enable them manually. Available Trackers google-analytics-enhanced-ecommerce google-analytics-universal-ecommerce google-gtag-enhanced-ecommerce google-gtm-classic-ecommerce google-gtm-enhanced-ecommerce matomo (piwik) Enabling Trackers core_shop_tracking: trackers: google-analytics-enhanced-ecommerce: enabled: false google-analytics-universal-ecommerce: enabled: false google-gtag-enhanced-ecommerce: enabled: false google-gtm-classic-ecommerce: enabled: false google-gtm-enhanced-ecommerce: enabled: false matomo: enabled: true External Google Enhanced E-Commerce Google Enhanced E-Commerce with gtag.js Google Tag Manager Enhanced E-Commerce Google Tag Manager Classic E-Commerce Matomo (Piwik) E-Commerce Actions Product Impression $this->get('coreshop.tracking.manager')->trackProductImpression($product); Product View $this->get('coreshop.tracking.manager')->trackProduct($product); Product Action Add from Cart $this->get('coreshop.tracking.manager')->trackCartAdd($cart, $product); Product Action Remove from Cart $this->get('coreshop.tracking.manager')->trackCartRemove($cart, $product); Checkout Step $this->get('coreshop.tracking.manager')->trackCheckoutStep($cart, $stepIdentifier, $isFirstStep, $checkoutOption) Checkout Complete $this->get('coreshop.tracking.manager')->trackCheckoutComplete($order) Add a custom Tracker To add a custom tracker you need to implement the interface CoreShop\\Component\\Tracking\\Tracker\\TrackerInterface app.tracking.tracker.my_tracker: class: AppBundle\\Tracker\\CustomTracker parent: coreshop.tracking.tracker.ecommerce_tracker tags: - { name: coreshop.tracking.tracker, type: app-custom-tracker } Google Tag Manager If you have enabled the gtm in backend, CoreShop sends some data to a dataLayer object which submits the object to gtm. GTM Classic eCommerce If you enable the classic mode only the order gets submitted if user has successfully reached the "thank-you" page. GTM Enhanced eCommerce There are six Impressions\/Events for Google Tag Manager Enhanced eCommerce: Product Impression Tag Config Example: Tag type : Universal Analytics Track type : Pageview Enable Enhanced Ecommerce Features: true Use Data Layer: true Trigger: event equals gtm.dom Product Detail View Tag Config Example: Tag type : Universal Analytics Track type : Pageview Enable Enhanced Ecommerce Features: true Use Data Layer: true Trigger: event equals gtm.dom Checkout Step: Event-Name: csCheckout Tag Config Example: Tag type : Universal Analytics Track type : Event Event Category: Ecommerce Event Action: Checkout Enable Enhanced Ecommerce Features: true Use Data Layer: true Trigger: event equals csCheckout Checkout Complete (Purchase): Tag Config Example: Tag type : Universal Analytics Track type : Pageview Enable Enhanced Ecommerce Features: true Use Data Layer: true Trigger: event equals gtm.dom Remove Item from Cart Event-Name: csRemoveFromCart Tag Config Example: Tag type : Universal Analytics Track type : Event Event Category: Ecommerce Event Action: Remove from Cart Enable Enhanced Ecommerce Features: true Use Data Layer: true Trigger: event equals csRemoveFromCart Add Item to Cart Event-Name: csAddToCart Tag Config Example: Tag type : Universal Analytics Track type : Event Event Category: Ecommerce Event Action: Add to Cart Enable Enhanced Ecommerce Features: true Use Data Layer: true Trigger: event equals csAddToCart","tags":"","url":"Development\/Ecommerce_Tracking\/index.html"},{"title":"Events","text":"CoreShop Events CoreShop comes with a lot of build-in events. Frontend Controller Name EventType Description coreshop.customer.update_post ResourceControllerEvent Fires after Customer has updated the profile coreshop.customer.change_password_post ResourceControllerEvent Fires after Customer has changed the password coreshop.customer.newsletter_confirm_post ResourceControllerEvent Fires after Customer has confirmed his newsletter subscription coreshop.address.add_post ResourceControllerEvent Fires after Customer has added a new address coreshop.address.update_post ResourceControllerEvent Fires after Customer has updated a address coreshop.address.delete_pre ResourceControllerEvent Fires before Customer deletes a address Cart Name EventType Description coreshop.cart.update GenericEvent Fires after cart has been updated coreshop.cart.pre_add_item GenericEvent Fires before a item gets added to cart coreshop.cart.post_add_item GenericEvent Fires after a item gets added to cart coreshop.cart.pre_remove_item GenericEvent Fires before a item gets removed from cart coreshop.cart.post_remove_item GenericEvent Fires after a item gets removed from cart Customer Name EventType Description coreshop.customer.register CustomerRegistrationEvent Fires after a new customer has been generated coreshop.customer.request_password_reset RequestPasswordChangeEvent Fires after password reset has been requested coreshop.customer.password_reset GenericEvent Fires after new password hast been applied to customer Order Document Name EventType Description coreshop.order.shipment.wkhtml.options WkhtmlOptionsEvent Options Event: Use it to change wkhtml options. coreshop.order.invoice.wkhtml.options WkhtmlOptionsEvent Options Event: Use it to change wkhtml options. Payment Name EventType Description coreshop.payment_provider.supports PaymentProviderSupportsEvent Support Event: Use it to modify available Payment Providers Notes Name EventType Description coreshop.note.*.post_add GenericEvent Fires after a note of type * has been created coreshop.note.*.post_delete GenericEvent Fires after a note of type * has been deleted Rules Name EventType Description coreshop.rule.availability_check RuleAvailabilityCheckEvent Fires in RuleAvailabilityCheck maintenance\/command for every active rule. Replace symbol (*) with one of those note types: payment update_order update_order_item email order_comment Workflow Name EventType Description coreshop.workflow.valid_transitions WorkflowTransitionEvent Valid Event: Use it if you need to extend the workflow transitions Transformer Name EventType Description coreshop.quote_item.pre_transform GenericEvent Fires before proposal item gets transformed to a quote item coreshop.quote_item.post_transform GenericEvent Fires after proposal item has been transformed to a quote item coreshop.order_item.pre_transform GenericEvent Fires before proposal item gets transformed to a order item coreshop.order_item.post_transform GenericEvent Fires after proposal item has been transformed to a order item coreshop.quote.pre_transform GenericEvent Fires before proposal gets transformed to a quote coreshop.quote.post_transform GenericEvent Fires after proposal has been transformed to a quote coreshop.order.pre_transform GenericEvent Fires before proposal gets transformed to a order coreshop.order.post_transform GenericEvent Fires after proposal has been transformed to a order coreshop.shipment_item.pre_transform GenericEvent Fires before proposal item gets transformed to a shipment item coreshop.shipment_item.post_transform GenericEvent Fires after proposal item has been transformed to a shipment item coreshop.shipment.pre_transform GenericEvent Fires before proposal gets transformed to a shipment coreshop.shipment.post_transform GenericEvent Fires after proposal has been transformed to a shipment coreshop.invoice.pre_transform GenericEvent Fires before proposal gets transformed to a invoice coreshop.invoice.post_transform GenericEvent Fires after proposal has been transformed to a invoice Backend Controller Name EventType Description coreshop.*.pre_create ResourceControllerEvent Fires before object gets created in backend coreshop.*.post_create ResourceControllerEvent Fires after object gets created in backend coreshop.*.pre_save ResourceControllerEvent Fires before object gets saved in backend coreshop.*.post_save ResourceControllerEvent Fires after object gets saved in backend coreshop.*.pre_delete ResourceControllerEvent Fires before object gets deleted in backend coreshop.*.post_delete ResourceControllerEvent Fires after object gets deleted in backend Replace symbol (*) with one of those controller: configuration payment_provider exchange_rate filter index notification_rule notification_rule cart_price_rule product_price_rule shipping_rule store tax_rule_group Workflow Events There are events vor every state machine transition. Read more about it here. Model Events You can use Pimcore Events for CoreShops Pimcore Models: Pimcore Events","tags":"","url":"Development\/Events\/index.html"},{"title":"Store Front","text":"CoreShop Store Front The CoreShop Store Front (FrontendBundle) comes with a default implementation and is designed to show you how to work with the CoreShop Framework. Controllers","tags":"","url":"Development\/Store_Front\/index.html"},{"title":"Controllers","text":"CoreShop Store Front Controller If you use CoreShop FrontendBundle, you can change the Controllers it uses. Simply change the configuration for the controller: core_shop_frontend: controllers: index: CoreShop\\Bundle\\FrontendBundle\\Controller\\IndexController register: CoreShop\\Bundle\\FrontendBundle\\Controller\\RegisterController customer: CoreShop\\Bundle\\FrontendBundle\\Controller\\CustomerController currency: CoreShop\\Bundle\\FrontendBundle\\Controller\\CurrencyController language: CoreShop\\Bundle\\FrontendBundle\\Controller\\LanguageController search: CoreShop\\Bundle\\FrontendBundle\\Controller\\SearchController cart: CoreShop\\Bundle\\FrontendBundle\\Controller\\CartController checkout: CoreShop\\Bundle\\FrontendBundle\\Controller\\CheckoutController category: CoreShop\\Bundle\\FrontendBundle\\Controller\\CategoryController product: CoreShop\\Bundle\\FrontendBundle\\Controller\\ProductController quote: CoreShop\\Bundle\\FrontendBundle\\Controller\\QuoteController security: CoreShop\\Bundle\\FrontendBundle\\Controller\\SecurityController payment: CoreShop\\Bundle\\PayumBundle\\Controller\\PaymentController Example of using a Custom ProductController 1: Add a new Controller and inherit from the FrontendController <?php namespace AppBundle\\Controller; use CoreShop\\Component\\Core\\Model\\ProductInterface; use Symfony\\Component\\HttpFoundation\\Request; class ProductController extends \\CoreShop\\Bundle\\FrontendBundle\\Controller\\ProductController { public function detailAction(Request $request) { \/\/Do whatever you want in here return parent::detailAction($request); } } 2: Change Configuration of the Controller: core_shop_frontend: controllers: product: AppBundle\\Controller\\ProductController","tags":"","url":"Development\/Store_Front\/Controllers.html"},{"title":"State Machine","text":"CoreShop State Machine The CoreShop State Machine is a important core feature which allows to determinate complex workflows securely and in a most modern way. Unlike the most eCommerce Frameworks out there, CoreShop does not work with the messy and hard do extend "state\/status" concept. Every order-section and of course the order itself provides its own state machine which allows us to build a super strong state workflow. Places In State Machine context, the well-known "Status" Property is called "Places". Every Workflow comes with a pre-defined set of Places. Transition To change the Place of a workflow we need to apply a transition. If the transition is valid the new place gets stored. Callbacks There are several events for each transition which can be also extend by every project. Example:: If all order payments has been successfully transformed to the completed place, the coreshop_order_payment workflow will automatically change to paid. Workflows There are seven implemented Workflows: coreshop_order coreshop_order_payment coreshop_order_shipment coreshop_order_invoice coreshop_payment coreshop_shipment coreshop_invoice Workflows are connected among themselves so every transition will trigger another Workflow and so on. If a transition has been dispatched, it cannot be transformed back unless it has been defined in the available transitions. So let's start: Available Workflows Create Callbacks Things to Know (!) Extend Workflows","tags":"","url":"Development\/State_Machine\/index.html"},{"title":"Available Workflows","text":"CoreShop State Machine - Available Workflows Order Sale Workflow In CoreShop 3.x the Cart, Order and Quote are the same DataObject. To differentiate between them, we use states with workflows. State Machine: coreshop_order_sales_type Available Places Name Description cart Initial State - Cart order Once the customer finishes the checkout, pre-payment, it becomes an order quote Once the customer finishes the checkout and requests a quote Available Transition Name Allowed from Places order cart cart cart quote cart Order Workflow State Machine: coreshop_order Description: The Order Workflow is the most simplest and also the most important one. Available Places Name Description initialized Initial State. Just before a order gets saved for the very first time. new a new order has been created confirmed customer has successfully placed an order cancelled order has been cancelled complete the order is complete (all payments and shipments have been successfully processed) Available Transition Name Allowed from Places create initialized confirm new cancel new, confirmed complete confirmed Visualization Order Payment Workflow State Machine: coreshop_order_payment Description: Defines the summary payment state Available Places Name Description new order has been initial created awaiting_payment a payment has been captured partially_paid one of the order payments has been paid cancelled all payments has been cancelled paid all order payments successfully paid partially_refunded one of the order payments has been refunded refunded all payments has been refunded Available Transition Name Allowed from Places request_payment new partially_pay awaiting_payment, partially_paid cancel awaiting_payment partially_refund paid, partially_paid, partially_refunded refund paid, partially_paid, partially_refunded Visualization Order Shipment Workflow State Machine: coreshop_order_shipment Description: Defines the summary shipment state Available Places Name Description new order has been initial created cancelled all shipments has been cancelled partially_shipped one of the order shipments has been shipped shipped all order shipments has been shipped Available Transition Name Allowed from Places partially_ship new cancel new ship new, partially_shipped Visualization Order Invoice Workflow State Machine: coreshop_order_invoice Description: Defines the summary invoice state Available Places Name Description new order has been initial created cancelled all invoices has been cancelled partially_invoiced one of the order invoices has been invoiced invoiced all order invoices has been successfully invoiced Available Transition Name Allowed from Places cancel new partially_invoice new invoice new, partially_invoiced Visualization Payment Workflow State Machine: coreshop_payment Description: Defines the single payment state Available Places Name Description new new payment has been created processing payment has been captured completed payment is complete failed payment has failed cancelled payment has been canceled refunded payment has been refunded Available Transition Name Allowed from Places process new complete new, processing fail new, processing cancel new, processing refund completed Visualization Shipment Workflow State Machine: coreshop_shipment Description: Defines the single shipment state Available Places Name Description new new shipment has been created ready shipment has been assigned to order cancelled shipment has been cancelled shipped shipment has been shipped Available Transition Name Allowed from Places create new ship ready cancel ready Visualization Invoice Workflow State Machine: coreshop_invoice Description: Defines the single invoice state Available Places Name Description new new invoice has been created ready invoice has been assigned to order cancelled invoice has been cancelled complete invoice has been completed Available Transition Name Allowed from Places create new cancel ready complete ready Visualization","tags":"","url":"Development\/State_Machine\/Available_Workflows.html"},{"title":"Create Callbacks","text":"CoreShop State Machine - Callbacks It's really simple to create a custom state machine callback. After Callbacks In this example we want to register a simple listener which gets triggered after a customer successfully placed a order: core_shop_workflow: state_machine: coreshop_order: callbacks: after: do_something_special: on: ['confirm'] do: ['@AppBundle\\EventListener\\SpecialListener', 'doSomething'] args: ['object'] priority: -10 # fire action early! Name Description on transition name do service and method to dispatch args object or event. Object type depends on state machine type. priority set priority. default is 0 And your Service: <?php namespace AppBundle\\EventListener; use CoreShop\\Component\\Core\\Model\\CustomerInterface; use CoreShop\\Component\\Core\\Model\\OrderInterface; final class SpecialListener { \/** * @param OrderInterface $order *\/ public function doSomething(OrderInterface $order) { \/** @var CustomerInterface $customer *\/ $customer = $order->getCustomer(); \/** @var string $locale *\/ $locale = $order->getLocaleCode(); \/\/ your very special code. } } Before Callbacks In this example we want to register a simple listener which gets triggered before a the shipment transaction ready gets applied: core_shop_workflow: state_machine: coreshop_shipment: callbacks: before: check_something: on: ['create'] do: ['@AppBundle\\EventListener\\SpecialListener', 'checkSomething'] args: ['object'] priority: 0 Name Description on transition name do service and method to dispatch args object or event. Object type depends on state machine type. priority set priority. default is 0 As you can see in the class below, the checkSomething() method throws an exception. This prevents the state machine from switching to the ready state. Just remove the exception and the transition gets applied as expected. <?php namespace AppBundle\\EventListener; use CoreShop\\Component\\Core\\Model\\OrderShipmentInterface; final class SpecialListener { \/** * @param OrderShipmentInterface $shipment *\/ public function checkSomething(OrderShipmentInterface $shipment) { \/\/ check something and throw an exeption throw new \\Exception('something is wrong...'); } }","tags":"","url":"Development\/State_Machine\/Create_Callbacks.html"},{"title":"Things To Know","text":"CoreShop State Machine - Important Things to Know Canceling Orders Within the CoreShop workflow architecture a lot of orders may stay forever in the new or confirmed state. CoreShop will automatically cancel orders older than 20 days under following conditions: Order creationDate >= 20 days ago Order State is initialized or new or confirmed Order Payment State is not paid Read more about automation here. Expire Orders via Backend There is also a cancel button in the order detail section. Expire Orders via Command There is also a command for that: $ coreshop:order:expire Change Orders Expiration Date core_shop_order: expiration: order: days: 30","tags":"","url":"Development\/State_Machine\/Things_To_Know.html"},{"title":"Extend Workflows","text":"CoreShop State Machine - Extend Workflows It's possible to extend all available CoreShop Workflow. Example A: Extend Shipment Workflow Workflow Configuration core_shop_workflow: state_machine: coreshop_shipment: # define a new place "reviewed" places: - reviewed # define a new transition "review" transitions: review: from: [new, ready] to: reviewed # add some colors for better ux place_colors: reviewed: '#2f819e' transition_colors: review: '#2f819e' Add translations Just use the Pimcore Backend\/Frontend translation or just add it via default symfony translation context: # app\/Resources\/translations\/admin.en.yml coreshop_workflow_transition_coreshop_shipment_review: 'Review' coreshop_workflow_state_coreshop_shipment_reviewed: 'Reviewed' # app\/Resources\/translations\/messages.en.yml coreshop.ui.workflow.state.coreshop_shipment.reviewed: 'Shipment under Review' Inform CoreShop about new Transition of Shipment Workflow Not all transitions should be available in backend. To allow the transition to show up, you need to implement a simple event listener: # app\/config\/services AppBundle\\EventListener\\WorkflowListener: autowire: true tags: - { name: kernel.event_listener, event: coreshop.workflow.valid_transitions, method: parseTransitions} <?php namespace AppBundle\\EventListener; use CoreShop\\Bundle\\OrderBundle\\Event\\WorkflowTransitionEvent; class WorkflowListener { public function parseTransitions(WorkflowTransitionEvent $event) { $workflowName = $event->getWorkflowName(); if($workflowName === 'coreshop_shipment') { $event->addAllowedTransitions(['review']); } } } Example B: Change default Transition Behaviour of Shipment Workflow Note: Be careful while changing transitions. Test your application if a workflow still runs smoothly after changing it! In this example we want to change the default shipping behavior. Workflow before: ready -> shipped -> cancelled Workflow after: ready -> reviewed -> shipped -> cancelled Workflow Configuration core_shop_workflow: state_machine: coreshop_shipment: # define a new place "reviewed" places: - reviewed # define a new transition "review" transitions: review: from: [ready] to: reviewed # override the default "ship" transition # which only allows [ready] as valid "from" dispatcher ship: from: [reviewed] to: shipped # add some colors for better ux place_colors: reviewed: '#2f819e' transition_colors: review: '#2f819e' Example C: Callback Listener If you need to implement some further business logic after the coreshop_shipment state has changed to reviewed you need to define a callback: Note: Please make sure your service is public available! core_shop_workflow: state_machine: coreshop_shipment: callbacks: after: do_something_after_review: on: ['review'] do: ['@your_service', 'yourAction'] # in this context, "object" is the shipment item args: ['object'] priority: -10 # fire action early!","tags":"","url":"Development\/State_Machine\/Extend_Workflows.html"},{"title":"Inventory","text":"CoreShop Inventory Twig Helper There are some Helpers to check the product inventory. Inventory Available {% if coreshop_inventory_is_available(product) %} {# show cart button since there is at least one item available #} {% endif %} Inventory is Sufficient {% if coreshop_inventory_is_sufficient(product, 10) %} {# do something here since there are at least 10 items available #} {% endif %}","tags":"","url":"Development\/Inventory\/index.html"},{"title":"SEO","text":"CoreShop SEO Usage","tags":"","url":"Development\/SEO\/index.html"},{"title":"Currency Fractions","text":"CoreShop Fraction Digits CoreShop allows you working with more than 2 digits for Currency Values. The default configuration looks like this: core_shop_currency: money_decimal_precision: 2 money_decimal_factor: 100 money_decimal_precision: 2 Having a global precision of 2 money_decimal_factor: 100 Displaying Currency with a factor of 100 (in Pimcore Backend). WARNING If you change these settings in an existing Installation with Orders\/Products etc. you also have to create a migration to change all the values from a precision of 2 to your new setting. In order to handle payment values with a precision of for example 4, we introduced a new Order Property called paymentTotal. Within a Payment, you cannot deal with a precision > 2, since a currency only has eg. 100 Cents. Therefore, we round the total Cart\/Order value to a precision of 2 into the paymentTotal Value. For example: Your Cart\/Order is "\u20ac 1.000,5498", your payment total then is: "\u20ac 1.000,55". If you want to display the payment total in your cart, you can use this template: {% if currency.convertAndFormat(cart.total) != currency.convertAndFormat(cart.paymentTotal, 2, 100) %} <tr> <td class="text-right" colspan="3"> <strong>{{ 'coreshop.ui.payment_total'|trans }}:<\/strong> <\/td> <td colspan="2" class="text-right cart-total-payment-price"> {{ currency.convertAndFormat(cart.paymentTotal, 2, 100) }} <\/td> <\/tr> {% endif %} c","tags":"","url":"Development\/Currency_Fractions\/index.html"}]} \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 94fc9591c9..625f7deb3c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,24 @@ -Welcome to the CoreShop Documentation! +--- +title: CoreShop - Pimcore eCommerce Framework +--- - * [Website](https://www.coreshop.org) - * [API-Documentation](https://api.coreshop.org/3.0.0) - * [Github](https://github.com/coreshop/CoreShop) +# CoreShop Documentation + +> This documentation section provides all information you need to use the CoreShop - Pimcore eCommerce Framework +> +> We've aimed this part of the documentation at a developer's audience. + +CoreShop provides a fully flexible and extendable eCommerce Solution for Pimcore. If you want to know more about Pimcore, please visit [pimcore.com](https://pimcore.com). + +## Documentation Overview + +The Core Framework documentation is divided into three sections that aim to guide the reader through its first use of the platform: + +* See the [Getting Started](./01_Getting_Started) section for an overview and information about the installation process. +* See the [Bundles](./02_Bundles) section for details about the different Bundles CoreShop provides. +* See the [User Documentation](./02_User_Documentation) section for documentation configuration of CoreShop. +* See the [Development](./03_Development) section for documentation about developing with CoreShop. + +## Additional resources for getting started with CoreShop +- [CoreShop Demo](https://demo3.coreshop.org): See CoreShop in action and also use it as a blueprint application for your own implementations. diff --git a/docs/themes/common/less/_fonts.less b/docs/static/themes/common/less/_fonts.less old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/common/less/_fonts.less rename to docs/static/themes/common/less/_fonts.less diff --git a/docs/themes/common/less/_print.less b/docs/static/themes/common/less/_print.less old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/common/less/_print.less rename to docs/static/themes/common/less/_print.less diff --git a/docs/themes/common/less/_typography.less b/docs/static/themes/common/less/_typography.less old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/common/less/_typography.less rename to docs/static/themes/common/less/_typography.less diff --git a/docs/themes/coreshop/config.json b/docs/static/themes/coreshop/config.json old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/config.json rename to docs/static/themes/coreshop/config.json diff --git a/docs/themes/coreshop/css/_variables.css b/docs/static/themes/coreshop/css/_variables.css similarity index 100% rename from docs/themes/coreshop/css/_variables.css rename to docs/static/themes/coreshop/css/_variables.css diff --git a/docs/themes/coreshop/css/theme-blue.min.css b/docs/static/themes/coreshop/css/theme-blue.min.css old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/css/theme-blue.min.css rename to docs/static/themes/coreshop/css/theme-blue.min.css diff --git a/docs/themes/coreshop/css/theme-coreshop.css b/docs/static/themes/coreshop/css/theme-coreshop.css similarity index 100% rename from docs/themes/coreshop/css/theme-coreshop.css rename to docs/static/themes/coreshop/css/theme-coreshop.css diff --git a/docs/themes/coreshop/css/theme-coreshop.min.css b/docs/static/themes/coreshop/css/theme-coreshop.min.css similarity index 100% rename from docs/themes/coreshop/css/theme-coreshop.min.css rename to docs/static/themes/coreshop/css/theme-coreshop.min.css diff --git a/docs/themes/coreshop/img/coreshop_tag.png b/docs/static/themes/coreshop/img/coreshop_tag.png similarity index 100% rename from docs/themes/coreshop/img/coreshop_tag.png rename to docs/static/themes/coreshop/img/coreshop_tag.png diff --git a/docs/themes/coreshop/img/favicon.ico b/docs/static/themes/coreshop/img/favicon.ico similarity index 100% rename from docs/themes/coreshop/img/favicon.ico rename to docs/static/themes/coreshop/img/favicon.ico diff --git a/docs/themes/coreshop/img/logo-full.svg b/docs/static/themes/coreshop/img/logo-full.svg similarity index 100% rename from docs/themes/coreshop/img/logo-full.svg rename to docs/static/themes/coreshop/img/logo-full.svg diff --git a/docs/themes/coreshop/js/bootstrap.min.js b/docs/static/themes/coreshop/js/bootstrap.min.js old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/js/bootstrap.min.js rename to docs/static/themes/coreshop/js/bootstrap.min.js diff --git a/docs/themes/coreshop/js/daux.js b/docs/static/themes/coreshop/js/daux.js old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/js/daux.js rename to docs/static/themes/coreshop/js/daux.js diff --git a/docs/themes/coreshop/js/highlight.pack.js b/docs/static/themes/coreshop/js/highlight.pack.js similarity index 100% rename from docs/themes/coreshop/js/highlight.pack.js rename to docs/static/themes/coreshop/js/highlight.pack.js diff --git a/docs/themes/coreshop/js/jquery-1.11.3.min.js b/docs/static/themes/coreshop/js/jquery-1.11.3.min.js old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/js/jquery-1.11.3.min.js rename to docs/static/themes/coreshop/js/jquery-1.11.3.min.js diff --git a/docs/themes/coreshop/js/pimcore_code_section.js b/docs/static/themes/coreshop/js/pimcore_code_section.js similarity index 100% rename from docs/themes/coreshop/js/pimcore_code_section.js rename to docs/static/themes/coreshop/js/pimcore_code_section.js diff --git a/docs/themes/coreshop/less/_components.less b/docs/static/themes/coreshop/less/_components.less old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/less/_components.less rename to docs/static/themes/coreshop/less/_components.less diff --git a/docs/themes/coreshop/less/_homepage.less b/docs/static/themes/coreshop/less/_homepage.less old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/less/_homepage.less rename to docs/static/themes/coreshop/less/_homepage.less diff --git a/docs/themes/coreshop/less/_mixins.less b/docs/static/themes/coreshop/less/_mixins.less old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/less/_mixins.less rename to docs/static/themes/coreshop/less/_mixins.less diff --git a/docs/themes/coreshop/less/_print.less b/docs/static/themes/coreshop/less/_print.less old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/less/_print.less rename to docs/static/themes/coreshop/less/_print.less diff --git a/docs/themes/coreshop/less/_structure.less b/docs/static/themes/coreshop/less/_structure.less old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/less/_structure.less rename to docs/static/themes/coreshop/less/_structure.less diff --git a/docs/themes/coreshop/less/_typography.less b/docs/static/themes/coreshop/less/_typography.less old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/less/_typography.less rename to docs/static/themes/coreshop/less/_typography.less diff --git a/docs/themes/coreshop/less/_utilities.less b/docs/static/themes/coreshop/less/_utilities.less old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/less/_utilities.less rename to docs/static/themes/coreshop/less/_utilities.less diff --git a/docs/themes/coreshop/less/_variables.less b/docs/static/themes/coreshop/less/_variables.less old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/less/_variables.less rename to docs/static/themes/coreshop/less/_variables.less diff --git a/docs/themes/coreshop/less/theme-coreshop.less b/docs/static/themes/coreshop/less/theme-coreshop.less old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/less/theme-coreshop.less rename to docs/static/themes/coreshop/less/theme-coreshop.less diff --git a/docs/themes/coreshop/less/theme.less b/docs/static/themes/coreshop/less/theme.less old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/less/theme.less rename to docs/static/themes/coreshop/less/theme.less diff --git a/docs/themes/coreshop/templates/content.php b/docs/static/themes/coreshop/templates/content.php old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/templates/content.php rename to docs/static/themes/coreshop/templates/content.php diff --git a/docs/themes/coreshop/templates/home.php b/docs/static/themes/coreshop/templates/home.php old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/templates/home.php rename to docs/static/themes/coreshop/templates/home.php diff --git a/docs/themes/coreshop/templates/layout/00_layout.php b/docs/static/themes/coreshop/templates/layout/00_layout.php old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/templates/layout/00_layout.php rename to docs/static/themes/coreshop/templates/layout/00_layout.php diff --git a/docs/themes/coreshop/templates/layout/05_page.php b/docs/static/themes/coreshop/templates/layout/05_page.php old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/templates/layout/05_page.php rename to docs/static/themes/coreshop/templates/layout/05_page.php diff --git a/docs/themes/coreshop/templates/partials/google_analytics.php b/docs/static/themes/coreshop/templates/partials/google_analytics.php old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/templates/partials/google_analytics.php rename to docs/static/themes/coreshop/templates/partials/google_analytics.php diff --git a/docs/themes/coreshop/templates/partials/navbar_content.php b/docs/static/themes/coreshop/templates/partials/navbar_content.php old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/templates/partials/navbar_content.php rename to docs/static/themes/coreshop/templates/partials/navbar_content.php diff --git a/docs/themes/coreshop/templates/partials/piwik_analytics.php b/docs/static/themes/coreshop/templates/partials/piwik_analytics.php old mode 100755 new mode 100644 similarity index 100% rename from docs/themes/coreshop/templates/partials/piwik_analytics.php rename to docs/static/themes/coreshop/templates/partials/piwik_analytics.php diff --git a/docs/static/themes/pimcore/config.json b/docs/static/themes/pimcore/config.json new file mode 100644 index 0000000000..5640881e93 --- /dev/null +++ b/docs/static/themes/pimcore/config.json @@ -0,0 +1,22 @@ +{ + "favicon": "img/favicon.png", + "css": [], + "js": [ + "js/build/pimcore.min.js" + ], + "fonts": [ + "//fonts.googleapis.com/css?family=Open+Sans:100,200,300,400,500,600,700,800,900" + ], + "variants": { + "core": { + "css": [ + "css/pimcore-core.min.css" + ] + }, + "generic": { + "css": [ + "css/pimcore-generic.min.css" + ] + } + } +} diff --git a/docs/static/themes/pimcore/css/pimcore-core.min.css b/docs/static/themes/pimcore/css/pimcore-core.min.css new file mode 100644 index 0000000000..c16cdddad7 --- /dev/null +++ b/docs/static/themes/pimcore/css/pimcore-core.min.css @@ -0,0 +1,5 @@ +/*! + * Pimcore Documentation + * License: GPLv3 + */ +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hidden{display:none!important}*,:after,:before{box-sizing:border-box}body{margin:0;padding:0}body,html{height:100%;background-color:#fff;color:#2d2d2d}.Columns__left{background-color:#f7f7f7}.Columns__right__content{padding:10px;background-color:#fff}.Collapsible__content{display:none}.Collapsible__trigger{margin:12px;padding:7px 10px;background-color:transparent;border:none;float:right;background-image:none;filter:none;box-shadow:none}.Collapsible__trigger--bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#0078be;box-shadow:none}.Collapsible__trigger:hover{background-color:#c5c5cb;box-shadow:none}.Collapsible__trigger:hover .Collapsible__trigger--bar{background-color:#3f4657;box-shadow:none}@media screen and (min-width:768px){body{background-color:#0078be}.Navbar{position:fixed;z-index:1030;width:100%}.Collapsible__trigger{display:none!important}.Collapsible__content{display:block!important}.Columns{height:100%}.Columns:after,.Columns:before{content:" ";display:table}.Columns:after{clear:both}.Columns__left,.Columns__right{position:relative;min-height:1px;float:left;overflow:auto;height:100%}.Columns__left{width:25%;border-right:1px solid #e7e7e9;overflow-x:hidden}.Columns__right{width:75%}.Columns__right__content{padding:0 20px 20px;min-height:100%}}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;line-height:1.5}h1,h2,h3,h4,h5,h6{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300}.s-content body{font-size:15px}.s-content h1,.s-content h2,.s-content h3,.s-content h4,.s-content h5,.s-content h6{font-weight:300;-webkit-font-smoothing:antialiased;cursor:text;line-height:1.4em;margin-top:.3em;margin-bottom:.3em}.s-content h1 code,.s-content h1 tt,.s-content h2 code,.s-content h2 tt,.s-content h3 code,.s-content h3 tt,.s-content h4 code,.s-content h4 tt,.s-content h5 code,.s-content h5 tt,.s-content h6 code,.s-content h6 tt{font-size:inherit}.s-content h1 i,.s-content h2 i,.s-content h3 i,.s-content h4 i,.s-content h5 i,.s-content h6 i{font-size:.7em}.s-content h1 p,.s-content h2 p,.s-content h3 p,.s-content h4 p,.s-content h5 p,.s-content h6 p{margin-top:0}.s-content h1{font-size:2.66666667em;color:#000}.s-content h2{font-size:2em;border-bottom:1px solid #eee;color:#000}.s-content h3{font-size:1.73333333em}.s-content h4{font-size:1.46666667em}.s-content h5{font-size:1.2em}.s-content h6{font-size:1.06666667em;color:#555}.s-content a{text-decoration:underline}.s-content p{line-height:1.8em;margin-bottom:20px}.s-content ol,.s-content ul{padding-left:30px}.s-content ul p,.s-content ul ul{margin:0}.s-content dl{padding:0}.s-content dl dt{font-weight:700;font-style:italic;padding:0;margin:15px 0 5px}.s-content dl dt:first-child{padding:0}.s-content dl dd{margin:0 0 15px;padding:0 15px}.s-content blockquote{font-size:1.2em;border-left:4px solid #ddd;padding:7px 15px}.s-content blockquote p{font-size:inherit}.s-content table{width:100%;padding:0;border-collapse:collapse}.s-content table tr{border-top:1px solid #eee;background-color:#fff;margin:0;padding:0}.s-content table tr:nth-child(2n){background-color:#f8f8f8}.s-content table th{font-weight:700;background:#eee}.s-content table td,.s-content table th{border:1px solid #eee;margin:0;padding:6px 13px}.s-content blockquote>:first-child,.s-content dl dd>:first-child,.s-content dl dt>:first-child,.s-content ol>:first-child,.s-content table td>:first-child,.s-content table th>:first-child,.s-content ul>:first-child{margin-top:0}.s-content blockquote>:last-child,.s-content dl dd>:last-child,.s-content dl dt>:last-child,.s-content ol>:last-child,.s-content table td>:last-child,.s-content table th>:last-child,.s-content ul>:last-child{margin-bottom:0}.s-content img{max-width:100%;display:block;margin:0 auto}.s-content code{font-family:Monaco,Menlo,Consolas,Courier New,monospace}.s-content code,.s-content tt{margin:0 2px;padding:0 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px}.s-content pre{background:#fdf6e3;color:#657b83;line-height:1.5em;overflow:auto;padding:20px;margin:0 -20px 20px}.s-content pre code{margin:0;padding:0;white-space:pre}.s-content pre code,.s-content pre tt{background-color:transparent;border:none}.s-content pre{border:none;border-radius:0;padding:10px 30px;margin-left:-20px;margin-right:-20px}@media (min-width:1150px){.Columns__right--float .Columns__right__content{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.Columns__right--float .Columns__right__content article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.Columns__right--float .Columns__right__content article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.Columns__right--float .Page__header,.Columns__right--float .Pager,.Columns__right--float .s-content blockquote,.Columns__right--float .s-content dl,.Columns__right--float .s-content h2,.Columns__right--float .s-content h3,.Columns__right--float .s-content h4,.Columns__right--float .s-content h5,.Columns__right--float .s-content h6,.Columns__right--float .s-content hr,.Columns__right--float .s-content ol,.Columns__right--float .s-content p,.Columns__right--float .s-content table,.Columns__right--float .s-content ul{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%}.Columns__right--float .s-content table{background-color:#fff;white-space:normal}.Columns__right--float .s-content table code,.Columns__right--float .s-content table pre{white-space:normal}.Columns__right--float .s-content blockquote:before,.Columns__right--float .s-content dl:before,.Columns__right--float .s-content h2:before,.Columns__right--float .s-content h3:before,.Columns__right--float .s-content h4:before,.Columns__right--float .s-content h5:before,.Columns__right--float .s-content h6:before,.Columns__right--float .s-content hr:before,.Columns__right--float .s-content ol:before,.Columns__right--float .s-content p:before,.Columns__right--float .s-content ul:before{width:100%;height:10px;display:block;clear:both}.Columns__right--float .s-content blockquote dl,.Columns__right--float .s-content blockquote h2,.Columns__right--float .s-content blockquote h3,.Columns__right--float .s-content blockquote h4,.Columns__right--float .s-content blockquote h5,.Columns__right--float .s-content blockquote h6,.Columns__right--float .s-content blockquote hr,.Columns__right--float .s-content blockquote ol,.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content blockquote ul,.Columns__right--float .s-content dl dl,.Columns__right--float .s-content dl h2,.Columns__right--float .s-content dl h3,.Columns__right--float .s-content dl h4,.Columns__right--float .s-content dl h5,.Columns__right--float .s-content dl h6,.Columns__right--float .s-content dl hr,.Columns__right--float .s-content dl ol,.Columns__right--float .s-content dl p,.Columns__right--float .s-content dl pre,.Columns__right--float .s-content dl ul,.Columns__right--float .s-content h2 dl,.Columns__right--float .s-content h2 h2,.Columns__right--float .s-content h2 h3,.Columns__right--float .s-content h2 h4,.Columns__right--float .s-content h2 h5,.Columns__right--float .s-content h2 h6,.Columns__right--float .s-content h2 hr,.Columns__right--float .s-content h2 ol,.Columns__right--float .s-content h2 p,.Columns__right--float .s-content h2 pre,.Columns__right--float .s-content h2 ul,.Columns__right--float .s-content h3 dl,.Columns__right--float .s-content h3 h2,.Columns__right--float .s-content h3 h3,.Columns__right--float .s-content h3 h4,.Columns__right--float .s-content h3 h5,.Columns__right--float .s-content h3 h6,.Columns__right--float .s-content h3 hr,.Columns__right--float .s-content h3 ol,.Columns__right--float .s-content h3 p,.Columns__right--float .s-content h3 pre,.Columns__right--float .s-content h3 ul,.Columns__right--float .s-content h4 dl,.Columns__right--float .s-content h4 h2,.Columns__right--float .s-content h4 h3,.Columns__right--float .s-content h4 h4,.Columns__right--float .s-content h4 h5,.Columns__right--float .s-content h4 h6,.Columns__right--float .s-content h4 hr,.Columns__right--float .s-content h4 ol,.Columns__right--float .s-content h4 p,.Columns__right--float .s-content h4 pre,.Columns__right--float .s-content h4 ul,.Columns__right--float .s-content h5 dl,.Columns__right--float .s-content h5 h2,.Columns__right--float .s-content h5 h3,.Columns__right--float .s-content h5 h4,.Columns__right--float .s-content h5 h5,.Columns__right--float .s-content h5 h6,.Columns__right--float .s-content h5 hr,.Columns__right--float .s-content h5 ol,.Columns__right--float .s-content h5 p,.Columns__right--float .s-content h5 pre,.Columns__right--float .s-content h5 ul,.Columns__right--float .s-content h6 dl,.Columns__right--float .s-content h6 h2,.Columns__right--float .s-content h6 h3,.Columns__right--float .s-content h6 h4,.Columns__right--float .s-content h6 h5,.Columns__right--float .s-content h6 h6,.Columns__right--float .s-content h6 hr,.Columns__right--float .s-content h6 ol,.Columns__right--float .s-content h6 p,.Columns__right--float .s-content h6 pre,.Columns__right--float .s-content h6 ul,.Columns__right--float .s-content hr dl,.Columns__right--float .s-content hr h2,.Columns__right--float .s-content hr h3,.Columns__right--float .s-content hr h4,.Columns__right--float .s-content hr h5,.Columns__right--float .s-content hr h6,.Columns__right--float .s-content hr hr,.Columns__right--float .s-content hr ol,.Columns__right--float .s-content hr p,.Columns__right--float .s-content hr pre,.Columns__right--float .s-content hr ul,.Columns__right--float .s-content ol dl,.Columns__right--float .s-content ol h2,.Columns__right--float .s-content ol h3,.Columns__right--float .s-content ol h4,.Columns__right--float .s-content ol h5,.Columns__right--float .s-content ol h6,.Columns__right--float .s-content ol hr,.Columns__right--float .s-content ol ol,.Columns__right--float .s-content ol p,.Columns__right--float .s-content ol pre,.Columns__right--float .s-content ol ul,.Columns__right--float .s-content p dl,.Columns__right--float .s-content p h2,.Columns__right--float .s-content p h3,.Columns__right--float .s-content p h4,.Columns__right--float .s-content p h5,.Columns__right--float .s-content p h6,.Columns__right--float .s-content p hr,.Columns__right--float .s-content p ol,.Columns__right--float .s-content p p,.Columns__right--float .s-content p pre,.Columns__right--float .s-content p ul,.Columns__right--float .s-content ul dl,.Columns__right--float .s-content ul h2,.Columns__right--float .s-content ul h3,.Columns__right--float .s-content ul h4,.Columns__right--float .s-content ul h5,.Columns__right--float .s-content ul h6,.Columns__right--float .s-content ul hr,.Columns__right--float .s-content ul ol,.Columns__right--float .s-content ul p,.Columns__right--float .s-content ul pre,.Columns__right--float .s-content ul ul{width:auto;float:none;display:block}.Columns__right--float .s-content hr{border-color:#ddd}.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content li p,.Columns__right--float .s-content li pre{width:100%}.Columns__right--float .s-content pre{float:left;clear:right;width:50%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0}.Columns__right--float .s-content pre code{padding:0 .5em}}a{text-decoration:none;color:#0078be}a.external:after{content:" " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=)}a.broken{color:red}p{margin:0 0 1em}hr{clear:both;margin:1em 0;border:0;border-top:1px solid #ddd}code{color:#3f4657}.Button{display:inline-block;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;border-radius:4px}.Button--small{font-size:12px;line-height:1.5;border-radius:3px}.Button--default{color:#333;background-color:#fff;border-color:#ccc}.Button--default.Button--active{color:#333;background-color:#e6e6e6;border-color:#adadad}.ButtonGroup{position:relative;display:inline-block;vertical-align:middle}.ButtonGroup .Button+.Button{margin-left:-1px}.ButtonGroup>.Button{position:relative;float:left}.ButtonGroup>.Button:focus,.ButtonGroup>.Button:hover{z-index:2}.ButtonGroup>.Button.Button--active,.ButtonGroup>.Button:active{z-index:3}.ButtonGroup>.Button:not(:first-child):not(:last-child){border-radius:0}.ButtonGroup>.Button:first-child{margin-left:0}.ButtonGroup>.Button:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.ButtonGroup>.Button:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.Brand{display:block;padding:15px 20px;font-size:18px;text-shadow:none;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;color:#0078be}.Brand,.Navbar{background-color:#3f4657}.Navbar{height:50px;box-shadow:0 1px 5px rgba(0,0,0,.25);margin-bottom:0}.Navbar .Brand{float:left;line-height:20px;height:50px}.CodeToggler__text{font-size:12px;line-height:1.5;padding:6px 10px 6px 0;display:inline-block;vertical-align:middle}.Nav{margin:0;padding:0}.Nav__arrow{display:inline-block;position:relative;width:16px;margin-left:-16px}.Nav__arrow:before{position:absolute;display:block;content:"";margin:-.25em 0 0 -.4em;left:50%;top:50%;width:.5em;height:.5em;border-right:.15em solid #3f4657;border-top:.15em solid #3f4657;transform:rotate(45deg);transition-duration:.3s}.Nav__item{display:block}.Nav__item a{display:block;margin:0;padding:6px 15px 6px 20px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#3f4657;font-size:15px;text-shadow:none;border-color:#e7e7e9}.Nav__item a:hover{color:#3f4657;text-shadow:none;background-color:#c5c5cb}.Nav .Nav{display:none;margin-left:15px}.Nav .Nav .Nav__item a{margin:0 0 0 -15px;padding:3px 30px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;color:#2d2d2d;opacity:.7}.Nav .Nav .Nav__item a:hover{opacity:1}.Nav .Nav .Nav__item--active a{color:#3f4657}.Nav__item--active>a,.Nav__item--open>a{background-color:#c5c5cb}.Nav__item--open>.Nav{display:block}.Nav__item--open>a>.Nav__arrow:before{margin-left:-.25em;transform:rotate(135deg)}.Page__header{margin:0 0 10px;padding:0;border-bottom:1px solid #eee}.Page__header:after,.Page__header:before{content:" ";display:table}.Page__header:after{clear:both}.Page__header h1{margin:0;padding:0;line-height:57px}.Page__header--separator{height:.6em}.Page__header a{text-decoration:none}.Links{padding:0 20px}.Links a{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#0078be;line-height:2em}.Search{position:relative}.Search__field{display:block;width:100%;height:34px;padding:6px 30px 6px 20px;color:#555;border-width:0 0 1px;border-bottom:1px solid #ccc;background:#fff;transition:border-color .15s ease-in-out}.Search__field:focus{border-color:#0078be;outline:0}.Search__icon{position:absolute;right:9px;top:9px;width:16px;height:16px}.Navbar .Search{float:right;margin:8px 20px}.Navbar .Search__field{box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-width:0;border-radius:4px;padding-left:10px}.TableOfContents{font-size:16px;padding-left:0;border-left:6px solid #efefef}.TableOfContents p{margin-bottom:0}.TableOfContents a{text-decoration:none}.TableOfContents .TableOfContents{border-left-width:0}.Pager{padding-left:0;margin:1em 0;list-style:none;text-align:center;clear:both}.Pager:after,.Pager:before{content:" ";display:table}.Pager:after{clear:both}.Pager li{display:inline}.Pager li>a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.Pager li>a:focus,.Pager li>a:hover{text-decoration:none;background-color:#eee}.Pager--next>a{float:right}.Pager--prev>a{float:left}.container{margin-right:auto;margin-left:auto}@media (min-width:992px){.container{width:970px}}@media (min-width:768px){.container{width:750px}}@media (min-width:1200px){.container{width:1170px}}.container--inner{width:80%;margin:0 auto}.Homepage{padding-top:60px!important;background-color:#0078be;border-radius:0;border:none;color:#3f4657;overflow:hidden;padding-bottom:0;margin-bottom:0;box-shadow:none}.HomepageTitle h2{width:80%;font-size:30px;margin:20px auto;text-align:center}.HomepageImage img{display:block;max-width:80%;margin:0 auto;height:auto}.HomepageButtons{padding:20px 0;background-color:#c5c5cb;text-align:center}.HomepageButtons .Button--hero{padding:20px 30px;border-radius:0;text-shadow:none;opacity:.8;margin:0 10px;text-transform:uppercase;border:5px solid #3f4657;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;background-image:none;filter:none;box-shadow:none}@media (max-width:768px){.HomepageButtons .Button--hero{display:block;margin-bottom:10px}}.HomepageButtons .Button--hero:hover{opacity:1}.HomepageButtons .Button--hero.Button--secondary{background-color:#c5c5cb;color:#3f4657}.HomepageButtons .Button--hero.Button--primary{background-color:#3f4657;color:#f7f7f7}.HomepageContent{background-color:#fff;padding:40px 0}@media (min-width:769px){.HomepageContent .row{margin:0 -15px}.HomepageContent .col-third{width:33.333333%;float:left;position:relative;min-height:1px;padding-left:15px;padding-right:15px}}.HomepageContent ol li,.HomepageContent ul li{list-style:none;padding-bottom:.5em}.HomepageContent ol li:before,.HomepageContent ul li:before{content:"";width:0;height:0;border:3px solid transparent;border-left-color:#0078be;float:left;display:block;margin:6px 6px 6px -12px}.HomepageContent .lead{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300;font-size:16px;margin-bottom:20px;line-height:1.4}@media (min-width:768px){.HomepageContent{padding:40px 20px}.HomepageContent .lead{font-size:21px}}.HomepageFooter{background-color:#3f4657;border-radius:0;color:#0078be;border:none;box-shadow:none}@media (max-width:768px){.HomepageFooter{padding:0 20px;text-align:center}.HomepageFooter .HomepageFooter__links{padding-left:0;list-style-type:none}}@media (min-width:769px){.HomepageFooter .HomepageFooter__links{float:left}.HomepageFooter .HomepageFooter__twitter{float:right}}.HomepageFooter__links{margin:40px 0}.HomepageFooter__links li a{line-height:32px;font-size:16px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700}.HomepageFooter__links li a:hover{color:#0078be;text-decoration:underline}.HomepageFooter__twitter{margin:40px 0}.HomepageFooter .Twitter{margin-bottom:20px}.s-content code{text-rendering:auto;-webkit-font-smoothing:initial;font-size:13px}.s-content pre{margin:20px -20px;background:#002b36}.s-content pre code{font-size:13px}.code-section pre{margin-top:0}.code-section .tab-pane{display:none}.code-section .tab-pane.active{display:block}.code-section .nav-tabs{list-style:none;border-bottom:none;padding-left:0;clear:left;margin-bottom:0}.code-section .nav-tabs:after,.code-section .nav-tabs:before{content:" ";display:table}.code-section .nav-tabs:after{clear:both}.code-section .nav-tabs li{float:left}.code-section .nav-tabs li a{display:block;background-color:#ddd;border-radius:4px 4px 0 0;border-color:#eee #eee #ddd;color:#333;padding:7px 12px;margin-right:4px}.code-section .nav-tabs li.active>a,.code-section .nav-tabs li.active>a:focus,.code-section .nav-tabs li.active>a:hover{background-color:#002b36;border-color:#222;color:#fff}.hljs{display:block;overflow-x:auto;padding:.5em;background:#002b36;color:#839496}.hljs-comment,.hljs-quote{color:#586e75}.hljs-addition,.hljs-keyword,.hljs-selector-tag{color:#859900}.hljs-doctag,.hljs-literal,.hljs-meta .hljs-meta-string,.hljs-number,.hljs-regexp,.hljs-string{color:#2aa198}.hljs-name,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-title{color:#268bd2}.hljs-attr,.hljs-attribute,.hljs-class .hljs-title,.hljs-template-variable,.hljs-type,.hljs-variable{color:#b58900}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-meta .hljs-keyword,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-subst,.hljs-symbol{color:#cb4b16}.hljs-built_in,.hljs-deletion{color:#dc322f}.hljs-formula{background:#073642}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.alert{color:#464a4e;background:#e7e8ea;border-left:5px solid #dddfe2;min-height:20px;margin:15px 0;padding:15px;position:relative}.alert.alert-note{color:#004085;background:#cce5ff;border-color:#b8daff}.alert.alert-success{color:#155724;background:#d4edda;border-color:#c3e6cb}.alert.alert-warning{color:#856404;background:#fff3cd;border-color:#ffeeba}.alert.alert-danger,.alert.alert-error{color:#721c24;background:#f8d7da;border-color:#f5c6cb}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-before:auto}blockquote,pre{border:1px solid #999;font-style:italic}blockquote,img,pre{page-break-inside:avoid}img{border:0}a,a:visited{text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}q{quotes:none}q:before{content:""}q:after{content:" (" attr(cite) ")"}.page-break{display:block;page-break-before:always}.hidden-print,.Pager,aside{display:none}.Columns__right{width:100%!important}.s-content a:after{content:" (" attr(href) ")";font-size:80%;word-wrap:break-word}.s-content a[href^="#"]:after{content:""}h1 a[href]:after{font-size:50%}}body{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif}.Brand{background:#222;color:#fff}.Brand .Brand__logo{color:transparent;display:block;max-width:170px;height:26.4px;background:transparent url(../img/logo-white.svg) no-repeat 0}.Brand .subtitle{margin-top:5px;margin-bottom:0}.Pager{margin:30px 0 10px}.breadcrumbs,.s-content h2{margin-top:25px}.s-content a{text-decoration:none}.s-content img{margin:0}@media screen and (min-width:768px){.s-content img.img-narrow{max-width:50%}}.s-content table{margin-top:15px;margin-bottom:15px}.s-content blockquote{font-size:16px;border-color:#ffeaae;background:#fffdf6;color:#666;margin-left:0;margin-right:0}.s-content h1 .headerlink,.s-content h2 .headerlink,.s-content h3 .headerlink,.s-content h4 .headerlink,.s-content h5 .headerlink,.s-content h6 .headerlink{color:transparent;font-size:75%;font-weight:400;line-height:1;margin:0;padding:0 0 0 6px}.s-content h1:hover .headerlink,.s-content h2:hover .headerlink,.s-content h3:hover .headerlink,.s-content h4:hover .headerlink,.s-content h5:hover .headerlink,.s-content h6:hover .headerlink{color:#c5c5cb}.s-content h1:hover .headerlink:hover,.s-content h2:hover .headerlink:hover,.s-content h3:hover .headerlink:hover,.s-content h4:hover .headerlink:hover,.s-content h5:hover .headerlink:hover,.s-content h6:hover .headerlink:hover{color:#0078be}.disqus-separator{margin:15px 0 20px}.Columns__landing .Nav{padding-left:15px}.ribbon-box{position:relative}.ribbon-box .ribbon{position:absolute;right:-5px;top:-5px;z-index:1;overflow:hidden;width:86px;height:86px;text-align:right}.ribbon-box.navigation .ribbon{right:-26px;top:-78px}.ribbon-box .ribbon span{font-size:10px;font-weight:700;color:#fff;text-transform:uppercase;text-align:center;line-height:20px;transform:rotate(45deg);-webkit-transform:rotate(45deg);width:115px;display:block;background:linear-gradient(#2989d8,#1e5799);box-shadow:0 3px 10px -5px #000;position:absolute;top:24px;right:-23px}.ribbon-box .ribbon span:before{left:0;border-color:#1e5799 transparent transparent #1e5799}.ribbon-box .ribbon span:after,.ribbon-box .ribbon span:before{content:"";position:absolute;top:100%;z-index:-1;border-style:solid;border-width:3px}.ribbon-box .ribbon span:after{right:0;border-color:#1e5799 #1e5799 transparent transparent}@media screen and (max-width:768px){.ribbon-box.navigation .ribbon{top:44px;pointer-events:none}}.extension-card{border:1px solid #e7e7e9;border-radius:4px;padding:20px;height:100%;position:relative}.extension-card .button{display:inline-block;padding:5px 14px;border:1px solid #e7e7e9;border-radius:15px}.extension-card .button:hover{background-color:#e7e7e9}.action-box{font-size:12px;float:right}.action-box .edit_on{color:grey;margin-left:3px;display:block;text-align:right}.action-box .version-switcher{font-size:16px;display:block;margin-bottom:5px}.action-box .version-switcher select{margin-left:3px}.column{margin:20px 0}@media screen and (min-width:768px){.Columns__landing{display:flex;flex-wrap:wrap}.Columns__landing .column{width:48%}.Columns__landing .column:nth-child(2n){margin-left:4%}}aside.Collapsible .version-info{font-size:11px;margin-bottom:25px}.SearchResults .SearchResults__highlight{font-weight:400;background:#bee7ff}.SearchResults .SearchResults__text,.SearchResults .SearchResults__title,.SearchResults .SearchResults__url,.SearchResults .SearchResults__warning{font-weight:400}.SearchResults .SearchResults__text a,.SearchResults .SearchResults__title a,.SearchResults .SearchResults__url a,.SearchResults .SearchResults__warning a{color:#0078be}.landingpage .Nav__item--open>a{background:transparent!important}.landingpage .Columns__landing div>.Nav li a{background:none;line-height:1.5}.landingpage .Columns__landing div>.Nav>li>a{display:block;color:#0078be;padding-left:0;font-size:16px;margin-top:15px}.landingpage .Columns__landing div>.Nav>li ul>li>a{padding-left:16px}.Banner{margin:40px 0 10px}.Banner .img{width:100%}.lightbox{display:none;position:fixed;z-index:999;top:0;left:0;right:0;bottom:0;padding:1em;background:rgba(0,0,0,.8)}.lightbox:target{display:block}.lightbox img{width:100%;height:100%;object-fit:scale-down}.image-as-lightbox+p>img,img.lightbox-thumbnail{max-width:50%;max-height:350px} \ No newline at end of file diff --git a/docs/static/themes/pimcore/css/pimcore-generic.min.css b/docs/static/themes/pimcore/css/pimcore-generic.min.css new file mode 100644 index 0000000000..c16cdddad7 --- /dev/null +++ b/docs/static/themes/pimcore/css/pimcore-generic.min.css @@ -0,0 +1,5 @@ +/*! + * Pimcore Documentation + * License: GPLv3 + */ +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hidden{display:none!important}*,:after,:before{box-sizing:border-box}body{margin:0;padding:0}body,html{height:100%;background-color:#fff;color:#2d2d2d}.Columns__left{background-color:#f7f7f7}.Columns__right__content{padding:10px;background-color:#fff}.Collapsible__content{display:none}.Collapsible__trigger{margin:12px;padding:7px 10px;background-color:transparent;border:none;float:right;background-image:none;filter:none;box-shadow:none}.Collapsible__trigger--bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#0078be;box-shadow:none}.Collapsible__trigger:hover{background-color:#c5c5cb;box-shadow:none}.Collapsible__trigger:hover .Collapsible__trigger--bar{background-color:#3f4657;box-shadow:none}@media screen and (min-width:768px){body{background-color:#0078be}.Navbar{position:fixed;z-index:1030;width:100%}.Collapsible__trigger{display:none!important}.Collapsible__content{display:block!important}.Columns{height:100%}.Columns:after,.Columns:before{content:" ";display:table}.Columns:after{clear:both}.Columns__left,.Columns__right{position:relative;min-height:1px;float:left;overflow:auto;height:100%}.Columns__left{width:25%;border-right:1px solid #e7e7e9;overflow-x:hidden}.Columns__right{width:75%}.Columns__right__content{padding:0 20px 20px;min-height:100%}}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;line-height:1.5}h1,h2,h3,h4,h5,h6{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300}.s-content body{font-size:15px}.s-content h1,.s-content h2,.s-content h3,.s-content h4,.s-content h5,.s-content h6{font-weight:300;-webkit-font-smoothing:antialiased;cursor:text;line-height:1.4em;margin-top:.3em;margin-bottom:.3em}.s-content h1 code,.s-content h1 tt,.s-content h2 code,.s-content h2 tt,.s-content h3 code,.s-content h3 tt,.s-content h4 code,.s-content h4 tt,.s-content h5 code,.s-content h5 tt,.s-content h6 code,.s-content h6 tt{font-size:inherit}.s-content h1 i,.s-content h2 i,.s-content h3 i,.s-content h4 i,.s-content h5 i,.s-content h6 i{font-size:.7em}.s-content h1 p,.s-content h2 p,.s-content h3 p,.s-content h4 p,.s-content h5 p,.s-content h6 p{margin-top:0}.s-content h1{font-size:2.66666667em;color:#000}.s-content h2{font-size:2em;border-bottom:1px solid #eee;color:#000}.s-content h3{font-size:1.73333333em}.s-content h4{font-size:1.46666667em}.s-content h5{font-size:1.2em}.s-content h6{font-size:1.06666667em;color:#555}.s-content a{text-decoration:underline}.s-content p{line-height:1.8em;margin-bottom:20px}.s-content ol,.s-content ul{padding-left:30px}.s-content ul p,.s-content ul ul{margin:0}.s-content dl{padding:0}.s-content dl dt{font-weight:700;font-style:italic;padding:0;margin:15px 0 5px}.s-content dl dt:first-child{padding:0}.s-content dl dd{margin:0 0 15px;padding:0 15px}.s-content blockquote{font-size:1.2em;border-left:4px solid #ddd;padding:7px 15px}.s-content blockquote p{font-size:inherit}.s-content table{width:100%;padding:0;border-collapse:collapse}.s-content table tr{border-top:1px solid #eee;background-color:#fff;margin:0;padding:0}.s-content table tr:nth-child(2n){background-color:#f8f8f8}.s-content table th{font-weight:700;background:#eee}.s-content table td,.s-content table th{border:1px solid #eee;margin:0;padding:6px 13px}.s-content blockquote>:first-child,.s-content dl dd>:first-child,.s-content dl dt>:first-child,.s-content ol>:first-child,.s-content table td>:first-child,.s-content table th>:first-child,.s-content ul>:first-child{margin-top:0}.s-content blockquote>:last-child,.s-content dl dd>:last-child,.s-content dl dt>:last-child,.s-content ol>:last-child,.s-content table td>:last-child,.s-content table th>:last-child,.s-content ul>:last-child{margin-bottom:0}.s-content img{max-width:100%;display:block;margin:0 auto}.s-content code{font-family:Monaco,Menlo,Consolas,Courier New,monospace}.s-content code,.s-content tt{margin:0 2px;padding:0 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px}.s-content pre{background:#fdf6e3;color:#657b83;line-height:1.5em;overflow:auto;padding:20px;margin:0 -20px 20px}.s-content pre code{margin:0;padding:0;white-space:pre}.s-content pre code,.s-content pre tt{background-color:transparent;border:none}.s-content pre{border:none;border-radius:0;padding:10px 30px;margin-left:-20px;margin-right:-20px}@media (min-width:1150px){.Columns__right--float .Columns__right__content{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.Columns__right--float .Columns__right__content article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.Columns__right--float .Columns__right__content article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.Columns__right--float .Page__header,.Columns__right--float .Pager,.Columns__right--float .s-content blockquote,.Columns__right--float .s-content dl,.Columns__right--float .s-content h2,.Columns__right--float .s-content h3,.Columns__right--float .s-content h4,.Columns__right--float .s-content h5,.Columns__right--float .s-content h6,.Columns__right--float .s-content hr,.Columns__right--float .s-content ol,.Columns__right--float .s-content p,.Columns__right--float .s-content table,.Columns__right--float .s-content ul{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%}.Columns__right--float .s-content table{background-color:#fff;white-space:normal}.Columns__right--float .s-content table code,.Columns__right--float .s-content table pre{white-space:normal}.Columns__right--float .s-content blockquote:before,.Columns__right--float .s-content dl:before,.Columns__right--float .s-content h2:before,.Columns__right--float .s-content h3:before,.Columns__right--float .s-content h4:before,.Columns__right--float .s-content h5:before,.Columns__right--float .s-content h6:before,.Columns__right--float .s-content hr:before,.Columns__right--float .s-content ol:before,.Columns__right--float .s-content p:before,.Columns__right--float .s-content ul:before{width:100%;height:10px;display:block;clear:both}.Columns__right--float .s-content blockquote dl,.Columns__right--float .s-content blockquote h2,.Columns__right--float .s-content blockquote h3,.Columns__right--float .s-content blockquote h4,.Columns__right--float .s-content blockquote h5,.Columns__right--float .s-content blockquote h6,.Columns__right--float .s-content blockquote hr,.Columns__right--float .s-content blockquote ol,.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content blockquote ul,.Columns__right--float .s-content dl dl,.Columns__right--float .s-content dl h2,.Columns__right--float .s-content dl h3,.Columns__right--float .s-content dl h4,.Columns__right--float .s-content dl h5,.Columns__right--float .s-content dl h6,.Columns__right--float .s-content dl hr,.Columns__right--float .s-content dl ol,.Columns__right--float .s-content dl p,.Columns__right--float .s-content dl pre,.Columns__right--float .s-content dl ul,.Columns__right--float .s-content h2 dl,.Columns__right--float .s-content h2 h2,.Columns__right--float .s-content h2 h3,.Columns__right--float .s-content h2 h4,.Columns__right--float .s-content h2 h5,.Columns__right--float .s-content h2 h6,.Columns__right--float .s-content h2 hr,.Columns__right--float .s-content h2 ol,.Columns__right--float .s-content h2 p,.Columns__right--float .s-content h2 pre,.Columns__right--float .s-content h2 ul,.Columns__right--float .s-content h3 dl,.Columns__right--float .s-content h3 h2,.Columns__right--float .s-content h3 h3,.Columns__right--float .s-content h3 h4,.Columns__right--float .s-content h3 h5,.Columns__right--float .s-content h3 h6,.Columns__right--float .s-content h3 hr,.Columns__right--float .s-content h3 ol,.Columns__right--float .s-content h3 p,.Columns__right--float .s-content h3 pre,.Columns__right--float .s-content h3 ul,.Columns__right--float .s-content h4 dl,.Columns__right--float .s-content h4 h2,.Columns__right--float .s-content h4 h3,.Columns__right--float .s-content h4 h4,.Columns__right--float .s-content h4 h5,.Columns__right--float .s-content h4 h6,.Columns__right--float .s-content h4 hr,.Columns__right--float .s-content h4 ol,.Columns__right--float .s-content h4 p,.Columns__right--float .s-content h4 pre,.Columns__right--float .s-content h4 ul,.Columns__right--float .s-content h5 dl,.Columns__right--float .s-content h5 h2,.Columns__right--float .s-content h5 h3,.Columns__right--float .s-content h5 h4,.Columns__right--float .s-content h5 h5,.Columns__right--float .s-content h5 h6,.Columns__right--float .s-content h5 hr,.Columns__right--float .s-content h5 ol,.Columns__right--float .s-content h5 p,.Columns__right--float .s-content h5 pre,.Columns__right--float .s-content h5 ul,.Columns__right--float .s-content h6 dl,.Columns__right--float .s-content h6 h2,.Columns__right--float .s-content h6 h3,.Columns__right--float .s-content h6 h4,.Columns__right--float .s-content h6 h5,.Columns__right--float .s-content h6 h6,.Columns__right--float .s-content h6 hr,.Columns__right--float .s-content h6 ol,.Columns__right--float .s-content h6 p,.Columns__right--float .s-content h6 pre,.Columns__right--float .s-content h6 ul,.Columns__right--float .s-content hr dl,.Columns__right--float .s-content hr h2,.Columns__right--float .s-content hr h3,.Columns__right--float .s-content hr h4,.Columns__right--float .s-content hr h5,.Columns__right--float .s-content hr h6,.Columns__right--float .s-content hr hr,.Columns__right--float .s-content hr ol,.Columns__right--float .s-content hr p,.Columns__right--float .s-content hr pre,.Columns__right--float .s-content hr ul,.Columns__right--float .s-content ol dl,.Columns__right--float .s-content ol h2,.Columns__right--float .s-content ol h3,.Columns__right--float .s-content ol h4,.Columns__right--float .s-content ol h5,.Columns__right--float .s-content ol h6,.Columns__right--float .s-content ol hr,.Columns__right--float .s-content ol ol,.Columns__right--float .s-content ol p,.Columns__right--float .s-content ol pre,.Columns__right--float .s-content ol ul,.Columns__right--float .s-content p dl,.Columns__right--float .s-content p h2,.Columns__right--float .s-content p h3,.Columns__right--float .s-content p h4,.Columns__right--float .s-content p h5,.Columns__right--float .s-content p h6,.Columns__right--float .s-content p hr,.Columns__right--float .s-content p ol,.Columns__right--float .s-content p p,.Columns__right--float .s-content p pre,.Columns__right--float .s-content p ul,.Columns__right--float .s-content ul dl,.Columns__right--float .s-content ul h2,.Columns__right--float .s-content ul h3,.Columns__right--float .s-content ul h4,.Columns__right--float .s-content ul h5,.Columns__right--float .s-content ul h6,.Columns__right--float .s-content ul hr,.Columns__right--float .s-content ul ol,.Columns__right--float .s-content ul p,.Columns__right--float .s-content ul pre,.Columns__right--float .s-content ul ul{width:auto;float:none;display:block}.Columns__right--float .s-content hr{border-color:#ddd}.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content li p,.Columns__right--float .s-content li pre{width:100%}.Columns__right--float .s-content pre{float:left;clear:right;width:50%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0}.Columns__right--float .s-content pre code{padding:0 .5em}}a{text-decoration:none;color:#0078be}a.external:after{content:" " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=)}a.broken{color:red}p{margin:0 0 1em}hr{clear:both;margin:1em 0;border:0;border-top:1px solid #ddd}code{color:#3f4657}.Button{display:inline-block;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;border-radius:4px}.Button--small{font-size:12px;line-height:1.5;border-radius:3px}.Button--default{color:#333;background-color:#fff;border-color:#ccc}.Button--default.Button--active{color:#333;background-color:#e6e6e6;border-color:#adadad}.ButtonGroup{position:relative;display:inline-block;vertical-align:middle}.ButtonGroup .Button+.Button{margin-left:-1px}.ButtonGroup>.Button{position:relative;float:left}.ButtonGroup>.Button:focus,.ButtonGroup>.Button:hover{z-index:2}.ButtonGroup>.Button.Button--active,.ButtonGroup>.Button:active{z-index:3}.ButtonGroup>.Button:not(:first-child):not(:last-child){border-radius:0}.ButtonGroup>.Button:first-child{margin-left:0}.ButtonGroup>.Button:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.ButtonGroup>.Button:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.Brand{display:block;padding:15px 20px;font-size:18px;text-shadow:none;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;color:#0078be}.Brand,.Navbar{background-color:#3f4657}.Navbar{height:50px;box-shadow:0 1px 5px rgba(0,0,0,.25);margin-bottom:0}.Navbar .Brand{float:left;line-height:20px;height:50px}.CodeToggler__text{font-size:12px;line-height:1.5;padding:6px 10px 6px 0;display:inline-block;vertical-align:middle}.Nav{margin:0;padding:0}.Nav__arrow{display:inline-block;position:relative;width:16px;margin-left:-16px}.Nav__arrow:before{position:absolute;display:block;content:"";margin:-.25em 0 0 -.4em;left:50%;top:50%;width:.5em;height:.5em;border-right:.15em solid #3f4657;border-top:.15em solid #3f4657;transform:rotate(45deg);transition-duration:.3s}.Nav__item{display:block}.Nav__item a{display:block;margin:0;padding:6px 15px 6px 20px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#3f4657;font-size:15px;text-shadow:none;border-color:#e7e7e9}.Nav__item a:hover{color:#3f4657;text-shadow:none;background-color:#c5c5cb}.Nav .Nav{display:none;margin-left:15px}.Nav .Nav .Nav__item a{margin:0 0 0 -15px;padding:3px 30px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;color:#2d2d2d;opacity:.7}.Nav .Nav .Nav__item a:hover{opacity:1}.Nav .Nav .Nav__item--active a{color:#3f4657}.Nav__item--active>a,.Nav__item--open>a{background-color:#c5c5cb}.Nav__item--open>.Nav{display:block}.Nav__item--open>a>.Nav__arrow:before{margin-left:-.25em;transform:rotate(135deg)}.Page__header{margin:0 0 10px;padding:0;border-bottom:1px solid #eee}.Page__header:after,.Page__header:before{content:" ";display:table}.Page__header:after{clear:both}.Page__header h1{margin:0;padding:0;line-height:57px}.Page__header--separator{height:.6em}.Page__header a{text-decoration:none}.Links{padding:0 20px}.Links a{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#0078be;line-height:2em}.Search{position:relative}.Search__field{display:block;width:100%;height:34px;padding:6px 30px 6px 20px;color:#555;border-width:0 0 1px;border-bottom:1px solid #ccc;background:#fff;transition:border-color .15s ease-in-out}.Search__field:focus{border-color:#0078be;outline:0}.Search__icon{position:absolute;right:9px;top:9px;width:16px;height:16px}.Navbar .Search{float:right;margin:8px 20px}.Navbar .Search__field{box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-width:0;border-radius:4px;padding-left:10px}.TableOfContents{font-size:16px;padding-left:0;border-left:6px solid #efefef}.TableOfContents p{margin-bottom:0}.TableOfContents a{text-decoration:none}.TableOfContents .TableOfContents{border-left-width:0}.Pager{padding-left:0;margin:1em 0;list-style:none;text-align:center;clear:both}.Pager:after,.Pager:before{content:" ";display:table}.Pager:after{clear:both}.Pager li{display:inline}.Pager li>a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.Pager li>a:focus,.Pager li>a:hover{text-decoration:none;background-color:#eee}.Pager--next>a{float:right}.Pager--prev>a{float:left}.container{margin-right:auto;margin-left:auto}@media (min-width:992px){.container{width:970px}}@media (min-width:768px){.container{width:750px}}@media (min-width:1200px){.container{width:1170px}}.container--inner{width:80%;margin:0 auto}.Homepage{padding-top:60px!important;background-color:#0078be;border-radius:0;border:none;color:#3f4657;overflow:hidden;padding-bottom:0;margin-bottom:0;box-shadow:none}.HomepageTitle h2{width:80%;font-size:30px;margin:20px auto;text-align:center}.HomepageImage img{display:block;max-width:80%;margin:0 auto;height:auto}.HomepageButtons{padding:20px 0;background-color:#c5c5cb;text-align:center}.HomepageButtons .Button--hero{padding:20px 30px;border-radius:0;text-shadow:none;opacity:.8;margin:0 10px;text-transform:uppercase;border:5px solid #3f4657;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;background-image:none;filter:none;box-shadow:none}@media (max-width:768px){.HomepageButtons .Button--hero{display:block;margin-bottom:10px}}.HomepageButtons .Button--hero:hover{opacity:1}.HomepageButtons .Button--hero.Button--secondary{background-color:#c5c5cb;color:#3f4657}.HomepageButtons .Button--hero.Button--primary{background-color:#3f4657;color:#f7f7f7}.HomepageContent{background-color:#fff;padding:40px 0}@media (min-width:769px){.HomepageContent .row{margin:0 -15px}.HomepageContent .col-third{width:33.333333%;float:left;position:relative;min-height:1px;padding-left:15px;padding-right:15px}}.HomepageContent ol li,.HomepageContent ul li{list-style:none;padding-bottom:.5em}.HomepageContent ol li:before,.HomepageContent ul li:before{content:"";width:0;height:0;border:3px solid transparent;border-left-color:#0078be;float:left;display:block;margin:6px 6px 6px -12px}.HomepageContent .lead{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300;font-size:16px;margin-bottom:20px;line-height:1.4}@media (min-width:768px){.HomepageContent{padding:40px 20px}.HomepageContent .lead{font-size:21px}}.HomepageFooter{background-color:#3f4657;border-radius:0;color:#0078be;border:none;box-shadow:none}@media (max-width:768px){.HomepageFooter{padding:0 20px;text-align:center}.HomepageFooter .HomepageFooter__links{padding-left:0;list-style-type:none}}@media (min-width:769px){.HomepageFooter .HomepageFooter__links{float:left}.HomepageFooter .HomepageFooter__twitter{float:right}}.HomepageFooter__links{margin:40px 0}.HomepageFooter__links li a{line-height:32px;font-size:16px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700}.HomepageFooter__links li a:hover{color:#0078be;text-decoration:underline}.HomepageFooter__twitter{margin:40px 0}.HomepageFooter .Twitter{margin-bottom:20px}.s-content code{text-rendering:auto;-webkit-font-smoothing:initial;font-size:13px}.s-content pre{margin:20px -20px;background:#002b36}.s-content pre code{font-size:13px}.code-section pre{margin-top:0}.code-section .tab-pane{display:none}.code-section .tab-pane.active{display:block}.code-section .nav-tabs{list-style:none;border-bottom:none;padding-left:0;clear:left;margin-bottom:0}.code-section .nav-tabs:after,.code-section .nav-tabs:before{content:" ";display:table}.code-section .nav-tabs:after{clear:both}.code-section .nav-tabs li{float:left}.code-section .nav-tabs li a{display:block;background-color:#ddd;border-radius:4px 4px 0 0;border-color:#eee #eee #ddd;color:#333;padding:7px 12px;margin-right:4px}.code-section .nav-tabs li.active>a,.code-section .nav-tabs li.active>a:focus,.code-section .nav-tabs li.active>a:hover{background-color:#002b36;border-color:#222;color:#fff}.hljs{display:block;overflow-x:auto;padding:.5em;background:#002b36;color:#839496}.hljs-comment,.hljs-quote{color:#586e75}.hljs-addition,.hljs-keyword,.hljs-selector-tag{color:#859900}.hljs-doctag,.hljs-literal,.hljs-meta .hljs-meta-string,.hljs-number,.hljs-regexp,.hljs-string{color:#2aa198}.hljs-name,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-title{color:#268bd2}.hljs-attr,.hljs-attribute,.hljs-class .hljs-title,.hljs-template-variable,.hljs-type,.hljs-variable{color:#b58900}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-meta .hljs-keyword,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-subst,.hljs-symbol{color:#cb4b16}.hljs-built_in,.hljs-deletion{color:#dc322f}.hljs-formula{background:#073642}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.alert{color:#464a4e;background:#e7e8ea;border-left:5px solid #dddfe2;min-height:20px;margin:15px 0;padding:15px;position:relative}.alert.alert-note{color:#004085;background:#cce5ff;border-color:#b8daff}.alert.alert-success{color:#155724;background:#d4edda;border-color:#c3e6cb}.alert.alert-warning{color:#856404;background:#fff3cd;border-color:#ffeeba}.alert.alert-danger,.alert.alert-error{color:#721c24;background:#f8d7da;border-color:#f5c6cb}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-before:auto}blockquote,pre{border:1px solid #999;font-style:italic}blockquote,img,pre{page-break-inside:avoid}img{border:0}a,a:visited{text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}q{quotes:none}q:before{content:""}q:after{content:" (" attr(cite) ")"}.page-break{display:block;page-break-before:always}.hidden-print,.Pager,aside{display:none}.Columns__right{width:100%!important}.s-content a:after{content:" (" attr(href) ")";font-size:80%;word-wrap:break-word}.s-content a[href^="#"]:after{content:""}h1 a[href]:after{font-size:50%}}body{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif}.Brand{background:#222;color:#fff}.Brand .Brand__logo{color:transparent;display:block;max-width:170px;height:26.4px;background:transparent url(../img/logo-white.svg) no-repeat 0}.Brand .subtitle{margin-top:5px;margin-bottom:0}.Pager{margin:30px 0 10px}.breadcrumbs,.s-content h2{margin-top:25px}.s-content a{text-decoration:none}.s-content img{margin:0}@media screen and (min-width:768px){.s-content img.img-narrow{max-width:50%}}.s-content table{margin-top:15px;margin-bottom:15px}.s-content blockquote{font-size:16px;border-color:#ffeaae;background:#fffdf6;color:#666;margin-left:0;margin-right:0}.s-content h1 .headerlink,.s-content h2 .headerlink,.s-content h3 .headerlink,.s-content h4 .headerlink,.s-content h5 .headerlink,.s-content h6 .headerlink{color:transparent;font-size:75%;font-weight:400;line-height:1;margin:0;padding:0 0 0 6px}.s-content h1:hover .headerlink,.s-content h2:hover .headerlink,.s-content h3:hover .headerlink,.s-content h4:hover .headerlink,.s-content h5:hover .headerlink,.s-content h6:hover .headerlink{color:#c5c5cb}.s-content h1:hover .headerlink:hover,.s-content h2:hover .headerlink:hover,.s-content h3:hover .headerlink:hover,.s-content h4:hover .headerlink:hover,.s-content h5:hover .headerlink:hover,.s-content h6:hover .headerlink:hover{color:#0078be}.disqus-separator{margin:15px 0 20px}.Columns__landing .Nav{padding-left:15px}.ribbon-box{position:relative}.ribbon-box .ribbon{position:absolute;right:-5px;top:-5px;z-index:1;overflow:hidden;width:86px;height:86px;text-align:right}.ribbon-box.navigation .ribbon{right:-26px;top:-78px}.ribbon-box .ribbon span{font-size:10px;font-weight:700;color:#fff;text-transform:uppercase;text-align:center;line-height:20px;transform:rotate(45deg);-webkit-transform:rotate(45deg);width:115px;display:block;background:linear-gradient(#2989d8,#1e5799);box-shadow:0 3px 10px -5px #000;position:absolute;top:24px;right:-23px}.ribbon-box .ribbon span:before{left:0;border-color:#1e5799 transparent transparent #1e5799}.ribbon-box .ribbon span:after,.ribbon-box .ribbon span:before{content:"";position:absolute;top:100%;z-index:-1;border-style:solid;border-width:3px}.ribbon-box .ribbon span:after{right:0;border-color:#1e5799 #1e5799 transparent transparent}@media screen and (max-width:768px){.ribbon-box.navigation .ribbon{top:44px;pointer-events:none}}.extension-card{border:1px solid #e7e7e9;border-radius:4px;padding:20px;height:100%;position:relative}.extension-card .button{display:inline-block;padding:5px 14px;border:1px solid #e7e7e9;border-radius:15px}.extension-card .button:hover{background-color:#e7e7e9}.action-box{font-size:12px;float:right}.action-box .edit_on{color:grey;margin-left:3px;display:block;text-align:right}.action-box .version-switcher{font-size:16px;display:block;margin-bottom:5px}.action-box .version-switcher select{margin-left:3px}.column{margin:20px 0}@media screen and (min-width:768px){.Columns__landing{display:flex;flex-wrap:wrap}.Columns__landing .column{width:48%}.Columns__landing .column:nth-child(2n){margin-left:4%}}aside.Collapsible .version-info{font-size:11px;margin-bottom:25px}.SearchResults .SearchResults__highlight{font-weight:400;background:#bee7ff}.SearchResults .SearchResults__text,.SearchResults .SearchResults__title,.SearchResults .SearchResults__url,.SearchResults .SearchResults__warning{font-weight:400}.SearchResults .SearchResults__text a,.SearchResults .SearchResults__title a,.SearchResults .SearchResults__url a,.SearchResults .SearchResults__warning a{color:#0078be}.landingpage .Nav__item--open>a{background:transparent!important}.landingpage .Columns__landing div>.Nav li a{background:none;line-height:1.5}.landingpage .Columns__landing div>.Nav>li>a{display:block;color:#0078be;padding-left:0;font-size:16px;margin-top:15px}.landingpage .Columns__landing div>.Nav>li ul>li>a{padding-left:16px}.Banner{margin:40px 0 10px}.Banner .img{width:100%}.lightbox{display:none;position:fixed;z-index:999;top:0;left:0;right:0;bottom:0;padding:1em;background:rgba(0,0,0,.8)}.lightbox:target{display:block}.lightbox img{width:100%;height:100%;object-fit:scale-down}.image-as-lightbox+p>img,img.lightbox-thumbnail{max-width:50%;max-height:350px} \ No newline at end of file diff --git a/docs/static/themes/pimcore/fonts/robotoslab-bold.eot b/docs/static/themes/pimcore/fonts/robotoslab-bold.eot new file mode 100644 index 0000000000000000000000000000000000000000..4e88b6cfeb0c6dcef692a784ed7a62e322634273 GIT binary patch literal 39370 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 J_r)5b{{l>b;dlT5 literal 0 HcmV?d00001 diff --git a/docs/static/themes/pimcore/fonts/robotoslab-bold.svg b/docs/static/themes/pimcore/fonts/robotoslab-bold.svg new file mode 100644 index 0000000000..0c830531b5 --- /dev/null +++ b/docs/static/themes/pimcore/fonts/robotoslab-bold.svg @@ -0,0 +1,688 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/static/themes/pimcore/fonts/robotoslab-bold.ttf b/docs/static/themes/pimcore/fonts/robotoslab-bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b5120e7f3caa028717c7440eaaf6edd7846ce08c GIT binary patch literal 39120 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%0A0+ao8+W(Tg8N8ykwxbQ$0a#nur&_ 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 literal 0 HcmV?d00001 diff --git a/docs/static/themes/pimcore/fonts/robotoslab-bold.woff b/docs/static/themes/pimcore/fonts/robotoslab-bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..9e98b2d356be062c31c97ec55f36eabafe514c44 GIT binary patch literal 23812 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 literal 0 HcmV?d00001 diff --git a/docs/static/themes/pimcore/fonts/robotoslab-bold.woff2 b/docs/static/themes/pimcore/fonts/robotoslab-bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a0e46d686e5410b7bdf6a084d7a33b31957fb5d4 GIT binary patch literal 18720 zcmV)9K*hgzPew8T0RR9107)PK6951J0GQAK07$a{0RR9100000000000000000000 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

_eRa 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 z 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 j{xNC$epx7z7L`7PLiqVVV_#6U@HC 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 literal 0 HcmV?d00001 diff --git a/docs/static/themes/pimcore/fonts/robotoslab-light.svg b/docs/static/themes/pimcore/fonts/robotoslab-light.svg new file mode 100644 index 0000000000..bf7f6a7372 --- /dev/null +++ b/docs/static/themes/pimcore/fonts/robotoslab-light.svg @@ -0,0 +1,687 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/static/themes/pimcore/fonts/robotoslab-light.ttf b/docs/static/themes/pimcore/fonts/robotoslab-light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..067e1e58b0729e758f737c5c1cc70cace6f4c734 GIT binary patch literal 40392 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 Chiqg3 literal 0 HcmV?d00001 diff --git a/docs/static/themes/pimcore/fonts/robotoslab-light.woff b/docs/static/themes/pimcore/fonts/robotoslab-light.woff new file mode 100644 index 0000000000000000000000000000000000000000..1cbe7902b7c7722c5f984d2933a76f962248ed21 GIT binary patch literal 24224 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 OD;59%0a>}9VE_OV(@IGI literal 0 HcmV?d00001 diff --git a/docs/static/themes/pimcore/fonts/robotoslab-light.woff2 b/docs/static/themes/pimcore/fonts/robotoslab-light.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b954cfdc867b95a2755e7cd6601cab227c4091f6 GIT binary patch literal 19112 zcmV)7K*zs#Pew8T0RR9107|F;6951J0G+%507^Ol0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/docs/static/themes/pimcore/fonts/robotoslab-regular.eot b/docs/static/themes/pimcore/fonts/robotoslab-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..10a7a2b6d2d836dcd1501f7d8fec3dcaba773e9c GIT binary patch literal 39066 zcmb@v2Vhji_CG#z+omU*&1O@{ZZ?}hIwT=pIdeCK_P+0Z|Nks^_tu#+XU?2{F59*;R};^zcf(H3u*(N+{xPzH?^KJQNH&z+#KvNqgU!xL*fds& zW5z;oWdfVX=87}3ab_PIjx)2_&1^F6oq@aCvP^8*__Sl~Sq|%rbM0`{*0(V((5Ibs5PP%n-4^%I*nntIIb8sy>e#% zH!nos_$Xsiz_?rH*i*Zhg3;j#T<=mfbK>;Xfw%TxECSE_-!-xF=9xGj##lV&n)ywf zwxH_R>Y`d4?_zA~%t;d}$MY}tKf>55+{4;W!ilh68v0t*8^=kLrq7wr!izWIcp78! zyVGtOS9$hWJ^EVf2F#bHSI(a)9p!r&yE7g4+hZzW3l-ITl#0cPBI9+EcjlD!WO4hShjmb)PM3SkkffSGaE=UA2&aV8XJf^gZCENx!$NF}C7XwZ+?jP@-B@?rIRp!E6dTQ!vE}Rzwt}r>tJrF`hOK4m*qv+> z@Vtd>W%sac?0)tVJH}pR|HD3EpRqHHOZ~+>27zKa@MK=ZNAo#+9e-D%zc{HKQ_)WZ zdJ0Ehk$655Pe`Fwc&eB8Gu9h8>w~Q?w*J^k zu?@#I5||q0y}(9eTZT54W4i;}3T!K}t-`h%?c9xR3%0G;?!mSV+r8NKpzQ~-J%nv9 zwtd(h#;gu1 z0VBJBkzD|!7ciG$n9VTEXBcKQ4C|#g;OK*`FSh>JhGW~0?Etn%u|0AjPMdp+J)u=k61s<*%Qu>Oaa zc~9c%fBEPAk}>ZEdeZyz|MI9A_k0OVU-9QXkNE>sSDe1=(0lH(LmY^HzrpO&{%P+v zjOOB%_gwGT`^ELHTzwwAtm)7D9d;wY^RD<4=dU;is9y6vV1xG^%j95Ox}K=QIqkkeyg_| zo%c@B$9i+T|MaGN@9>T@t{LCph~lsDx8*h32i08j&-cu^WIJd zPQVGRfSzdLXhsWk?!W)T?1|Q{e)78K0fYAky8n8sR9tJCr7Q3Cejxe^Z61|4ruH_A zC!5FBG%Ml`-%MgZ?CPGO`Qfi6rHN;*0pr!rUhhuhe9LcREG^IYo)!4G`h4>l?`G(z zSN#zu^VZR6f{NBEbb_n?yu+_L^>0tKq(ft6=|pEIypMXn_I}$uhHFby@25?iZo&1t zY1xPGE(y9F$$)ss`yhOSYe1q~@M*}W>67<fZH}L50_?THQd@L|f zi=b|XHq(3nSKe+)ix(3e*O z<~7ilRahe%0o5jaWVRU}2^#b^?C)T^0M-5Ygt9&CVf4Nqp9okykE7qG@UgL{*|X^J zC48dU%lKHKZy&?{tN4Tpy*r+Licc${f5)@4__Si5rUKL{8m%$fy1hOUi| z8FoN2jtRdi?6!1#6Hem<236=??Qy09K2ZXX0RoSjz+;fWqrbpon80JOz@tUrF&g;m zi;?ulCqiH_UTAOeE%4|k@MwceVmR(8!zY%F#3xYTR1!F~3Y1foCdRxU};7Q z%$fvd%>uI~fmyS_tQk*737TaBvs~a+5;&EC(NxTQ2B^;;SnCd0djT8Kf|}xdxEPAD zw-OYTC`RkVXveT5F}4(pY#W~6fw6QIBPkFg>5Y**i|5JWDiN>_2b5>g3eEP7SSSD1 z{+>2@V&!G_H(Bl+XE>;sekH7vAYs`Lfu$|6fjCQcqpTG1^}vy$Zc}scNP_Vz|C3c2 zhJWK~Kg%TVU}hhMV>_LjxnTCq(A%ZI6|G9If-7XKwBFA6&Ov}w>7)|JvZEjJ0vKBy z`okYraEA8cfX55?ZIAmD%!vey2D57BJ5%ihUe zWFKQc;7Cjich&!`!27^_&)L~7JU6uIIc5*DN7>_i&vm@)IZj>+@88~EynhZjO z7(c;$`5#(VHItuzKwwaCNNAWj+!A4pv_(b7#Ky(9O0YW;ok_0bl-6xh)6z3Cv$ET^ z%gN1apWmTlr_NovcI)o$QBVj!SaI(@ef#wvFmTY|Awx?_hYcT5Rz7mn4L6P+Q&Bl~ z99y|+_1ewbc0IV~p?!NF-v8)<#~wfEIrPL+|9JYDXAeLB+zT(VIaL#z3cS=B^DJ*KgU%?!Is5j#o~cx|y+)a8+IFuMR5#8_|jurF3FUukah&@Sa-d z{Z`9R2715M`_VBgQq3Ng?y*-?Wq5eHeZ1ZC;$V-GJkq1|998CUI$~?f?4H4c%N!ne zd92;jf%ZC-m)kvoJuAn1TGL@*PrE0ZcCzV?7YCQwtL(M4m3B|S;IaywvD38x+G|gH z?JHs{%FD}RJuI!f-05M1%O;eUXLzJ^JK9lPl>k9499-s6odq7vSrF@RlzVtZhDT0! z0v`MLgX-7UvLn6seLvuG?j^C+nq9xdHY5J^49d3evU6-5FFlW~%z zIS=|Nt_pk4T4yC8O^lJn5*|GESoGG|okw;#D~pVW{n8JrYEKWZEXwfsr=vZ)-Q!=_ zmr#HmXF<6qfR2XZC;&$po`7`wGYT6^U*ph`C$O->URwd&1KtczV0ypOvV$gGRG#Ds zp5UCH;R#CbH>9jziE%R4f%6t|J~;g#3o0B|b}%TY5ZxDe0@BJotk5I53J&_yR{*{| zJQ7HdU4zRGa$p8iQBVuKqFet|hZB!A?#CL}=@H2#u9jmM#Q?sz0{Cl2*+F=Eofvu{ z+%AVW=K|d!fJNDQcoP@>=P^n)_}TG9_H^cw-J(yulBphmxu=?6{pYfC@qN54_&2mR?cI^E-!_8;~g zgTABjOf34Q-#GM5zwzjsep{h$`b|LJ^lL}o^y@(1^qYvj>DP(A={G6e-bK)lD;+}) zuCNyZp%pX%mH71}r8+V^$>|XgRf@VfI~+{qRzQ`GF#v+b zyDC6Hl^rrX8R?m}E*YN8Yh1<5kHZ~VKpu;9*)#3Mw8k*#KDD*Q&SI>bvauM0hhr^g za&C=4FWKqn8?=Xi;ueqAGi^d`rqgckQj50QHea@98f|zKViY~o?4Al*NA4kIPe^vz z9{YrpEXR}=(8~4$hd_Vm(b)@xT?i`0Dq?8{o01AE#ydT7VdZ!%Ua7D$7W)pbI(t=ih;^c!UVt7yqAfIGG=(0(5O4sTqM}2S!gw}JM)4;gF(VRZ40;UX4p0CHkMzmItOu#4_G2cGjY0sqL_X2sb+$54H&y%HG-Qp5mw_6|98qM{_lu|utRILi?c(lqs7EI%6*V@ zr6D(>t{aWgLHH#=e9$%xtUCr~HCD_aM0us^g~>n>5Uz6rVriI6_@(bJ+#x0 z?xCIjbPw$epnE!EXCU1}JA>#R+8Ipu(9RILr!#hj(mk|OLif;4DcwUm!|0xF*cndu z(9Q_Dhjz;79@;6VdpcofB;7+hqv#&mxq0(PfpX_W9dNLJx=V=-Q&d`-8v!NliPG_6&;9MCyG6~b&}YlTPLS`@|td)LI>j3 zsbY_AohJ6^*6HbK9={15Ice~GV&56Wd0|07lMaQFQUsNDygCdju8Czr^k#KAWK!b3 zYj;pnKk0HvmaxkX%5++#(}zr2e0`TgoX+Q%9cGuq>?o4#dJ^BNPf~~dwZBMt1MN$& zuNg0een{=Ma>r7iLqKRjg-n*EAxx5jr6RN09Hv;(xYL|tcIM^q(mMR{&*ZoN8vHu7 z@sJWG&DWw}WB9XpcZ`ZtoEJz?x%m(o5WWi zW1^#Mkys(<%J>Tli%R1T*=cd+ImDJDJ1jYJj@2nPCypG_OI|j3%iwRhsmRM?hi)0l zy!bltMbRgJ4BoPdvmzKW+w>~FZ4JL+9p9x_(6&zBvqrCyk~yNzn4^K-Z21>$2kid> zclRKFfa~I_l9(XLs$77Wo+5E&66`-oQDMe0AVwO+R9RLBF;$g^Fx=KN(HfT+5u;ht zcy4k^CeO=lpP!dwZN;t5++=5>W{rrn;UGdYS)F;AygSc{h|Fo%Ue2o7c6?%YX|G%dqmXHuT7r>S)gqVim*{6pv*fnVX%`vKBQ$4Xa-IQhR}78@!~e}S zHHF&->{(g6XV1!24{jLJug{R7eftiUvgnXb<5b_lbV`qzF1iOC>VLDk#*rqWJcuB4=WU_KE4vbf-0@waG$b%@=cq z5o3-*!J{~ateI>kXG#cnCMK!v+UIjq2xc%+##H9xx0bVE?={`@Ev-j&UKiTFeQn1!l>>*A@s+p!n}@#c&(IqBcC%>Z>>KVtnbm=%$ath zl)+bvwgb_&Q?woJj-<8;D1b(}6zC$_LO_Kv;IVzUIWJ5~$xej^u>xs~d^>nb2#a$^hXe-&2Kf7# zG#TrVd~W1}DvH2RxGP_kb7YrIwU`2V3ZJ5X*p{~rxIciqvh}xLTKbe{nf!kFwww5H zeb0=0%k`fsc!GZMMl^sv`mha3mhv<#7?(Q{>q$}vC~!!Cei$zYK@l%irJjN@h0!v1 zSRH1k*^%ck=SVyGdVOY{eiOf|P7Xb!=keDLQGyD!Ytv8i&hVr8vru=CA`1q|Dx(0d z3-p!Jjd$fayz|(So3gU&dXIg-xNq;fOSj^=ZBmT1RC*E=Z*xcBnDGHXEds#U?`aMr ztfFsescz#Jr5HqJaQ-fQ4QHqDOt?GLcQ;T}ByM*Q=O12Ihky^=%e+fvO~?(p7bm9T zfgo<&Yjg6Py?dpKhi=z0z&93P%|-cm3&|Ks;w88noWsXMtc*BEA_<5v$(blc^RV!o zcH!m}gI$;fugg=S{`lbizy5gtgTLxlEnU2_cJa~`Qks5I|A43RNM4RDO@B}SCiS@& zUU*I)_S{P^J`b?qW0Aao)1TSh@g@z4Ga#-4RS`tY*%ZJ5`C$zQLb`LaDbHoLSse?` zeaRm=+i+`joKmPPyy35J;;Lzg#gI*57)KoOMo1n!tIFVvl#L@eyeuoDfgPy?LlmP^ zhiY6^gH=dxJQZiQIm1&-5otMj#2}2pIa89E!8T0X=E%=6SMpC6jaoE$%evwMl@*gwXLQfG?L|3IqpNN|>Tpm7=6XOR6(G$qo+AAz+$; zByLXfhoq1Kj@BrGa7P;FQx7bie%peZR|DohPoDZ=`t+sK^}k;`q1UVO(X|V2Ust{I zfSj{*?(Iuf%+wzI`h!A#)( zAN{veuV}X{^W3xciC(?Ua)N%=x4zOa_c1Jm^>gx)Wm zSN*3qKi9wD?RnfQd?cUJaMO^Yxvzcv#@6-E(mWvhK}ixcKztP1T@QnND~MX5D#<`L z#iJpvA|i-kFiAE!^JBQh0o~G}BZRln# z_rG2=y?TrO=iBe=^_!}v-}c?hFaCV*eG6{AXG`_MZEaReoV<9+lu65!+}Zn6(~mAZ z_1=4@79LGc-9P)qfBv(6+x%_!EVym$IyrvYx>d7oy5kOvU!uG%MQWb&R+wH$2d+e6 zt=ph2D+QQw;8TId2I*sPB%1hZ&3Q;r)114Ys0fus%F6{`VqnD#WSf%Tid%5W#}6VR zxp&=zveJ6}$oGEZrlaS%N&otr{yV$3>RK~%`d#*oYo~8nv;3nU)xzG~^sn>Wseb`R z{inWPe>%R^=J;rSW^|uzFTL{mt{u<8z7cXq=@jNfMkMybl9>g<-$dW?OktHk4W+pc zEhPGd3^ND-CPk|>Jf8;{S&ruu*)Mr4ECtVTd8S!oW+XPj9`W~+r0zhOG!+jDZ6_3p zh1o2}r{RR4xvBDP@~@B)+7o^%Zw)iWYE!K|4@`8xuwhbG{abRjR2Z&V&Y$E9H}hLh z(sL5q$hXMv$^QdtGBJm{6X?4VW_|f9|1xV4=pVX^e5;^= zR;;VLQwVS)lqW=gNeY|!~o=tn>4Zdx|O*hP~E}t@cT!nW3%O{^) z{Qk`L!$;{=ZxMb9_0HO1bqiw3g>1OHB%I4qH%(FkQV^|a&0$3p0965!954wt2Pjei zk*Z$_^YaTT^oP35N-!d3B?H4$!c3-UQ&EAtL;ECGQj*h>l$00<^G+kCDhM_iOaL;< zX3CK@Vodqr%wb0d%z=Fyv~WAKh*R9SoZLR&BAA=D&;PSe`%Ja9TR-OZ+Hl*KdnVTm zP_!KXt~m=g`kD0?^n?0qdTnSpAIv+IJ=ra#=*_YEGQGlL;jbe(b0OdS_g{epeY;Oh zhq9Ly(=p-pW&F4I_18-J4IcR8D_rIsbK5Ho|Cmwo#pAr1@7LSuYxR|SzclC6)GYop z_wc<^xE|Eduy%91?m;nOQcO_D#|C}n!!X+iUKk3BhCB=of*@oXI6HAEg{fpzf;%eG zNZcP(NTxP)8ME19v4n$3b>|R*LLSNv8NXx-=TGAe5A$E9>Z4~=G#nl`Lm$K6;io^> zszX)hU!R6nS6g_H{)?qrDv)NOQCa9bUjhaT^cNS&Ml&ZEWCheF$pv8?GE$OyFvWz~ zRb-k$L%;~}ELbRDiiqIMM7|S%U+SY#uHIjMA)9KyI5;@^UO@%onj4m&4GJ z98%qR&KFKtx>c|Ltf6T4?%j2~bj9Y|7whYIpD9Z>t>nS_@xJHC4qHxw@<)A2?zKRL;)s<$&)}QfWHdtMVPXX zj*`@<61kifms2PhPFUtpPhr$TJ#7zBZWd%k0?`4=Q#`9(*=s7l_~rX|$32klTHU?= zA^p6*iC6K&hw8h_Kc3F&qW`18)}TMtE#tJ_Fr;oYp<&37*zOzQ>urRo5#Ll7N@ zh8YAl?hh4gwYKR7PAci8?hT2%2{Yss4YAUY&?VqYY^Rb28)cf;RaG| zW=L;X-;z^$n8))``h)rx4fhc$|2lQ?;wjam->-l3Dp>Sx1AW{7Ud{vFI(eE05Pu}S z*CS|Pup3s51T2|UsetTau43*9le~gyimGZApczGzm2$u*I5i+uRnt)DP^MrLX-CMM zFx)d%Xh%5$K3GC2;Ek||NC7V1y;~Xma9G1JDWl;XsZZEG119}}V|ttI4Zk1Lcl%&E z0GQ0Ii@PHrVWA-qcF^nLcaoqq_+SDs(AX{q2I{zgAVRDW&|Gu(SS8f^gneNRN2HvF zH+DDt+T3}-c0Ce?0B8B2rPH7#2lX9{p5hr?J0K=WhE)j#Tf^GaR0smOQHLOAhOxuY zF@u;au0&I0n(H#+0SW|hks(doi{MgDyZ<_&f1=;Xr}L}_el4xdZo9hjlK1zI=55XV zoL&wj7?%QNb0mxfP!~~Juv}!ZSg|01Crh5gYJwjzC9kuD9l=#_ zX#5sSfxD%bK};a1hF^C#bfa&zZB0#_?$3XZ!|&hAN#o`hbsPOE@Hi1%y+HIs09PPO zaL2(Y*Py}>T;Okl!VS}m+!99jMsK~)TT=%{!=gcWkufjh(Vms%y4za9!5O*i4{D&n z$r6ZU5>Ai;3DPV@7nlw49g%2psStt~nDACL>F8n(#_#^U?(IKR>A6+6Pp{q0C#jyA zxccg2U%vO6wqp6lh4PZP8iO9yiRe3yb#mv21O||Q!Nge@V2Fv1w1&fekjb@lZ7fGx zEX~viFmgC%-)izV*f$)n24Q04Tlkjg{PZflkbkvGPrOO5e58p+fo>cBJ*1{4y5Yly zz0uXxA(E>5lj&-}r&IvGP@;hVe+5%c8Z~eu8A>*eqzc>$^x*tZ!W0MqCqh}M*^&qR z7;9C`zi*k+jPt)jeG8PPnT%2V37%m}Lw~JUzB|_z84?VsAxrUb(NRHxekMQgTN3_Q zF$|L;NknmyQ0uH_vn!Is7d$XdZnF4j41`DGjHu8c1ND7XZ?jZyqec)h?A~3^-_rP- ze3zgNWgY)}7QPyu&_@~+7gzIlrLwb$5+7>0E^I8roeIY>xrX2vl6VlLY5~+~f{RoT zm>U?B4dF|x#YZRrttDh)xvC%Su4^dL40!6KqneLe{sLJ_^&Of3*&)ftK{WW2*dX{_ z%fL&>@A|*`MwkO^orDd3Qozhf6d9fpwM^frf2Mz>@8T6ah9~mrbw7V_`s=SxfBb{= zhW@gCgCT0V@`v=1`Y}o8J@n@rY+k0n0PzDGO7Qr%FkfaUg^)ckd>QE*FuSFK5D;+> z@O5xH^8bRB!4Nk@5TXOfe~O9-2gRd6frpXoX$PsUI2*YG$#kDccSz?ia#?S|7Ca#E<4|V+KNfJ?Htu8+)`t5A8vV81NUg~# zjF3#KsRe_*2Ex`a<|!-mr`k=)zYf}7)?Xa^*8EFh;r{{d)D-n`mWXN#c$DozLz0wM z@iEaMAZxiG0saK2NJ3X@sUi6^HqO%8xSZg|k>*gA$Q>qOdK;P%bdAUaL;(_$h4cKH zNCo0f`UcJY`Q-if8fMLbs+Z-ZgvHy!CpR z57*TVw^T2<`3|gE^3&A-*KJ5gY6CtT0r!X0LPr8qP+ICp&0ddGC)`G1v}z48))cTH zS5b;N2f+&nHK=td$w_&+Nu;MM6E?dt?jE;e-~JcA`d&YGVW0l@&`rr5@0+pt(Yv4j zTCeAc7w-AHzaqVr+-~{QF*Vs8KilJZe?~bE{byE}>S^OwWahvB!2T~L_oHX?yGpz1X(5T@Of~^G)XQPl2 zeiITdIV5rjMR_>Nk&1U8-S)t7aE;x&_1FIRQGb8;ZXs=6d~p9G56Nzlr1dX;*U<1C z?Hl9Hg3frCShua+u26^_4($U_04Er@G>JyuIA#bLiwMGTTTZ?qVZdSm28X)W%b_`V z&!zmexq8&Ydej{Ly4u!SKk(+8_td_!q9^=8S zwfKK*=5Nl`k9qX7FaL5x%{-+)>i-7)BGRuGxfcX9FY@kH8r7seJ203bZLEv znixv*7^b~Sx{Z2ODyjY`Wfn3pIppXLwjB!31>-bA|LL4q@z*z%ZHsk_@c`T7ZEhpS+4E!=zOwLfg2bf4SiJ|0&N}i0^%JC;uXPP#8YWyyGZE6u`2v*R^CyX7q;*3 zUu6G=XF?v9&uxR`-=HkT>R2n*;|~3V6t6Avc}8S3j|eVkQW9|p@{I6i&j?~pr29+p zM~>)=_#*YoKdZN!o)PUNA|H+=qrxwwnCq+LZQCdmgJ(*WBm5G0vBEBouY`-xjZ@Cg;g@#)DSw6A6b*86 z5_osKGLSiu*+0nL--bYD3TzQmBGx9jJ=S+_R$Su~B6_#yB{>aZ&b z72d6rGF_Qy$ceytk}Du0&5_9s4+~tKoqchOQ0~klpKzoV(HRIR@*CzEfoeI{KS1iZ zzw%+vpC7$8e`?=ZPV3gbZ!di2JeLMHyfpR!=i3X`mZkS{_NjdE?rnRk$J~_cnEiI= z;-il@{BCU>5m>!`bitvSgNuo=OWr>)u6)ESN&a_scL?x@tr-ll6dNPKS||WZhh&wc z5OTo_*QSl^O`qq8!b(mHeAVQ!6^KjDBEh{uU4faU{|T(OcbWWZT8*5DS z^St5xet0A?^~?jQ4}FT>2u5W+a2d&x$Z`!00Z{~tP=`fURPrc_Pyrzm;8TbW$Ru?S ze&)=HijBEs8|sG|KD}d2 z+5D8`TZgS(vAA!4p74zoy}OGG`Qf;lzm~*R^Ivu!AKZukRy6pVBL=+kdEhkC$OW+k zWA5QdB9+AO(wD=>ZMf+HD7i)mt03bj8yUB@gs22_C{%ilMe<0vo76-GWWuW*9uF=i zW}O^^GQ~F>&`qS`&-Guq<><%f8VY22>#Ffv@&|N!Vb8cVVG{rOHY?BgA^mHfqyO>A zLiOI09osGHFhD-Bw_1&vbFZ;x$)5cH5zknnR5Cot@)JG@P^iFXWFgE8U=(RF&_4*x zMr<&a#ahTQVD=+ZI|u8G5NpI<;yL14KHlH!;in!*?3o%Bo)bHw^z+Y2L6P@uSoP?0 zfdO|b+QhM|Hq`$_Y+pvfA?91}C;trm#X}kvy4@PwuC63W)odWoFtB}i?qsz9-c@6{ zh?QeFy$G9vI-@0u%wiFd!@^?BH^hK2lPM;E`R>XEHTY6I^3BHVk34^}YFlpjL*INj z@adj8`F9sDTbQ@0;??tYwQI|X1ct9&Bl*+p5AMJ6?|0w+G0k;PeDbDM6N`Fr`^DYI zhxFw?^&E2Pu;7K=AiI76-3omJRvBl=^$9nJ1Y^44J_b49WgP^vk7miBgygcitj-8E zg5tW3YaZOnQ1V1Gr956z9bnD5prfkQ%KC}O2mNG zmeWI;r9&ns{=NhE*mL88L)x2r3_!8Q40>U3%|KBKgdG?iWsNY01;d#E@4e5Nfros+G`Wo;p;v=Zz;9#DF?77kd>Qci zb>ow&zaGcymLV26YN6hJf_`o>&47AOP5pe{3hGmgen9UNMe5TeeJ@Rc@JyCRId8BaQE?sSE>dCb@Q)_tN0pJ=3ObPs!Og z^C3{)FS}<pziURrx5oa~wS5a4 z76_kY7tGlYVy$PpGoaHoEfI_YIdp<-jAb5Lc+K^3J;=KN*piU;yC*#^7RanQ!k!z@I65z1>ZS;XmJA^eV8Oe)+7R+M!yDeXIub}@v%ZHC(c4S9~Kd4gji$F zM0Q1{*hsFNIm=bO{>(YOzV5C&*KF9ZZryq*>lx>hMO(|Ibf(aXfm^g@8E^;}oE+={8 zEW)WH@Dgq|qW396%=u>0P#byxKmEhoZ?8Ie=4{>gEqTC=Ja7HF()ljeyb){G>u2JW zJ#jV5`VQ1z(*LqTjVLV8SI5=J4p*W zp%iKfhQm&h0d=EhBjmDN3V;zElO(g?(uShb%%lxYcTMJe=ERsyxnblw+?{*psN-kq z?pQPQ=9H8pPyuV%|dy`M?+6{tw&uhI4q=c@$zdwRS58fx+1+1CwG^t@dT87 zq-ICSXp`~}txrM2Mj|g+HP-$u(6gRG-##A&S0gCD5)z;>j&qrhLg1-U&AP6Sf-)4d zcncpzV>sU?Z{B22n%;AA)yUd6PFy^?@Rb34lPhs<*U9t7)z+Oj_vFG?dPrX_No;dN z4|m`A^er{(4|Qz+`&|if!+Q28O-S2Rz3f?cM+5F2-ftz3+8uNWn;DTEi6cO-F>MNh zy$ETOLk*+|(IF;PI9_ecCUgQ)3OFnzr;!IGVwp&(q*PopKlsKQ-E(7lM8?KVYd?S8 z{{3oq{qGG8H}&u4udWEU-L+l1YXeA$vux;o_n-nSmZiJfL?KDm4>iLQkA{zcA~~Fk z-i_cAG$`mILX-$i4}A$0&!^rss(bR7ockwxj^B1$UDdS7tDJY;Rd<{I&aM%oKmVSS z>|FHdl3@d-S%y#p5;$^`n9>h0nA!Dx6#@(h?wL= z$MAdQBasbXE?p{l8U}CJAjQHV5K>*i)}n^8Iu4*Lb(NdRfK0?^f!=t8IK8UkpD<5FBf2U`>rp zuhD1Qs;dKenEpec;hS*k{gfL8zThK>jX~6ceD-1f2#r!yrrC@n0fLDF;rcWWOGKnA z37Q8t31txJBFSV5AOa2L!)gK^NeNJHtklQ1*|x;iHzGnS3G6;FK1<&|jz4wlktFTh zLjI(DB=qmcrausFNI#6!H`4lzgF^-a=Ftt)K06n7F#3Xo1%sKnh=8QvXphT+3CriLFE53rfhP-S4d6+w zCuno5iJAaDcG~EXqw#NA>z5y_nmV=W!IytadScldQ+K7c*){$2vZtJL^S|GJde*{? zx6gdzkssjTBA6HOyOfKv6KW~>N6Fh090XSkI5m84Sa!%C$7~LQ1S9;(tQc7xA_3IU zT@525#jt~X_W8xfmy~ZD)@5wl!ZB<2FDtuySm!Z01(nkIRi_I2W@k_77ryePp1pE1 zXAhuvruqKD5sJmG#MbGxyacpExjIIi<%*0VBpdtOLWEIK=TJg*4tlNpHV?xqA~<|3 zfpWc?4C{HQdk|7aRXNIM=m#Rj2q{-rTKh8Mz_L0D$|)`n!Vlt|fJN%bSptFs5f%!> zu_T_dScqt`pFX#1b1G2KU-8%x#9zB6-h39Ikz z{o+3lXt&JXyj=fjJI&*0@0aReu z$ylbKHsqyX5Tt-Ywq>TbPL7O7RFFbV%29HPDaA^SY{36#QJWoX1 zlf&gjb>?HU^V{R9Le) zoD!o(=f1-E*tu3e94k{zQGYlvV@Rn&-8ax>F7%-|@~b zXBy6Amn8M+z2cqR{)v4CZ{&}UUeh{f<=6wq-uOh5?p!f%)TjyFyFYty)Y>-fR#!fB z^2{mimiy+78aJ*}&!2wbX%ahFr%o7 zeBh0BS$R1st+(DEf2^l|{IPQ3#EBEcQ<3AUeyzR&{ihAyrZK`@8Ulw82Sz1uVH6!n z>ZAYyU!|ZPcrz^%1v-<0cWRhSA`wsIhWnR-8Cd->i@EJ+@g&;OWV{Pm6V5=$d|MYiU zvfqB;W%|Bfe$)5O=lAi}$OE`fuhc)*Kh(!crP`Jq?>;{7(f9A$tc@A5cJ}NBvKMrH8|ps zBJamliVLZrBoJ*=QoP|$(uxutjHS37X^Clg-kuDvxIbdd*YJv4v$&Bv302+J!X+*Z z_Y066GY8CDvhRV~&YcST?B?1dYnJZ_3ei{QObcJtue7uDvNbyqTx80g|Ls#`%AV&%c)uaE6nHz~ zZWa+h%rt0a0O|H@2&ufRrzPAHj+9xFWefN`8Idy#xobaqMT0vMXE|P?az&^l)@`NR zr(Su!{7DcWg{MRfi+rT6VX0ie=W*>ppc`=d>Q6*YFZL}O-s1xE-+gs0idl*SL|__C z^cn~&sU0{Xq*Nj|`L*E+>d)YXF-e#tlrd02fd44w7r;%5-({6(&Ax@GsLmbpa-!Nr zwT*WmR}{&j^IRRqQ6Kw^i?+qMa}B;DRL(Hi$HOx9B zwSDiRCA@owJ`f6o{B3G0dFplbKT0W{+K?svQ*E_@?w8nY@(a=e&^qCfbRD1X1#1}+ zgklb%yogXDd@r!_mVz&xy8k~d3}@@r)=LoW!mP= z)AD=w&d={h;TiPR56kC_@-zAhWvT8Im{lM+h$+-Oq3A%B%E3uQkwmaY{EGgZ|Ze!XpY^ zCQLa>O`%LLNo2!TT8TOK~glUF%JT<_8?$8jE5<}Hhhk7KsG0qNu9pYbuM4zM?@-_ z=ozn$hBVs5w$Gr%`;0mSu{OHIvUHf_e54CgXL~?Dyk?ejcPw9Od1zo^H>efknWN0yu(J%p*Bx?LQcnXB8qvfu;0|qc(h{Q}dk{o;g_Cx{k^AmDdSu7WqX)`Hl$4d1mX<5GY&vpe)7;I6 z4{t7;JY~e((y3F)QvkUznQfJCm!A@H0sD|(U!tDV#J=P=;fD6^9IONol8|7?+!b>- zK9K7W+q^J0D7#R@`Q(VQ~CG$_XsN*{vJS&smJ1g+4oihdO&?kKRt5NUxO2^CD! z$XcXG7O^pl*=lk?P-3hL0OL;eRnh?#&`7`HZ;D=jmgh0T(ZfpZccV)Qer}@xEO2q$nFA1)=)bMb%}M-Z;|IHox!txH7e*D zvRp=3Ty7Z_7Z^62Hk365kM>nHDj~iCYB-iCHZBMeJ{ItGD(9E_OW6}947q8_$i+ux z>EaW|KU_UGFA6m((yk3NN6o)&#MD{iDnyM+&3m)+hTp)q|C4Z;54zcBau6=_SvbAV zk1*Jik3nre;s@kLD(cR1h&V>Y>FPt-Yd;ll*?ZpB;7w zw&sDo0ef&;uBR$m3v{2D7a0;pIb07Met zcX`o-X(;eY6&&=M4N*P;ERv%EK3-8j0r!r>Vx)-Wr#MV-I&g=alCxHhmS06Or4k_x zY z3Wo_45~!smV6o9!k;CE0c4V8QsV>854#2{teqoS!Oo>hXf{znlV88Mk*=YAD%2o#l z1rDL=pcYu_0ZQw_7fk>Cc4KHU-1iQ#Dd(6g#f>RDM0goiUx>q0}b(U zG10cj7KjJ}BAVtQ_zF0tu~nFdvF{fqG<>)r(UuG& zuX(Is3mB~?#6R$WC8>4?|1l$n3pPm@I5TS6ux>)R2IrI119gLF1kR{(tVY8$0@{4} zXTTj?<*njlBN4F_Xi8|EGwjq+6|JZXur zJ7N5U0yd-;%MvO_l!A1wxgi>;1`Lig;M}B)@PD_*6N#W_XN!p#miCv)JwL=LCbC>$Djf6vOz>#JsP6c3HqS=?vyEjKN! zE9j~P0cn4^83Kc=JU^hAJmoO?J3BT4S?eqEs81x2E&^SQe_Io8=9n;8C4P_ zCLkh6jwug;uUlc)Azz7jAAEln)H$LRAOSWLM51~Fsm2Iajlx4{M}!d3N~_3tdOu1M zN^gwpITXTJ9lp9TdWQ>dtODH)3nCv_ZF|uYO8$ zW)iIn;8p0En^6OPqkCi&dHhZzkKfNE)TW084h}71Gurs z9=83*AT;&=+ZFwvU>m??C%dcK=VU|AybKC>Yq(#45ySV32y z1sbrQKOEH}THG{ASHqAG+RkZr6|GzjgVyIV7)1El{#v4AXrxX1{s@^)!1Suttp=u5_H6Ohb^ zcNc1-LXajdEAT}timfo%Pa-EgM?MN+zjLSTEY7-j>r~LWATKAYV|K?jDM?OyD@rX0 z4uqdLlV^rf@qq6&BQ1(x8pC}eYvA&tf)>F)-dJCtMyz4O?_<3 zeUA>CvS7x*aIN;KAp`oA==JC4sXLG7=hS8l*fzZ5M>B`?y;075c)6NzE7cKUeT~$M zs4j)(Y$WlQ-h#i}#&f*Cv+?dq3-l|>oz8SfCJB^tdASO5IsN?bUr01ntq>(iqN=f_ z0d2QS+@596YSTI;IfnAXLrIwM1SugfhU6R7#+)~JoPeQk3mylbL_`Se94iH&Av@vG z)xcK}Ji=R;M#4%rUIimmGh}lT%ckfF<_#`fPQo-kF3KKl$6N*Z;|*$(Eucl8g0Hpc z)8K1Y^ob79ZDXHghWvl(Q}D7DeHy$BygVhz0bg9xXk|(O_2Yic!z~B4Lka^xq%DVw zNoX8yo7TxLXX2Fu29kYqE$}ROL{tA7BOU=yNmIYTvVmRkLRHfc^6QY)xV+bZ=3X(Y zE>bM6>^G>f-zX>q6Vy+L#-fPEUcvlotmi8>lD#Oo1T7Ga6<|&=$#@Z+?=4;;g;1Es zzOXdW3ffwze$+&-MqBf5vs~F08bWh;a}ca54F6hfwLx3!)L*HsHqCIIcqxD^7IO&H zP4FcjbW#D#VrV=Bo~W&8(PX&QBFtl~C;DG}q+N#ZUD(G2pNUQLmLb*(`?#q+E@EIZ z5__*0EZN6+Jx`;3jQ@i{X%9QVjw%F1KM<>tAf!o!f*uzeg9N<@7QhiAz-T$tsAfBd zGBJ{p5h~)5U_D0iJOWvy@gp-qrJN?xTWt9@yp;^^j3uSTi15mzCf%%`{orH$B9C~l zWOJ?(QQBGmVZg6R15&&6TiNB}fS0)Q{<%x<-?L`YDGfAYlGU-62qs5j5^ICri( zc6Yb!RcmanusxBzvX)oX|K*qH*Jl#cK1TjZpLHC6(y*iNzg92323(=7k=_MLqH?&|zV_E7mBGk{oP%{jp;1`Y zu&*(FCRH(2fiuZd(VZ}=fozkhv2MT_>5L-#8fgonR7IH7B1aZUO~TklLK$9g?6avg zs{=V^PGM`e&!YmC{0Uio7EdaxKov{w=+r)oCybd;my)9K{&59KC}!#AbZGiB(VZM? zHi*KONXw?T`(9W_#Vz4sn@;!s*QWBjv!z{O=FcA)vM#$}QgG1O17bczPQSr-vx&cf zcM5uc0=x)zZ!}(M;*a+(p$-w;gV;UNv;L9!AKEXVQJQTX!v<_6$<6Wu;50>sz8U5=YB)vZTeAfBz3~xY4x^+g86{1P z^?2Qc52!^w6Kd0p_i{H@LPzsSd0WPwICG|M{8p-G+AY1ee%&w>G|fjr6YBFC9x3YG zRLxYVBMqY_PFqsH=J2Hfg$=(J_M?g>ngat*Vh)<{ggNMLBY)R5vE(ycTF%E+ND|XQ zXcE&wwm#_$6OfA{-ab!ncxbK%Y*Y)bs0SPgpMp_lL=~4tb&)gmAMi_qS73ca4g=bNpf1m&6-|&28)4wA%>tv{-Atp)Y8H~A$Rls?0M%Pd0opl zqW#?~Z(3ffyml2?55M?wKp_4{Z-1VRt$&bzi`S&xVS;kA&|fuu@t%JA{quq^!ruUo z^gxyfeWN4IgU0<$an?}O`$ode3KPH|nufnr9^kW*z#MFa2-y3~C%huKUEB6~Z9BH> z=yD|?WQNSTCcY?0>$2KvVvu6YSEP(I*+i4Ld}hf>xBJ+1qw0D~Emd82es0CG*WK<{ z7oA1b-}*b(ZrHeP?Rq83SBWjSIYHYv+uNZWt+Gtx?X&x$4j0PN)r~ z>I*3MTq;1^)D7;0N){t45MFdhPD*}7?iXZ#b2$d7jz%p8?fBPh76>>darlnyu_};sY`;GUm)64!v zU5~S(qI70ZytVx=Ef3wsu*Wb)z$%^6 z(gbe)Uu#za9Yv9b|LX2Ja?MQcbCQ`%E)o)ECK(cv5JCtO6bJ$ ztE&I{|ElV$zyA6QZpc)9D*ur_W#A@~e=gseiPZuy<&j-zs8ik+=`zJD!gghdoDOcJ zyXeD55Et24q=OupGaXj=xHb_AAugPD$%Hka#Z*e%pqmGsSj+NNK z_qdFsM5-3c6ehrjB5Fm3;s>$I~C91UzSMF*{R2j3%cOJyFq`( z6;p5?Dqnu(S}O4)gTxtR(>VLVwdDr@x<|i>oU4Q7G+@OKYEZqgwZy1$YS86Mbs;^8 zaky-plTWwO3W$RQ8pVel*u=c=$ze6A0U0ZYUv+%ZjEjX|&8p7}ur11H-p8&v0@*cz z6noD2`aY}GG2@R7yH;s`WG0<Z3t^C<^p6$BQOW z1u4>0?A64C087AJ%+V;`R&GswM)^Qpt8!;`+3kNemo>4qQn%pP!)7tZb|KWUf<1Km zDtp^8jJ-Wc#_2YpQM@Gf!71;##7kTfS!jF)QGioiQihZPyc2X^8l{Y%I=PYG;kX{@ zW$6Ae@{t-xG5T1+5am>{sfH3#a6jBSK-B!~8n+G*K5vpWG9#&xOI!ifP>lL(Eg){y zZ*Dtz&-pj<)=x3omW^04N2ucC8Aqu+s@dIK|7xc}-x?TMIltaDz|q`M48pifkaP>M zMso=&UJngXT$=`%ee%)`A77(P@*FWp9;7m`G5B-=0+X^-06-cwkR3G2*T+lO zA0n;yFA$9YJo*g1T%cdWJvnewoL_W_Wb`$fQ)i}yla9u4O-;)EfN zj>p03*8eO9e^()R$iVkr7rsQ^iO4(D2YLTLrPkR;zazEIw|tS9AQ~}a)S^Gocwze= zV1OJb&POuFqbr6;h)USIdi7q%G&OtafMdoFN*@-suBBzRV7h%1atqk-;%w8f`K4;d z6n6CVd<)#Xt;1vlefQKfZT5AFQu7$}R*x@ae~3Q(Y{He^E{Ct`riyDj<7fXmFQmbF zs@SKjw)J-P{#kXi-xqkC>q0mFE4Uce#oZTovoGjz;Wp0bxlALZDO9L9LgN)4bT50C zb_rXlR@h8l;t9%w{J}kJ3k5^z@HX}}Jt1bGH8;_6aU9i4^Qb_YM0RN>@)$;?(lS~O z2FEyrmrCpC4{Rqr!FH2Pyos_ zGL{MegI(G|S&ID#KS%|tMO1)sPJ!YjnxF`Ty$kkSy!(ungE1DXR8Y3!1PxIwp>Rb5 zB`F#yU3!a3h2iw9cn`%02`IyK#BZXdf*o9lN{p#r=)ED`MI*{1?eAEu}=9%Qalu zO*zsgGD+D~BfNp3%A2$mb~xZ&F5~_RZN|whmC`emuQ*C&2+v|Yv{ibKrih$(3g8;J=V9nowh7m%K{C=wlFnm8Rj}oCoQRLP4S(>^#j8Of*e= z1?l!um0~Bors$;Cl-uB6L76h%IqnA-wV6_7T7V9m7H$JN=r}E4jKbF5F2x?oyF&*~ zi#|qzE;!(R0;fe^Bh%tG*%fNggya1#MujytnHHb}r-j=HtrP-N0y9Wx?d_3XMqPE& zfzzU|X`p*$Kc_`s!)bAoLOD%%UaCV>3$f=)4wsk>J$naflX!&Ih^Npj(ZbxeuwHH_ zd?`UT^d0PVXhri72Q+aT#WH$IIUX`~FVJ+DWcED1(?!#T9?BHX!+n@Gf@#vs(?XOz zA7--nAhzFpfwp8oo$R6t)SYek*OT-SB`fTdsyaw^wGDVr0WC{G>v>cqZlS3>4K9BA zyZbJrIy#H__=`fckR!|&o)gXqKZ_xvRU9LhiQC1Kl1{3HRI5f&r`WAjE31{8l?Rlk zl|3p?Rf+1BI$PbU{@x?UqtWA(XQby`&t}haUIwosuf1N~-e&Ix@3THupC+G9jkm_G zY0-SCHE4^p4caZ*4((;_4V_NcpgZRq?YqMFeZMfj)qb6RH~feCKjgnRKo?LHuqB`; z&>pxx@be%;P({$TpsrwR@VemR!H$rCkfM;5kk*isq0yo1Lwmvs!|K9*4i5`&jgTS| zB8nnvBOLl5{W$$P{i(>5$T5*kk)4sBN9m#lN6n0CiaKpj8cGfO4Hu2x#$02A@j!G$ zbVGDU^bJ#nsljx@^ks}^Oj=B7Oh?R*v0<^fv2$a$$DWMsiklv{IqvniZ{j24$Hce9 zcP9)^n4i!-hz8{iYD|nsEK6)jd_T!AsW7Q7X~%Cv0k4m~D)$(YD{#A@}IlF*Z@q7#M->qX&rZ z3A#ncAnd~b9Da0}FvgcW;N~-Mr<*~KU5?8wU`hx@FLE4_QmDe^mazYz$>mniZhF<_ zR#FUC&nd@O;h(V1<@O+N{2!d*UKGGCxZK_p$GTl^AN09?E;qg^RJ+_d3KCAb+`gni zU+c`rkK%-Xx!j!;1ZIFU{2elj(J1#ql(voxG?U6NeHWese>_KUNj%+D-b#hG3#YtZNHS6zmX#IcXBig$a4z5P)mye zABWxmSW;ljxUDo4aAoy@k-O_~&jxJuGNhGA=PYvqEkPPCbC8B7FI6(~nE?({8YGPj z@Xg0FLw42TX+azwT7V~yZI*q@aC+3C ztmUB3ELs4&7QLeZ<(`daU#g_^^YwqjDY}40ftH-6i;-g$a^jeCew|~p4&fY|r$mD>u#SAu@AzY7G7$YtFjhQ6G42n?imM(HdQteE5w*-jF<488qj*X{ zeNCh!{Iik)^$@_s>uM_Mu?;OE9d&pZAkCs|Xi>@m6Dt=K%mX&_fk``R&KThKUd+hG z(Rko@0(!xTs2h{ftKAP;PNgES6H2g&trWdu8D=ZfsT`u;J83;_pf_kMb%=8)+X4r4#fgdL4^#;q)kdi+QFV zYlKnEz>F*!{G%8atDG}`c}=B7RbO3YHk z?uRYs2V0H@TaE`i&Gp{qvWL3tbeEmsvfcTObowo>d@UBw*;RAuYiG?YUtH;YWwkqP zn_U`RU%OED*zBXYZO?PU0b7OxwhRaCG__o8tM!h<<_;O^cBH!<8DrZzClwuHY;*B3 z>@uMlhBju(Zxc;5ZNZ}rhOup$iDTQ8lS_))(!$#kil@&uY`P!kxyL#WKCfsKO!@7Q zkW6g%R^kzWM{&E9;4ykqe!I6?m3T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/static/themes/pimcore/fonts/robotoslab-regular.ttf b/docs/static/themes/pimcore/fonts/robotoslab-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9c36f36071729ae3ea3e8d5f1875a09729b44301 GIT binary patch literal 38804 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%0Dbj(K8EgX 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

exW(pmYyuoPS8g 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�!5~{^5zCW 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 T&kdhvhfThnUFDlidVl}fTd@}u literal 0 HcmV?d00001 diff --git a/docs/static/themes/pimcore/img/favicon.png b/docs/static/themes/pimcore/img/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..52928789fe7578677f91938a1fad7578e3345a53 GIT binary patch literal 1955 zcmaJ?dr%Yi7LE$EqFmJ50u{J-ji^MM#|9EfNU$WE@VEpr7!k{(F3ElKC&wof9ui>I(d^@Vd^I!}iMJmt?1c=eV znMfi6EB0nP5FUxNELbf|#*-y+Tsf+t!7dEVpwSU*5{b9Xpo8UE2o7W*nQASceBWXv z18N1IypttiNOVF(rH;LGI@TMoTDIbivV~AF5y6f;4om&?9uAE20rP#{V=wf?fnu=OPL*hH8MP72>L2q#~3BF$mQh zh{Gf@2ox#d(9$0sHu zwwzkh+x~I8DJ{5mMM}HWfBf)AWwonCTi6zW+AyDWc;0a_FyK(}uRQer+`aILf{D8W zVb;ev!?VWjIbQc%#J=IVoc~B9?wiI+z7`Be4U5yG9zV#mnnub;OlM7n_QK4n^c;cs zNWtNPgR-IW`%FRP8#)cTKGk;bv?FM>_Y-Km#^FWIjxQLIYk9ca@w@n4eJ=j^05o@vVaR(093 z?($2cGuf3xX5IdZc<<)o^p{IUJ3`(+v?B1qD0|oX8K*?-V>B991qOO~mMnETox2MQ ze{Z=N6G0{~WwY74b8~&ZR<@o_Uf1NtsjtjpMnpu^_fM|l^KWMu3km|>Oi6)_#$mBs zsoYpqRrQ8S^W{+&1*u}dOban{&=%QzQ<>IR2~itFkEr60+91_tbyz%#b1w>L3c zy~5M8Yq+PkcPWKJskYQ6UHj@(&&Wu(ZNryqHjMcP@XD`ORGd4vFV$XovjF8{c&u=k5SsR_ok`ZPSt%`T!Uf%t;=pd)TYjTKQiTB zX@AEz;3%b8-#b|Q4cR)u`aLt}Wc$&eck-a9JmEjBHCG-)z`R3a!t@C+^^oIC{Sc>R r!n>(?;*0sgg!7ZXMP;^3Sl#_djohdWEwSP(*KadM6c05Eb|3gZ(kLS% literal 0 HcmV?d00001 diff --git a/docs/static/themes/pimcore/img/logo-white.svg b/docs/static/themes/pimcore/img/logo-white.svg new file mode 100644 index 0000000000..541e195532 --- /dev/null +++ b/docs/static/themes/pimcore/img/logo-white.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + diff --git a/docs/static/themes/pimcore/js/build/pimcore.js b/docs/static/themes/pimcore/js/build/pimcore.js new file mode 100644 index 0000000000..a3e8f4950d --- /dev/null +++ b/docs/static/themes/pimcore/js/build/pimcore.js @@ -0,0 +1,340 @@ +/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; + +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m(" + + + + + +
+ insert('theme::partials/version_info', ['params' => $params]); ?> + + + + +
+
+
+ section('content'); ?> +
+
+
+ diff --git a/docs/static/themes/pimcore/templates/partials/change_version.php b/docs/static/themes/pimcore/templates/partials/change_version.php new file mode 100644 index 0000000000..297a804114 --- /dev/null +++ b/docs/static/themes/pimcore/templates/partials/change_version.php @@ -0,0 +1,52 @@ + + + + + + + Version: + + + + + + + \ No newline at end of file diff --git a/docs/static/themes/pimcore/templates/partials/disqus.php b/docs/static/themes/pimcore/templates/partials/disqus.php new file mode 100644 index 0000000000..e4f295a8ed --- /dev/null +++ b/docs/static/themes/pimcore/templates/partials/disqus.php @@ -0,0 +1,26 @@ + + +
+ +
+ + + + diff --git a/docs/static/themes/pimcore/templates/partials/edit_on.php b/docs/static/themes/pimcore/templates/partials/edit_on.php new file mode 100644 index 0000000000..8e311200ac --- /dev/null +++ b/docs/static/themes/pimcore/templates/partials/edit_on.php @@ -0,0 +1,7 @@ +getHTML()->getEditOn(); +if ($edit_on) { ?> + + Edit on + + diff --git a/docs/static/themes/pimcore/templates/partials/navbar_content.php b/docs/static/themes/pimcore/templates/partials/navbar_content.php new file mode 100644 index 0000000000..da94f86183 --- /dev/null +++ b/docs/static/themes/pimcore/templates/partials/navbar_content.php @@ -0,0 +1,23 @@ + + + + +

+ + + + + +
+ + + + \ No newline at end of file diff --git a/docs/static/themes/pimcore/templates/partials/version_info.php b/docs/static/themes/pimcore/templates/partials/version_info.php new file mode 100644 index 0000000000..f73137e621 --- /dev/null +++ b/docs/static/themes/pimcore/templates/partials/version_info.php @@ -0,0 +1,34 @@ + + +
+ Built + + $params['build_versions']['source'], + '{short_commit_hash}' => substr($params['build_versions']['source'], 0, 6) + ]; + + $from = 'from '; + $from .= sprintf( + '%s', + str_replace(array_keys($replacements), array_values($replacements), $versionInfo['source_url']), + str_replace(array_keys($replacements), array_values($replacements), $versionInfo['source_name']) + ); + + echo $from; + } + ?> + + with + + + pimcore-docs@ + + . +
+ + diff --git a/docs/themes/common/less/vendor/bootstrap.less b/docs/themes/common/less/vendor/bootstrap.less deleted file mode 100644 index ea876e6f89..0000000000 --- a/docs/themes/common/less/vendor/bootstrap.less +++ /dev/null @@ -1,536 +0,0 @@ -/*! - * Bootstrap v3.3.7 (http://getbootstrap.com) - * Copyright 2011-2017 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! - * Generated using the Bootstrap Customizer (http://getbootstrap.com/docs/3.3/customize/?id=350e77845e8549be4ed71b83bdc02365) - * Config saved to config.json and https://gist.github.com/350e77845e8549be4ed71b83bdc02365 - */ -/*! - * Bootstrap v3.3.7 (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -html { - font-family: sans-serif; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} -audio:not([controls]) { - display: none; - height: 0; -} -[hidden], -template { - display: none; -} -a { - background-color: transparent; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - font-size: 2em; - margin: 0.67em 0; -} -mark { - background: #ff0; - color: #000; -} -small { - font-size: 80%; -} -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - color: inherit; - font: inherit; - margin: 0; -} -button { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} -input { - line-height: normal; -} -input[type="checkbox"], -input[type="radio"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - -webkit-appearance: textfield; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} -legend { - border: 0; - padding: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-collapse: collapse; - border-spacing: 0; -} -td, -th { - padding: 0; -} -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-size: 10px; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #333333; - background-color: #ffffff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: #337ab7; - text-decoration: none; -} -a:hover, -a:focus { - color: #23527c; - text-decoration: underline; -} -a:focus { - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive { - display: block; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 6px; -} -.img-thumbnail { - padding: 4px; - line-height: 1.42857143; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; - display: inline-block; - max-width: 100%; - height: auto; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - margin: -1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -[role="button"] { - cursor: pointer; -} -.nav { - margin-bottom: 0; - padding-left: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} -.nav > li.disabled > a { - color: #777777; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #777777; - text-decoration: none; - background-color: transparent; - cursor: not-allowed; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #337ab7; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid #dddddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - background-color: #ffffff; - border: 1px solid #dddddd; - border-bottom-color: transparent; - cursor: default; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - text-align: center; - margin-bottom: 5px; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #dddddd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #dddddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #337ab7; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - text-align: center; - margin-bottom: 5px; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #dddddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #dddddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-right-radius: 0; - border-top-left-radius: 0; -} -.clearfix:before, -.clearfix:after, -.nav:before, -.nav:after { - content: " "; - display: table; -} -.clearfix:after, -.nav:after { - clear: both; -} -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; -} -.affix { - position: fixed; -} diff --git a/docs/themes/common/less/vendor/highlight.less b/docs/themes/common/less/vendor/highlight.less deleted file mode 100755 index be182d0b50..0000000000 --- a/docs/themes/common/less/vendor/highlight.less +++ /dev/null @@ -1,77 +0,0 @@ -/* - -Darcula color scheme from the JetBrains family of IDEs - -*/ - - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #2b2b2b; -} - -.hljs { - color: #bababa; -} - -.hljs-strong, -.hljs-emphasis { - color: #a8a8a2; -} - -.hljs-bullet, -.hljs-quote, -.hljs-link, -.hljs-number, -.hljs-regexp, -.hljs-literal { - color: #6896ba; -} - -.hljs-code, -.hljs-selector-class { - color: #a6e22e; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-section, -.hljs-attribute, -.hljs-name, -.hljs-variable { - color: #cb7832; -} - -.hljs-params { - color: #b9b9b9; -} - -.hljs-string { - color: #6a8759; -} - -.hljs-subst, -.hljs-type, -.hljs-built_in, -.hljs-builtin-name, -.hljs-symbol, -.hljs-selector-id, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-template-tag, -.hljs-template-variable, -.hljs-addition { - color: #e0c46c; -} - -.hljs-comment, -.hljs-deletion, -.hljs-meta { - color: #7f7f7f; -} diff --git a/docs/themes/common/less/vendor/normalize.less b/docs/themes/common/less/vendor/normalize.less deleted file mode 100755 index f9fca6136e..0000000000 --- a/docs/themes/common/less/vendor/normalize.less +++ /dev/null @@ -1,419 +0,0 @@ -/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */ - -/** - * 1. Change the default font family in all browsers (opinionated). - * 2. Prevent adjustments of font size after orientation changes in IE and iOS. - */ - -html { - font-family: sans-serif; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/** - * Remove the margin in all browsers (opinionated). - */ - -body { - margin: 0; -} - -/* HTML5 display definitions - ========================================================================== */ - -/** - * Add the correct display in IE 9-. - * 1. Add the correct display in Edge, IE, and Firefox. - * 2. Add the correct display in IE. - */ - -article, -aside, -details, /* 1 */ -figcaption, -figure, -footer, -header, -main, /* 2 */ -menu, -nav, -section, -summary { /* 1 */ - display: block; -} - -/** - * Add the correct display in IE 9-. - */ - -audio, -canvas, -progress, -video { - display: inline-block; -} - -/** - * Add the correct display in iOS 4-7. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ - -progress { - vertical-align: baseline; -} - -/** - * Add the correct display in IE 10-. - * 1. Add the correct display in IE. - */ - -template, /* 1 */ -[hidden] { - display: none; -} - -/* Links - ========================================================================== */ - -/** - * 1. Remove the gray background on active links in IE 10. - * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. - */ - -a { - background-color: transparent; /* 1 */ - -webkit-text-decoration-skip: objects; /* 2 */ -} - -/** - * Remove the outline on focused links when they are also active or hovered - * in all browsers (opinionated). - */ - -a:active, -a:hover { - outline-width: 0; -} - -/* Text-level semantics - ========================================================================== */ - -/** - * 1. Remove the bottom border in Firefox 39-. - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ - -abbr[title] { - border-bottom: none; /* 1 */ - text-decoration: underline; /* 2 */ - text-decoration: underline dotted; /* 2 */ -} - -/** - * Prevent the duplicate application of `bolder` by the next rule in Safari 6. - */ - -b, -strong { - font-weight: inherit; -} - -/** - * Add the correct font weight in Chrome, Edge, and Safari. - */ - -b, -strong { - font-weight: bolder; -} - -/** - * Add the correct font style in Android 4.3-. - */ - -dfn { - font-style: italic; -} - -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/** - * Add the correct background and color in IE 9-. - */ - -mark { - background-color: #ff0; - color: #000; -} - -/** - * Add the correct font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove the border on images inside links in IE 10-. - */ - -img { - border-style: none; -} - -/** - * Hide the overflow in IE. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* Grouping content - ========================================================================== */ - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/** - * Add the correct margin in IE 8. - */ - -figure { - margin: 1em 40px; -} - -/** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ - -hr { - box-sizing: content-box; /* 1 */ - height: 0; /* 1 */ - overflow: visible; /* 2 */ -} - -/* Forms - ========================================================================== */ - -/** - * 1. Change font properties to `inherit` in all browsers (opinionated). - * 2. Remove the margin in Firefox and Safari. - */ - -button, -input, -select, -textarea { - font: inherit; /* 1 */ - margin: 0; /* 2 */ -} - -/** - * Restore the font weight unset by the previous rule. - */ - -optgroup { - font-weight: bold; -} - -/** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ - -button, -input { /* 1 */ - overflow: visible; -} - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ - -button, -select { /* 1 */ - text-transform: none; -} - -/** - * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` - * controls in Android 4. - * 2. Correct the inability to style clickable types in iOS and Safari. - */ - -button, -html [type="button"], /* 1 */ -[type="reset"], -[type="submit"] { - -webkit-appearance: button; /* 2 */ -} - -/** - * Remove the inner border and padding in Firefox. - */ - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; -} - -/** - * Restore the focus styles unset by the previous rule. - */ - -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; -} - -/** - * Change the border, margin, and padding in all browsers (opinionated). - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ - -legend { - box-sizing: border-box; /* 1 */ - color: inherit; /* 2 */ - display: table; /* 1 */ - max-width: 100%; /* 1 */ - padding: 0; /* 3 */ - white-space: normal; /* 1 */ -} - -/** - * Remove the default vertical scrollbar in IE. - */ - -textarea { - overflow: auto; -} - -/** - * 1. Add the correct box sizing in IE 10-. - * 2. Remove the padding in IE 10-. - */ - -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ - -[type="search"] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} - -/** - * Remove the inner padding and cancel buttons in Chrome and Safari on OS X. - */ - -[type="search"]::-webkit-search-cancel-button, -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Correct the text style of placeholders in Chrome, Edge, and Safari. - */ - -::-webkit-input-placeholder { - color: inherit; - opacity: 0.54; -} - -/** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ - -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} diff --git a/docs/themes/pimcore/config.json b/docs/themes/pimcore/config.json new file mode 100755 index 0000000000..5640881e93 --- /dev/null +++ b/docs/themes/pimcore/config.json @@ -0,0 +1,22 @@ +{ + "favicon": "img/favicon.png", + "css": [], + "js": [ + "js/build/pimcore.min.js" + ], + "fonts": [ + "//fonts.googleapis.com/css?family=Open+Sans:100,200,300,400,500,600,700,800,900" + ], + "variants": { + "core": { + "css": [ + "css/pimcore-core.min.css" + ] + }, + "generic": { + "css": [ + "css/pimcore-generic.min.css" + ] + } + } +} diff --git a/docs/themes/pimcore/css/pimcore-core.min.css b/docs/themes/pimcore/css/pimcore-core.min.css new file mode 100755 index 0000000000..04cf4e0e15 --- /dev/null +++ b/docs/themes/pimcore/css/pimcore-core.min.css @@ -0,0 +1,5 @@ +/*! + * Pimcore Documentation + * License: GPLv3 + */ +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hidden{display:none!important}*,:after,:before{box-sizing:border-box}body{margin:0;padding:0}body,html{height:100%;background-color:#fff;color:#2d2d2d}.Columns__left{background-color:#f7f7f7}.Columns__right__content{padding:10px;background-color:#fff}.Collapsible__content{display:none}.Collapsible__trigger{margin:12px;padding:7px 10px;background-color:transparent;border:none;float:right;background-image:none;filter:none;box-shadow:none}.Collapsible__trigger--bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#0078be;box-shadow:none}.Collapsible__trigger:hover{background-color:#c5c5cb;box-shadow:none}.Collapsible__trigger:hover .Collapsible__trigger--bar{background-color:#3f4657;box-shadow:none}@media screen and (min-width:768px){body{background-color:#0078be}.Navbar{position:fixed;z-index:1030;width:100%}.Collapsible__trigger{display:none!important}.Collapsible__content{display:block!important}.Columns{height:100%}.Columns:after,.Columns:before{content:" ";display:table}.Columns:after{clear:both}.Columns__left,.Columns__right{position:relative;min-height:1px;float:left;overflow:auto;height:100%}.Columns__left{width:25%;border-right:1px solid #e7e7e9;overflow-x:hidden}.Columns__right{width:75%}.Columns__right__content{padding:0 20px 20px;min-height:100%}}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;line-height:1.5}h1,h2,h3,h4,h5,h6{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300}.s-content body{font-size:15px}.s-content h1,.s-content h2,.s-content h3,.s-content h4,.s-content h5,.s-content h6{font-weight:300;-webkit-font-smoothing:antialiased;cursor:text;line-height:1.4em;margin-top:.3em;margin-bottom:.3em}.s-content h1 code,.s-content h1 tt,.s-content h2 code,.s-content h2 tt,.s-content h3 code,.s-content h3 tt,.s-content h4 code,.s-content h4 tt,.s-content h5 code,.s-content h5 tt,.s-content h6 code,.s-content h6 tt{font-size:inherit}.s-content h1 i,.s-content h2 i,.s-content h3 i,.s-content h4 i,.s-content h5 i,.s-content h6 i{font-size:.7em}.s-content h1 p,.s-content h2 p,.s-content h3 p,.s-content h4 p,.s-content h5 p,.s-content h6 p{margin-top:0}.s-content h1{font-size:2.66666667em;color:#000}.s-content h2{font-size:2em;border-bottom:1px solid #eee;color:#000}.s-content h3{font-size:1.73333333em}.s-content h4{font-size:1.46666667em}.s-content h5{font-size:1.2em}.s-content h6{font-size:1.06666667em;color:#555}.s-content a{text-decoration:underline}.s-content p{line-height:1.8em;margin-bottom:20px}.s-content ol,.s-content ul{padding-left:30px}.s-content ul p,.s-content ul ul{margin:0}.s-content dl{padding:0}.s-content dl dt{font-weight:700;font-style:italic;padding:0;margin:15px 0 5px}.s-content dl dt:first-child{padding:0}.s-content dl dd{margin:0 0 15px;padding:0 15px}.s-content blockquote{font-size:1.2em;border-left:4px solid #ddd;padding:7px 15px}.s-content blockquote p{font-size:inherit}.s-content table{width:100%;padding:0;border-collapse:collapse}.s-content table tr{border-top:1px solid #eee;background-color:#fff;margin:0;padding:0}.s-content table tr:nth-child(2n){background-color:#f8f8f8}.s-content table th{font-weight:700;background:#eee}.s-content table td,.s-content table th{border:1px solid #eee;margin:0;padding:6px 13px}.s-content blockquote>:first-child,.s-content dl dd>:first-child,.s-content dl dt>:first-child,.s-content ol>:first-child,.s-content table td>:first-child,.s-content table th>:first-child,.s-content ul>:first-child{margin-top:0}.s-content blockquote>:last-child,.s-content dl dd>:last-child,.s-content dl dt>:last-child,.s-content ol>:last-child,.s-content table td>:last-child,.s-content table th>:last-child,.s-content ul>:last-child{margin-bottom:0}.s-content img{max-width:100%;display:block;margin:0 auto}.s-content code{font-family:Monaco,Menlo,Consolas,Courier New,monospace}.s-content code,.s-content tt{margin:0 2px;padding:0 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px}.s-content pre{background:#fdf6e3;color:#657b83;line-height:1.5em;overflow:auto;padding:20px;margin:0 -20px 20px}.s-content pre code{margin:0;padding:0;white-space:pre}.s-content pre code,.s-content pre tt{background-color:transparent;border:none}.s-content pre{border:none;border-radius:0;padding:10px 30px;margin-left:-20px;margin-right:-20px}@media (min-width:1150px){.Columns__right--float .Columns__right__content{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.Columns__right--float .Columns__right__content article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.Columns__right--float .Columns__right__content article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.Columns__right--float .Page__header,.Columns__right--float .Pager,.Columns__right--float .s-content blockquote,.Columns__right--float .s-content dl,.Columns__right--float .s-content h2,.Columns__right--float .s-content h3,.Columns__right--float .s-content h4,.Columns__right--float .s-content h5,.Columns__right--float .s-content h6,.Columns__right--float .s-content hr,.Columns__right--float .s-content ol,.Columns__right--float .s-content p,.Columns__right--float .s-content table,.Columns__right--float .s-content ul{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%}.Columns__right--float .s-content table{background-color:#fff;white-space:normal}.Columns__right--float .s-content table code,.Columns__right--float .s-content table pre{white-space:normal}.Columns__right--float .s-content blockquote:before,.Columns__right--float .s-content dl:before,.Columns__right--float .s-content h2:before,.Columns__right--float .s-content h3:before,.Columns__right--float .s-content h4:before,.Columns__right--float .s-content h5:before,.Columns__right--float .s-content h6:before,.Columns__right--float .s-content hr:before,.Columns__right--float .s-content ol:before,.Columns__right--float .s-content p:before,.Columns__right--float .s-content ul:before{width:100%;height:10px;display:block;clear:both}.Columns__right--float .s-content blockquote dl,.Columns__right--float .s-content blockquote h2,.Columns__right--float .s-content blockquote h3,.Columns__right--float .s-content blockquote h4,.Columns__right--float .s-content blockquote h5,.Columns__right--float .s-content blockquote h6,.Columns__right--float .s-content blockquote hr,.Columns__right--float .s-content blockquote ol,.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content blockquote ul,.Columns__right--float .s-content dl dl,.Columns__right--float .s-content dl h2,.Columns__right--float .s-content dl h3,.Columns__right--float .s-content dl h4,.Columns__right--float .s-content dl h5,.Columns__right--float .s-content dl h6,.Columns__right--float .s-content dl hr,.Columns__right--float .s-content dl ol,.Columns__right--float .s-content dl p,.Columns__right--float .s-content dl pre,.Columns__right--float .s-content dl ul,.Columns__right--float .s-content h2 dl,.Columns__right--float .s-content h2 h2,.Columns__right--float .s-content h2 h3,.Columns__right--float .s-content h2 h4,.Columns__right--float .s-content h2 h5,.Columns__right--float .s-content h2 h6,.Columns__right--float .s-content h2 hr,.Columns__right--float .s-content h2 ol,.Columns__right--float .s-content h2 p,.Columns__right--float .s-content h2 pre,.Columns__right--float .s-content h2 ul,.Columns__right--float .s-content h3 dl,.Columns__right--float .s-content h3 h2,.Columns__right--float .s-content h3 h3,.Columns__right--float .s-content h3 h4,.Columns__right--float .s-content h3 h5,.Columns__right--float .s-content h3 h6,.Columns__right--float .s-content h3 hr,.Columns__right--float .s-content h3 ol,.Columns__right--float .s-content h3 p,.Columns__right--float .s-content h3 pre,.Columns__right--float .s-content h3 ul,.Columns__right--float .s-content h4 dl,.Columns__right--float .s-content h4 h2,.Columns__right--float .s-content h4 h3,.Columns__right--float .s-content h4 h4,.Columns__right--float .s-content h4 h5,.Columns__right--float .s-content h4 h6,.Columns__right--float .s-content h4 hr,.Columns__right--float .s-content h4 ol,.Columns__right--float .s-content h4 p,.Columns__right--float .s-content h4 pre,.Columns__right--float .s-content h4 ul,.Columns__right--float .s-content h5 dl,.Columns__right--float .s-content h5 h2,.Columns__right--float .s-content h5 h3,.Columns__right--float .s-content h5 h4,.Columns__right--float .s-content h5 h5,.Columns__right--float .s-content h5 h6,.Columns__right--float .s-content h5 hr,.Columns__right--float .s-content h5 ol,.Columns__right--float .s-content h5 p,.Columns__right--float .s-content h5 pre,.Columns__right--float .s-content h5 ul,.Columns__right--float .s-content h6 dl,.Columns__right--float .s-content h6 h2,.Columns__right--float .s-content h6 h3,.Columns__right--float .s-content h6 h4,.Columns__right--float .s-content h6 h5,.Columns__right--float .s-content h6 h6,.Columns__right--float .s-content h6 hr,.Columns__right--float .s-content h6 ol,.Columns__right--float .s-content h6 p,.Columns__right--float .s-content h6 pre,.Columns__right--float .s-content h6 ul,.Columns__right--float .s-content hr dl,.Columns__right--float .s-content hr h2,.Columns__right--float .s-content hr h3,.Columns__right--float .s-content hr h4,.Columns__right--float .s-content hr h5,.Columns__right--float .s-content hr h6,.Columns__right--float .s-content hr hr,.Columns__right--float .s-content hr ol,.Columns__right--float .s-content hr p,.Columns__right--float .s-content hr pre,.Columns__right--float .s-content hr ul,.Columns__right--float .s-content ol dl,.Columns__right--float .s-content ol h2,.Columns__right--float .s-content ol h3,.Columns__right--float .s-content ol h4,.Columns__right--float .s-content ol h5,.Columns__right--float .s-content ol h6,.Columns__right--float .s-content ol hr,.Columns__right--float .s-content ol ol,.Columns__right--float .s-content ol p,.Columns__right--float .s-content ol pre,.Columns__right--float .s-content ol ul,.Columns__right--float .s-content p dl,.Columns__right--float .s-content p h2,.Columns__right--float .s-content p h3,.Columns__right--float .s-content p h4,.Columns__right--float .s-content p h5,.Columns__right--float .s-content p h6,.Columns__right--float .s-content p hr,.Columns__right--float .s-content p ol,.Columns__right--float .s-content p p,.Columns__right--float .s-content p pre,.Columns__right--float .s-content p ul,.Columns__right--float .s-content ul dl,.Columns__right--float .s-content ul h2,.Columns__right--float .s-content ul h3,.Columns__right--float .s-content ul h4,.Columns__right--float .s-content ul h5,.Columns__right--float .s-content ul h6,.Columns__right--float .s-content ul hr,.Columns__right--float .s-content ul ol,.Columns__right--float .s-content ul p,.Columns__right--float .s-content ul pre,.Columns__right--float .s-content ul ul{width:auto;float:none;display:block}.Columns__right--float .s-content hr{border-color:#ddd}.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content li p,.Columns__right--float .s-content li pre{width:100%}.Columns__right--float .s-content pre{float:left;clear:right;width:50%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0}.Columns__right--float .s-content pre code{padding:0 .5em}}a{text-decoration:none;color:#cd1017}a.external:after{content:" " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=)}a.broken{color:red}p{margin:0 0 1em}hr{clear:both;margin:1em 0;border:0;border-top:1px solid #ddd}code{color:#3f4657}.Button{display:inline-block;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;border-radius:4px}.Button--small{font-size:12px;line-height:1.5;border-radius:3px}.Button--default{color:#333;background-color:#fff;border-color:#ccc}.Button--default.Button--active{color:#333;background-color:#e6e6e6;border-color:#adadad}.ButtonGroup{position:relative;display:inline-block;vertical-align:middle}.ButtonGroup .Button+.Button{margin-left:-1px}.ButtonGroup>.Button{position:relative;float:left}.ButtonGroup>.Button:focus,.ButtonGroup>.Button:hover{z-index:2}.ButtonGroup>.Button.Button--active,.ButtonGroup>.Button:active{z-index:3}.ButtonGroup>.Button:not(:first-child):not(:last-child){border-radius:0}.ButtonGroup>.Button:first-child{margin-left:0}.ButtonGroup>.Button:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.ButtonGroup>.Button:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.Brand{display:block;padding:15px 20px;font-size:18px;text-shadow:none;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;color:#0078be}.Brand,.Navbar{background-color:#3f4657}.Navbar{height:50px;box-shadow:0 1px 5px rgba(0,0,0,.25);margin-bottom:0}.Navbar .Brand{float:left;line-height:20px;height:50px}.CodeToggler__text{font-size:12px;line-height:1.5;padding:6px 10px 6px 0;display:inline-block;vertical-align:middle}.Nav{margin:0;padding:0}.Nav__arrow{display:inline-block;position:relative;width:16px;margin-left:-16px}.Nav__arrow:before{position:absolute;display:block;content:"";margin:-.25em 0 0 -.4em;left:50%;top:50%;width:.5em;height:.5em;border-right:.15em solid #3f4657;border-top:.15em solid #3f4657;transform:rotate(45deg);transition-duration:.3s}.Nav__item{display:block}.Nav__item a{display:block;margin:0;padding:6px 15px 6px 20px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#3f4657;font-size:15px;text-shadow:none;border-color:#e7e7e9}.Nav__item a:hover{color:#3f4657;text-shadow:none;background-color:#c5c5cb}.Nav .Nav{display:none;margin-left:15px}.Nav .Nav .Nav__item a{margin:0 0 0 -15px;padding:3px 30px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;color:#2d2d2d;opacity:.7}.Nav .Nav .Nav__item a:hover{opacity:1}.Nav .Nav .Nav__item--active a{color:#3f4657}.Nav__item--active>a,.Nav__item--open>a{background-color:#c5c5cb}.Nav__item--open>.Nav{display:block}.Nav__item--open>a>.Nav__arrow:before{margin-left:-.25em;transform:rotate(135deg)}.Page__header{margin:0 0 10px;padding:0;border-bottom:1px solid #eee}.Page__header:after,.Page__header:before{content:" ";display:table}.Page__header:after{clear:both}.Page__header h1{margin:0;padding:0;line-height:57px}.Page__header--separator{height:.6em}.Page__header a{text-decoration:none}.Links{padding:0 20px}.Links a{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#0078be;line-height:2em}.Search{position:relative}.Search__field{display:block;width:100%;height:34px;padding:6px 30px 6px 20px;color:#555;border-width:0 0 1px;border-bottom:1px solid #ccc;background:#fff;transition:border-color .15s ease-in-out}.Search__field:focus{border-color:#0078be;outline:0}.Search__icon{position:absolute;right:9px;top:9px;width:16px;height:16px}.Navbar .Search{float:right;margin:8px 20px}.Navbar .Search__field{box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-width:0;border-radius:4px;padding-left:10px}.TableOfContents{font-size:16px;padding-left:0;border-left:6px solid #efefef}.TableOfContents p{margin-bottom:0}.TableOfContents a{text-decoration:none}.TableOfContents .TableOfContents{border-left-width:0}.Pager{padding-left:0;margin:1em 0;list-style:none;text-align:center;clear:both}.Pager:after,.Pager:before{content:" ";display:table}.Pager:after{clear:both}.Pager li{display:inline}.Pager li>a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.Pager li>a:focus,.Pager li>a:hover{text-decoration:none;background-color:#eee}.Pager--next>a{float:right}.Pager--prev>a{float:left}.container{margin-right:auto;margin-left:auto}@media (min-width:992px){.container{width:970px}}@media (min-width:768px){.container{width:750px}}@media (min-width:1200px){.container{width:1170px}}.container--inner{width:80%;margin:0 auto}.Homepage{padding-top:60px!important;background-color:#0078be;border-radius:0;border:none;color:#3f4657;overflow:hidden;padding-bottom:0;margin-bottom:0;box-shadow:none}.HomepageTitle h2{width:80%;font-size:30px;margin:20px auto;text-align:center}.HomepageImage img{display:block;max-width:80%;margin:0 auto;height:auto}.HomepageButtons{padding:20px 0;background-color:#c5c5cb;text-align:center}.HomepageButtons .Button--hero{padding:20px 30px;border-radius:0;text-shadow:none;opacity:.8;margin:0 10px;text-transform:uppercase;border:5px solid #3f4657;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;background-image:none;filter:none;box-shadow:none}@media (max-width:768px){.HomepageButtons .Button--hero{display:block;margin-bottom:10px}}.HomepageButtons .Button--hero:hover{opacity:1}.HomepageButtons .Button--hero.Button--secondary{background-color:#c5c5cb;color:#3f4657}.HomepageButtons .Button--hero.Button--primary{background-color:#3f4657;color:#f7f7f7}.HomepageContent{background-color:#fff;padding:40px 0}@media (min-width:769px){.HomepageContent .row{margin:0 -15px}.HomepageContent .col-third{width:33.333333%;float:left;position:relative;min-height:1px;padding-left:15px;padding-right:15px}}.HomepageContent ol li,.HomepageContent ul li{list-style:none;padding-bottom:.5em}.HomepageContent ol li:before,.HomepageContent ul li:before{content:"";width:0;height:0;border:3px solid transparent;border-left-color:#0078be;float:left;display:block;margin:6px 6px 6px -12px}.HomepageContent .lead{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300;font-size:16px;margin-bottom:20px;line-height:1.4}@media (min-width:768px){.HomepageContent{padding:40px 20px}.HomepageContent .lead{font-size:21px}}.HomepageFooter{background-color:#3f4657;border-radius:0;color:#0078be;border:none;box-shadow:none}@media (max-width:768px){.HomepageFooter{padding:0 20px;text-align:center}.HomepageFooter .HomepageFooter__links{padding-left:0;list-style-type:none}}@media (min-width:769px){.HomepageFooter .HomepageFooter__links{float:left}.HomepageFooter .HomepageFooter__twitter{float:right}}.HomepageFooter__links{margin:40px 0}.HomepageFooter__links li a{line-height:32px;font-size:16px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700}.HomepageFooter__links li a:hover{color:#0078be;text-decoration:underline}.HomepageFooter__twitter{margin:40px 0}.HomepageFooter .Twitter{margin-bottom:20px}.s-content code{text-rendering:auto;-webkit-font-smoothing:initial;font-size:13px}.s-content pre{margin:20px -20px;background:#002b36}.s-content pre code{font-size:13px}.code-section pre{margin-top:0}.code-section .tab-pane{display:none}.code-section .tab-pane.active{display:block}.code-section .nav-tabs{list-style:none;border-bottom:none;padding-left:0;clear:left;margin-bottom:0}.code-section .nav-tabs:after,.code-section .nav-tabs:before{content:" ";display:table}.code-section .nav-tabs:after{clear:both}.code-section .nav-tabs li{float:left}.code-section .nav-tabs li a{display:block;background-color:#ddd;border-radius:4px 4px 0 0;border-color:#eee #eee #ddd;color:#333;padding:7px 12px;margin-right:4px}.code-section .nav-tabs li.active>a,.code-section .nav-tabs li.active>a:focus,.code-section .nav-tabs li.active>a:hover{background-color:#002b36;border-color:#222;color:#fff}.hljs{display:block;overflow-x:auto;padding:.5em;background:#002b36;color:#839496}.hljs-comment,.hljs-quote{color:#586e75}.hljs-addition,.hljs-keyword,.hljs-selector-tag{color:#859900}.hljs-doctag,.hljs-literal,.hljs-meta .hljs-meta-string,.hljs-number,.hljs-regexp,.hljs-string{color:#2aa198}.hljs-name,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-title{color:#268bd2}.hljs-attr,.hljs-attribute,.hljs-class .hljs-title,.hljs-template-variable,.hljs-type,.hljs-variable{color:#b58900}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-meta .hljs-keyword,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-subst,.hljs-symbol{color:#cb4b16}.hljs-built_in,.hljs-deletion{color:#dc322f}.hljs-formula{background:#073642}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.alert{color:#464a4e;background:#e7e8ea;border-left:5px solid #dddfe2;min-height:20px;margin:15px 0;padding:15px;position:relative}.alert.alert-note{color:#004085;background:#cce5ff;border-color:#b8daff}.alert.alert-success{color:#155724;background:#d4edda;border-color:#c3e6cb}.alert.alert-warning{color:#856404;background:#fff3cd;border-color:#ffeeba}.alert.alert-danger,.alert.alert-error{color:#721c24;background:#f8d7da;border-color:#f5c6cb}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-before:auto}blockquote,pre{border:1px solid #999;font-style:italic}blockquote,img,pre{page-break-inside:avoid}img{border:0}a,a:visited{text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}q{quotes:none}q:before{content:""}q:after{content:" (" attr(cite) ")"}.page-break{display:block;page-break-before:always}.hidden-print,.Pager,aside{display:none}.Columns__right{width:100%!important}.s-content a:after{content:" (" attr(href) ")";font-size:80%;word-wrap:break-word}.s-content a[href^="#"]:after{content:""}h1 a[href]:after{font-size:50%}}body{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif}.Brand{background:#222;color:#fff}.Brand .Brand__logo{color:transparent;display:block;max-width:170px;height:50px;background:transparent url(../img/logo-white.svg) no-repeat 0}.Brand .subtitle{margin-top:5px;margin-bottom:0}.Pager{margin:30px 0 10px}.breadcrumbs,.s-content h2{margin-top:25px}.s-content a{text-decoration:none}.s-content img{margin:0}@media screen and (min-width:768px){.s-content img.img-narrow{max-width:50%}}.s-content table{margin-top:15px;margin-bottom:15px}.s-content blockquote{font-size:16px;border-color:#ffeaae;background:#fffdf6;color:#666;margin-left:0;margin-right:0}.s-content h1 .headerlink,.s-content h2 .headerlink,.s-content h3 .headerlink,.s-content h4 .headerlink,.s-content h5 .headerlink,.s-content h6 .headerlink{color:transparent;font-size:75%;font-weight:400;line-height:1;margin:0;padding:0 0 0 6px}.s-content h1:hover .headerlink,.s-content h2:hover .headerlink,.s-content h3:hover .headerlink,.s-content h4:hover .headerlink,.s-content h5:hover .headerlink,.s-content h6:hover .headerlink{color:#c5c5cb}.s-content h1:hover .headerlink:hover,.s-content h2:hover .headerlink:hover,.s-content h3:hover .headerlink:hover,.s-content h4:hover .headerlink:hover,.s-content h5:hover .headerlink:hover,.s-content h6:hover .headerlink:hover{color:#0078be}.disqus-separator{margin:15px 0 20px}.Columns__landing .Nav{padding-left:15px}.ribbon-box{position:relative}.ribbon-box .ribbon{position:absolute;right:-5px;top:-5px;z-index:1;overflow:hidden;width:86px;height:86px;text-align:right}.ribbon-box.navigation .ribbon{right:-26px;top:-78px}.ribbon-box .ribbon span{font-size:10px;font-weight:700;color:#fff;text-transform:uppercase;text-align:center;line-height:20px;transform:rotate(45deg);-webkit-transform:rotate(45deg);width:115px;display:block;background:linear-gradient(#2989d8,#1e5799);box-shadow:0 3px 10px -5px #000;position:absolute;top:24px;right:-23px}.ribbon-box .ribbon span:before{left:0;border-color:#1e5799 transparent transparent #1e5799}.ribbon-box .ribbon span:after,.ribbon-box .ribbon span:before{content:"";position:absolute;top:100%;z-index:-1;border-style:solid;border-width:3px}.ribbon-box .ribbon span:after{right:0;border-color:#1e5799 #1e5799 transparent transparent}@media screen and (max-width:768px){.ribbon-box.navigation .ribbon{top:44px;pointer-events:none}}.extension-card{border:1px solid #e7e7e9;border-radius:4px;padding:20px;height:100%;position:relative}.extension-card .button{display:inline-block;padding:5px 14px;border:1px solid #e7e7e9;border-radius:15px}.extension-card .button:hover{background-color:#e7e7e9}.action-box{font-size:12px;float:right}.action-box .edit_on{color:grey;margin-left:3px;display:block;text-align:right}.action-box .version-switcher{font-size:16px;display:block;margin-bottom:5px}.action-box .version-switcher select{margin-left:3px}.column{margin:20px 0}@media screen and (min-width:768px){.Columns__landing{display:flex;flex-wrap:wrap}.Columns__landing .column{width:48%}.Columns__landing .column:nth-child(2n){margin-left:4%}}aside.Collapsible .version-info{font-size:11px;margin-bottom:25px}.SearchResults .SearchResults__highlight{font-weight:400;background:#bee7ff}.SearchResults .SearchResults__text,.SearchResults .SearchResults__title,.SearchResults .SearchResults__url,.SearchResults .SearchResults__warning{font-weight:400}.SearchResults .SearchResults__text a,.SearchResults .SearchResults__title a,.SearchResults .SearchResults__url a,.SearchResults .SearchResults__warning a{color:#0078be}.landingpage .Nav__item--open>a{background:transparent!important}.landingpage .Columns__landing div>.Nav li a{background:none;line-height:1.5}.landingpage .Columns__landing div>.Nav>li>a{display:block;color:#0078be;padding-left:0;font-size:16px;margin-top:15px}.landingpage .Columns__landing div>.Nav>li ul>li>a{padding-left:16px}.Banner{margin:40px 0 10px}.Banner .img{width:100%}.lightbox{display:none;position:fixed;z-index:999;top:0;left:0;right:0;bottom:0;padding:1em;background:rgba(0,0,0,.8)}.lightbox:target{display:block}.lightbox img{width:100%;height:100%;object-fit:scale-down}.image-as-lightbox+p>img,img.lightbox-thumbnail{max-width:50%;max-height:350px} \ No newline at end of file diff --git a/docs/themes/pimcore/css/pimcore-generic.min.css b/docs/themes/pimcore/css/pimcore-generic.min.css new file mode 100755 index 0000000000..c16cdddad7 --- /dev/null +++ b/docs/themes/pimcore/css/pimcore-generic.min.css @@ -0,0 +1,5 @@ +/*! + * Pimcore Documentation + * License: GPLv3 + */ +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hidden{display:none!important}*,:after,:before{box-sizing:border-box}body{margin:0;padding:0}body,html{height:100%;background-color:#fff;color:#2d2d2d}.Columns__left{background-color:#f7f7f7}.Columns__right__content{padding:10px;background-color:#fff}.Collapsible__content{display:none}.Collapsible__trigger{margin:12px;padding:7px 10px;background-color:transparent;border:none;float:right;background-image:none;filter:none;box-shadow:none}.Collapsible__trigger--bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#0078be;box-shadow:none}.Collapsible__trigger:hover{background-color:#c5c5cb;box-shadow:none}.Collapsible__trigger:hover .Collapsible__trigger--bar{background-color:#3f4657;box-shadow:none}@media screen and (min-width:768px){body{background-color:#0078be}.Navbar{position:fixed;z-index:1030;width:100%}.Collapsible__trigger{display:none!important}.Collapsible__content{display:block!important}.Columns{height:100%}.Columns:after,.Columns:before{content:" ";display:table}.Columns:after{clear:both}.Columns__left,.Columns__right{position:relative;min-height:1px;float:left;overflow:auto;height:100%}.Columns__left{width:25%;border-right:1px solid #e7e7e9;overflow-x:hidden}.Columns__right{width:75%}.Columns__right__content{padding:0 20px 20px;min-height:100%}}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;line-height:1.5}h1,h2,h3,h4,h5,h6{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300}.s-content body{font-size:15px}.s-content h1,.s-content h2,.s-content h3,.s-content h4,.s-content h5,.s-content h6{font-weight:300;-webkit-font-smoothing:antialiased;cursor:text;line-height:1.4em;margin-top:.3em;margin-bottom:.3em}.s-content h1 code,.s-content h1 tt,.s-content h2 code,.s-content h2 tt,.s-content h3 code,.s-content h3 tt,.s-content h4 code,.s-content h4 tt,.s-content h5 code,.s-content h5 tt,.s-content h6 code,.s-content h6 tt{font-size:inherit}.s-content h1 i,.s-content h2 i,.s-content h3 i,.s-content h4 i,.s-content h5 i,.s-content h6 i{font-size:.7em}.s-content h1 p,.s-content h2 p,.s-content h3 p,.s-content h4 p,.s-content h5 p,.s-content h6 p{margin-top:0}.s-content h1{font-size:2.66666667em;color:#000}.s-content h2{font-size:2em;border-bottom:1px solid #eee;color:#000}.s-content h3{font-size:1.73333333em}.s-content h4{font-size:1.46666667em}.s-content h5{font-size:1.2em}.s-content h6{font-size:1.06666667em;color:#555}.s-content a{text-decoration:underline}.s-content p{line-height:1.8em;margin-bottom:20px}.s-content ol,.s-content ul{padding-left:30px}.s-content ul p,.s-content ul ul{margin:0}.s-content dl{padding:0}.s-content dl dt{font-weight:700;font-style:italic;padding:0;margin:15px 0 5px}.s-content dl dt:first-child{padding:0}.s-content dl dd{margin:0 0 15px;padding:0 15px}.s-content blockquote{font-size:1.2em;border-left:4px solid #ddd;padding:7px 15px}.s-content blockquote p{font-size:inherit}.s-content table{width:100%;padding:0;border-collapse:collapse}.s-content table tr{border-top:1px solid #eee;background-color:#fff;margin:0;padding:0}.s-content table tr:nth-child(2n){background-color:#f8f8f8}.s-content table th{font-weight:700;background:#eee}.s-content table td,.s-content table th{border:1px solid #eee;margin:0;padding:6px 13px}.s-content blockquote>:first-child,.s-content dl dd>:first-child,.s-content dl dt>:first-child,.s-content ol>:first-child,.s-content table td>:first-child,.s-content table th>:first-child,.s-content ul>:first-child{margin-top:0}.s-content blockquote>:last-child,.s-content dl dd>:last-child,.s-content dl dt>:last-child,.s-content ol>:last-child,.s-content table td>:last-child,.s-content table th>:last-child,.s-content ul>:last-child{margin-bottom:0}.s-content img{max-width:100%;display:block;margin:0 auto}.s-content code{font-family:Monaco,Menlo,Consolas,Courier New,monospace}.s-content code,.s-content tt{margin:0 2px;padding:0 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px}.s-content pre{background:#fdf6e3;color:#657b83;line-height:1.5em;overflow:auto;padding:20px;margin:0 -20px 20px}.s-content pre code{margin:0;padding:0;white-space:pre}.s-content pre code,.s-content pre tt{background-color:transparent;border:none}.s-content pre{border:none;border-radius:0;padding:10px 30px;margin-left:-20px;margin-right:-20px}@media (min-width:1150px){.Columns__right--float .Columns__right__content{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.Columns__right--float .Columns__right__content article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.Columns__right--float .Columns__right__content article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.Columns__right--float .Page__header,.Columns__right--float .Pager,.Columns__right--float .s-content blockquote,.Columns__right--float .s-content dl,.Columns__right--float .s-content h2,.Columns__right--float .s-content h3,.Columns__right--float .s-content h4,.Columns__right--float .s-content h5,.Columns__right--float .s-content h6,.Columns__right--float .s-content hr,.Columns__right--float .s-content ol,.Columns__right--float .s-content p,.Columns__right--float .s-content table,.Columns__right--float .s-content ul{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%}.Columns__right--float .s-content table{background-color:#fff;white-space:normal}.Columns__right--float .s-content table code,.Columns__right--float .s-content table pre{white-space:normal}.Columns__right--float .s-content blockquote:before,.Columns__right--float .s-content dl:before,.Columns__right--float .s-content h2:before,.Columns__right--float .s-content h3:before,.Columns__right--float .s-content h4:before,.Columns__right--float .s-content h5:before,.Columns__right--float .s-content h6:before,.Columns__right--float .s-content hr:before,.Columns__right--float .s-content ol:before,.Columns__right--float .s-content p:before,.Columns__right--float .s-content ul:before{width:100%;height:10px;display:block;clear:both}.Columns__right--float .s-content blockquote dl,.Columns__right--float .s-content blockquote h2,.Columns__right--float .s-content blockquote h3,.Columns__right--float .s-content blockquote h4,.Columns__right--float .s-content blockquote h5,.Columns__right--float .s-content blockquote h6,.Columns__right--float .s-content blockquote hr,.Columns__right--float .s-content blockquote ol,.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content blockquote ul,.Columns__right--float .s-content dl dl,.Columns__right--float .s-content dl h2,.Columns__right--float .s-content dl h3,.Columns__right--float .s-content dl h4,.Columns__right--float .s-content dl h5,.Columns__right--float .s-content dl h6,.Columns__right--float .s-content dl hr,.Columns__right--float .s-content dl ol,.Columns__right--float .s-content dl p,.Columns__right--float .s-content dl pre,.Columns__right--float .s-content dl ul,.Columns__right--float .s-content h2 dl,.Columns__right--float .s-content h2 h2,.Columns__right--float .s-content h2 h3,.Columns__right--float .s-content h2 h4,.Columns__right--float .s-content h2 h5,.Columns__right--float .s-content h2 h6,.Columns__right--float .s-content h2 hr,.Columns__right--float .s-content h2 ol,.Columns__right--float .s-content h2 p,.Columns__right--float .s-content h2 pre,.Columns__right--float .s-content h2 ul,.Columns__right--float .s-content h3 dl,.Columns__right--float .s-content h3 h2,.Columns__right--float .s-content h3 h3,.Columns__right--float .s-content h3 h4,.Columns__right--float .s-content h3 h5,.Columns__right--float .s-content h3 h6,.Columns__right--float .s-content h3 hr,.Columns__right--float .s-content h3 ol,.Columns__right--float .s-content h3 p,.Columns__right--float .s-content h3 pre,.Columns__right--float .s-content h3 ul,.Columns__right--float .s-content h4 dl,.Columns__right--float .s-content h4 h2,.Columns__right--float .s-content h4 h3,.Columns__right--float .s-content h4 h4,.Columns__right--float .s-content h4 h5,.Columns__right--float .s-content h4 h6,.Columns__right--float .s-content h4 hr,.Columns__right--float .s-content h4 ol,.Columns__right--float .s-content h4 p,.Columns__right--float .s-content h4 pre,.Columns__right--float .s-content h4 ul,.Columns__right--float .s-content h5 dl,.Columns__right--float .s-content h5 h2,.Columns__right--float .s-content h5 h3,.Columns__right--float .s-content h5 h4,.Columns__right--float .s-content h5 h5,.Columns__right--float .s-content h5 h6,.Columns__right--float .s-content h5 hr,.Columns__right--float .s-content h5 ol,.Columns__right--float .s-content h5 p,.Columns__right--float .s-content h5 pre,.Columns__right--float .s-content h5 ul,.Columns__right--float .s-content h6 dl,.Columns__right--float .s-content h6 h2,.Columns__right--float .s-content h6 h3,.Columns__right--float .s-content h6 h4,.Columns__right--float .s-content h6 h5,.Columns__right--float .s-content h6 h6,.Columns__right--float .s-content h6 hr,.Columns__right--float .s-content h6 ol,.Columns__right--float .s-content h6 p,.Columns__right--float .s-content h6 pre,.Columns__right--float .s-content h6 ul,.Columns__right--float .s-content hr dl,.Columns__right--float .s-content hr h2,.Columns__right--float .s-content hr h3,.Columns__right--float .s-content hr h4,.Columns__right--float .s-content hr h5,.Columns__right--float .s-content hr h6,.Columns__right--float .s-content hr hr,.Columns__right--float .s-content hr ol,.Columns__right--float .s-content hr p,.Columns__right--float .s-content hr pre,.Columns__right--float .s-content hr ul,.Columns__right--float .s-content ol dl,.Columns__right--float .s-content ol h2,.Columns__right--float .s-content ol h3,.Columns__right--float .s-content ol h4,.Columns__right--float .s-content ol h5,.Columns__right--float .s-content ol h6,.Columns__right--float .s-content ol hr,.Columns__right--float .s-content ol ol,.Columns__right--float .s-content ol p,.Columns__right--float .s-content ol pre,.Columns__right--float .s-content ol ul,.Columns__right--float .s-content p dl,.Columns__right--float .s-content p h2,.Columns__right--float .s-content p h3,.Columns__right--float .s-content p h4,.Columns__right--float .s-content p h5,.Columns__right--float .s-content p h6,.Columns__right--float .s-content p hr,.Columns__right--float .s-content p ol,.Columns__right--float .s-content p p,.Columns__right--float .s-content p pre,.Columns__right--float .s-content p ul,.Columns__right--float .s-content ul dl,.Columns__right--float .s-content ul h2,.Columns__right--float .s-content ul h3,.Columns__right--float .s-content ul h4,.Columns__right--float .s-content ul h5,.Columns__right--float .s-content ul h6,.Columns__right--float .s-content ul hr,.Columns__right--float .s-content ul ol,.Columns__right--float .s-content ul p,.Columns__right--float .s-content ul pre,.Columns__right--float .s-content ul ul{width:auto;float:none;display:block}.Columns__right--float .s-content hr{border-color:#ddd}.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content li p,.Columns__right--float .s-content li pre{width:100%}.Columns__right--float .s-content pre{float:left;clear:right;width:50%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0}.Columns__right--float .s-content pre code{padding:0 .5em}}a{text-decoration:none;color:#0078be}a.external:after{content:" " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=)}a.broken{color:red}p{margin:0 0 1em}hr{clear:both;margin:1em 0;border:0;border-top:1px solid #ddd}code{color:#3f4657}.Button{display:inline-block;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;border-radius:4px}.Button--small{font-size:12px;line-height:1.5;border-radius:3px}.Button--default{color:#333;background-color:#fff;border-color:#ccc}.Button--default.Button--active{color:#333;background-color:#e6e6e6;border-color:#adadad}.ButtonGroup{position:relative;display:inline-block;vertical-align:middle}.ButtonGroup .Button+.Button{margin-left:-1px}.ButtonGroup>.Button{position:relative;float:left}.ButtonGroup>.Button:focus,.ButtonGroup>.Button:hover{z-index:2}.ButtonGroup>.Button.Button--active,.ButtonGroup>.Button:active{z-index:3}.ButtonGroup>.Button:not(:first-child):not(:last-child){border-radius:0}.ButtonGroup>.Button:first-child{margin-left:0}.ButtonGroup>.Button:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.ButtonGroup>.Button:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.Brand{display:block;padding:15px 20px;font-size:18px;text-shadow:none;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;color:#0078be}.Brand,.Navbar{background-color:#3f4657}.Navbar{height:50px;box-shadow:0 1px 5px rgba(0,0,0,.25);margin-bottom:0}.Navbar .Brand{float:left;line-height:20px;height:50px}.CodeToggler__text{font-size:12px;line-height:1.5;padding:6px 10px 6px 0;display:inline-block;vertical-align:middle}.Nav{margin:0;padding:0}.Nav__arrow{display:inline-block;position:relative;width:16px;margin-left:-16px}.Nav__arrow:before{position:absolute;display:block;content:"";margin:-.25em 0 0 -.4em;left:50%;top:50%;width:.5em;height:.5em;border-right:.15em solid #3f4657;border-top:.15em solid #3f4657;transform:rotate(45deg);transition-duration:.3s}.Nav__item{display:block}.Nav__item a{display:block;margin:0;padding:6px 15px 6px 20px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#3f4657;font-size:15px;text-shadow:none;border-color:#e7e7e9}.Nav__item a:hover{color:#3f4657;text-shadow:none;background-color:#c5c5cb}.Nav .Nav{display:none;margin-left:15px}.Nav .Nav .Nav__item a{margin:0 0 0 -15px;padding:3px 30px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;color:#2d2d2d;opacity:.7}.Nav .Nav .Nav__item a:hover{opacity:1}.Nav .Nav .Nav__item--active a{color:#3f4657}.Nav__item--active>a,.Nav__item--open>a{background-color:#c5c5cb}.Nav__item--open>.Nav{display:block}.Nav__item--open>a>.Nav__arrow:before{margin-left:-.25em;transform:rotate(135deg)}.Page__header{margin:0 0 10px;padding:0;border-bottom:1px solid #eee}.Page__header:after,.Page__header:before{content:" ";display:table}.Page__header:after{clear:both}.Page__header h1{margin:0;padding:0;line-height:57px}.Page__header--separator{height:.6em}.Page__header a{text-decoration:none}.Links{padding:0 20px}.Links a{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#0078be;line-height:2em}.Search{position:relative}.Search__field{display:block;width:100%;height:34px;padding:6px 30px 6px 20px;color:#555;border-width:0 0 1px;border-bottom:1px solid #ccc;background:#fff;transition:border-color .15s ease-in-out}.Search__field:focus{border-color:#0078be;outline:0}.Search__icon{position:absolute;right:9px;top:9px;width:16px;height:16px}.Navbar .Search{float:right;margin:8px 20px}.Navbar .Search__field{box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-width:0;border-radius:4px;padding-left:10px}.TableOfContents{font-size:16px;padding-left:0;border-left:6px solid #efefef}.TableOfContents p{margin-bottom:0}.TableOfContents a{text-decoration:none}.TableOfContents .TableOfContents{border-left-width:0}.Pager{padding-left:0;margin:1em 0;list-style:none;text-align:center;clear:both}.Pager:after,.Pager:before{content:" ";display:table}.Pager:after{clear:both}.Pager li{display:inline}.Pager li>a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.Pager li>a:focus,.Pager li>a:hover{text-decoration:none;background-color:#eee}.Pager--next>a{float:right}.Pager--prev>a{float:left}.container{margin-right:auto;margin-left:auto}@media (min-width:992px){.container{width:970px}}@media (min-width:768px){.container{width:750px}}@media (min-width:1200px){.container{width:1170px}}.container--inner{width:80%;margin:0 auto}.Homepage{padding-top:60px!important;background-color:#0078be;border-radius:0;border:none;color:#3f4657;overflow:hidden;padding-bottom:0;margin-bottom:0;box-shadow:none}.HomepageTitle h2{width:80%;font-size:30px;margin:20px auto;text-align:center}.HomepageImage img{display:block;max-width:80%;margin:0 auto;height:auto}.HomepageButtons{padding:20px 0;background-color:#c5c5cb;text-align:center}.HomepageButtons .Button--hero{padding:20px 30px;border-radius:0;text-shadow:none;opacity:.8;margin:0 10px;text-transform:uppercase;border:5px solid #3f4657;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;background-image:none;filter:none;box-shadow:none}@media (max-width:768px){.HomepageButtons .Button--hero{display:block;margin-bottom:10px}}.HomepageButtons .Button--hero:hover{opacity:1}.HomepageButtons .Button--hero.Button--secondary{background-color:#c5c5cb;color:#3f4657}.HomepageButtons .Button--hero.Button--primary{background-color:#3f4657;color:#f7f7f7}.HomepageContent{background-color:#fff;padding:40px 0}@media (min-width:769px){.HomepageContent .row{margin:0 -15px}.HomepageContent .col-third{width:33.333333%;float:left;position:relative;min-height:1px;padding-left:15px;padding-right:15px}}.HomepageContent ol li,.HomepageContent ul li{list-style:none;padding-bottom:.5em}.HomepageContent ol li:before,.HomepageContent ul li:before{content:"";width:0;height:0;border:3px solid transparent;border-left-color:#0078be;float:left;display:block;margin:6px 6px 6px -12px}.HomepageContent .lead{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300;font-size:16px;margin-bottom:20px;line-height:1.4}@media (min-width:768px){.HomepageContent{padding:40px 20px}.HomepageContent .lead{font-size:21px}}.HomepageFooter{background-color:#3f4657;border-radius:0;color:#0078be;border:none;box-shadow:none}@media (max-width:768px){.HomepageFooter{padding:0 20px;text-align:center}.HomepageFooter .HomepageFooter__links{padding-left:0;list-style-type:none}}@media (min-width:769px){.HomepageFooter .HomepageFooter__links{float:left}.HomepageFooter .HomepageFooter__twitter{float:right}}.HomepageFooter__links{margin:40px 0}.HomepageFooter__links li a{line-height:32px;font-size:16px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700}.HomepageFooter__links li a:hover{color:#0078be;text-decoration:underline}.HomepageFooter__twitter{margin:40px 0}.HomepageFooter .Twitter{margin-bottom:20px}.s-content code{text-rendering:auto;-webkit-font-smoothing:initial;font-size:13px}.s-content pre{margin:20px -20px;background:#002b36}.s-content pre code{font-size:13px}.code-section pre{margin-top:0}.code-section .tab-pane{display:none}.code-section .tab-pane.active{display:block}.code-section .nav-tabs{list-style:none;border-bottom:none;padding-left:0;clear:left;margin-bottom:0}.code-section .nav-tabs:after,.code-section .nav-tabs:before{content:" ";display:table}.code-section .nav-tabs:after{clear:both}.code-section .nav-tabs li{float:left}.code-section .nav-tabs li a{display:block;background-color:#ddd;border-radius:4px 4px 0 0;border-color:#eee #eee #ddd;color:#333;padding:7px 12px;margin-right:4px}.code-section .nav-tabs li.active>a,.code-section .nav-tabs li.active>a:focus,.code-section .nav-tabs li.active>a:hover{background-color:#002b36;border-color:#222;color:#fff}.hljs{display:block;overflow-x:auto;padding:.5em;background:#002b36;color:#839496}.hljs-comment,.hljs-quote{color:#586e75}.hljs-addition,.hljs-keyword,.hljs-selector-tag{color:#859900}.hljs-doctag,.hljs-literal,.hljs-meta .hljs-meta-string,.hljs-number,.hljs-regexp,.hljs-string{color:#2aa198}.hljs-name,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-title{color:#268bd2}.hljs-attr,.hljs-attribute,.hljs-class .hljs-title,.hljs-template-variable,.hljs-type,.hljs-variable{color:#b58900}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-meta .hljs-keyword,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-subst,.hljs-symbol{color:#cb4b16}.hljs-built_in,.hljs-deletion{color:#dc322f}.hljs-formula{background:#073642}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.alert{color:#464a4e;background:#e7e8ea;border-left:5px solid #dddfe2;min-height:20px;margin:15px 0;padding:15px;position:relative}.alert.alert-note{color:#004085;background:#cce5ff;border-color:#b8daff}.alert.alert-success{color:#155724;background:#d4edda;border-color:#c3e6cb}.alert.alert-warning{color:#856404;background:#fff3cd;border-color:#ffeeba}.alert.alert-danger,.alert.alert-error{color:#721c24;background:#f8d7da;border-color:#f5c6cb}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-before:auto}blockquote,pre{border:1px solid #999;font-style:italic}blockquote,img,pre{page-break-inside:avoid}img{border:0}a,a:visited{text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}q{quotes:none}q:before{content:""}q:after{content:" (" attr(cite) ")"}.page-break{display:block;page-break-before:always}.hidden-print,.Pager,aside{display:none}.Columns__right{width:100%!important}.s-content a:after{content:" (" attr(href) ")";font-size:80%;word-wrap:break-word}.s-content a[href^="#"]:after{content:""}h1 a[href]:after{font-size:50%}}body{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif}.Brand{background:#222;color:#fff}.Brand .Brand__logo{color:transparent;display:block;max-width:170px;height:26.4px;background:transparent url(../img/logo-white.svg) no-repeat 0}.Brand .subtitle{margin-top:5px;margin-bottom:0}.Pager{margin:30px 0 10px}.breadcrumbs,.s-content h2{margin-top:25px}.s-content a{text-decoration:none}.s-content img{margin:0}@media screen and (min-width:768px){.s-content img.img-narrow{max-width:50%}}.s-content table{margin-top:15px;margin-bottom:15px}.s-content blockquote{font-size:16px;border-color:#ffeaae;background:#fffdf6;color:#666;margin-left:0;margin-right:0}.s-content h1 .headerlink,.s-content h2 .headerlink,.s-content h3 .headerlink,.s-content h4 .headerlink,.s-content h5 .headerlink,.s-content h6 .headerlink{color:transparent;font-size:75%;font-weight:400;line-height:1;margin:0;padding:0 0 0 6px}.s-content h1:hover .headerlink,.s-content h2:hover .headerlink,.s-content h3:hover .headerlink,.s-content h4:hover .headerlink,.s-content h5:hover .headerlink,.s-content h6:hover .headerlink{color:#c5c5cb}.s-content h1:hover .headerlink:hover,.s-content h2:hover .headerlink:hover,.s-content h3:hover .headerlink:hover,.s-content h4:hover .headerlink:hover,.s-content h5:hover .headerlink:hover,.s-content h6:hover .headerlink:hover{color:#0078be}.disqus-separator{margin:15px 0 20px}.Columns__landing .Nav{padding-left:15px}.ribbon-box{position:relative}.ribbon-box .ribbon{position:absolute;right:-5px;top:-5px;z-index:1;overflow:hidden;width:86px;height:86px;text-align:right}.ribbon-box.navigation .ribbon{right:-26px;top:-78px}.ribbon-box .ribbon span{font-size:10px;font-weight:700;color:#fff;text-transform:uppercase;text-align:center;line-height:20px;transform:rotate(45deg);-webkit-transform:rotate(45deg);width:115px;display:block;background:linear-gradient(#2989d8,#1e5799);box-shadow:0 3px 10px -5px #000;position:absolute;top:24px;right:-23px}.ribbon-box .ribbon span:before{left:0;border-color:#1e5799 transparent transparent #1e5799}.ribbon-box .ribbon span:after,.ribbon-box .ribbon span:before{content:"";position:absolute;top:100%;z-index:-1;border-style:solid;border-width:3px}.ribbon-box .ribbon span:after{right:0;border-color:#1e5799 #1e5799 transparent transparent}@media screen and (max-width:768px){.ribbon-box.navigation .ribbon{top:44px;pointer-events:none}}.extension-card{border:1px solid #e7e7e9;border-radius:4px;padding:20px;height:100%;position:relative}.extension-card .button{display:inline-block;padding:5px 14px;border:1px solid #e7e7e9;border-radius:15px}.extension-card .button:hover{background-color:#e7e7e9}.action-box{font-size:12px;float:right}.action-box .edit_on{color:grey;margin-left:3px;display:block;text-align:right}.action-box .version-switcher{font-size:16px;display:block;margin-bottom:5px}.action-box .version-switcher select{margin-left:3px}.column{margin:20px 0}@media screen and (min-width:768px){.Columns__landing{display:flex;flex-wrap:wrap}.Columns__landing .column{width:48%}.Columns__landing .column:nth-child(2n){margin-left:4%}}aside.Collapsible .version-info{font-size:11px;margin-bottom:25px}.SearchResults .SearchResults__highlight{font-weight:400;background:#bee7ff}.SearchResults .SearchResults__text,.SearchResults .SearchResults__title,.SearchResults .SearchResults__url,.SearchResults .SearchResults__warning{font-weight:400}.SearchResults .SearchResults__text a,.SearchResults .SearchResults__title a,.SearchResults .SearchResults__url a,.SearchResults .SearchResults__warning a{color:#0078be}.landingpage .Nav__item--open>a{background:transparent!important}.landingpage .Columns__landing div>.Nav li a{background:none;line-height:1.5}.landingpage .Columns__landing div>.Nav>li>a{display:block;color:#0078be;padding-left:0;font-size:16px;margin-top:15px}.landingpage .Columns__landing div>.Nav>li ul>li>a{padding-left:16px}.Banner{margin:40px 0 10px}.Banner .img{width:100%}.lightbox{display:none;position:fixed;z-index:999;top:0;left:0;right:0;bottom:0;padding:1em;background:rgba(0,0,0,.8)}.lightbox:target{display:block}.lightbox img{width:100%;height:100%;object-fit:scale-down}.image-as-lightbox+p>img,img.lightbox-thumbnail{max-width:50%;max-height:350px} \ No newline at end of file diff --git a/docs/themes/pimcore/fonts/robotoslab-bold.eot b/docs/themes/pimcore/fonts/robotoslab-bold.eot new file mode 100755 index 0000000000000000000000000000000000000000..4e88b6cfeb0c6dcef692a784ed7a62e322634273 GIT binary patch literal 39370 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 J_r)5b{{l>b;dlT5 literal 0 HcmV?d00001 diff --git a/docs/themes/pimcore/fonts/robotoslab-bold.svg b/docs/themes/pimcore/fonts/robotoslab-bold.svg new file mode 100755 index 0000000000..0c830531b5 --- /dev/null +++ b/docs/themes/pimcore/fonts/robotoslab-bold.svg @@ -0,0 +1,688 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/themes/pimcore/fonts/robotoslab-bold.ttf b/docs/themes/pimcore/fonts/robotoslab-bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..b5120e7f3caa028717c7440eaaf6edd7846ce08c GIT binary patch literal 39120 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%0A0+ao8+W(Tg8N8ykwxbQ$0a#nur&_ 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 literal 0 HcmV?d00001 diff --git a/docs/themes/pimcore/fonts/robotoslab-bold.woff b/docs/themes/pimcore/fonts/robotoslab-bold.woff new file mode 100755 index 0000000000000000000000000000000000000000..9e98b2d356be062c31c97ec55f36eabafe514c44 GIT binary patch literal 23812 zcmZsB1B|FW5bfHwZQHhO+qUn{yoBdz%fBpZrh>5Al0ssJ({jxa!!JZJ!Ph3P)?3Ww-l_`Ef1q2VY zEUqB0{L5Ve0D$8H0Kk7js!AM+E2|0t06@b0>PY=U8qU?8!Fv#=m-MzrFzO{5MC?LBe-iLyzC@ zYW(LL!G8ei1RSt4v^D+Ze)WJLe|AA@ocePD4$EteBIG%B;fX6wXLriP(O+w3ZQsQ zpppb)-BUzUWc8c_XjiW#cJ5Q|_R`K8C`0WxFQ-clXBi2+Ry27adi0soGw_8Ce>~Cq)yV4vgbB^mT$3N=w=PKYs<2A65f&= z>w>o)xT}o52j{j*?Q-Uk?!ngS*6~)TuF~~zx9~D~2xb#yKMwuK6=HZP=y+kwU<9iRd#v&GPC;KvQ;6b{N@dOY5^KQMq!!^5BjdTYFbD?lO~h z0k;k1L(Obqv+T^qFoBjRi>j!GXp@8?`@O5!JtpUn1YlwqT^)7f$}Ea?sI9m+$c$V& z=R|AIfS%zIY}ID}_=n5l_puLWEWNrWb~ATdt*|go`(icn zQfd1A(MZFQ`?b_C;|KOuC^Ra6>e=LwU#me>CoAe-RG|GAdR-WhCjr%i-s;rs8EHW# zG>t(m0I2(@>aeOzvp;&jb^&h*EI?!pkgfS)*n((x5$jNShSxWG4-B|h0WhO3#*Z|m^mrG_#Lw8*?HzB(L7*-H-Zp z$Y@QW%+FuI*+Zs3`(1xKi8|3cG#@!`NISN2>aIjM;e=0L{X%7Ex>7kw#^~Mx$(naQ%RWRO}SptQj&v#aoj~E z@!bdWe^y*xMHgJ0>ff2l6XDB!;9BGmV{7ZmeGhgYh+$pDy#BmyB{cVsL~JMJ$)32Z z)imVXd0Mf#KJ!Vw(41+%ze$>fvgRJu=odYnyqM0({ynr(Em+Aho6GsmlKaR)lcdP^ z<({j&aEj%V(=Oz2T&M-FH7hljt~0-vHKISqsa<4OrbqLu&3NWJdA3S;p7x=TT^MV} zJzd>m^Ig(r{_f)xl~ubP{?V#y@Ll{m1pTSy{c>Mhi0H_DX?I&;&Jt8jk4aX1I9@;_ zBrcB`XhbK#Q@y323Yn82Te`(?Iw8`X?5vmIYr5k&Qo`5oUzsjmRKQdjN3QFH87suA zCeo)9zh5&)a#dqxQrHoKDzhbju*(fZQB+*1J5e1aSRz7{6_Qi#A?Z-%Om)VcXp22!Ft12^GbBG66&P_1w;zUD|Fg3fJB5&9NqQw>Qg+bTbHK9U zxIW{^)$6Er$uT9l=YpXlN1l@|F<8&puNpwC#4+WP1-HB;A+kasjMLy5yGAo&6Jg9Y z!N@JqLQw4URyBO`=P2HoxrmJ9kYma%>zG3>tnU;~P3~X%+3KXTjTt9ig9`xUovt^+ z#GeJ6u0sDh>0X-}W46n*Dc8wR+y=um-2Jo^<7MYbGY&CkLl>9}JrT0w{xy`<@_-nn zznTNwZE2#1rgWLp#QR>|{I#V0_N}X8h?>N0-LVp69TGJT2{Od7Tkm*`mtkGKD_)&8 zg*9+KT95wAe0A%;vGo7MQKNX{SwjOC#|KEmT>}HaNQTd!8GuB?$uSvukVr-W4*^az zhAF^7C4-EJfS7==J=%CU6AxgLuRjIRFxvob-4MSgqW{J+b2MHb=pFCv=ZacN3kXoe z6JpjkkuWwA0E5R!`vzyA5CKkyBJdM5Rb-4Gddv)=z0$`51{OzB&IJNK@cCUdFf{6A zSOZrXfWM(|WB+SR0|T=^zwum*V61l(=#Vk+jRuDPPa|d!P(0~y?_lp(?}Wn0ZSGt= zV_JRS8O8!_2{)7u6cLmXloON`loixFlo}Kr)E$&HN=kCD%Fn0S+Yf#jet~>|A)taj zf)0LA;Ge+YKp2%=(nvnBJig(do*)0OpU0nspQIo3pO>GJ$Cs}icX&B|j_2LmAYu4t z{?!MAiJ&ETG~QDW1LvRDF6@@=hVIbTT%6ufu)$pcfDimbGZs)7m@1n~oGhJ9o=%@n zpg^I1q5`9Rq(r58rhiWNP?1vOR25d|SQ%RDToG`^OFzG1%+0Uj{Ze-EwybL|B{qsL+31=3uBfq^qYqELYcdO%`}dek-JzWt|4CiY)` zp7`w%a{EG55di4>;G2KXW~!F%3t}iKog}eIv!u|Vu9(b@d2^$|v=|JQR6}lrx;PNk zAi6~~E=Sz>ADTVKl#M5k#QfDSv44Y8a~9ah#c!rFD_eBBFr$n`isgYFW4KiAod{Bv zMwHI@BCy-{j_MQp2<%4H_9-oqo03GvY}mPzrFEv=QmT-vlJ1-kDod$mm`R@mv-%5L z)ydZh)+M@FB$4EC_$3=Tf?g>kfhaLUI8w|)kt*g0QY+w0rNZ_liIoultWt6+Vu2|Q zDTQf86b{JvZHY6LSAjB_qEJ)0!Vg|umu@tNpXD#yxhht&C@)R9ip|-?#fsyKc#g8k zksp;zH;2)$$S7934NWxzr!zWGk}}WvA_2OjNn}@oYb@1671=G~qnhW&0h1)IQK))C zT`AfVG?efaMZR=2Op4SFy6_VH?}G&ZtYtUP#W0;SaqipSlxi?r}h4 zRg3T2;C0kkAMpigRcv*wCUD|bpg8*H=DKHVlEXYSrq#aRPrlIQy|D}M9Dv`KQ0lC= z$S4;0ZlIX1gDR_7pyyLvB~q4H{FP;t^gqgh)=*?Eo8S2=Cq(EV5b$c*+?zsdI`Y-J3n1Y6_{sf@-)y|UBwEd$vXd7 z95L1rPIys?jO)6*Oy!UAvlKy(Gg=&xbNx?82ie_ntNC{C%uRnwi}^gXdYC;nIqZ&M z{$MtE`raPyr zNzd43w*z!iRkiJ?d8;=cqr9RfFb}_l3N94B*jV)|Atrr1! zRD9W43DqgacE)jx7*pA|%s+I)@x_192Lh+h7E8ON+#Vu?sJ&a;;@nS<#F>vCm{cruFy?b?a;sH2V zoG{4>*mTQEy;|ExtZcBSQ$+sgI$v_&{=xerJ;!?AC|oBF*GKHc2G~s!woB~G!0b0oy}r@P^lOu?!YEQ$>+J;56JnGZeH*8p)X3@yRSPzbUFZbH8+TwS^1Ox#5`2m3c z-2;8WeUe2Vex~`3t`nu{-2YA#lmDGKnkOLn3kJfGI7^5i1PutYB!OHMSpei#d#W|>ji+itaYY{%wN4xe1)%~RetX^@k;S@1ncXSFDb|A-#%YnF8C#0$Bgld%7aS+ zBzq*8?PYF9#gaM(+*m3jn0BKXr=1l8q(4{_Ot01uO2`V+bfHJnmR+1;w&x$?S^iZb zzCfAx;GN{3PfjR{ENfNl9?dv&s)o8`gMv_gpt3`O14;mdsfsJOj_goI&nv)#i9y6l zy^sK6I!{sNpFY}s4!`{R&**aN_!5%T;flb%Q;8Z4&e+mAFXq$srg5}BRn^L-wAPZf ziUNmMiZVHASxGr5nQ-@!Hlu8glsiOZCql3-z-N+?bI(td?Q}CSCRsluI zAG`bhft&7^+1Ra*HX^=EHFi6juYbb7%x&z5U!P?Xebzh!DqT%>ivGub5ciIA_lw|u z+>C`ZeL7#enN{B_`gO+(>q=9pXKdV$F7h1SA6UC|@(Qz;h+%uXwSQL@c z0UBGG393l(jW2-4rnl%l3!l4moz@G-+&7yp1JmX~s9k|y-Y?hSJy*Z7?rUL3F0R6M z56@~xL9RpX0ey|Ky^iZl%@VQN*M)wiR}9XYwMgyyx*oZH+hLAwrC8PXN{uS7b=VX3 zTtjp7$<4sxLnvVz)Wx!wOvAnxFHP=~320Qo@Jgt*b}0ar zSPEPPme*8e7v@nh=G(SUEj8oDVbM_P8110xUTnU=BdE?_JEu&ZZ;M+q6D!eTQ-jFi zuV`fl-qEeKp;u?;viyEH*c$K{GRd1>Rd%Iy`*F=YR%&1fbZINjemJZs6`W zMNiLz@h@So7kmhHx-C}E`559G->Wz4(yjGUB_2&j+o>ge*-z0*dg>1yX{kU-MP97- z6?!GLBi7^;bGREd73LhtwJtGExWeM?VQ}47f0gw*Sb~%$XKy@;qRK+>8ZX5tl-viK zH=VB23HqflW^QSSVNKR#b1#Hd8=qOYB}h4+SAw*tIZM*&ytlJM#qSLYeclnOwDvJt{IGa|?IIYUadP_X6-To5 zTGI)AmC2+Q)&-hQ41`?cSeS;4nJ%C!$V2aY+*MUvXh!$F>LrwbLnq5wB@(v-6nAFw zqmDdy(A!RT=iO5sH(iRJ`F=B?vjlE5{&{+z?tCWU^yb(X6ecT`c29(8V?KQ_i}W=y z3IX}5gQ!b|CJEU~uK)vj3Gd!I^RubDJ;yR3}>83;@)}=pRPR;k(>wLUWh=%e@EEmkPd5za;^vGhv z-2u=+z6f#KBU%PW%3rpf9(smMr`UHkZEg$c>8w%atqsrmP?F$eNF$b2rUMP@#qbZD z2%f%ruW9erw&>)4cD{GVda^$q-7D_QEg$KQ%{*Q#wIgc})R75IpRcThCybXApB8VGH;^Kwe$BMWMq`mj~qg@TKiA z87#+CPtIn7zB0T1`hEU+)!86m8+}4K_%=E4a$3tXXhP*^1?U4h#ab6t^4T6`NwS-N zB=hNzG(Lp_Nai9@Z3k+KEw7NSo}P3#_QFj+JB9l5Tp2SxiI9D`q0$&_I1+j@3asJj zy%3FQ9;5fCL>zo1pb(+yGwXpKEsT$s04{$^Qj5>>I8hYZPJMVXlgrS}IHvpJ_TyuE zeTn#{yZD38|Ay0dvJ*5W>R6&GDdK}k=e#}175

GOHY|Ayf>GgJYyIC8S#(-52>#5FcdEu~{R&R6<3pivOf4@^+t~|+Z+_L{UgS}tZ#Tn7d>>ivg0VUk^3Z)&)&p4Q zo9M*L$Drb&_UGrj=0e7FO{F^&qZnq{bQ)QP@>gDXl71Iu_uH){t=D!_RVm>T1oS0jFszbO4%dj%y6#@wZpdk(tfLfTA2psYq>{y_5xttu( z@e|2g(idGR?RZs#hy=^VeICWM?KzxCRR?_}SPgO2k=$oGbtjhJ#;G+J*!vV-ofkGm zNGACWFHJZ9YX}ESP)-#uy{+lOpyxx=$%4{OgfstJ8QLjnY}ZQy2NbWO4rX%iYii)W zo$}4s46gKa524N9bS%=(QiXXu{%+T5`qm_VDq>b(gS3`$T8(q2vfY^TD+#m zOx3OqUZ}t~wva+7 zwM1$Kmcf7uuZq5j!MIHuq%OD&#raq&6$oP?li2yarg8Kc9iO(>?^(mUEz>CTY;rw+ z+%$wJEG#sdw9PsO9PxNC3zB7V}w8{wcJCC4aL09HKDBQcdSwf&N$E+LBW>B&0f#+TBK zXAA3%<`0N{M3jBfA(Lt3BFCBgzr}&b^@@@nvbPtBup#Qpou8xR4&~}NoV5Q^lbk8(-g%Xd;D+({rAvYyr#%? z#gGFozg;48toaV;h%^0#avXIavtA8t(CQ@grZH@hV?gC;4T^{%OsOOmyw4)K4^AvY zov3ENHg!Fz$&S#(g(Z=YHT&bX^Ea#SnuZw9Fo_%BKsloYiD9a=1k6JMJlpA@0 z066}(;Ly!}_+9!h(qP6S-T?lJw4D(b1vcofCN58MNqG~+ydsqrRpi)hn@BD3#^I>& z%_5kyEG`UxpaHoO3~>JQr=W4E9F7-TUXqf4=a=zvyQN?*4ISSfnpMB6^RX_v+RQ~3 z!>aGciQMb1*Dpd)^Q8z&f1()Cf|l=8H&*C6DmF5WjTU)&T~*@GyapQq9`%UH$XzKB zBSez&V=gl`?Mj;PeNEh&h_+Gf^z+$mva|~7prhjS?n#+iW@ct$q#%jxB!|RK zv;1<{_$ep~E=!&CAkTS6pyR$3J0Ec_=W+aiyNmsKq*509cfE<1ouw@F+#a+3^{MIL zn;Si!D-BWTG$&?sUE^59+6eQ(3!{c9z@R*f%b>4@3cXA^v?#6)V7@;S2Cz1~ghXCo z6WC0IJGuz|*G6#o;U{F#IK1y4Cm<-Oe=BIcOJUx3>C(Vf!X5W>jWW|xvftx2fnFh> zd+Fea%8v$ztfj!5n8Oap9+*d?abRBA3Sk@bMzHbGkiNp2$i^$i~V#brcY#BjX&Z&2#5L70q7LLlQ`^;uO+H)4wXW7Cmw{ELS1! zG&iEyul)mMBDA`TECJo0&6K8Ve=YFUdgw+szaEwIJN#td-pH#Wm9BNT{&F@p4FsB`$h<*NtD)ai$W z9Barhu5QT>vFeH%0%?qmLJLF4$C;MVQt~~fuJ=9D`t-dRggglE9tA(NREP2DE-dpK zN*X*x_csOt2KF-xI?abh8m7ar^Xv(S0onB!7G_QNUArGW@2Yq-jA9OF%%K57F=I1^MS@HTHB}oOJAnbrbTQ6HCa`9AO|xo`#PqJR~@0*v&VIrHc#2*$C~+ zT09`gEn@+|`aW8)_$flInd4*f1EpHLBV2^KZ5Y42-+_;t_e0)@;qo~`&KLQ-J0_pP z?c7O=9P|u%f(aV!^$a~Z;YZ|@#^Z52g2U37H(R*aVn8UMfxFiuf~GQP@&1$Gf}qyq z5jl`^LatXLcetKi#2C$2OSWGt&WLgy(=7pVx)jt=(26jc{^|ev3s_8>gyF;D++uM}%>3 zqakp8yoQuZN`973oQvqcMgu0Whjz1B(giFfD~jmC#!$vCMommPv82(x7(+`A9D39j zQ`*=QBMe(kTnk9SdH_(EfsAU5>7l~F!Wx$SIMi~sy)OwUve{aNfB2qSdM@)Lo?>mQhI;gM zSqWpN3sjn@*yy~^5J(M}`HVD#6DI&>N)pl1ofwYN23@O!M1av7w1KK1c9PysyMrMF z{@9ltx^Ku8{hj+ok-H^ZY;7T|m`o=?n`Sn4@`&hEb0oK$=6+lwJqkRs>~@X!w0#4^ zU{TRI1CtfW3E^|xb!^i{tN0N9I>yW`&A>~@;N*0Z;N%V+Ewtol+Bxz5hFk>rC}$z( z^mE4=6*V*(w-HhCd}2ipDJP*$)_EJILR>P6KTtys+8pG34v_ac79#tj#R2%822NOW zIawG$vt(4H>p|@rcUi3p@?@SOQfmD~xT*IdNO`nYkXas*w1KIrx!6L<>puIeO$;-L%suPN9c`z=r85$#d*+cH2~N zO+0yF5aWjfPw`b*5~|ywN&cadoau2Eu%cjXv5XOHC-x^gJcL1sa-8VfW^y>B>o|^G z9{93jWN9(c6QRyS`6KwAhkarAevka0sCSKNKrKQHZ~;44Mu{G&_#wZ4)%;FBoStwm zs*ayY+B;KXJ_=6X6hz2GMh*gbC>V%DtuzD|dHARo>A)D5;tZ=n7{;@RC{&LRe%%w; z7Vf))zmGWf^G!RAx2Ia8&1uN~G+9gEUpSn+f70^Ie{JnV$MkkM-&S~=V-D*Cq+v7w zyFAa&+(?~5D!6gDH~?CZj?<;* z#RbN9&s{>tYr7&u^DRAdgVy^MnzosnH zx0{I0()dwScALNhGI&_vDm;DNnV?P2+)jLQ(Tz>W zY|$Qm*E&eYpKlmD-849-=9_`~;(cynMW^Xugn#gZe~Y?1$A^X1|Kae6`mZe#?LPbH zj|=&roMP-{)Jztq)u|?_D*o2b>c>N=P}~X=bV&>zbLB>z`pwQm1d}z*d``^g4XLdb z!K!dOW}`_;GKS~>!aI!(9C?}~4f|CbXt?tEBz3S(`rlaTTef0}O zlqqO?ZbFitS6c_lH5mT$3-@~&7+bN$CKI-hkZNZKE;B^QsMzjo_ z9`UFd*ORlyRVW@0vaye3g)7F5U^tiL>GlY&PktK2QlrU&fI^^zQlY@G6aI{iISp8~ z>x`OPPFk|nG8Rr8x)f5AttN1Q|Mm`;^|Pl5Ywm8!sFsH&fVVvfD(q9018o&uOXnL zp9rx%0!Il-Dv^_8OYZQX_fk17LFv_9CKXD1>_IuA>NHiD-t61Q(pq}Dy7Ra@OA9$W zC$9oA7iMH4YkhCr$2>Mb4}w+hnKLJpBp_9yfOT+BWl+5g;TboGiJhK4$aM%hI?9D@ z5}5Z|+Q>`L9g)FmyQ%QECx6hRL_y+5K-2B|HMS7}!);_{8fzO3Q6mMZ-V4`Hi3}(_ zK5@r~QY@3NLgTiZfpIbu!He1^gTpFQgyE{eC9lufVj&F`oW`#TV(kMxK1G&-OeL+9 z(^*pnA>V}^$ngy5BZOQNJ8C^Vk>}W=LEEWJWbC!iYNlEoqrRsqq>32c4`TeCJX!-Y zmCWOn-fsdwO%747(xn#b$Fse`pXssZA{(i1u2HP9DIPyiMp_eg;;LjvX7D1`?^|H@<>fnZQ}gn)4feJ5 zDrnlt6C@#a8?F@d$etjQYn+wM(O*=E;*Hv~0#dIpw7n7ka)fKPH3)zIqUB_uEe00D zTJD;69}`_O zP{9XRL3c2gZ!z#u$vQdF-jL9@XV3M|1tH#bO$B|*Rmp6< z>5xy+-nN#$<-6rbP`h$A^(Z=c?AacaU{6U&cZDm3z1FKO#<|bI^&}{MRG2ng_w(7h zl#gm}wRyKnzhjrdkzYo({e~FrWjpkZoVVDrsm{snx^OrwD9Ni#6}sJVHq33l674)f z!>7mf_!cJe6a1-haoxrHaE-B3T18(|`Gl>rqQR?Y1TaX7K}5|1r9w)XU`>U^!?kq6 zli`ynL_aN&wAX;v`u7NwcupxPX%4HwfvDw=6ebSWA%h)h=j{FyVANx=_H8kPq^PFSdEm9qJm@%X zKl-Cmk?ioN#NseeVTVQF%N~kShXV8_)pD&a6ChO}U#l@hs6|DBbu8H?Vg$F;n;E0s zUrdtDe6$aVVYkb=1VGGfKO%Q97vX6nV+Fiy=P4ZeSck)UJRo%M{VFW))Z-jpL5Eoa zr)?wswzqxp;u*sed_2Hj+;2EPr2^tPIU<{4mVh;+QmZN{@SH)MRn~~6CED&H89|(} zowZ*(o$(r&kqOjX{Uc6_u2ANncD?0}%tE*EF z=K>wB8gTl^nMU49-nWCL)k7|P$#v+mYYQrRf53i@{Pv<)!+i%AlBFDR^wFRL9hwP< zA<6ZHEW-F^2P{t+cH?jdC7fI7Q0dy-V}>glxTBeNjv2#}?xBQWA(?ybzYr)~Z;w+C z<6icC>N=da+tO6jO`p5Y^1m?nnorZs>y!yllUO%_pY#p>!A=N0{{Mt?otyYy0uuYi z&!Nq&B9dlUAJM16jg~s{<*6XiG!xc?Jz(Bkn0g|K5|njP$f%uETmaa{-Neq8!iN$=fmLd(Uz{X9WjFgk5a9xfk4l}O7RHO2%@YX@96B7Uld=n~+Nd_wV zgUK8;Irm-72z2F)YZ)JjJ;>o9fUeBJbL6=7y-oZFmO|(V{rK446EfxlR+cBzw~U|C z(BlNm4mK;s#>SF9X42(0AiAu=bUpW@+_gL2^d+Ba^mxkT5q$WoI;!gcwrOcZ5dl(T zyDxhv8Yoeum6GWR#g&W#2k>w~VPpe^G(%1+9E65-i?Ob^kDNV?n^qmDC`{^Lda&mG zKIQwgU>1O|$-ghst+ls1%lw3LLmQ*Cwnb)Jkea@R4PA3_kOzv~eP0Wl?;Eu7689Pv z@rTd}b{a7eI%S4@el`gwX+6dfwqWOr_gMLND8r=MHNlp=rRz39TkK;V?ekl9N(B6 z)-q@gAg_`@a-fP|dVJ5mvnnP}TdyU%J`OIqrn0^ct<5G7b!)LpZDef0t_;F&e)`&w zDbZ6UJdp=iIDARU;t_5ln?^*^QJB#4gG1}VMWn-uLV1&o{(+B^R4Kxg6$i&UUY*^l z{A8Qotx7)!e(4xiw>p#F`&BP5`Z&G0hu10%(i@fhUdTYyebWWJN(qm|v+>E_>*YMh zpDhZn6`vyXWanQd^770rlu@%VX<{0a0MEpV;X=ln_ImxG>( zQuhf<&tSa=T*B?L9?3582*G@jq*X=DqC*TSd+x4+-jK04zUB2@&t1u zbA8UEMZp&{?*Ug~2L{Oeem{k;h)kJi^gQOzo+qr1Kk^Dhdf#hLQ68W`JvN;`0sgIQ zJdd+r!s5;%h3$|hZp`=>*q2ws6r!e<ub0={rgiwuF>Y>@G8Y_xIxlS zi^z+MSn`tCqFttTm;Aql8ig!H@m!AAylH}10t%{E447%lhN zi_5$x?#xL-3mA)RyBX@eCiz&Y$1`YPD%XBW(cTH zumjFTwyPU>k>}IQ%3Y`B%&)8Wd9dYnvrygd`F+iMsa|nrzh>jk*V~{E2t71i_LsiA zOM#j(HO`f5(qeVCju>o^R~g1aXv}Hpk1|K?BUSgT4$^(dAqC7&^8S8i$(5Je8q+9_ zCbNOrJLzA6W32l7ioHVqPox|n_jZS~wJoPNf`KtYSWAmaG$L64lz}?eDMOB}04DPh z9I?TwC%LVrX2@7s#F_Bgp#|mLG^ZwIl9>$9++jBM4LQ9M9fQK(q@0Z}!1Re(ai74+ zC+J%p8Ox&yp_wGMJ@g4RS-4@U91kzhLvbRU5c}N>5!jrT-q?MOx48 z!kqoP%qUXsR4{$%j^BjLt5?P=m`_8n@B6gwf#~@)MjGJ3<&?X&zWWSOPaGZ$vnzI{`0cutg$L0*;h<2I(#V7S~?%D~Enbf=VJ0A`sRWLGqC#uu*io zaS2DQ!G@du&u8@M;wT|2U0ka-nR`~xT*-}AAMW^4GjcB7nq7=fSY?ou7&ZDJ3;Rf< zA}c_3z1XxR(0VF-LJ38`zha)nJEjw6^!O}y5z}Sz5W&?mW>^BjMTpKVjY|t2XImom zeoq2E^#b2E0o&%ljV3(wP2$7bP|T-K7yPi(w?T>a^8WBD2Z-|6-?1~X@pdY&8v<_} z(4#FuuX3cb>LRWZ0d2gMsgIj3V;|vxSMKN3IBW()ez0g{_Eg**SA+M@uLm={)hFS# z=0;p;c$TgC>fKaL@YHJwW|IS@J7kb`Yxa$M05MGpRA6wo8#Mki`SHz>7@x$V^!TzW zn7-9m#Hrah#5Q8fU@oab7$U}lW*&Ccl5r`rbYnW^GT2s=`0`Am5tu9%)A6DJ-55tv!^oQq}Tt9=AJEovx%sL@orL&0nIoh;LfhPt< zHM>03#v$UftO&*G_5eT>Hj0J6l<@2@Wmc;OJ%*OT0dGm(H5eWFB^Dljce`INda5m+ z8hf{$y$atOwD`~1X}P@C3j5VJs;X`e?6CRmd9z`{BdhVBr&f-vn<4*@uPZrdjb;5JG5Kyp7jwLBl$=lKl^wTM+kC;H1gO&mNrC-N~6{faPQi{=?8M{=k8*G_|5 z0b?+~y^3I-t;?}20kArM69O9K+1>Rrqn8L5%FKdjV2eX=g&TR!gZvo8eo+OTjlMev z^w-`tJ6YaTT%w=Y+fM$TG{~K`rFa1L&nNg|Fc%Aq_u$LOSCb}Jo<;r|4h}$RlNR?f zW>YpoUy66IF=(@8e-QpE&Pn~9t&`t$dwz}%co`4ObKdw7y*RjBoM<(@7gnu9gME+;a~ml<@k+7@31VWbR8p9y zK)R_Y){ZGCQaxD2#}9B|pXcOeqoQZ#4+nSt-8p23dL92XCA?HTX2X=lwL^9(+fa!T z`?{!bV!!K>2^q+sO zG`kM#=eH#@KJHr_>`IF2Bjt|A)^SFdxy%-`&6VqCpt#mhAv|;dh*B4PcAS@{tV0?( zFDYlh86p~&oI*KXil{~!X&`I<9_yIZYJ|lDLq$L6ig@4<5wv3AqLsavmX%V$mV>+- zxNQU^5MA6SdPNfJx8SP&o_qDT+}#!ZzGE3$oc_lBE}A3#;+}cY>$4o5{#W$33~Stq zhR(zox7xOz_@D0U=M;Ab*4X)N<=y2nGhl7~*ypnhg_%TliJa)m>D9VeO-VDE_E5MK zN;g`v8Os-v_(WZ}432*M$WW%J$=!zjHx|ud;ufxev4Sf$SDuHB^Pq&cwzY4Wr~f_Nd_QF}7J|Y2DZ23k3>zLo zKbhgR-)o!t`6@Z8zdUcG+4TyICNo!O~~75sBM1W<+#Ma1{1ljHQbWFGdd{BZ6ly%cZ;!{y;=`X=eA; z|+wUz?!sk!kj@xL~}}z2dz8stS&QkBulPVnju1QSBBHD0?KW zGP2-yNnvG3l1#lD6LOxwFspB+Y5f=yE%LxT<1mS&2L?1Tp;?C+x1O&rF{J2BETkmN ze!#>9{nsVH2xot!?h2uv*|PPUM`E|%D7=qBCYMWRG#(#(N5hW(c|ymazy3aAzpF*9 z!~NF>&n;5;D$q$^a>w|7Y-@j`=XTS<&32|dtk>o6R#174MUUJQHRS-8rl?+4egJ<8 zJ7tvYp~pjRwaZ7jq5KN`2{LZXHBl&6)T$Bv#Vojh3S~((m50c;uZ1M>#y(U>bV#F!*`t8GX=Glg$KURsD*vKQYRziui zW>fRMlZXaNQ`zqa>ksgEcU|78Ap24K(8@g1GE}U^KIR>toZO?NtB#2OvT0y$b+!=z z9>d^I!rV}YP;o&~@pfP!Gk>-!JJlm7jiN-WvAVy;1sAMJYL3CVCx}#B5|+G&>`Wh1 z(4Vk!Q@QLdJmvh=qbu23Toj&;P>+JV3H@tUs>XS2XD}Iv>;3ei;{3}rZy0P|ZI0ah zILA5f>V)mc7WKu)c=C`uh}n^?3JS+J;P9NDr=XARcigV~aepwBba)&T@;t)5egd`a zbse^wub`#DU}%yYD%wehmvOI zFAoshSx_Ut3_zePY$nN5rHp^+N2og7sWY6+$nz6(az@$jfj6OR5*-oG#*UF`sJfw* zshk!i0>s!}#06McZAJ8*qM6?|vEF!mY1+mF*}?O#I^ia(c|b!=jK4Vh&J4qD{3bf$ z21L3|C&mgYaQr1j1Nc5dm!!pOdA$GG?e5L_@bZ^*^*XJc?v6?n5u?e_6kE^0p=uCC z&n-dXa=FQnshO7?#+GB<1@2r3s^=O+Mb@RUq(Zl$RiIJwhA1d=c+bHDU2SobI_U0f z9~}kU`|8+t`#j_b`hvlB{FGeat-N*np&l&(Q=^wfL3Nme-Y-0+qtj&SFUKSJt33rm ztJ5tyLwg;fr|6Nb6!1-pH)TtQ-ZE#0Vf{M-qbCu7MBni%?8=Kua{4kYP<$Z#mMeLO zDWdNW^dn&mV8HIjSqi6+JY^}o)pn!h($%YNxQeHoz^9V4k!Qnb3uS$St^_{l+(%F) zUzW$=Ble``X;Pako4z@YL>6YXwsM{rmUSMN@=&DM>D8pX_O7q$aE&)vr5tP)15%E0 z_Kc42cf~<^T(@Bho7$V4oW=3%X5uC#jnX_VnlPmb2-3djMx)L1ft_e>-0Z_{zLXOM zRonJ}Ww8=2M2b}>#jiOyy3JF%`|ImRu???8hqogYpS2W$FYVr%5clx@xtF*GHV*VON zuu-*H%|r49+$|>m{D!~Cc+Xii!k!EUT!!A>UrfG0ks^$fO26Kjz6N6u%O-x{mf4F^ zNq)4~Dvc0!Gn+&F(;ECP5!=AyN9^|#=sP;e@jdhDgyXN`5DdB&2nX`?HysI?1GS+d z5^^s-*2q{%MnK%o z83-xM9m1$NVm*rG27!})lm6sO^K2%(l)veFtfg+LFA9}GlZT2u(}_?D{tp%=ETUCa zQUe5C2PJ13b^2OS=41>FlawkkwkC)&v6$=W9&s;Q&H5K)fby$Iv zyG{=u?}St&G_=q5V`FkrYaX`+!+2^=n9`CgjVfH>m&Ju=K5U5@`fM`X$oW0NjImV9UW zFvz9#qLtj5(gDIk&QfIdO54k5I%E29EHJ8!Tpr zXoBp}HPZ#`S$6AHGPxtxGB|rv*17Bz6P?a$Net;v@Xx%kH#Er@oCnh+L6w0i+b9*rPG~yv`tm4)u`BR zkosaM*GUmhYKOMij@Z3L33vS8OSs|z>`)StF@==jRUl3 zd?D$oB6l%YOJ#@#^<~D<6`+H0$*oeel}UlVa=tjNrpr4%-Fy}=9z47}yhc}${}@N{ z&PcNpe3?RP{w{Di!RnfeE37bn*NHjl784aKbDPs}G=RDv)N)xMAz$W`VR=i0#=J4L zPqyID34Z-tyiHCPWYGS!yp8`-alDaihDHuPPC{8mu@C(g{l;+ zq?B`rIb2L80u=wvbp^gcgI074qel@hn~IDzf}MM}Egk09kFSqtO^XQ+lp8x@ z$#O1eRI3szb{TVSYdOkOw_t83`Y7KBT~|w)UzbBq&og2=d|n$WYmn0@PZDE82u6Ku zXq8Ozag83AHHHu}LE(lrU}-1@aj{N^Y`oB!9qg9QO>K0X=`W$94g)pPnJ53eLvP#O zy<7OEcV&0mGw*ilZ-bY&z`qgpe=P>d9yc*FEMw?M>f2;2VE7{Nq4`7^O8}GZMGTjL z9tfiqTQv1Rm=tbh=#lb452E!($fq@+psC!XHkdngi2&qg`+e!SEQklU&lPJ)3CV@* z^Dtzrismg2VT59oF+}&|9AxVKbd3!TCzW6!%iG5BbQxzkyo2&Z(bQ$v{_6?jxU4<#gTR#$)1&Ew0 zdvswYATv)pg~#WSC1?g_G3Ky#nPV>d56W+TFb4rSLhv(klDv0lEV|c*y{7!Eu4R!- zzu!VV*iH+SS-_1R(gJ;;L>$-!J)p-faR5qoiPy#Jun2>@-nWaFp!9a}ym1Xm zy|aT`Z_yTL-=lx_u|hUA7!&8@8c)OJT6E6Zd|HxG#!T(`bed{(4%US`)zXaL%DS<( z4*m}BsDC&&-|06BT4R_;7POYpnGy9EQjLcx&f)SEXB7a@*_ngNJkkJUi4P|r)kV&qg2F zGgz7sPnGZrmt7NK!Pigeof6CY)W%&OayR6ID z`=CGiK9pZWCpyf)JF182G?Vx;GdyXjp=r!1d2Mq`wo3vzhFft`rC!se44>C zy&0bLw6;}{rNQxK?}5ReOd7v$$UeM?{OKJmkG1F;r+lx&9)m`=Q#V4GT^+j;9QL?4 zr&C&c&TxM9PubTXV==Oe7@m? zu1*z`#SA0FP=*b@5dF6RKl0#rvmx(`gCjQiN;BtF3?C=nou1oM(9dK@hcW;=W;n#$T~S%9yOv*S?_r8A|&zFoYksuypoL&=!w= zCmUlSuPW>Ihc#Q!XcV1NzHc^LYB8#gu4*sjkCcV{5urlulc=jhz#mRT}7lsJ0UgDqRT_p+=b1rc;QCi0H@*tE3~c10CgM zCB;RBT_}l?_{*R}cXgrTrP^e6L2!8wh>Yk3W=l^{&7G*xE2|(Pcp9!m)EU&6&5?C1 zGO{Coq9k3`4s`YJ*SCU5>q1#{XCCeELfc$V0-GLe{2x1n_#4F}bTs`JG?bw}1&U7D zr_MC!wO!<7Kl`0sKs$9NDk3o0iNKgT%$dkYc^nz{m$VG54)*O;eg=M^Pao2HOy8;2 zAja*9@%O^u{A5tHI0P?!kcy%_pJF!UD;$GtDn&wz(`c0`LNhlt*dn>2Xm!+F<*tgh zaI=}!L6k9d?_NC$fc5L!tFm`xNuZ!-kDfXHOmBK>V!SKX5fc?@(pY!s9z%@^S*M;D z`s8&jMxAlz28IsjhY;>%Q2$u9zpCQEHBY}GetvND(Ar6Kdlzecd)Ch0eQuln_D?NK zxq9J+lP;_o(f8exTY6pOyMNleIwj+*DJBlH$GU2VSJywdZO1*mM>Y&Acjy})FDouC z6Tctbt}nPOJLi!eLtgEZ+dQFP?*aUQ3(nD!r<`kGT@j#Om^O?yI27wwVXXgfFxm;4 zLbci+F!L}j>eHoyCIV2n83y~@#4%WJ>zg3~3s>iM4EFn;=6Q`#wEwpTs1K&5r*lXz zNH6H#EhpQbMSEelMbP1B8c(w(=7li4^1JqB+q#BI{TOh*hw{U*pm0~Gt`xe&hAs_@ zmRH+!>`yTp1(gZ$TtbAD(*=?;(cd(ykCL#`9keGL@V9s)WsfyVU~xk-l$BcN+i1UmqkF3s{D|^h7Pe8 z^}1(fsrEdGL%Ssp(o2liwzBSE)MF9ua+kT4a3wZjFy)5%%f<7@z87zU^~+&b7OAl{ zC12J&=^f&mGmz>1ST*7N%dR?a$yFL(BA$O@xcF7v3kk0u1$(|<9k#mUl7;6u z)1p3b4J=%|uqBXPynWTV|9tN*+BexJVff;7;!RyBUcH1RvkAemX<#G~G1kXj#v)vmD8~vNjadKwSig1}i!hRj>Tbgs0gXCNbrr=< z*Uv;@TT+0vkE^@8jQdh;D%~;Fo)uu>tbnFTyDXbJC3nw2eTU3I2l@|mnP;viN%kZF zvDIXBJD+Z}j=2H43+r~ZLVZZqQbkg2HZu-h2|<&Gsb?CFHzLGeP3?GVYzY!(-2J9j zoH(hf;=1rf-Mr7I_kMli`>zdrF}!t=Iz)XclrzBS&!VGqj&pJ@bNY0_uBvOgsu2WL z=Ey7>3-#%>H!#FgMu58WLdp~{ic*--?@Fa>KDs~xjF3iV1dLnIT*JZkL$@(GRku!? zIZyofeMw{9&|BwDnZ`eeb?V|zN4La<=ZK+E(OOGPhCS406BT*Y{=q-qK)p6Gw#|nI ze|?>+@0`q*uPv4b{!un54Na1&KePe&LiQFIGVY81r$5F=1gC(w5Ct4m3i3uRP z4QS76<({9~ci^Cohj5O`8295Y<1WYOIq|gP>ble=>)#vq*DmAkV>jUbR|SJ4{hF!s z=t?ERI};tpHc1O`ni(7pIYsE))tKWzr#VnQE0ZXi?n*gHs$Of{vwrHx@*IkW4xh2f zx_#{p8at83o)Y5AaFpJXU{P|CJI+bxP!^+gu+1!-Qq%9S$H)16ZT3DxG^*?Lc-cQS zAXw?9q7?-Y6?JK$(n6hg?XLJQ+NkXRyNxOXo+?;9_6%KAT2ph&p5TD4ZB%;l$(K5{ zQMK{q@lJd}o)=mvThxUs9Zke3d?Ah#XQZ)_{Z9OPwb$wT4{fLKKO89gJgJ|LN>Pkn zJAG za%M(yPD&0{13P>fWQ?NX+wNhLx8Wp&@`Rx~(V)En%pM!3KW<#kc5>XLRaN3Au^UE0 z^ni6Em7T^tZ6_moEh_K5sOQEzcZRNPi-?5bV1XX^IoxWISGTpyu~?L!&5=($C|-T& zNwRU1FoyaSW2g+)1EZ*c!72>TmS5`p~+kHSXFS(+z)?hIiH&^o;U}cWNwDcGgabr?T$i+R2FaOk-^jpuG;vu6GE zbBwMn`VsEZ%iHgh4~FlPcZPe5yp8A7Y{<^}O}%gWM}ukxZkqfI-8-PX39DpJv^^Ld zzK1@VRnwCYzKK2nt7Z@1;LrV4tDkXb;K%`+raUF@uMkhb)sXgAci0EuD*5DZRnrd* zq$}(X;TmTuKk^p6T&@vc$7Hb&HInuZVH^(N493`^5h$@BDfZNagf`v`QQqXA>hbb9 ze2ve26iv^41k)&72s(`C`q6W^gwT`J7yAVNP}1q7(W9eOCG@VT81UIUP^+CnH;n2+ z|3~2$2H%&%F+N6(U{T@vMp6YERQoc>kasF%TfS=U{8g*w&0D2p&A8;^nG4C~9aUfBC zd(AQ8+Pqv!!%(Ly;hY$1Z1K1{^t!S>KzC%wdoozZdopC}i?UUWxng;*a|5oPEBgK_ z-nh5E3(J>Y0r!Y8a1VTLzI2`4{;4enqCYd=bi++i-$P1_?eiGt_N#3- z-5~MLaOEHBNO`}Qo0%VsbC@~L&I7;VRZMoTU3P!ky;LD-_m+5+SM_s-%-2`#Sf(%k z=PF^nWWz|U;xlWn3pXtn&rKKg9C1I(d!V;(|h#ACFtJUz|0{?n|=GGiV(05Q|w>0z~s3{45_ z$g8305_>8%LS9=iia6!s5l@#3K{Iao<7mx|GjfM48!>Yx->{|Sfwf}e+LrsbD)U|$ z`tqT)lrQ4qC)E!Pft;J^E)x1~^xkTdkybBNUwKg`GCZj%blzo_$44@XMp>lTFHVNe zP^(GgYYtr};qX$QlQY8-p9h_9$L&1# z9(f5wzBPKmynPpC8G4A|nAF~H`JYJPQ_Mh@yx5|x8ddVvMwqA&)m9Z1$z^qWN=i!K zl)k-tl_94Ky65G19mef1&X{mr8O=Yn^ZaNFa7lix{A^6H}MB%&U{PE zih{e|5|dxoknfh5ZoXweEWDB8@R=iamMKi_wb`a}uxIN#;<7KYo-Z+7VV)hio%QhI5Y&b(OX1 zAq#XjX(mdx^MibyMXMUeLG>y2!E{rr+gWI~kYU!4V-7LHl*o4rm9kd0sU%{WDR3T8 z>D1RxHlbCJq60}i5Hj5nFD(WX>zKE8SAyt8W{6%EJs^G0skODt^d%CoeWbZJm}<{6-R_i{`iZJyI`k^Wt2`3*4ym`4 zDz%M5vyrGd7yD>(rPe+nLPY%{EPGpSCzGm95m2jRugzO&carLEmvtwSYW7iJo)VNj zM|3r%CWTt{hjj67x;eo#U!(YWQO5O=Y%*D+juUXM(55;_w6oaYd9TKENc>u6&X8wM zv%>Bss2q-%7pxSIPWn=a>N=|R9gO(jfkrcdVx3EkE@Fjhllc+xs)2bb zNSE`C3N?j#$!@EDLZLlOv%OBeua0tkos78e|G|w>9M8f(l*KUWQS7Uih3I?Xp}j!n zNDgB#=`64>Jc%b1{e$?3D>=)e-dgTs8r%x1yt?!r)=5T9`W9PsKe#%TlXpU72)>H8iEfrL zlF2Z(iu1lO`<*wecLoSMgK{>C*r?0I^RVpUE-m&Z?cQ9KPr52(k#1s=x3&q$-58LX zYv?i|uz94}P67#Y2qzpQto)LD4wZT_OLZgpa&P$yc38!90001Z+GAi~&_RL$3}p=G z7|j^hG3hXQFjX7Yb?$NeVj@xfCrF(-dbZ zUQ^;wvQe6&%%E(cT%f#8`IU-*ikV7+N{7k=RT)(W)fCk})dQ-})Oge;sU1*zr>>wL zpkAkbMngekj>a8L1OG?9)f4!^YJ)MkV-Y0 z@qcdrxy)G7WzSb2uQVs=K0C*r7Lao6tE?@D14Y_)xTH|;9X_EC`snaUUG+8{KBXt# z*x@qZTm$H=d|S)xz20B|K#ummHi_2qC)?t!(Z|FnSZmf4o)Yl93%({+lgfvhWsivxy zw5&~ZJM5Gls)aR1euy-HZ#t%Vgm3d0u5iNk43{0u*O(9T;Zd1cP0G!FA9BFt`og893u`0B+0>k_{)`<$Jqt z_s#Aj1b_T)qn7{0PmmA^l`sh>lrX}HKu07|L=!_Sam15AB1t5ZLMmyblR+j~WRpWK zdE`?-Aw?8ZLMdgmqdgtyNGCeeg|2j?J9-Rg7%^eSf|YVA=s{0<(VIT>r5`rzR8mDX z4*D~Ifed0WLm0|1hBJbZjAArn7|S@uGl7XrVlq>h$~2}kgBpq8AZu95Rd(^7b!=lZ zdpOJ?(Xoj(RbS!_9`k^Q zJmLfOJmU#ZIf0Y!?BFHOd4Y>hd|@NAaWjXxG|RCdCMD#kywe7cu9~%Ns?qqkyJ^ObjgrRPIHFyT;L{W zIma#5b5ydp#&xbpw&bvdZ;~r{k}m~PC`D2%B~mJ75zdCzW|u+dZFKAP`YNTStO#h+ zD^=aD>UN{je@^pVP#Tn)(x@~k%}R^Xsw`Iq``H2-R9}N3y58;ddg^LxT3mrG%@NS- z2&?vbn*0m1qw=o~d*B^DHKkE$iu8Y5)BYvqU}6a-)?iZp2Q-kh4FCXm+VkFUA}C@b zBV%9WP7VeRhGc~ejLI$>n3W4Qh`TB%cyHhf^xnW092K#_M0$fpWI~!kS7^irCe_3Z zjIPPbNgJ4yT{dwuvT1GNVFMB(Kq7Jziw37_kjo|>4tA}LY>X}&RTw)0BQ`j6M1Xl} mAl?oZ1_(D22zD_3Z{5JsyOEW_1px9`D;59%0a>}9WdH!qzDlJ4 literal 0 HcmV?d00001 diff --git a/docs/themes/pimcore/fonts/robotoslab-bold.woff2 b/docs/themes/pimcore/fonts/robotoslab-bold.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..a0e46d686e5410b7bdf6a084d7a33b31957fb5d4 GIT binary patch literal 18720 zcmV)9K*hgzPew8T0RR9107)PK6951J0GQAK07$a{0RR9100000000000000000000 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

_eRa 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 z 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 j{xNC$epx7z7L`7PLiqVVV_#6U@HC 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 literal 0 HcmV?d00001 diff --git a/docs/themes/pimcore/fonts/robotoslab-light.svg b/docs/themes/pimcore/fonts/robotoslab-light.svg new file mode 100755 index 0000000000..bf7f6a7372 --- /dev/null +++ b/docs/themes/pimcore/fonts/robotoslab-light.svg @@ -0,0 +1,687 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/themes/pimcore/fonts/robotoslab-light.ttf b/docs/themes/pimcore/fonts/robotoslab-light.ttf new file mode 100755 index 0000000000000000000000000000000000000000..067e1e58b0729e758f737c5c1cc70cace6f4c734 GIT binary patch literal 40392 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 Chiqg3 literal 0 HcmV?d00001 diff --git a/docs/themes/pimcore/fonts/robotoslab-light.woff b/docs/themes/pimcore/fonts/robotoslab-light.woff new file mode 100755 index 0000000000000000000000000000000000000000..1cbe7902b7c7722c5f984d2933a76f962248ed21 GIT binary patch literal 24224 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 OD;59%0a>}9VE_OV(@IGI literal 0 HcmV?d00001 diff --git a/docs/themes/pimcore/fonts/robotoslab-light.woff2 b/docs/themes/pimcore/fonts/robotoslab-light.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..b954cfdc867b95a2755e7cd6601cab227c4091f6 GIT binary patch literal 19112 zcmV)7K*zs#Pew8T0RR9107|F;6951J0G+%507^Ol0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/docs/themes/pimcore/fonts/robotoslab-regular.eot b/docs/themes/pimcore/fonts/robotoslab-regular.eot new file mode 100755 index 0000000000000000000000000000000000000000..10a7a2b6d2d836dcd1501f7d8fec3dcaba773e9c GIT binary patch literal 39066 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/themes/pimcore/fonts/robotoslab-regular.ttf b/docs/themes/pimcore/fonts/robotoslab-regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..9c36f36071729ae3ea3e8d5f1875a09729b44301 GIT binary patch literal 38804 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 T{)-s=)*i$Cru4ietXLB-{nSbtg zzk9!X?>{MBwKB%fJJ6fOV)@0z;z{7lW)4pe@M|t8cmhsd#@MxH7RzTAbGWc7tLCv- z9;>ygR7KExv-2xg1Kd=f$+G!s!%SB?oV#EXjtJTW43i-52BY?$XG2;V4c))^ZUT?4vHlD$}$ms#6%%n+c zv}kDqoAF3w(s>pM2Sn>gLvK_nCmkEi6Ji0`1UAAbfccO>uV-=_w>Ddns8?Z3X>C@m zH&TKm%1q~(ND7!QdIeVG1LlbwegRmKPZ=zea3KHBgPlBTa?;M2XVQ(!q$UNFj?x2v zW{?v+nUFD?w$SEm`X^jZJ{}i>ApmM&I8Ej;uHtYB2dwbbS~Z3%@NlUN4}(Rh42Bh9 zQV5mHQ6Y}Q;X*Ma4Rd1S3}y>qASowS3$T<>NM(tsa9)^@M0qGlAv{7Pqd97!>-NDHt3zVIlsf zv6{rPXp^1*{iD?r8cJX^XgKW2@?dgWN1FgKh)&3K{zRcDlQy4HN1JFpd%Sfq?G*Ck zXebVWa*1&<0!oL9oKq+iv_*}76N28<-;2_a;JW>S(!=UjzF z%R@ytgyOJ}nJck4G)yR0h-7kHAwy9)68&7*O?=lA4BzOmszuA%RStAEZ&{pPn$ z_*pOX&TT$?wXVqLguj4LwMTMw!&}T3-J3G!-|2YjVjC*{Y zH$O7yWz0FXu3hH)<^9zJ8e9frx)fipf#Wld5iZ~0jUs6Afxhjf_PKqz*0OJj1M{l5 zU*L5qGfuzfvLpjO1&0hhUs!wlR_e}6C+1IY?_JP*qjmqR$drWby*q~1{mw07$4L6Z zgKdpQog(0lBCVunZZp4XUO!=Ld9xwtO1ayDiWvi~?sg>?nLe~6f#-Id;BNH&Ze2f@ z_v}=e$o_VQ_1;)~dg(4WC@N#);MT;Bi*Quo;UQuA=HbWsu3sh3T%}NUy?Lf+#;vi% z>5F-q4OMhk_@eXHKQ--sH$0`F_Uw&WMtngU^6W>udjKhKZ*lqXLVtIcW_jcVZ{Lb_ z51R_6jka+t{?I^aa!uDo*fok=ccZtuNRr$C;jQTn4Oh?F1C|Vat}{Tv?f)p4_QB4f z>ZHy8;?}=)_eev!zu#T-am7D-9{;i2>zMKIlh0pXD=Hea`&7qQjH!({ld>B)|PeV06m4;neN#+T%J0rXw$6L#l6f6#9{E z&9W73+=8K}i4vC%a_{v4^=IR^>WhU)~i3bU2o~?sd@fP z|8V$GdA_~G{iV1wz6C1W8~>YomD^Il5N=(~+uoJV&x3+CQ)dhop24d-pfg zj+(w|`D$BH;QhG7N^3&R)^b&pY3$d>yU5x@mp$2`0X{WN@4J1p`@tE}gGGm~Zp`?z z>&}a#F1F#~ + + + + coreshopWon rgb + + + \ No newline at end of file diff --git a/docs/themes/pimcore/js/build/pimcore.js b/docs/themes/pimcore/js/build/pimcore.js new file mode 100755 index 0000000000..a3e8f4950d --- /dev/null +++ b/docs/themes/pimcore/js/build/pimcore.js @@ -0,0 +1,340 @@ +/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; + +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="

a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m(" + + + + + +
+ insert('theme::partials/version_info', ['params' => $params]); ?> + + + + +
+
+
+ section('content'); ?> +
+
+
+ diff --git a/docs/themes/pimcore/templates/partials/change_version.php b/docs/themes/pimcore/templates/partials/change_version.php new file mode 100755 index 0000000000..297a804114 --- /dev/null +++ b/docs/themes/pimcore/templates/partials/change_version.php @@ -0,0 +1,52 @@ + + + + + + + Version: + + + + + + + \ No newline at end of file diff --git a/docs/themes/pimcore/templates/partials/disqus.php b/docs/themes/pimcore/templates/partials/disqus.php new file mode 100755 index 0000000000..e4f295a8ed --- /dev/null +++ b/docs/themes/pimcore/templates/partials/disqus.php @@ -0,0 +1,26 @@ + + +
+ +
+ + + + diff --git a/docs/themes/pimcore/templates/partials/edit_on.php b/docs/themes/pimcore/templates/partials/edit_on.php new file mode 100755 index 0000000000..8e311200ac --- /dev/null +++ b/docs/themes/pimcore/templates/partials/edit_on.php @@ -0,0 +1,7 @@ +getHTML()->getEditOn(); +if ($edit_on) { ?> + + Edit on + + diff --git a/docs/themes/pimcore/templates/partials/navbar_content.php b/docs/themes/pimcore/templates/partials/navbar_content.php new file mode 100755 index 0000000000..da94f86183 --- /dev/null +++ b/docs/themes/pimcore/templates/partials/navbar_content.php @@ -0,0 +1,23 @@ + + + + +

+ + + + + +
+ + + + \ No newline at end of file diff --git a/docs/themes/pimcore/templates/partials/version_info.php b/docs/themes/pimcore/templates/partials/version_info.php new file mode 100755 index 0000000000..f73137e621 --- /dev/null +++ b/docs/themes/pimcore/templates/partials/version_info.php @@ -0,0 +1,34 @@ + + +
+ Built + + $params['build_versions']['source'], + '{short_commit_hash}' => substr($params['build_versions']['source'], 0, 6) + ]; + + $from = 'from '; + $from .= sprintf( + '%s', + str_replace(array_keys($replacements), array_values($replacements), $versionInfo['source_url']), + str_replace(array_keys($replacements), array_values($replacements), $versionInfo['source_name']) + ); + + echo $from; + } + ?> + + with + + + pimcore-docs@ + + . +
+ + diff --git a/src/CoreShop/Bundle/AddressBundle/README.md b/src/CoreShop/Bundle/AddressBundle/README.md index 7c2e9acc11..4cbe04458b 100644 --- a/src/CoreShop/Bundle/AddressBundle/README.md +++ b/src/CoreShop/Bundle/AddressBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Address_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/ConfigurationBundle/README.md b/src/CoreShop/Bundle/ConfigurationBundle/README.md index 73190c536b..45412163ce 100644 --- a/src/CoreShop/Bundle/ConfigurationBundle/README.md +++ b/src/CoreShop/Bundle/ConfigurationBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Configuration_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/CoreBundle/README.md b/src/CoreShop/Bundle/CoreBundle/README.md index 057d481346..029b6f4053 100644 --- a/src/CoreShop/Bundle/CoreBundle/README.md +++ b/src/CoreShop/Bundle/CoreBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Core_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/CurrencyBundle/README.md b/src/CoreShop/Bundle/CurrencyBundle/README.md index 86c5744730..2d82c15401 100644 --- a/src/CoreShop/Bundle/CurrencyBundle/README.md +++ b/src/CoreShop/Bundle/CurrencyBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Currency_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/CustomerBundle/README.md b/src/CoreShop/Bundle/CustomerBundle/README.md index 18fea2d33b..bc31b98d19 100644 --- a/src/CoreShop/Bundle/CustomerBundle/README.md +++ b/src/CoreShop/Bundle/CustomerBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Customer_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/FixtureBundle/README.md b/src/CoreShop/Bundle/FixtureBundle/README.md index 35a6fc3aeb..1c1e73a789 100644 --- a/src/CoreShop/Bundle/FixtureBundle/README.md +++ b/src/CoreShop/Bundle/FixtureBundle/README.md @@ -14,7 +14,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Fixture_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/IndexBundle/README.md b/src/CoreShop/Bundle/IndexBundle/README.md index fa755159dd..5ff3066881 100644 --- a/src/CoreShop/Bundle/IndexBundle/README.md +++ b/src/CoreShop/Bundle/IndexBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Index_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/InventoryBundle/README.md b/src/CoreShop/Bundle/InventoryBundle/README.md index bd0f718e87..c1fe632009 100644 --- a/src/CoreShop/Bundle/InventoryBundle/README.md +++ b/src/CoreShop/Bundle/InventoryBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Inventory_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/LocaleBundle/README.md b/src/CoreShop/Bundle/LocaleBundle/README.md index 55d1554b07..8f8dd30a79 100644 --- a/src/CoreShop/Bundle/LocaleBundle/README.md +++ b/src/CoreShop/Bundle/LocaleBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundle/Locale_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/MenuBundle/README.md b/src/CoreShop/Bundle/MenuBundle/README.md index 469f6974b6..00f1d23844 100644 --- a/src/CoreShop/Bundle/MenuBundle/README.md +++ b/src/CoreShop/Bundle/MenuBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Menu_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/MessengerBundle/README.md b/src/CoreShop/Bundle/MessengerBundle/README.md index d756b80aba..f135313cb0 100644 --- a/src/CoreShop/Bundle/MessengerBundle/README.md +++ b/src/CoreShop/Bundle/MessengerBundle/README.md @@ -12,7 +12,7 @@ code. [Read more on coreshop.org](http://www.coreshop.org) Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Messenger_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/MoneyBundle/README.md b/src/CoreShop/Bundle/MoneyBundle/README.md index ea97d73a09..23be1c16b9 100644 --- a/src/CoreShop/Bundle/MoneyBundle/README.md +++ b/src/CoreShop/Bundle/MoneyBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Money_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/NotificationBundle/README.md b/src/CoreShop/Bundle/NotificationBundle/README.md index e2b6f78277..c7e5a935d8 100644 --- a/src/CoreShop/Bundle/NotificationBundle/README.md +++ b/src/CoreShop/Bundle/NotificationBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Notification_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/OptimisticEntityLockBundle/README.md b/src/CoreShop/Bundle/OptimisticEntityLockBundle/README.md index 6db9f646aa..5c64935c33 100644 --- a/src/CoreShop/Bundle/OptimisticEntityLockBundle/README.md +++ b/src/CoreShop/Bundle/OptimisticEntityLockBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/OptimisticEntityLock_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/OrderBundle/README.md b/src/CoreShop/Bundle/OrderBundle/README.md index d685dd3f16..0ec6618482 100644 --- a/src/CoreShop/Bundle/OrderBundle/README.md +++ b/src/CoreShop/Bundle/OrderBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Order_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/PaymentBundle/README.md b/src/CoreShop/Bundle/PaymentBundle/README.md index 2f1ec3ccab..dc67f3db14 100644 --- a/src/CoreShop/Bundle/PaymentBundle/README.md +++ b/src/CoreShop/Bundle/PaymentBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Payment_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/PayumBundle/README.md b/src/CoreShop/Bundle/PayumBundle/README.md index 230bc40dda..0a2abc50cf 100644 --- a/src/CoreShop/Bundle/PayumBundle/README.md +++ b/src/CoreShop/Bundle/PayumBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Payum_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/PimcoreBundle/README.md b/src/CoreShop/Bundle/PimcoreBundle/README.md index 88b7392fbc..1eeff93926 100644 --- a/src/CoreShop/Bundle/PimcoreBundle/README.md +++ b/src/CoreShop/Bundle/PimcoreBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Pimcore_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/ProductBundle/README.md b/src/CoreShop/Bundle/ProductBundle/README.md index a62654c28c..80747034f9 100644 --- a/src/CoreShop/Bundle/ProductBundle/README.md +++ b/src/CoreShop/Bundle/ProductBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Product_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/ProductQuantityPriceRulesBundle/README.md b/src/CoreShop/Bundle/ProductQuantityPriceRulesBundle/README.md index 3e97b8e206..37af807c3f 100644 --- a/src/CoreShop/Bundle/ProductQuantityPriceRulesBundle/README.md +++ b/src/CoreShop/Bundle/ProductQuantityPriceRulesBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Product_Quantity_Price_Rules_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/ResourceBundle/README.md b/src/CoreShop/Bundle/ResourceBundle/README.md index 1488bdc4a6..6d9d273106 100644 --- a/src/CoreShop/Bundle/ResourceBundle/README.md +++ b/src/CoreShop/Bundle/ResourceBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Resource_Bundle/index.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/RuleBundle/README.md b/src/CoreShop/Bundle/RuleBundle/README.md index aac4300c3a..220551301e 100644 --- a/src/CoreShop/Bundle/RuleBundle/README.md +++ b/src/CoreShop/Bundle/RuleBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Rule_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/SEOBundle/README.md b/src/CoreShop/Bundle/SEOBundle/README.md index 3690709f2a..d19c988b5e 100644 --- a/src/CoreShop/Bundle/SEOBundle/README.md +++ b/src/CoreShop/Bundle/SEOBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/SEO_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/SequenceBundle/README.md b/src/CoreShop/Bundle/SequenceBundle/README.md index 6e17b45ef0..f8f0bea6e0 100644 --- a/src/CoreShop/Bundle/SequenceBundle/README.md +++ b/src/CoreShop/Bundle/SequenceBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Sequence_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/ShippingBundle/README.md b/src/CoreShop/Bundle/ShippingBundle/README.md index c51c855941..87dbb42f77 100644 --- a/src/CoreShop/Bundle/ShippingBundle/README.md +++ b/src/CoreShop/Bundle/ShippingBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Shipping_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/StorageListBundle/README.md b/src/CoreShop/Bundle/StorageListBundle/README.md index c310ae7dcc..bb9d6771e9 100644 --- a/src/CoreShop/Bundle/StorageListBundle/README.md +++ b/src/CoreShop/Bundle/StorageListBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Storage_List_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/StoreBundle/README.md b/src/CoreShop/Bundle/StoreBundle/README.md index 2bb6925c2e..238a8370e0 100644 --- a/src/CoreShop/Bundle/StoreBundle/README.md +++ b/src/CoreShop/Bundle/StoreBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Store_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/TaxationBundle/README.md b/src/CoreShop/Bundle/TaxationBundle/README.md index 76cf72e9c8..bd53ab1209 100644 --- a/src/CoreShop/Bundle/TaxationBundle/README.md +++ b/src/CoreShop/Bundle/TaxationBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Taxation_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/TestBundle/README.md b/src/CoreShop/Bundle/TestBundle/README.md index 41ad184900..ee29feabff 100644 --- a/src/CoreShop/Bundle/TestBundle/README.md +++ b/src/CoreShop/Bundle/TestBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Test_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/ThemeBundle/README.md b/src/CoreShop/Bundle/ThemeBundle/README.md index 26cb8f66e1..5221e84fd9 100644 --- a/src/CoreShop/Bundle/ThemeBundle/README.md +++ b/src/CoreShop/Bundle/ThemeBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Theme_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/TrackingBundle/README.md b/src/CoreShop/Bundle/TrackingBundle/README.md index 03e2c8cda7..7b12b0a58d 100644 --- a/src/CoreShop/Bundle/TrackingBundle/README.md +++ b/src/CoreShop/Bundle/TrackingBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Tracking_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/VariantBundle/README.md b/src/CoreShop/Bundle/VariantBundle/README.md index 8fe2c31075..8cdfd45379 100644 --- a/src/CoreShop/Bundle/VariantBundle/README.md +++ b/src/CoreShop/Bundle/VariantBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Variant_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/WishlistBundle/README.md b/src/CoreShop/Bundle/WishlistBundle/README.md index 1564d35ad1..2841d19fa5 100644 --- a/src/CoreShop/Bundle/WishlistBundle/README.md +++ b/src/CoreShop/Bundle/WishlistBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Wishlist_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Bundle/WorkflowBundle/README.md b/src/CoreShop/Bundle/WorkflowBundle/README.md index f0e7febade..0e7058ec71 100644 --- a/src/CoreShop/Bundle/WorkflowBundle/README.md +++ b/src/CoreShop/Bundle/WorkflowBundle/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Bundles/Workflow_Bundle.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Address/README.md b/src/CoreShop/Component/Address/README.md index 3a6d033f7d..e6c48385e0 100644 --- a/src/CoreShop/Component/Address/README.md +++ b/src/CoreShop/Component/Address/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Address_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Configuration/README.md b/src/CoreShop/Component/Configuration/README.md index 1e40c469ad..31f0bc684b 100644 --- a/src/CoreShop/Component/Configuration/README.md +++ b/src/CoreShop/Component/Configuration/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Configuration_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Core/README.md b/src/CoreShop/Component/Core/README.md index 494fa6965b..b2d6f57adf 100644 --- a/src/CoreShop/Component/Core/README.md +++ b/src/CoreShop/Component/Core/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Core_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Currency/README.md b/src/CoreShop/Component/Currency/README.md index 447479da8b..bcd61ccae2 100644 --- a/src/CoreShop/Component/Currency/README.md +++ b/src/CoreShop/Component/Currency/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Currency_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Customer/README.md b/src/CoreShop/Component/Customer/README.md index bf8f6c3c21..8f123bffac 100644 --- a/src/CoreShop/Component/Customer/README.md +++ b/src/CoreShop/Component/Customer/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Customer_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Index/README.md b/src/CoreShop/Component/Index/README.md index 7a6338c625..636997a8ac 100644 --- a/src/CoreShop/Component/Index/README.md +++ b/src/CoreShop/Component/Index/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Index_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Inventory/README.md b/src/CoreShop/Component/Inventory/README.md index e5b7daf40d..456450144f 100644 --- a/src/CoreShop/Component/Inventory/README.md +++ b/src/CoreShop/Component/Inventory/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Inventory_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Locale/README.md b/src/CoreShop/Component/Locale/README.md index e2ca5a1bf5..18e8cd6012 100644 --- a/src/CoreShop/Component/Locale/README.md +++ b/src/CoreShop/Component/Locale/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Locale_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Notification/README.md b/src/CoreShop/Component/Notification/README.md index f2dbc215a1..262afd69a7 100644 --- a/src/CoreShop/Component/Notification/README.md +++ b/src/CoreShop/Component/Notification/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Notification_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Order/README.md b/src/CoreShop/Component/Order/README.md index 6fba16498c..f4b164c4d9 100644 --- a/src/CoreShop/Component/Order/README.md +++ b/src/CoreShop/Component/Order/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Order_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Payment/README.md b/src/CoreShop/Component/Payment/README.md index 7faad5de84..a7019f540b 100644 --- a/src/CoreShop/Component/Payment/README.md +++ b/src/CoreShop/Component/Payment/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Payment_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Pimcore/README.md b/src/CoreShop/Component/Pimcore/README.md index 1a94cc9d86..64d000a2ff 100644 --- a/src/CoreShop/Component/Pimcore/README.md +++ b/src/CoreShop/Component/Pimcore/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Pimcore_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Product/README.md b/src/CoreShop/Component/Product/README.md index 5680d13829..ec162e179a 100644 --- a/src/CoreShop/Component/Product/README.md +++ b/src/CoreShop/Component/Product/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Product_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/ProductQuantityPriceRules/README.md b/src/CoreShop/Component/ProductQuantityPriceRules/README.md index 824394f358..a3e44ad252 100644 --- a/src/CoreShop/Component/ProductQuantityPriceRules/README.md +++ b/src/CoreShop/Component/ProductQuantityPriceRules/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/ProductQuantityPriceRules_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Registry/README.md b/src/CoreShop/Component/Registry/README.md index 6ed7f0677a..e6c48385e0 100644 --- a/src/CoreShop/Component/Registry/README.md +++ b/src/CoreShop/Component/Registry/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Registry_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Resource/README.md b/src/CoreShop/Component/Resource/README.md index 197f04450c..ecf357bb28 100644 --- a/src/CoreShop/Component/Resource/README.md +++ b/src/CoreShop/Component/Resource/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Resource_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Rule/README.md b/src/CoreShop/Component/Rule/README.md index 3ebfa3eb24..39f6687721 100644 --- a/src/CoreShop/Component/Rule/README.md +++ b/src/CoreShop/Component/Rule/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Rule_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/SEO/README.md b/src/CoreShop/Component/SEO/README.md index 352bd73e41..17b60d57ec 100644 --- a/src/CoreShop/Component/SEO/README.md +++ b/src/CoreShop/Component/SEO/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/SEO_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Sequence/README.md b/src/CoreShop/Component/Sequence/README.md index bfcdbe197c..9bb7f9f44f 100644 --- a/src/CoreShop/Component/Sequence/README.md +++ b/src/CoreShop/Component/Sequence/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Sequence_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Shipping/README.md b/src/CoreShop/Component/Shipping/README.md index 96a5f846af..318739f762 100644 --- a/src/CoreShop/Component/Shipping/README.md +++ b/src/CoreShop/Component/Shipping/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Shipping_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/StorageList/README.md b/src/CoreShop/Component/StorageList/README.md index cba7a56a4b..765c471021 100644 --- a/src/CoreShop/Component/StorageList/README.md +++ b/src/CoreShop/Component/StorageList/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Sequence_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Store/README.md b/src/CoreShop/Component/Store/README.md index 0cc7e5963c..99d9ae87aa 100644 --- a/src/CoreShop/Component/Store/README.md +++ b/src/CoreShop/Component/Store/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Store_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Taxation/README.md b/src/CoreShop/Component/Taxation/README.md index e7a2d1b43e..1836dd1267 100644 --- a/src/CoreShop/Component/Taxation/README.md +++ b/src/CoreShop/Component/Taxation/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Taxation_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Tracking/README.md b/src/CoreShop/Component/Tracking/README.md index 287f5024de..924adad9ac 100644 --- a/src/CoreShop/Component/Tracking/README.md +++ b/src/CoreShop/Component/Tracking/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Tracking_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ diff --git a/src/CoreShop/Component/Wishlist/README.md b/src/CoreShop/Component/Wishlist/README.md index 47319be765..d9d9e87d3b 100644 --- a/src/CoreShop/Component/Wishlist/README.md +++ b/src/CoreShop/Component/Wishlist/README.md @@ -11,7 +11,7 @@ CoreShop is an eCommerce Solution for Pimcore. It is build from decoupled compon Documentation ------------- -Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0/Components/Wishlist_Component.html). +Documentation is available on [**coreshop.org**](https://docs.coreshop.org/3.0.0). Bug tracking ------------ From 137775108425ac26a3bccba5dac52b9a65067a90 Mon Sep 17 00:00:00 2001 From: Dominik Pfaffenbauer Date: Tue, 25 Apr 2023 13:12:54 +0200 Subject: [PATCH 18/19] Update docs --- .../Bundles/Address_Bundle.html | 166 ----- .../Bundles/Configuration_Bundle.html | 167 ----- docs/generated-docs/Bundles/Core_Bundle.html | 161 ---- .../Bundles/Currency_Bundle.html | 208 ------ .../Bundles/Customer_Bundle.html | 190 ----- .../Bundles/Fixture_Bundle.html | 246 ------ .../Bundles/Frontend_Bundle.html | 161 ---- docs/generated-docs/Bundles/Index_Bundle.html | 199 ----- .../Bundles/Inventory_Bundle.html | 161 ---- .../generated-docs/Bundles/Locale_Bundle.html | 161 ---- docs/generated-docs/Bundles/Menu_Bundle.html | 225 ------ .../Bundles/Messenger_Bundle.html | 175 ----- docs/generated-docs/Bundles/Money_Bundle.html | 178 ----- .../Bundles/Notification_Bundle.html | 170 ----- .../Bundles/OptimisticEntityLock_Bundle.html | 179 ----- docs/generated-docs/Bundles/Order_Bundle.html | 161 ---- .../Bundles/Payment_Bundle.html | 192 ----- .../Bundles/PayumPayment_Bundle.html | 158 ---- docs/generated-docs/Bundles/Payum_Bundle.html | 161 ---- .../Bundles/Pimcore_Bundle.html | 422 ----------- .../ProductQuantityPriceRules_Bundle.html | 161 ---- .../Bundles/Product_Bundle.html | 161 ---- .../Resource_Bundle/CustomEntities.html | 446 ----------- .../Bundles/Resource_Bundle/Installation.html | 221 ------ .../Resource_Bundle/PimcoreEntities.html | 261 ------- .../Bundles/Resource_Bundle/index.html | 181 ----- docs/generated-docs/Bundles/Rule_Bundle.html | 165 ---- docs/generated-docs/Bundles/SEO_Bundle.html | 237 ------ .../Bundles/Sequence_Bundle.html | 189 ----- .../Bundles/Shipping_Bundle.html | 161 ---- .../Bundles/StorageList_Bundle.html | 215 ------ docs/generated-docs/Bundles/Store_Bundle.html | 161 ---- .../Bundles/Taxation_Bundle.html | 161 ---- docs/generated-docs/Bundles/Theme_Bundle.html | 218 ------ .../Bundles/Tracking_Bundle.html | 162 ---- docs/generated-docs/Bundles/User_Bundle.html | 161 ---- .../Bundles/Variant_Bundle.html | 218 ------ .../Bundles/Wishlist_Bundle.html | 161 ---- .../Bundles/Workflow_Bundle.html | 161 ---- docs/generated-docs/Bundles/index.html | 257 ------- .../generated-docs/Development/Cart/CRUD.html | 203 ----- .../Development/Cart/Cart_Manager.html | 163 ---- .../Development/Cart/Cart_Modifier.html | 166 ----- .../Development/Cart/Cart_Processor.html | 212 ------ .../Development/Cart/Commands.html | 178 ----- .../Development/Cart/Context.html | 202 ----- .../Development/Cart/index.html | 181 ----- .../Checkout/Checkout_Manager.html | 208 ------ .../Development/Checkout/Checkout_Step.html | 268 ------- .../Development/Checkout/index.html | 166 ----- .../Development/Currency_Fractions/index.html | 192 ----- .../Development/Customers/CRUD.html | 203 ----- .../Customers/Company_Extension.html | 188 ----- .../Development/Customers/Context.html | 169 ----- .../Customers/Customer_Manager.html | 189 ----- .../Customers/Registration_Types.html | 182 ----- .../Development/Customers/index.html | 175 ----- .../Development/Ecommerce_Tracking/index.html | 305 -------- .../Development/Events/index.html | 544 -------------- .../Extend_CoreShop_DataObjects.html | 169 ----- .../Extend_CoreShop_Forms.html | 245 ------ .../Extend_CoreShop_Resources.html | 263 ------- .../Extending_Rule_Actions.html | 283 ------- .../Extending_Rule_Conditions.html | 280 ------- .../Filter/Custom_Filter.html | 219 ------ .../Index_and_Filters/Filter/index.html | 227 ------ .../Index_and_Filters/Index/Extension.html | 167 ----- .../Index_and_Filters/Index/Interpreter.html | 224 ------ .../Index_and_Filters/Index/index.html | 213 ------ .../Development/Index_and_Filters/index.html | 166 ----- .../Development/Inventory/index.html | 169 ----- .../Localization/Countries/CRUD.html | 200 ----- .../Localization/Countries/Context.html | 283 ------- .../Localization/Countries/index.html | 168 ----- .../Localization/Currencies/CRUD.html | 200 ----- .../Localization/Currencies/Context.html | 194 ----- .../Localization/Currencies/index.html | 168 ----- .../Development/Localization/States/CRUD.html | 200 ----- .../Localization/States/index.html | 162 ---- .../Localization/Taxes/Tax_Rate/CRUD.html | 200 ----- .../Localization/Taxes/Tax_Rate/index.html | 165 ---- .../Localization/Taxes/Tax_Rule/CRUD.html | 200 ----- .../Taxes/Tax_Rule/Tax_Factory.html | 156 ---- .../Localization/Taxes/Tax_Rule/index.html | 165 ---- .../Development/Localization/Taxes/index.html | 168 ----- .../Development/Localization/Zones/CRUD.html | 200 ----- .../Development/Localization/Zones/index.html | 162 ---- .../Development/Localization/index.html | 175 ----- .../Notification_Rules/Custom_Actions.html | 162 ---- .../Notification_Rules/Custom_Conditions.html | 162 ---- .../Notification_Rules/Custom_Types.html | 166 ----- .../Notification_Rules/Triggering.html | 173 ----- .../Development/Notification_Rules/index.html | 703 ------------------ .../Development/Order/AdditionalData.html | 289 ------- .../Order/Invoice/Invoice_Creation.html | 178 ----- .../Development/Order/Invoice/index.html | 158 ---- .../Development/Order/OrderList/Action.html | 250 ------- .../Development/Order/OrderList/Filter.html | 203 ----- .../Development/Order/Order_Creation.html | 164 ---- .../Development/Order/Order_Workflow.html | 158 ---- .../Development/Order/Purchasable.html | 210 ------ .../Order/Shipment/Shipment_Creation.html | 178 ----- .../Development/Order/Shipment/index.html | 158 ---- .../Development/Order/TemplateHelper.html | 161 ---- .../Development/Order/Transformer.html | 201 ----- .../Development/Order/index.html | 190 ----- .../Development/Payment/Omnipay_Bridge.html | 282 ------- .../Development/Payment/Payment_Provider.html | 261 ------- .../Development/Payment/Payum_Providers.html | 158 ---- .../Development/Payment/index.html | 246 ------ .../Development/Products/CRUD.html | 203 ----- .../Development/Products/Configuration.html | 169 ----- .../Multiple_Product_DataObjects.html | 295 -------- .../Products/Price_Calculation.html | 255 ------- .../Products/Price_Rules/index.html | 202 ----- .../Products/Unit_Definitions.html | 211 ------ .../Development/Products/Units.html | 185 ----- .../Development/Products/index.html | 181 ----- .../generated-docs/Development/SEO/index.html | 162 ---- .../Development/Shipping/Carrier/CRUD.html | 200 ----- .../Shipping/Carrier/Carrier_Discovery.html | 159 ---- .../Shipping/Carrier/Price_Calculation.html | 162 ---- .../Development/Shipping/Carrier/index.html | 169 ----- .../Shipping/Shipping_Rules/index.html | 194 ----- .../Development/Shipping/index.html | 166 ----- .../State_Machine/Available_Workflows.html | 635 ---------------- .../State_Machine/Create_Callbacks.html | 282 ------- .../State_Machine/Extend_Workflows.html | 262 ------- .../State_Machine/Things_To_Know.html | 180 ----- .../Development/State_Machine/index.html | 212 ------ .../Development/Store_Front/Controllers.html | 198 ----- .../Development/Store_Front/index.html | 164 ---- .../Development/Stores/CRUD.html | 200 ----- .../Development/Stores/Context.html | 266 ------- .../Development/Stores/Theme.html | 159 ---- .../Development/Stores/index.html | 169 ----- docs/generated-docs/Development/index.html | 192 ----- .../Architecture_Overview.html | 189 ----- .../Difference_to_ecommerce_Framework.html | 501 ------------- .../Getting_Started/Installation.html | 179 ----- .../Getting_Started/Upgrade_Notes.html | 444 ----------- .../generated-docs/Getting_Started/index.html | 178 ----- .../User_Documentation/Automation/index.html | 194 ----- .../User_Documentation/Cart/index.html | 169 ----- .../Catalog/Categories.html | 158 ---- .../Catalog/Product_Variants.html | 158 ---- .../User_Documentation/Catalog/Products.html | 158 ---- .../User_Documentation/Catalog/index.html | 168 ----- .../User_Documentation/Geo_IP.html | 158 ---- .../User_Documentation/Inventory/index.html | 201 ----- .../Localization/Countries.html | 168 ----- .../Localization/Currencies.html | 178 ----- .../Localization/States.html | 165 ---- .../Localization/TaxRules.html | 166 ----- .../Localization/Taxes.html | 165 ---- .../Localization/Zones.html | 164 ---- .../Localization/index.html | 177 ----- .../Order/Order_Comments.html | 164 ---- .../Order/Order_Detail.html | 310 -------- .../Order/Order_Workflow.html | 220 ------ .../User_Documentation/Order/Orders.html | 170 ----- .../User_Documentation/Order/index.html | 171 ----- .../Price_Rules/Actions.html | 291 -------- .../Price_Rules/Cart_Price_Rules.html | 216 ------ .../Price_Rules/Conditions.html | 435 ----------- .../Price_Rules/Product_Price_Rules.html | 210 ------ .../Price_Rules/Quantity_Price_Rules.html | 186 ----- .../Price_Rules/Specific_Price_Rules.html | 201 ----- .../Price_Rules/Vouchers.html | 264 ------- .../User_Documentation/Price_Rules/index.html | 213 ------ .../Reports/Abandoned_Carts.html | 257 ------- .../Reports/Carrier_Distribution.html | 221 ------ .../User_Documentation/Reports/Carts.html | 238 ------ .../Reports/Categories.html | 250 ------- .../User_Documentation/Reports/Customers.html | 242 ------ .../Reports/Payment_Distribution.html | 221 ------ .../User_Documentation/Reports/Products.html | 281 ------- .../User_Documentation/Reports/Sales.html | 242 ------ .../User_Documentation/Reports/Vouchers.html | 245 ------ .../User_Documentation/Reports/index.html | 186 ----- .../User_Documentation/Settings.html | 230 ------ .../User_Documentation/Shipping/Carriers.html | 176 ----- .../Shipping/Shipping_Rules.html | 201 ----- .../User_Documentation/Shipping/index.html | 166 ----- .../User_Documentation/Stores.html | 180 ----- .../User_Documentation/index.html | 298 -------- .../Bundles/Address_Bundle.html | 166 ----- .../Bundles/Configuration_Bundle.html | 167 ----- .../generated_docs/Bundles/Core_Bundle.html | 161 ---- .../Bundles/Currency_Bundle.html | 208 ------ .../Bundles/Customer_Bundle.html | 190 ----- .../Bundles/Fixture_Bundle.html | 246 ------ .../Bundles/Frontend_Bundle.html | 161 ---- .../generated_docs/Bundles/Index_Bundle.html | 199 ----- .../Bundles/Inventory_Bundle.html | 161 ---- .../generated_docs/Bundles/Locale_Bundle.html | 161 ---- .../generated_docs/Bundles/Menu_Bundle.html | 225 ------ .../Bundles/Messenger_Bundle.html | 175 ----- .../generated_docs/Bundles/Money_Bundle.html | 178 ----- .../Bundles/Notification_Bundle.html | 170 ----- .../Bundles/OptimisticEntityLock_Bundle.html | 179 ----- .../generated_docs/Bundles/Order_Bundle.html | 161 ---- .../Bundles/Payment_Bundle.html | 192 ----- .../Bundles/PayumPayment_Bundle.html | 158 ---- .../generated_docs/Bundles/Payum_Bundle.html | 161 ---- .../Bundles/Pimcore_Bundle.html | 422 ----------- .../ProductQuantityPriceRules_Bundle.html | 161 ---- .../Bundles/Product_Bundle.html | 161 ---- .../Resource_Bundle/CustomEntities.html | 446 ----------- .../Bundles/Resource_Bundle/Installation.html | 221 ------ .../Resource_Bundle/PimcoreEntities.html | 261 ------- .../Bundles/Resource_Bundle/index.html | 181 ----- .../generated_docs/Bundles/Rule_Bundle.html | 165 ---- .../generated_docs/Bundles/SEO_Bundle.html | 237 ------ .../Bundles/Sequence_Bundle.html | 189 ----- .../Bundles/Shipping_Bundle.html | 161 ---- .../Bundles/StorageList_Bundle.html | 215 ------ .../generated_docs/Bundles/Store_Bundle.html | 161 ---- .../Bundles/Taxation_Bundle.html | 161 ---- .../generated_docs/Bundles/Theme_Bundle.html | 218 ------ .../Bundles/Tracking_Bundle.html | 162 ---- .../generated_docs/Bundles/User_Bundle.html | 161 ---- .../Bundles/Variant_Bundle.html | 218 ------ .../Bundles/Wishlist_Bundle.html | 161 ---- .../Bundles/Workflow_Bundle.html | 161 ---- .../generated_docs/Bundles/index.html | 257 ------- .../generated_docs/Development/Cart/CRUD.html | 203 ----- .../Development/Cart/Cart_Manager.html | 163 ---- .../Development/Cart/Cart_Modifier.html | 166 ----- .../Development/Cart/Cart_Processor.html | 212 ------ .../Development/Cart/Commands.html | 178 ----- .../Development/Cart/Context.html | 202 ----- .../Development/Cart/index.html | 181 ----- .../Checkout/Checkout_Manager.html | 208 ------ .../Development/Checkout/Checkout_Step.html | 268 ------- .../Development/Checkout/index.html | 166 ----- .../Development/Currency_Fractions/index.html | 192 ----- .../Development/Customers/CRUD.html | 203 ----- .../Customers/Company_Extension.html | 188 ----- .../Development/Customers/Context.html | 169 ----- .../Customers/Customer_Manager.html | 189 ----- .../Customers/Registration_Types.html | 182 ----- .../Development/Customers/index.html | 175 ----- .../Development/Ecommerce_Tracking/index.html | 305 -------- .../Development/Events/index.html | 544 -------------- .../Extend_CoreShop_DataObjects.html | 169 ----- .../Extend_CoreShop_Forms.html | 245 ------ .../Extend_CoreShop_Resources.html | 263 ------- .../Extending_Rule_Actions.html | 283 ------- .../Extending_Rule_Conditions.html | 280 ------- .../Filter/Custom_Filter.html | 219 ------ .../Index_and_Filters/Filter/index.html | 227 ------ .../Index_and_Filters/Index/Extension.html | 167 ----- .../Index_and_Filters/Index/Interpreter.html | 224 ------ .../Index_and_Filters/Index/index.html | 213 ------ .../Development/Index_and_Filters/index.html | 166 ----- .../Development/Inventory/index.html | 169 ----- .../Localization/Countries/CRUD.html | 200 ----- .../Localization/Countries/Context.html | 283 ------- .../Localization/Countries/index.html | 168 ----- .../Localization/Currencies/CRUD.html | 200 ----- .../Localization/Currencies/Context.html | 194 ----- .../Localization/Currencies/index.html | 168 ----- .../Development/Localization/States/CRUD.html | 200 ----- .../Localization/States/index.html | 162 ---- .../Localization/Taxes/Tax_Rate/CRUD.html | 200 ----- .../Localization/Taxes/Tax_Rate/index.html | 165 ---- .../Localization/Taxes/Tax_Rule/CRUD.html | 200 ----- .../Taxes/Tax_Rule/Tax_Factory.html | 156 ---- .../Localization/Taxes/Tax_Rule/index.html | 165 ---- .../Development/Localization/Taxes/index.html | 168 ----- .../Development/Localization/Zones/CRUD.html | 200 ----- .../Development/Localization/Zones/index.html | 162 ---- .../Development/Localization/index.html | 175 ----- .../Notification_Rules/Custom_Actions.html | 162 ---- .../Notification_Rules/Custom_Conditions.html | 162 ---- .../Notification_Rules/Custom_Types.html | 166 ----- .../Notification_Rules/Triggering.html | 173 ----- .../Development/Notification_Rules/index.html | 703 ------------------ .../Development/Order/AdditionalData.html | 289 ------- .../Order/Invoice/Invoice_Creation.html | 178 ----- .../Development/Order/Invoice/index.html | 158 ---- .../Development/Order/OrderList/Action.html | 250 ------- .../Development/Order/OrderList/Filter.html | 203 ----- .../Development/Order/Order_Creation.html | 164 ---- .../Development/Order/Order_Workflow.html | 158 ---- .../Development/Order/Purchasable.html | 210 ------ .../Order/Shipment/Shipment_Creation.html | 178 ----- .../Development/Order/Shipment/index.html | 158 ---- .../Development/Order/TemplateHelper.html | 161 ---- .../Development/Order/Transformer.html | 201 ----- .../Development/Order/index.html | 190 ----- .../Development/Payment/Omnipay_Bridge.html | 282 ------- .../Development/Payment/Payment_Provider.html | 261 ------- .../Development/Payment/Payum_Providers.html | 158 ---- .../Development/Payment/index.html | 246 ------ .../Development/Products/CRUD.html | 203 ----- .../Development/Products/Configuration.html | 169 ----- .../Multiple_Product_DataObjects.html | 295 -------- .../Products/Price_Calculation.html | 255 ------- .../Products/Price_Rules/index.html | 202 ----- .../Products/Unit_Definitions.html | 211 ------ .../Development/Products/Units.html | 185 ----- .../Development/Products/index.html | 181 ----- .../generated_docs/Development/SEO/index.html | 162 ---- .../Development/Shipping/Carrier/CRUD.html | 200 ----- .../Shipping/Carrier/Carrier_Discovery.html | 159 ---- .../Shipping/Carrier/Price_Calculation.html | 162 ---- .../Development/Shipping/Carrier/index.html | 169 ----- .../Shipping/Shipping_Rules/index.html | 194 ----- .../Development/Shipping/index.html | 166 ----- .../State_Machine/Available_Workflows.html | 635 ---------------- .../State_Machine/Create_Callbacks.html | 282 ------- .../State_Machine/Extend_Workflows.html | 262 ------- .../State_Machine/Things_To_Know.html | 180 ----- .../Development/State_Machine/index.html | 212 ------ .../Development/Store_Front/Controllers.html | 198 ----- .../Development/Store_Front/index.html | 164 ---- .../Development/Stores/CRUD.html | 200 ----- .../Development/Stores/Context.html | 266 ------- .../Development/Stores/Theme.html | 159 ---- .../Development/Stores/index.html | 169 ----- .../generated_docs/Development/index.html | 192 ----- .../Architecture_Overview.html | 189 ----- .../Difference_to_ecommerce_Framework.html | 501 ------------- .../Getting_Started/Installation.html | 179 ----- .../Getting_Started/Upgrade_Notes.html | 444 ----------- .../generated_docs/Getting_Started/index.html | 178 ----- .../User_Documentation/Automation/index.html | 194 ----- .../User_Documentation/Cart/index.html | 169 ----- .../Catalog/Categories.html | 158 ---- .../Catalog/Product_Variants.html | 158 ---- .../User_Documentation/Catalog/Products.html | 158 ---- .../User_Documentation/Catalog/index.html | 168 ----- .../User_Documentation/Geo_IP.html | 158 ---- .../User_Documentation/Inventory/index.html | 201 ----- .../Localization/Countries.html | 168 ----- .../Localization/Currencies.html | 178 ----- .../Localization/States.html | 165 ---- .../Localization/TaxRules.html | 166 ----- .../Localization/Taxes.html | 165 ---- .../Localization/Zones.html | 164 ---- .../Localization/index.html | 177 ----- .../Order/Order_Comments.html | 164 ---- .../Order/Order_Detail.html | 310 -------- .../Order/Order_Workflow.html | 220 ------ .../User_Documentation/Order/Orders.html | 170 ----- .../User_Documentation/Order/index.html | 171 ----- .../Price_Rules/Actions.html | 291 -------- .../Price_Rules/Cart_Price_Rules.html | 216 ------ .../Price_Rules/Conditions.html | 435 ----------- .../Price_Rules/Product_Price_Rules.html | 210 ------ .../Price_Rules/Quantity_Price_Rules.html | 186 ----- .../Price_Rules/Specific_Price_Rules.html | 201 ----- .../Price_Rules/Vouchers.html | 264 ------- .../User_Documentation/Price_Rules/index.html | 213 ------ .../Reports/Abandoned_Carts.html | 257 ------- .../Reports/Carrier_Distribution.html | 221 ------ .../User_Documentation/Reports/Carts.html | 238 ------ .../Reports/Categories.html | 250 ------- .../User_Documentation/Reports/Customers.html | 242 ------ .../Reports/Payment_Distribution.html | 221 ------ .../User_Documentation/Reports/Products.html | 281 ------- .../User_Documentation/Reports/Sales.html | 242 ------ .../User_Documentation/Reports/Vouchers.html | 245 ------ .../User_Documentation/Reports/index.html | 186 ----- .../User_Documentation/Settings.html | 230 ------ .../User_Documentation/Shipping/Carriers.html | 176 ----- .../Shipping/Shipping_Rules.html | 201 ----- .../User_Documentation/Shipping/index.html | 166 ----- .../User_Documentation/Stores.html | 180 ----- .../User_Documentation/index.html | 298 -------- docs/generated-docs/generated_docs/index.html | 193 ----- docs/generated-docs/index.html | 193 ----- .../generated-docs/themes/pimcore/config.json | 22 - .../themes/pimcore/css/pimcore-core.min.css | 5 - .../pimcore/css/pimcore-generic.min.css | 5 - .../themes/pimcore/fonts/robotoslab-bold.eot | Bin 39370 -> 0 bytes .../themes/pimcore/fonts/robotoslab-bold.svg | 688 ----------------- .../themes/pimcore/fonts/robotoslab-bold.ttf | Bin 39120 -> 0 bytes .../themes/pimcore/fonts/robotoslab-bold.woff | Bin 23812 -> 0 bytes .../pimcore/fonts/robotoslab-bold.woff2 | Bin 18720 -> 0 bytes .../themes/pimcore/fonts/robotoslab-light.eot | Bin 40646 -> 0 bytes .../themes/pimcore/fonts/robotoslab-light.svg | 687 ----------------- .../themes/pimcore/fonts/robotoslab-light.ttf | Bin 40392 -> 0 bytes .../pimcore/fonts/robotoslab-light.woff | Bin 24224 -> 0 bytes .../pimcore/fonts/robotoslab-light.woff2 | Bin 19112 -> 0 bytes .../pimcore/fonts/robotoslab-regular.eot | Bin 39066 -> 0 bytes .../pimcore/fonts/robotoslab-regular.svg | 687 ----------------- .../pimcore/fonts/robotoslab-regular.ttf | Bin 38804 -> 0 bytes .../pimcore/fonts/robotoslab-regular.woff | Bin 23624 -> 0 bytes .../pimcore/fonts/robotoslab-regular.woff2 | Bin 18620 -> 0 bytes .../themes/pimcore/img/favicon.png | Bin 2655 -> 0 bytes .../themes/pimcore/img/logo-white.svg | 10 - .../themes/pimcore/js/build/pimcore.js | 340 --------- .../themes/pimcore/js/build/pimcore.min.js | 1 - .../pimcore/js/source/html5shiv-3.7.3.min.js | 4 - .../themes/pimcore/js/source/pimcore.js | 29 - .../pimcore/js/source/pimcore_code_section.js | 126 ---- .../js/source/pimcore_image_lightbox.js | 19 - .../themes/pimcore/js/source/pimcore_video.js | 63 -- .../themes/pimcore/less/_boxes.less | 35 - .../themes/pimcore/less/_code.less | 70 -- .../themes/pimcore/less/_highlight-style.less | 84 --- .../themes/pimcore/less/_theme.less | 352 --------- .../themes/pimcore/less/_variables.less | 8 - .../themes/pimcore/less/pimcore-core.less | 3 - .../themes/pimcore/less/pimcore-generic.less | 3 - .../themes/pimcore/templates/content.php | 49 -- .../themes/pimcore/templates/home.php | 70 -- .../pimcore/templates/layout/00_layout.php | 105 --- .../pimcore/templates/layout/05_page.php | 105 --- .../templates/partials/change_version.php | 52 -- .../pimcore/templates/partials/disqus.php | 26 - .../pimcore/templates/partials/edit_on.php | 7 - .../templates/partials/navbar_content.php | 23 - .../templates/partials/version_info.php | 34 - .../tipuesearch/tipuesearch.css | 177 ----- .../generated-docs/tipuesearch/tipuesearch.js | 374 ---------- .../tipuesearch/tipuesearch_content.json | 1 - 420 files changed, 82950 deletions(-) delete mode 100644 docs/generated-docs/Bundles/Address_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Configuration_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Core_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Currency_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Customer_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Fixture_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Frontend_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Index_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Inventory_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Locale_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Menu_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Messenger_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Money_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Notification_Bundle.html delete mode 100644 docs/generated-docs/Bundles/OptimisticEntityLock_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Order_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Payment_Bundle.html delete mode 100644 docs/generated-docs/Bundles/PayumPayment_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Payum_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Pimcore_Bundle.html delete mode 100644 docs/generated-docs/Bundles/ProductQuantityPriceRules_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Product_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Resource_Bundle/CustomEntities.html delete mode 100644 docs/generated-docs/Bundles/Resource_Bundle/Installation.html delete mode 100644 docs/generated-docs/Bundles/Resource_Bundle/PimcoreEntities.html delete mode 100644 docs/generated-docs/Bundles/Resource_Bundle/index.html delete mode 100644 docs/generated-docs/Bundles/Rule_Bundle.html delete mode 100644 docs/generated-docs/Bundles/SEO_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Sequence_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Shipping_Bundle.html delete mode 100644 docs/generated-docs/Bundles/StorageList_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Store_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Taxation_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Theme_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Tracking_Bundle.html delete mode 100644 docs/generated-docs/Bundles/User_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Variant_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Wishlist_Bundle.html delete mode 100644 docs/generated-docs/Bundles/Workflow_Bundle.html delete mode 100644 docs/generated-docs/Bundles/index.html delete mode 100644 docs/generated-docs/Development/Cart/CRUD.html delete mode 100644 docs/generated-docs/Development/Cart/Cart_Manager.html delete mode 100644 docs/generated-docs/Development/Cart/Cart_Modifier.html delete mode 100644 docs/generated-docs/Development/Cart/Cart_Processor.html delete mode 100644 docs/generated-docs/Development/Cart/Commands.html delete mode 100644 docs/generated-docs/Development/Cart/Context.html delete mode 100644 docs/generated-docs/Development/Cart/index.html delete mode 100644 docs/generated-docs/Development/Checkout/Checkout_Manager.html delete mode 100644 docs/generated-docs/Development/Checkout/Checkout_Step.html delete mode 100644 docs/generated-docs/Development/Checkout/index.html delete mode 100644 docs/generated-docs/Development/Currency_Fractions/index.html delete mode 100644 docs/generated-docs/Development/Customers/CRUD.html delete mode 100644 docs/generated-docs/Development/Customers/Company_Extension.html delete mode 100644 docs/generated-docs/Development/Customers/Context.html delete mode 100644 docs/generated-docs/Development/Customers/Customer_Manager.html delete mode 100644 docs/generated-docs/Development/Customers/Registration_Types.html delete mode 100644 docs/generated-docs/Development/Customers/index.html delete mode 100644 docs/generated-docs/Development/Ecommerce_Tracking/index.html delete mode 100644 docs/generated-docs/Development/Events/index.html delete mode 100644 docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html delete mode 100644 docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Forms.html delete mode 100644 docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Resources.html delete mode 100644 docs/generated-docs/Development/Extending_Guide/Extending_Rule_Actions.html delete mode 100644 docs/generated-docs/Development/Extending_Guide/Extending_Rule_Conditions.html delete mode 100644 docs/generated-docs/Development/Index_and_Filters/Filter/Custom_Filter.html delete mode 100644 docs/generated-docs/Development/Index_and_Filters/Filter/index.html delete mode 100644 docs/generated-docs/Development/Index_and_Filters/Index/Extension.html delete mode 100644 docs/generated-docs/Development/Index_and_Filters/Index/Interpreter.html delete mode 100644 docs/generated-docs/Development/Index_and_Filters/Index/index.html delete mode 100644 docs/generated-docs/Development/Index_and_Filters/index.html delete mode 100644 docs/generated-docs/Development/Inventory/index.html delete mode 100644 docs/generated-docs/Development/Localization/Countries/CRUD.html delete mode 100644 docs/generated-docs/Development/Localization/Countries/Context.html delete mode 100644 docs/generated-docs/Development/Localization/Countries/index.html delete mode 100644 docs/generated-docs/Development/Localization/Currencies/CRUD.html delete mode 100644 docs/generated-docs/Development/Localization/Currencies/Context.html delete mode 100644 docs/generated-docs/Development/Localization/Currencies/index.html delete mode 100644 docs/generated-docs/Development/Localization/States/CRUD.html delete mode 100644 docs/generated-docs/Development/Localization/States/index.html delete mode 100644 docs/generated-docs/Development/Localization/Taxes/Tax_Rate/CRUD.html delete mode 100644 docs/generated-docs/Development/Localization/Taxes/Tax_Rate/index.html delete mode 100644 docs/generated-docs/Development/Localization/Taxes/Tax_Rule/CRUD.html delete mode 100644 docs/generated-docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html delete mode 100644 docs/generated-docs/Development/Localization/Taxes/Tax_Rule/index.html delete mode 100644 docs/generated-docs/Development/Localization/Taxes/index.html delete mode 100644 docs/generated-docs/Development/Localization/Zones/CRUD.html delete mode 100644 docs/generated-docs/Development/Localization/Zones/index.html delete mode 100644 docs/generated-docs/Development/Localization/index.html delete mode 100644 docs/generated-docs/Development/Notification_Rules/Custom_Actions.html delete mode 100644 docs/generated-docs/Development/Notification_Rules/Custom_Conditions.html delete mode 100644 docs/generated-docs/Development/Notification_Rules/Custom_Types.html delete mode 100644 docs/generated-docs/Development/Notification_Rules/Triggering.html delete mode 100644 docs/generated-docs/Development/Notification_Rules/index.html delete mode 100644 docs/generated-docs/Development/Order/AdditionalData.html delete mode 100644 docs/generated-docs/Development/Order/Invoice/Invoice_Creation.html delete mode 100644 docs/generated-docs/Development/Order/Invoice/index.html delete mode 100644 docs/generated-docs/Development/Order/OrderList/Action.html delete mode 100644 docs/generated-docs/Development/Order/OrderList/Filter.html delete mode 100644 docs/generated-docs/Development/Order/Order_Creation.html delete mode 100644 docs/generated-docs/Development/Order/Order_Workflow.html delete mode 100644 docs/generated-docs/Development/Order/Purchasable.html delete mode 100644 docs/generated-docs/Development/Order/Shipment/Shipment_Creation.html delete mode 100644 docs/generated-docs/Development/Order/Shipment/index.html delete mode 100644 docs/generated-docs/Development/Order/TemplateHelper.html delete mode 100644 docs/generated-docs/Development/Order/Transformer.html delete mode 100644 docs/generated-docs/Development/Order/index.html delete mode 100644 docs/generated-docs/Development/Payment/Omnipay_Bridge.html delete mode 100644 docs/generated-docs/Development/Payment/Payment_Provider.html delete mode 100644 docs/generated-docs/Development/Payment/Payum_Providers.html delete mode 100644 docs/generated-docs/Development/Payment/index.html delete mode 100644 docs/generated-docs/Development/Products/CRUD.html delete mode 100644 docs/generated-docs/Development/Products/Configuration.html delete mode 100644 docs/generated-docs/Development/Products/Multiple_Product_DataObjects.html delete mode 100644 docs/generated-docs/Development/Products/Price_Calculation.html delete mode 100644 docs/generated-docs/Development/Products/Price_Rules/index.html delete mode 100644 docs/generated-docs/Development/Products/Unit_Definitions.html delete mode 100644 docs/generated-docs/Development/Products/Units.html delete mode 100644 docs/generated-docs/Development/Products/index.html delete mode 100644 docs/generated-docs/Development/SEO/index.html delete mode 100644 docs/generated-docs/Development/Shipping/Carrier/CRUD.html delete mode 100644 docs/generated-docs/Development/Shipping/Carrier/Carrier_Discovery.html delete mode 100644 docs/generated-docs/Development/Shipping/Carrier/Price_Calculation.html delete mode 100644 docs/generated-docs/Development/Shipping/Carrier/index.html delete mode 100644 docs/generated-docs/Development/Shipping/Shipping_Rules/index.html delete mode 100644 docs/generated-docs/Development/Shipping/index.html delete mode 100644 docs/generated-docs/Development/State_Machine/Available_Workflows.html delete mode 100644 docs/generated-docs/Development/State_Machine/Create_Callbacks.html delete mode 100644 docs/generated-docs/Development/State_Machine/Extend_Workflows.html delete mode 100644 docs/generated-docs/Development/State_Machine/Things_To_Know.html delete mode 100644 docs/generated-docs/Development/State_Machine/index.html delete mode 100644 docs/generated-docs/Development/Store_Front/Controllers.html delete mode 100644 docs/generated-docs/Development/Store_Front/index.html delete mode 100644 docs/generated-docs/Development/Stores/CRUD.html delete mode 100644 docs/generated-docs/Development/Stores/Context.html delete mode 100644 docs/generated-docs/Development/Stores/Theme.html delete mode 100644 docs/generated-docs/Development/Stores/index.html delete mode 100644 docs/generated-docs/Development/index.html delete mode 100644 docs/generated-docs/Getting_Started/Architecture_Overview.html delete mode 100644 docs/generated-docs/Getting_Started/Difference_to_ecommerce_Framework.html delete mode 100644 docs/generated-docs/Getting_Started/Installation.html delete mode 100644 docs/generated-docs/Getting_Started/Upgrade_Notes.html delete mode 100644 docs/generated-docs/Getting_Started/index.html delete mode 100644 docs/generated-docs/User_Documentation/Automation/index.html delete mode 100644 docs/generated-docs/User_Documentation/Cart/index.html delete mode 100644 docs/generated-docs/User_Documentation/Catalog/Categories.html delete mode 100644 docs/generated-docs/User_Documentation/Catalog/Product_Variants.html delete mode 100644 docs/generated-docs/User_Documentation/Catalog/Products.html delete mode 100644 docs/generated-docs/User_Documentation/Catalog/index.html delete mode 100644 docs/generated-docs/User_Documentation/Geo_IP.html delete mode 100644 docs/generated-docs/User_Documentation/Inventory/index.html delete mode 100644 docs/generated-docs/User_Documentation/Localization/Countries.html delete mode 100644 docs/generated-docs/User_Documentation/Localization/Currencies.html delete mode 100644 docs/generated-docs/User_Documentation/Localization/States.html delete mode 100644 docs/generated-docs/User_Documentation/Localization/TaxRules.html delete mode 100644 docs/generated-docs/User_Documentation/Localization/Taxes.html delete mode 100644 docs/generated-docs/User_Documentation/Localization/Zones.html delete mode 100644 docs/generated-docs/User_Documentation/Localization/index.html delete mode 100644 docs/generated-docs/User_Documentation/Order/Order_Comments.html delete mode 100644 docs/generated-docs/User_Documentation/Order/Order_Detail.html delete mode 100644 docs/generated-docs/User_Documentation/Order/Order_Workflow.html delete mode 100644 docs/generated-docs/User_Documentation/Order/Orders.html delete mode 100644 docs/generated-docs/User_Documentation/Order/index.html delete mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Actions.html delete mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Cart_Price_Rules.html delete mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Conditions.html delete mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Product_Price_Rules.html delete mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html delete mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Specific_Price_Rules.html delete mode 100644 docs/generated-docs/User_Documentation/Price_Rules/Vouchers.html delete mode 100644 docs/generated-docs/User_Documentation/Price_Rules/index.html delete mode 100644 docs/generated-docs/User_Documentation/Reports/Abandoned_Carts.html delete mode 100644 docs/generated-docs/User_Documentation/Reports/Carrier_Distribution.html delete mode 100644 docs/generated-docs/User_Documentation/Reports/Carts.html delete mode 100644 docs/generated-docs/User_Documentation/Reports/Categories.html delete mode 100644 docs/generated-docs/User_Documentation/Reports/Customers.html delete mode 100644 docs/generated-docs/User_Documentation/Reports/Payment_Distribution.html delete mode 100644 docs/generated-docs/User_Documentation/Reports/Products.html delete mode 100644 docs/generated-docs/User_Documentation/Reports/Sales.html delete mode 100644 docs/generated-docs/User_Documentation/Reports/Vouchers.html delete mode 100644 docs/generated-docs/User_Documentation/Reports/index.html delete mode 100644 docs/generated-docs/User_Documentation/Settings.html delete mode 100644 docs/generated-docs/User_Documentation/Shipping/Carriers.html delete mode 100644 docs/generated-docs/User_Documentation/Shipping/Shipping_Rules.html delete mode 100644 docs/generated-docs/User_Documentation/Shipping/index.html delete mode 100644 docs/generated-docs/User_Documentation/Stores.html delete mode 100644 docs/generated-docs/User_Documentation/index.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Address_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Configuration_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Core_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Currency_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Customer_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Fixture_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Frontend_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Index_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Inventory_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Locale_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Menu_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Messenger_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Money_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Notification_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/OptimisticEntityLock_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Order_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Payment_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/PayumPayment_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Payum_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Pimcore_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/ProductQuantityPriceRules_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Product_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Resource_Bundle/CustomEntities.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Resource_Bundle/Installation.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Resource_Bundle/PimcoreEntities.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Resource_Bundle/index.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Rule_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/SEO_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Sequence_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Shipping_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/StorageList_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Store_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Taxation_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Theme_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Tracking_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/User_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Variant_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Wishlist_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/Workflow_Bundle.html delete mode 100644 docs/generated-docs/generated_docs/Bundles/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Cart/CRUD.html delete mode 100644 docs/generated-docs/generated_docs/Development/Cart/Cart_Manager.html delete mode 100644 docs/generated-docs/generated_docs/Development/Cart/Cart_Modifier.html delete mode 100644 docs/generated-docs/generated_docs/Development/Cart/Cart_Processor.html delete mode 100644 docs/generated-docs/generated_docs/Development/Cart/Commands.html delete mode 100644 docs/generated-docs/generated_docs/Development/Cart/Context.html delete mode 100644 docs/generated-docs/generated_docs/Development/Cart/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Checkout/Checkout_Manager.html delete mode 100644 docs/generated-docs/generated_docs/Development/Checkout/Checkout_Step.html delete mode 100644 docs/generated-docs/generated_docs/Development/Checkout/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Currency_Fractions/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Customers/CRUD.html delete mode 100644 docs/generated-docs/generated_docs/Development/Customers/Company_Extension.html delete mode 100644 docs/generated-docs/generated_docs/Development/Customers/Context.html delete mode 100644 docs/generated-docs/generated_docs/Development/Customers/Customer_Manager.html delete mode 100644 docs/generated-docs/generated_docs/Development/Customers/Registration_Types.html delete mode 100644 docs/generated-docs/generated_docs/Development/Customers/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Ecommerce_Tracking/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Events/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html delete mode 100644 docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Forms.html delete mode 100644 docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Resources.html delete mode 100644 docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Actions.html delete mode 100644 docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Conditions.html delete mode 100644 docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/Custom_Filter.html delete mode 100644 docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Extension.html delete mode 100644 docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Interpreter.html delete mode 100644 docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Index_and_Filters/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Inventory/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Countries/CRUD.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Countries/Context.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Countries/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Currencies/CRUD.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Currencies/Context.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Currencies/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/States/CRUD.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/States/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/CRUD.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/CRUD.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Taxes/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Zones/CRUD.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/Zones/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Localization/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Actions.html delete mode 100644 docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Conditions.html delete mode 100644 docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Types.html delete mode 100644 docs/generated-docs/generated_docs/Development/Notification_Rules/Triggering.html delete mode 100644 docs/generated-docs/generated_docs/Development/Notification_Rules/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Order/AdditionalData.html delete mode 100644 docs/generated-docs/generated_docs/Development/Order/Invoice/Invoice_Creation.html delete mode 100644 docs/generated-docs/generated_docs/Development/Order/Invoice/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Order/OrderList/Action.html delete mode 100644 docs/generated-docs/generated_docs/Development/Order/OrderList/Filter.html delete mode 100644 docs/generated-docs/generated_docs/Development/Order/Order_Creation.html delete mode 100644 docs/generated-docs/generated_docs/Development/Order/Order_Workflow.html delete mode 100644 docs/generated-docs/generated_docs/Development/Order/Purchasable.html delete mode 100644 docs/generated-docs/generated_docs/Development/Order/Shipment/Shipment_Creation.html delete mode 100644 docs/generated-docs/generated_docs/Development/Order/Shipment/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Order/TemplateHelper.html delete mode 100644 docs/generated-docs/generated_docs/Development/Order/Transformer.html delete mode 100644 docs/generated-docs/generated_docs/Development/Order/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Payment/Omnipay_Bridge.html delete mode 100644 docs/generated-docs/generated_docs/Development/Payment/Payment_Provider.html delete mode 100644 docs/generated-docs/generated_docs/Development/Payment/Payum_Providers.html delete mode 100644 docs/generated-docs/generated_docs/Development/Payment/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Products/CRUD.html delete mode 100644 docs/generated-docs/generated_docs/Development/Products/Configuration.html delete mode 100644 docs/generated-docs/generated_docs/Development/Products/Multiple_Product_DataObjects.html delete mode 100644 docs/generated-docs/generated_docs/Development/Products/Price_Calculation.html delete mode 100644 docs/generated-docs/generated_docs/Development/Products/Price_Rules/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Products/Unit_Definitions.html delete mode 100644 docs/generated-docs/generated_docs/Development/Products/Units.html delete mode 100644 docs/generated-docs/generated_docs/Development/Products/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/SEO/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Shipping/Carrier/CRUD.html delete mode 100644 docs/generated-docs/generated_docs/Development/Shipping/Carrier/Carrier_Discovery.html delete mode 100644 docs/generated-docs/generated_docs/Development/Shipping/Carrier/Price_Calculation.html delete mode 100644 docs/generated-docs/generated_docs/Development/Shipping/Carrier/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Shipping/Shipping_Rules/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Shipping/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/State_Machine/Available_Workflows.html delete mode 100644 docs/generated-docs/generated_docs/Development/State_Machine/Create_Callbacks.html delete mode 100644 docs/generated-docs/generated_docs/Development/State_Machine/Extend_Workflows.html delete mode 100644 docs/generated-docs/generated_docs/Development/State_Machine/Things_To_Know.html delete mode 100644 docs/generated-docs/generated_docs/Development/State_Machine/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Store_Front/Controllers.html delete mode 100644 docs/generated-docs/generated_docs/Development/Store_Front/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/Stores/CRUD.html delete mode 100644 docs/generated-docs/generated_docs/Development/Stores/Context.html delete mode 100644 docs/generated-docs/generated_docs/Development/Stores/Theme.html delete mode 100644 docs/generated-docs/generated_docs/Development/Stores/index.html delete mode 100644 docs/generated-docs/generated_docs/Development/index.html delete mode 100644 docs/generated-docs/generated_docs/Getting_Started/Architecture_Overview.html delete mode 100644 docs/generated-docs/generated_docs/Getting_Started/Difference_to_ecommerce_Framework.html delete mode 100644 docs/generated-docs/generated_docs/Getting_Started/Installation.html delete mode 100644 docs/generated-docs/generated_docs/Getting_Started/Upgrade_Notes.html delete mode 100644 docs/generated-docs/generated_docs/Getting_Started/index.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Automation/index.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Cart/index.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Catalog/Categories.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Catalog/Product_Variants.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Catalog/Products.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Catalog/index.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Geo_IP.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Inventory/index.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/Countries.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/Currencies.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/States.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/TaxRules.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/Taxes.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/Zones.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Localization/index.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Order/Order_Comments.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Order/Order_Detail.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Order/Order_Workflow.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Order/Orders.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Order/index.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Actions.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Cart_Price_Rules.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Conditions.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Product_Price_Rules.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Specific_Price_Rules.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Vouchers.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Price_Rules/index.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Abandoned_Carts.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Carrier_Distribution.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Carts.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Categories.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Customers.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Payment_Distribution.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Products.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Sales.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/Vouchers.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Reports/index.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Settings.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Shipping/Carriers.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Shipping/Shipping_Rules.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Shipping/index.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/Stores.html delete mode 100644 docs/generated-docs/generated_docs/User_Documentation/index.html delete mode 100644 docs/generated-docs/generated_docs/index.html delete mode 100644 docs/generated-docs/index.html delete mode 100644 docs/generated-docs/themes/pimcore/config.json delete mode 100644 docs/generated-docs/themes/pimcore/css/pimcore-core.min.css delete mode 100644 docs/generated-docs/themes/pimcore/css/pimcore-generic.min.css delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.eot delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.svg delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.ttf delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.woff delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.woff2 delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-light.eot delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-light.svg delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-light.ttf delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-light.woff delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-light.woff2 delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.eot delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.svg delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.ttf delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.woff delete mode 100644 docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.woff2 delete mode 100644 docs/generated-docs/themes/pimcore/img/favicon.png delete mode 100644 docs/generated-docs/themes/pimcore/img/logo-white.svg delete mode 100644 docs/generated-docs/themes/pimcore/js/build/pimcore.js delete mode 100644 docs/generated-docs/themes/pimcore/js/build/pimcore.min.js delete mode 100644 docs/generated-docs/themes/pimcore/js/source/html5shiv-3.7.3.min.js delete mode 100644 docs/generated-docs/themes/pimcore/js/source/pimcore.js delete mode 100644 docs/generated-docs/themes/pimcore/js/source/pimcore_code_section.js delete mode 100644 docs/generated-docs/themes/pimcore/js/source/pimcore_image_lightbox.js delete mode 100644 docs/generated-docs/themes/pimcore/js/source/pimcore_video.js delete mode 100644 docs/generated-docs/themes/pimcore/less/_boxes.less delete mode 100644 docs/generated-docs/themes/pimcore/less/_code.less delete mode 100644 docs/generated-docs/themes/pimcore/less/_highlight-style.less delete mode 100644 docs/generated-docs/themes/pimcore/less/_theme.less delete mode 100644 docs/generated-docs/themes/pimcore/less/_variables.less delete mode 100644 docs/generated-docs/themes/pimcore/less/pimcore-core.less delete mode 100644 docs/generated-docs/themes/pimcore/less/pimcore-generic.less delete mode 100644 docs/generated-docs/themes/pimcore/templates/content.php delete mode 100644 docs/generated-docs/themes/pimcore/templates/home.php delete mode 100644 docs/generated-docs/themes/pimcore/templates/layout/00_layout.php delete mode 100644 docs/generated-docs/themes/pimcore/templates/layout/05_page.php delete mode 100644 docs/generated-docs/themes/pimcore/templates/partials/change_version.php delete mode 100644 docs/generated-docs/themes/pimcore/templates/partials/disqus.php delete mode 100644 docs/generated-docs/themes/pimcore/templates/partials/edit_on.php delete mode 100644 docs/generated-docs/themes/pimcore/templates/partials/navbar_content.php delete mode 100644 docs/generated-docs/themes/pimcore/templates/partials/version_info.php delete mode 100644 docs/generated-docs/tipuesearch/tipuesearch.css delete mode 100644 docs/generated-docs/tipuesearch/tipuesearch.js delete mode 100644 docs/generated-docs/tipuesearch/tipuesearch_content.json diff --git a/docs/generated-docs/Bundles/Address_Bundle.html b/docs/generated-docs/Bundles/Address_Bundle.html deleted file mode 100644 index 6a062154d7..0000000000 --- a/docs/generated-docs/Bundles/Address_Bundle.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Address Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Address Bundle

-

CoreShop Address Bundle provides a basic set of data for Addressing Information like:

-
    -
  • Country
  • -
  • State
  • -
  • Address
  • -
-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Configuration_Bundle.html b/docs/generated-docs/Bundles/Configuration_Bundle.html deleted file mode 100644 index b7618e99de..0000000000 --- a/docs/generated-docs/Bundles/Configuration_Bundle.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - Configuration Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Configuration Bundle

-

Installation

-
$ composer require coreshop/configuration-bundle:^3.0
-
-

Usage

-

Configuration Component helps you store your configurations in database.

-
    $service = new CoreShop\Component\Configuration\Service\ConfigurationService($doctrineEntityManager, $configRepo, $configFactory);
-    $service->set('key', 'value');
-
-    $service->get('key');
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Core_Bundle.html b/docs/generated-docs/Bundles/Core_Bundle.html deleted file mode 100644 index 3fa93009f6..0000000000 --- a/docs/generated-docs/Bundles/Core_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Core Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Core Bundle

-

Core Bundle glues all independent CoreShop Bundles into one e-commerce suite and extends certain parts accordingly.

-
-

This Bundle is not advised to be installed seperately!

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Currency_Bundle.html b/docs/generated-docs/Bundles/Currency_Bundle.html deleted file mode 100644 index a72c1ccfe9..0000000000 --- a/docs/generated-docs/Bundles/Currency_Bundle.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - Currency Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Currency Bundle

-

Currency Bundle provides you with Models for persisting Currencies and resolving Currency Contexts.

-
    -
  • Symfony Profiler
  • -
  • Pimcore Core Extensions
  • -
  • Doctrine Mappings
  • -
  • Symfony Forms
  • -
  • Money Formatter
  • -
  • Twig Extensions -
      -
    • Currency Formatting
    • -
    • Currency Conversion
    • -
    • Currency Code to Symbol
    • -
    -
  • -
-

Installation

-
$ composer require coreshop/currency-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\CurrencyBundle\CoreShopCurrencyBundle(),
-    ]);
-}
-
-

Updating database schema

-

Run the following command.

-
$ php bin/console doctrine:schema:update --force
-
-

Usage

-

This Bundle integrates Currency Component into Symfony and Doctrine

-

The Currency Bundle provides you with basic information needed for Currencies: Currency, Exchange Rates, Conversion and Formatting

-

Doctrine Entities

-
    -
  • Currency
  • -
-

Pimcore UI

-
    -
  • Currency
  • -
  • Exchange Rate
  • -
-

How to use?

-
coreshop.global.resource.open('coreshop.currency', 'currency');
-coreshop.global.resource.open('coreshop.currency', 'exchange_rate');
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Customer_Bundle.html b/docs/generated-docs/Bundles/Customer_Bundle.html deleted file mode 100644 index 6a5c89c5e4..0000000000 --- a/docs/generated-docs/Bundles/Customer_Bundle.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - Customer Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Customer Bundle

-

Installation

-
$ composer require coreshop/customer-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\CustomerBundle\CoreShopCustomerBundle(),
-    ]);
-}
-
-

Updating database schema

-

Run the following command.

-
$ php bin/console doctrine:schema:update --force
-
-

Install Pimcore Entities

-
$ php bin/console coreshop:resources:install
-
-

Learn more about overriding Pimcore Classes here)

-

Usage

-

This Bundle integrates Customer Component into Symfony and Doctrine

-

The Customer Bundle provides you with basic information needed for a Customer: Customer and CustomerGroup

-

The Bundle also introduces an Customer Context, which helps you determine the current Customer.

-

Pimcore Entities

-
    -
  • Customer (CoreShopCustomer)
  • -
  • CustomerGroup (CoreShopCustomerGroup)
  • -
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Fixture_Bundle.html b/docs/generated-docs/Bundles/Fixture_Bundle.html deleted file mode 100644 index ef17dac419..0000000000 --- a/docs/generated-docs/Bundles/Fixture_Bundle.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - Fixture Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Fixture Bundle

-

Fixture Bundle allows us to Install certain data needed for runtime of CoreShop or for the Demo.

-

Installation

-
$ composer require coreshop/fixture-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\FixtureBundle\CoreShopFixtureBundle(),
-    ]);
-}
-
-

Updating database schema

-

Run the following command.

-
$ php bin/console doctrine:schema:update --force
-
-

Creating a new Fixture

-

Create a new File in your Bundle within the Namespace Fixtures\Data\Application for app fixtures and Fixtures\Data\Demo for Demo fixtures. The FixtureBundle -will automatically recognize your fixtures.

-
<?php
-
-namespace CoreShop\Bundle\CoreBundle\Fixtures\Application;
-
-use CoreShop\Bundle\FixtureBundle\Fixture\VersionedFixtureInterface;
-use Doctrine\Common\DataFixtures\AbstractFixture;
-use Doctrine\Common\Persistence\ObjectManager;
-use Symfony\Component\DependencyInjection\ContainerAwareInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-class ConfigurationFixture extends AbstractFixture implements ContainerAwareInterface, VersionedFixtureInterface
-{
-    /**
-     * @var ContainerInterface
-     */
-    private $container;
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getVersion()
-    {
-        return '2.0';
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function setContainer(ContainerInterface $container = null)
-    {
-        $this->container = $container;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function load(ObjectManager $manager)
-    {
-        $configurations = [
-            'system.guest.checkout' => true,
-            'system.category.list.mode' => 'list',
-            'system.category.list.per_page' => [12, 24, 36],
-            'system.category.list.per_page.default' => 12,
-            'system.category.grid.per_page' => [5, 10, 15, 20, 25],
-            'system.category.grid.per_page.default' => 10,
-            'system.category.variant_mode' => 'hide',
-            'system.order.prefix' => 'O',
-            'system.order.suffix' => '',
-            'system.quote.prefix' => 'Q',
-            'system.quote.suffix' => '',
-            'system.invoice.prefix' => 'IN',
-            'system.invoice.suffix' => '',
-            'system.invoice.wkhtml' => '-T 40mm -B 15mm -L 10mm -R 10mm --header-spacing 5 --footer-spacing 5',
-            'system.shipment.prefix' => 'SH',
-            'system.shipment.suffix' => '',
-            'system.shipment.wkhtml' => '-T 40mm -B 15mm -L 10mm -R 10mm --header-spacing 5 --footer-spacing 5',
-        ];
-
-        foreach ($configurations as $key => $value) {
-            $this->container->get('coreshop.configuration.service')->set($key, $value);
-        }
-    }
-}
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Frontend_Bundle.html b/docs/generated-docs/Bundles/Frontend_Bundle.html deleted file mode 100644 index 6c261bf208..0000000000 --- a/docs/generated-docs/Bundles/Frontend_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Frontend Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Frontend Bundle

-

CoreShop FrontendBundle provides some FrontendControllers as well as a default Implementation for the Frontend.

-
-

This Bundle is not advised to be installed seperately!

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Index_Bundle.html b/docs/generated-docs/Bundles/Index_Bundle.html deleted file mode 100644 index 2d778f94af..0000000000 --- a/docs/generated-docs/Bundles/Index_Bundle.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - Index Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Index Bundle

-

Installation

-
$ composer require coreshop/index-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\IndexBundle\CoreShopIndexBundle(),
-    ]);
-}
-
-

Updating database schema

-

Run the following command.

-
$ php bin/console doctrine:schema:update --force
-
-

Usage

-

This Bundle integrates Index Component into Symfony and Doctrine

-

The Index Bundle provides you with basic information needed for a Indexing Pimcore Models: Index, Filters and Conditions

-

It also provides you with ListingServices and FilterServices

-

Get Listing from Index

-

How to get a Listing from an Index?

-
$filter = $this->get('coreshop.repository.filter')->find(1); //Get Filter by ID 1
-$filteredList = $this->get('coreshop.factory.filter.list')->createList($filter, $request->request);
-$filteredList->setVariantMode(ListingInterface::VARIANT_MODE_HIDE);
-$filteredList->setCategory($category);
-$this->get('coreshop.filter.processor')->processConditions($filter, $filteredList, $request->query);
-$filteredList->load();
-
-

Pimcore UI

-
    -
  • Index Configuration
  • -
  • Filter Configuration
  • -
-

How to use?

-
coreshop.global.resource.open('coreshop.index', 'index');
-coreshop.global.resource.open('coreshop.index', 'filter');
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Inventory_Bundle.html b/docs/generated-docs/Bundles/Inventory_Bundle.html deleted file mode 100644 index a29fceebdd..0000000000 --- a/docs/generated-docs/Bundles/Inventory_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Inventory Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Inventory Bundle

-

CoreShop Inventory Bundle provides a Basic implementation to handle Inventory for a Product.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Locale_Bundle.html b/docs/generated-docs/Bundles/Locale_Bundle.html deleted file mode 100644 index 4209e2d1f1..0000000000 --- a/docs/generated-docs/Bundles/Locale_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Locale Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Locale Bundle

-

CoreShop Locale Bundle provides a basic set of data for Locale Information.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Menu_Bundle.html b/docs/generated-docs/Bundles/Menu_Bundle.html deleted file mode 100644 index c5fabef061..0000000000 --- a/docs/generated-docs/Bundles/Menu_Bundle.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - Menu Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Menu Bundle

-

Menu Bundle makes it easy creating Pimcore Menus based on permissions.

-

Installation

-
$ composer require coreshop/menu-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\MenuBundle\CoreShopMenuBundle(),
-    ]);
-}
-
-

Usage

-

Create a new Menu by creating a new Class, let's call it MyMenuBuilder

-

-namespace AppBundle\Menu;
-
-use CoreShop\Bundle\MenuBundle\Builder\MenuBuilderInterface;
-use Knp\Menu\FactoryInterface;
-use Knp\Menu\ItemInterface;
-
-class MyMenuBuilder implements MenuBuilderInterface
-{
-    public function buildMenu(ItemInterface $menuItem, FactoryInterface $factory, string $type) 
-    {
-        //Create a new direct sub-menu item
-        $menuItem
-            ->addChild('my-menu-item')
-            ->setLabel('my-menu-item')
-            ->setAttribute('permission', 'my_menu_item')
-            ->setAttribute('iconCls', 'pimcore_icon_delete')
-        ;
-    }
-}
-
-

You then need to register your class to the symfony container:

-
    app.my_menu:
-        class: AppBundle\Menu\MyMenuBuilder
-        tags:
-            - { name: coreshop.menu, type: my_menu, menu: my_menu }
-
-
-

Where the menu attribute defines your unique identifier for your menu. You can also register multiple Builders -for your Menu with the same menu attribute, this will load them one after another.

-

Now, lets do the ExtJs Javascript part. In your Bundle. I assume you already have a working Bundle for that. In your -Bundle.php file, add this file to the jsPaths array:

-
'/admin/coreshop/coreshop.my_menu/menu.js'
-
-

Where my_menu here again is your defined identifier. This will load a basic helper file that will build your menu. -Now, let's actually build the menu.

-

You should already have a startup.js somehwere in your Bundle. In there, you can instantiate the menu by calling:

-
new coreshop.menu.coreshop.my_menu();
-
-

That will build the menu automatically for you.

-

In order now to do something when a menu-item is clicked, you can attach to the event that is fired:

-
pimcore.eventDispatcher.registerTarget('coreshopMenuOpen', new (Class.create({
-    coreshopMenuOpen: function(type, item) {
-        if (item.id === 'my-menu-item') {
-            alert('My Menu Item has been clicked');
-        }
-    }
-})));
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Messenger_Bundle.html b/docs/generated-docs/Bundles/Messenger_Bundle.html deleted file mode 100644 index 6d5e772043..0000000000 --- a/docs/generated-docs/Bundles/Messenger_Bundle.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - Messenger Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Messenger Bundle

-

CoreShop Messenger Bundle provides you with a nice UI to see what Messenger Tasks are queued in which queues:

-

Messenger

-

Installation

-
$ composer require coreshop/messenger-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\MessengerBundle\CoreShopMessengerBundle(),
-    ]);
-}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Money_Bundle.html b/docs/generated-docs/Bundles/Money_Bundle.html deleted file mode 100644 index 1c174d8a06..0000000000 --- a/docs/generated-docs/Bundles/Money_Bundle.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - Money Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Money Bundle

-

Installation

-
$ composer require coreshop/money-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\MoneyBundle\CoreShopMoneyBundle(),
-    ]);
-}
-
-

Usage

-

Money Bundle adds a new core-extension to pimcore which allows you to store currency values as integer.

-

You also get a Twig Extension to format money values.

-
{{ value|coreshop_format_money('€', 'de'); }}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Notification_Bundle.html b/docs/generated-docs/Bundles/Notification_Bundle.html deleted file mode 100644 index 2e742a9a08..0000000000 --- a/docs/generated-docs/Bundles/Notification_Bundle.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - Notification Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Notification Bundle

-

CoreShop Notification Bundle handles all communication between CoreShop and the outside world. It provides a basic set of data for Notifications like:

-
    -
  • Notification Rules
  • -
  • Notification Rule Conditions
  • -
  • Notification Rule Actions
  • -
-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-

Usage

-

Notifications run async in a Symfony messenger queue:

-
bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/OptimisticEntityLock_Bundle.html b/docs/generated-docs/Bundles/OptimisticEntityLock_Bundle.html deleted file mode 100644 index 33fff358bb..0000000000 --- a/docs/generated-docs/Bundles/OptimisticEntityLock_Bundle.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - OptimisticEntityLock Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Optimistic Entity Lock Bundle

-

The CoreShop Optimistic Entity Lock Bundle is a package for the CoreShop e-commerce framework, based on the Pimcore platform, designed to handle optimistic entity locking. This bundle helps prevent conflicts when multiple users try to edit the same entity concurrently by implementing an optimistic locking strategy. -Messenger

-

Installation

-
$ composer require optimistic-entity-lock-bundle
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\OptimisticEntityLockBundle\CoreShopOptimisticEntityLockBundle(),
-    ]);
-}
-
-

Usage

-

Your Pimcore DataObject Class needs to implement the Interface CoreShop\Bundle\OptimisticEntityLockBundle\Model\OptimisticLockedInterface.

-

You can therefore add the field optimisticLockVersion to your Pimcore Class Definition.

-

From now on, everytime the DataObject gets saved, CoreShop compares the Versions and increases it before saving. If the version is different, someone else saved the entity before you and you get a exception.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Order_Bundle.html b/docs/generated-docs/Bundles/Order_Bundle.html deleted file mode 100644 index 9eac334ac1..0000000000 --- a/docs/generated-docs/Bundles/Order_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Order Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Order Bundle

-

CoreShop Order Bundle provides a basic set of data for Orders.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Payment_Bundle.html b/docs/generated-docs/Bundles/Payment_Bundle.html deleted file mode 100644 index d46e10cbeb..0000000000 --- a/docs/generated-docs/Bundles/Payment_Bundle.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - Payment Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Payment Bundle

-

Installation

-
$ composer require coreshop/payment-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\PaymentBundle\CoreShopPaymentBundle(),
-    ]);
-}
-
-

Updating database schema

-

Run the following command.

-
$ php bin/console doctrine:schema:update --force
-
-

Usage

-

This Bundle integrates Payment Component into Symfony and Doctrine

-

The Payment Bundle provides you with basic information needed for payment: Payment

-

The Bundle also introduces an Address Formatter, which formats addresses in country based formats.

-

Doctrine Entities

-
    -
  • Payment
  • -
-

Pimcore UI

-
    -
  • Payment Provider
  • -
-

How to use?

-
coreshop.global.resource.open('coreshop.payment', 'payment_provider');
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/PayumPayment_Bundle.html b/docs/generated-docs/Bundles/PayumPayment_Bundle.html deleted file mode 100644 index 24ba9550ce..0000000000 --- a/docs/generated-docs/Bundles/PayumPayment_Bundle.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - PayumPayment Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Payum_Bundle.html b/docs/generated-docs/Bundles/Payum_Bundle.html deleted file mode 100644 index 549c8f3013..0000000000 --- a/docs/generated-docs/Bundles/Payum_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Payum Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Payum Bundle

-

Handles the Payum Integration with CoreShop. This Bundle requires the Core and can only be used in the full installation.

-
-

This Bundle is not advised to be installed seperately!

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Pimcore_Bundle.html b/docs/generated-docs/Bundles/Pimcore_Bundle.html deleted file mode 100644 index c865befffa..0000000000 --- a/docs/generated-docs/Bundles/Pimcore_Bundle.html +++ /dev/null @@ -1,422 +0,0 @@ - - - - - - - Pimcore Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Pimcore Bundle

-

Installation

-
$ composer require coreshop/pimcore-bundle:^3.0
-
-

Activating Bundle

-

You need to enable the bundle inside the kernel or with the Pimcore Extension Manager.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\PimcoreBundle\CoreShopPimcoreBundle()
-    ]);
-}
-
-

Usage

-

The CoreShopPimcoreBundle integrates the CoreShop Pimcore Component into Symfony automatically registers a lot of services for you.

-

JS/CSS Resource Loading

-

With Pimcore, every bundle needs to take care about loading static assets themselve. PimcoreBundle helps you out here, follow these steps to use it:

-
    -
  • Create a DependencyInjection Extension class like:
  • -
-
<?php
-
-namespace AppBundle\DependencyInjection;
-
-use CoreShop\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractModelExtension;
-use Symfony\Component\Config\FileLocator;
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
-
-class AppExtension extends AbstractModelExtension
-{
-    public function load(array $config, ContainerBuilder $container)
-    {
-        $config = $this->processConfiguration($this->getConfiguration([], $container), $config);
-
-        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
-        $loader->load('services.yml');
-
-        $this->registerPimcoreResources('coreshop', $config['pimcore_admin'], $container);
-    }
-}
-
-
    -
  • Create a DependencyInjection Configuration class like:
  • -
-
<?php
-
-namespace AppBundle\DependencyInjection;
-
-use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
-use Symfony\Component\Config\Definition\Builder\TreeBuilder;
-use Symfony\Component\Config\Definition\ConfigurationInterface;
-
-final class Configuration implements ConfigurationInterface
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function getConfigTreeBuilder()
-    {
-        $treeBuilder = new TreeBuilder();
-        $rootNode = $treeBuilder->root('app');
-
-        $this->addPimcoreResourcesSection($rootNode);
-
-        return $treeBuilder;
-    }
-
-    /**
-     * @param ArrayNodeDefinition $node
-     */
-    private function addPimcoreResourcesSection(ArrayNodeDefinition $node)
-    {
-        $node->children()
-            ->arrayNode('pimcore_admin')
-                ->addDefaultsIfNotSet()
-                ->children()
-                    ->arrayNode('js')
-                        ->addDefaultsIfNotSet()
-                        ->ignoreExtraKeys(false)
-                        ->children()
-                            ->scalarNode('test')->defaultValue('/bundles/app/pimcore/js/test.js')->end()
-                        ->end()
-                    ->end()
-                    ->arrayNode('css')
-                        ->addDefaultsIfNotSet()
-                        ->ignoreExtraKeys(false)
-                        ->children()
-                            ->scalarNode('test')->defaultValue('/bundles/app/pimcore/css/pimcore.css')->end()
-                        ->end()
-                    ->end()
-                ->end()
-            ->end()
-        ->end();
-    }
-}
-
-
-
    -
  • That's it, PimcoreBundle now takes care about loading your resources and also bundles them in non DEV-Mode.
  • -
-

DataObject Extensions

-

Serialized Data

-

This extension allows you to store SerializedData inside a Pimcore DataObject.

-

Slug

-

Pimcore comes with quite useful objects slugs. But it doesn't come with a Slug Generator. CoreShop for the rescue. In Order to use it, -your class needs to implement CoreShop\Component\Pimcore\Slug\SluggableInterface and CoreShop automatically generates slugs for you.

-

Extensions / Influence the slug generation

-

If you want to change the generated slug or prefix it, you can use the CoreShop\Component\Pimcore\Event\SlugGenerationEvent Event.

-
<?php
-
-declare(strict_types=1);
-
-namespace App\EventListener;
-
-use CoreShop\Component\Pimcore\Event\SlugGenerationEvent;
-use Pimcore\Model\DataObject\PressRelease;
-use Pimcore\Model\Document;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
-
-final class SlugEventListener implements EventSubscriberInterface
-{
-    public static function getSubscribedEvents()
-    {
-        return [
-            SlugGenerationEvent::class => 'onGenerate',
-        ];
-    }
-
-    public function onGenerate(SlugGenerationEvent $event): void
-    {
-        $event->setSlug($event->getSlug() . '-bar');
-    }
-}
-
-

Data Object Features

-

Class Converter and Data Migrate

-

Class converter is a small utility, which lets you migrate all Data from one class to another. Usage:

-
<?php
-
-use CoreShop\Component\Pimcore\Migrate;
-
-$currentClassName = 'Product';
-$newClassName = 'NewProduct';
-$options = [
-    'delete_existing_class' => true,
-    'parentClass' => 'AppBundle\Model\MyProduct'
-];
-
-//Copies $currentClassName Definition to $newClassName
-//$options can overwrite some properties like parentClass
-Migrate::migrateClass($currentClassName, $newClassName, $options);
-
-//This function migrates all data from $currentClassName to $newClassName
-//It uses SQL Commands to increase performance of migration
-Migrate::migrateData($currentClassName, $newClassName);
-
-

Class Installer

-

Class Installer helps you importing Classes/FieldCollections/ObjectBricks into Pimcore based of a JSON Definition:

-

-use CoreShop\Component\Pimcore\ClassInstaller;
-
-$installer = new ClassInstaller();
-
-// For Bricks use
-$installer->createBrick($pathToJson, $brickName);
-
-// For Classes use
-$installer->createClass($pathToJson, $className, $updateExistingClass);
-
-// For FieldCollections use
-$installer->createFieldCollection($pathToJson, $fcName);
-
-
-

Class/Brick/Field Collection Updater

-

Definition Updaters help you in migrating your Pimcore Class/Bricks or Field Collection Definitions to be properly -migrated from Release to Release.

-

To update a Pimcore class use it like this:

-
use CoreShop\Component\Pimcore\DataObject\ClassUpdate;
-
-$classUpdater = new ClassUpdate('Product');
-
-//Your JSON Definition from Pimcore
-$payment = [
-    'fieldtype' => 'coreShopSerializedData',
-    'phpdocType' => 'array',
-    'allowedTypes' =>
-        [
-        ],
-    'maxItems' => 1,
-    'name' => 'paymentSettings',
-    'title' => 'Payment Settings',
-    'tooltip' => '',
-    'mandatory' => false,
-    'noteditable' => true,
-    'index' => false,
-    'locked' => null,
-    'style' => '',
-    'permissions' => null,
-    'datatype' => 'data',
-    'columnType' => null,
-    'queryColumnType' => null,
-    'relationType' => false,
-    'invisible' => false,
-    'visibleGridView' => false,
-    'visibleSearch' => false,
-];
-
-//Check if field exists
-if (!$classUpdater->hasField('paymentSettings')) {
-    //If not insert field after a specific field and save the definition
-    $classUpdater->insertFieldAfter('paymentProvider', $payment);
-    $classUpdater->save();
-}
-
-
-

Thats it, the same works for FieldCollections with the class CoreShop\Component\Pimcore\DataObject\FieldCollectionDefinitionUpdate -and for Bricks with the class CoreShop\Component\Pimcore\DataObject\BrickDefinitionUpdate

-

Inheritance Helper

-

Inhertiance Helper is a small little but very useful helper class to enable Pimcore inheritance only with a closure function like this:

-

-use CoreShop\Component\Pimcore\DataObject\InheritanceHelper;
-
-$inheritedValue = InheritanceHelper::useInheritedValues(function() use($object) {
-    return $object->getValueInherited();
-}, true);
-
-
-

Version Helper

-

Version Helper is a small little but very useful helper class to disabling or enablind Pimcore Versioning.

-

-use CoreShop\Component\Pimcore\DataObject\VersionHelper;
-
-VersionHelper::useVersioning(function() use($object) {
-    //Object will be saved without creating a new Version
-    $object->save();
-}, false);
-
-
-

Unpublished Helper

-

Unpublsihed Helper is a small little but very useful helper class to get unpublished objects in Pimcore Frontend.

-

-use CoreShop\Component\Pimcore\DataObject\UnpublishedHelper;
-
-$allProducts = UnpublishedHelper::hideUnpublished(function() use($object) {
-    //Will return all products, even the unpbulished ones
-    return $object->getProducts();
-}, false);
-
-
-

Expression Language Features

-

CoreShop adds some features to the Symfony Expression language like:

-
    -
  • PimcoreLanguageProvider: to get Pimcore Objects, Assets or Documents inside a Expression Language Query
  • -
-

Migration Features

-

Pimcore Shared Translations

-

Helps you to install new Shared Translations during Migration:

-
use CoreShop\Component\Pimcore\Migration\SharedTranslation;
-
-SharedTranslation::add('key', 'en', 'value');
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/ProductQuantityPriceRules_Bundle.html b/docs/generated-docs/Bundles/ProductQuantityPriceRules_Bundle.html deleted file mode 100644 index 50c91e7b13..0000000000 --- a/docs/generated-docs/Bundles/ProductQuantityPriceRules_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - ProductQuantityPriceRules Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Quantity Price Rules Bundle

-

This Bundle implements the Quantity Price Rules for CoreShop.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Product_Bundle.html b/docs/generated-docs/Bundles/Product_Bundle.html deleted file mode 100644 index 20a1925877..0000000000 --- a/docs/generated-docs/Bundles/Product_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Product Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Bundle

-

CoreShop Product Bundle is responsible for the Product Management.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Resource_Bundle/CustomEntities.html b/docs/generated-docs/Bundles/Resource_Bundle/CustomEntities.html deleted file mode 100644 index 7abe1b63c2..0000000000 --- a/docs/generated-docs/Bundles/Resource_Bundle/CustomEntities.html +++ /dev/null @@ -1,446 +0,0 @@ - - - - - - - CustomEntities - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Adding a new custom entity

-

Create Translatable Entity

-

First of all, we need to create our Entity Class. In this case, we create a Translatable Entity.

-
<?php
-
-//AppBundle/Model/CustomEntityInterface.php
-
-interface CustomEntityInterface extends ResourceInterface, TranslatableInterface {
-    public function getName($language = null);
-
-    public function setName($name, $language = null);
-}
-
-
<?php
-
-//AppBundle/Model/CustomEntity.php
-
-class CustomEntity implements CustomEntityInterface {
-    use TranslatableTrait {
-        __construct as private initializeTranslationsCollection;
-    }
-
-    protected $id;
-    protected $name;
-
-    public function __construct()
-    {
-        $this->initializeTranslationsCollection();
-    }
-
-    public function getId()
-    {
-        return $this->id;
-    }
-
-    public function getName($language = null)
-    {
-        return $this->getTranslation($language)->getName();
-    }
-
-    public function setName($name, $language = null)
-    {
-        $this->getTranslation($language, false)->setName($name);
-
-        return $this;
-    }
-
-    protected function createTranslation()
-    {
-        return new CustomEntityTranslation();
-    }
-}
-
-

Since our Entity is Translatable, we need to add our Translation Entity as well.

-
<?php
-
-//AppBundle/Model/CustomEntityTranslationInterface.php
-
-interface CustomEntityTranslationInterface extends ResourceInterface, TimestampableInterface
-{
-    /**
-     * @return string
-     */
-    public function getName();
-
-    /**
-     * @param string $name
-     */
-    public function setName($name);
-}
-
-
<?php
-
-//AppBundle/Model/CustomEntityTranslation.php
-
-class CustomEntityTranslation extends AbstractTranslation implements CustomEntityTranslationInterface
-{
-    protected $id;
-    protected $name;
-
-    public function getId()
-    {
-        return $this->id;
-    }
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($name)
-    {
-        $this->name = $name;
-    }
-}
-
-

Create Doctrine Configuration

-
# AppBundle/Resources/config/doctrine/model/CustomEntity.orm.yml
-
-AppBundle\Model\CustomEntity:
-  type: mappedSuperclass
-  table: app_custom_entity
-  fields:
-    id:
-      type: integer
-      column: id
-      id: true
-      generator:
-        strategy: AUTO
-
-

Our Translation Doctrine definition:

-
# AppBundle/Resources/config/doctrine/model/CustomEntityTranslation.orm.yml
-
-AppBundle\Model\CustomEntityTranslation:
-  type: mappedSuperclass
-  table: app_custom_entity_translation
-  fields:
-    id:
-      type: integer
-      column: id
-      id: true
-      generator:
-        strategy: AUTO
-    name:
-      type: string
-      column: name
-
-

Create DI Configuration

-
<?php
-
-//AppBundle/DependencyInjection/Configuration.php
-
-namespace CoreShop\Bundle\AddressBundle\DependencyInjection;
-
-final class Configuration implements ConfigurationInterface
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function getConfigTreeBuilder()
-    {
-        $treeBuilder = new TreeBuilder();
-        $rootNode = $treeBuilder->root('app');
-
-        $rootNode
-            ->children()
-                ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end()
-            ->end()
-        ;
-        $this->addModelsSection($rootNode);
-
-        return $treeBuilder;
-    }
-
-    /**
-     * @param ArrayNodeDefinition $node
-     */
-    private function addModelsSection(ArrayNodeDefinition $node)
-    {
-        $node
-            ->children()
-                ->arrayNode('resources')
-                    ->addDefaultsIfNotSet()
-                    ->children()
-                        ->arrayNode('custom_entity')
-                            ->addDefaultsIfNotSet()
-                            ->children()
-                                ->variableNode('options')->end()
-                                ->scalarNode('permission')->defaultValue('custom_entity')->cannotBeOverwritten()->end()
-                                ->arrayNode('classes')
-                                    ->addDefaultsIfNotSet()
-                                    ->children()
-                                        ->scalarNode('model')->defaultValue(CustomEntity::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('interface')->defaultValue(CustomEntityInterface::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('admin_controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('factory')->defaultValue(TranslatableFactory::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('repository')->defaultValue(CustomEntityRepository::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('form')->defaultValue(CustomEntityType::class)->cannotBeEmpty()->end()
-                                    ->end()
-                                ->end()
-                                ->arrayNode('translation')
-                                    ->addDefaultsIfNotSet()
-                                    ->children()
-                                        ->variableNode('options')->end()
-                                        ->arrayNode('classes')
-                                            ->addDefaultsIfNotSet()
-                                            ->children()
-                                                ->scalarNode('model')->defaultValue(CustomEntityTranslation::class)->cannotBeEmpty()->end()
-                                                ->scalarNode('interface')->defaultValue(CustomEntityTranslationInterface::class)->cannotBeEmpty()->end()
-                                                ->scalarNode('controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end()
-                                                ->scalarNode('repository')->cannotBeEmpty()->end()
-                                                ->scalarNode('factory')->defaultValue(Factory::class)->end()
-                                                ->scalarNode('form')->defaultValue(CustomEntityTranslationType::class)->cannotBeEmpty()->end()
-                                            ->end()
-                                        ->end()
-                                    ->end()
-                                ->end()
-                            ->end()
-                        ->end()
-                    ->end()
-                ->end()
-            ->end()
-        ;
-    }
-}
-
-
<?php
-
-//AppBundle/DependencyInjection/AppExtension.php
-
-final class AppExtension extends AbstractModelExtension
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function load(array $config, ContainerBuilder $container)
-    {
-        $config = $this->processConfiguration($this->getConfiguration([], $container), $config);
-        //'app' is the application name
-        $this->registerResources('app', $config['driver'], $config['resources'], $container);
-    }
-}
-
-
-
<?php
-
-//AppBundle/DependencyInjection/AppExtension.php
-
-final class AppBundle extends AbstractResourceBundle
-{
-    public function getSupportedDrivers()
-    {
-        return [
-            CoreShopResourceBundle::DRIVER_DOCTRINE_ORM,
-        ];
-    }
-
-    protected function getModelNamespace()
-    {
-        return 'AppBundle\Model';
-    }
-}
-
-
-

Create Serialization Definition if you want to serialize your Entity

-
# AppBundle/Resources/config/serializer/Model.CustomEntity.yml
-
-AppBundle\Model\CustomEntity:
-  exclusion_policy: ALL
-  xml_root_name: custom_entity
-  properties:
-    id:
-      expose: true
-      type: integer
-      groups: [List, Detailed]
-    translations:
-      expose: true
-      type: array
-      groups: [Detailed]
-  virtual_properties:
-    getName:
-      serialized_name: name
-      groups: [List, Detailed]
-
-
# AppBundle/Resources/config/serializer/Model.CustomEntityTranslation.yml
-
-AppBundle\Model\CustomEntityTranslation:
-  exclusion_policy: ALL
-  xml_root_name: custom_entity_translation
-  properties:
-    name:
-      expose: true
-      type: string
-      groups: [Detailed]
-
-

Create Routes to ResourceController

-
# AppBundle/Resources/config/pimcore/routing.yml
-
-app_custom_entity:
-  type: coreshop.resources
-  resource: |
-    alias: app.custom_entity
-
-
-

This will create all CRUD routes: (app is the application name specified in AppExtension.php)

-

GET: /admin/app/custom_entity/list -GET: /admin/app/custom_entity/get -POST: /admin/app/custom_entity/add -POST: /admin/app/custom_entity/save -DELETE: /admin/app/custom_entity/delete

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Resource_Bundle/Installation.html b/docs/generated-docs/Bundles/Resource_Bundle/Installation.html deleted file mode 100644 index 956481aa17..0000000000 --- a/docs/generated-docs/Bundles/Resource_Bundle/Installation.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - Installation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Adding new files that needs to be installed

-

Resource Bundles takes care about installing your resources. It can handle following types: -- Object Classes -- Field Collection Classes -- Objectbrick Classes -- Routes -- Permissions -- SQL Files

-

Object Classes, Field Collections and Objectbrick Classes

-

To install object classes, you need to configure your classes inside your Bundle and register them to Resource Bundle. (as described here)

-

Routes, SQL and Permissions

-

To install routes, permissions or execute sql files, configure them in your Bundle likes this:

-
<?php
-
-namespace AppBundle\DependencyInjection;
-
-final class Configuration implements ConfigurationInterface
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function getConfigTreeBuilder()
-    {
-        $treeBuilder = new TreeBuilder();
-        $rootNode = $treeBuilder->root('AppBundle');
-
-        $this->addPimcoreResourcesSection($rootNode);
-
-        return $treeBuilder;
-    }
-
-    private function addPimcoreResourcesSection(ArrayNodeDefinition $node)
-    {
-        $node->children()
-            ->arrayNode('pimcore_admin')
-                ->addDefaultsIfNotSet()
-                ->children()
-                    ->arrayNode('install')
-                        ->addDefaultsIfNotSet()
-                        ->children()
-                            ->scalarNode('routes')->defaultValue(['@AppBundle/Resources/install/pimcore/routes.yml'])->end()
-                            ->scalarNode('sql')->defaultValue(['@AppBundle/Resources/install/pimcore/data.sql'])->end()
-                        ->end()
-                    ->end()
-                    ->scalarNode('permissions')
-                        ->cannotBeOverwritten()
-                        ->defaultValue(['name_of_permission'])
-                    ->end()
-                ->end()
-            ->end()
-        ->end();
-    }
-}
-
-
-

Routes Example File

-
yeah_route:
-  pattern: "/(\\w+)\\/yeah-route/"
-  reverse: "/%_locale/yeah\-route"
-  module: AppBundle
-  controller: "@app.frontend.controller.controller"
-  action: doSomething
-  variables: _locale
-  priority: 2
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Resource_Bundle/PimcoreEntities.html b/docs/generated-docs/Bundles/Resource_Bundle/PimcoreEntities.html deleted file mode 100644 index cde008ece6..0000000000 --- a/docs/generated-docs/Bundles/Resource_Bundle/PimcoreEntities.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - PimcoreEntities - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Adding a new Pimcore Entity with automated installation

-
    -
  1. Add a new Pimcore Class in Pimcore.
  2. -
  3. Add a Parent Class to your Pimcore Entity
  4. -
  5. Export Class Definition to AppBundle/Resources/install/pimcore/classes/PimcoreEntity.json -
  6. -
-

Create Parent Class

-
<?php
-//AppBundle/Model/PimcoreEntityInterface.php
-
-interface PimcoreEntityInterface extends ResourceInterface
-    public function getName($language = null);
-
-    public function setName($name, $language = null);
-}
-
-
<?php
-//AppBundle/Model/PimcoreEntity.php
-
-class PimcoreEntity extends AbstractPimcoreModel implements PimcoreEntityInterface, PimcoreModelInterface {
-    public function getName($language = null) {
-        throw new ImplementedByPimcoreException(__CLASS__, __METHOD__);
-    }
-
-    public function setName($name, $language = null) {
-        throw new ImplementedByPimcoreException(__CLASS__, __METHOD__);
-    }
-}
-
-

Create Dependency Injection Configuration

-
<?php
-//AppBundle/DependencyInjection/Configuration.php
-
-namespace AppBundle\DependencyInjection;
-
-final class Configuration implements ConfigurationInterface
-{
-    public function getConfigTreeBuilder()
-    {
-        $treeBuilder = new TreeBuilder();
-        $rootNode = $treeBuilder->root('app_custom');
-
-        $this->addModelsSection($rootNode);
-
-        return $treeBuilder;
-    }
-
-    private function addModelsSection(ArrayNodeDefinition $node)
-    {
-        $node
-            ->children()
-                ->arrayNode('pimcore')
-                    ->addDefaultsIfNotSet()
-                    ->children()
-                        ->arrayNode('pimcore_entity')
-                            ->addDefaultsIfNotSet()
-                            ->children()
-                                ->variableNode('PimcoreEntity')->end()
-                                ->arrayNode('options')
-                                    ->scalarNode('path')->defaultValue('path/within/pimcore')->end()
-                                    ->scalarNode('permission')->defaultValue('pimcore_entity')->cannotBeOverwritten()->end()
-                                    ->addDefaultsIfNotSet()
-                                    ->children()
-                                        ->scalarNode('model')->defaultValue('Pimcore\Model\Object\PimcoreEntity')->cannotBeEmpty()->end()
-                                        ->scalarNode('interface')->defaultValue(PimcoreEntity::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('factory')->defaultValue(PimcoreFactory::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('repository')->cannotBeEmpty()->end()
-                                        ->scalarNode('admin_controller')->cannotBeEmpty()->end()
-                                        ->scalarNode('install_file')->defaultValue('@AppBundle/Resources/install/pimcore/classes/PimcoreEntity.json')->end()
-                                        ->scalarNode('type')->defaultValue(CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT)->cannotBeOverwritten(true)->end()
-                                    ->end()
-                                ->end()
-                            ->end()
-                        ->end()
-                    ->end()
-                ->end()
-            ->end()
-        ;
-    }
-}
-
-
<?php
-//AppBundle/DependencyInjection/AppBundleExtension.php
-
-namespace AppBundle\DependencyInjection;
-
-final class AppBundleExtension extends AbstractModelExtension
-{
-    public function load(array $config, ContainerBuilder $container)
-    {
-        $this->registerPimcoreModels('app', $config['pimcore'], $container);
-    }
-}
-
-
-

Use your Pimcore Entity

-

You can either use Pimcore Listing Classes like:

-
$list = new Pimcore\Model\Object\PimcoreEntity\Listing();
-
-

or use automated generated Factory/Repository Classes

-
$pimcoreEntityObject = $container->get('app.repository.pimcore_entity')->findBy($id);
-
-$list = $container->get('app.repository.pimcore_entity')->getList();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Resource_Bundle/index.html b/docs/generated-docs/Bundles/Resource_Bundle/index.html deleted file mode 100644 index 7737fcdbb6..0000000000 --- a/docs/generated-docs/Bundles/Resource_Bundle/index.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - Resource Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Resource Bundle

-

Resource Bundle is the Heart of CoreShops Model. It handles saving/deleting/updating/creating of CoreShop Models. It handles -Doctrine ORM Mappings and Translations. As well as Routing, Event Dispatching, Serialization and CRUD.

-

Resource Bundle also takes care about installation of Pimcore Class Definitions, Object Brick Definitions, Field Collection Definitions, -Static Routes and SQL.

-

You can use Resource Bundle as base for all your Custom Pimcore Entities.

-

Installation

-
$ composer require coreshop/resource-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \JMS\SerializerBundle\JMSSerializerBundle(),
-        new \CoreShop\Bundle\ResourceBundle\CoreShopResourceBundle(),
-        new \Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle(),
-        new \Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle()
-    ]);
-}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Rule_Bundle.html b/docs/generated-docs/Bundles/Rule_Bundle.html deleted file mode 100644 index aa43e87b40..0000000000 --- a/docs/generated-docs/Bundles/Rule_Bundle.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - Rule Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Rule Bundle

-

CoreShop Rule Bundle is the base Bundle for all Rule Based Systems in CoreShop. It provides a basic set of data for Rules like:

-
    -
  • Rule Conditions
  • -
  • Rule Actions
  • -
-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/SEO_Bundle.html b/docs/generated-docs/Bundles/SEO_Bundle.html deleted file mode 100644 index 38f8cf6104..0000000000 --- a/docs/generated-docs/Bundles/SEO_Bundle.html +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - SEO Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop SEO Bundle

-

Installation

-
$ composer require coreshop/seo-bundle:^3.0
-
-

Activating Bundle

-

You need to enable the bundle inside the kernel or with the Pimcore Extension Manager.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\SEOBundle\CoreShopSEOBundle()
-    ]);
-}
-
-

Usage

-

The SEO Bundle provides you with services to make SEO more manageable. It depends on Pimcore's HeadLink and HeadMeta Helper.

-

There are multiple ways of making use of this bundle:

-
    -
  • Implement SEO interfaces provided with this bundle
  • -
  • Implement Custom Extractors and add them to the SEOMetadata Model
  • -
-

To update the SEO Information, you need to use the service coreshop.seo.presentation:

-

-//From a Controller
-$this->get('coreshop.seo.presentation')->updateSeoMetadata($object);
-
-

Implement SEO Interfaces

-

SEO Bundle comes with 3 SEO Aware interfaces you can take advantage of:

-
    -
  • -CoreShop\Component\SEO\Model\SEOAwareInterface for meta-title and meta-description
  • -
  • -CoreShop\Component\SEO\Model\SEOImageAwareInterface for og-image attribute
  • -
  • -CoreShop\Component\SEO\Model\SEOImageAwareInterface for og-title, og-type and pg-description attribute
  • -
-

Implement SEO Extractors

-

To add a new Extractor, you need to implement the interface CoreShop\Component\SEO\Extractor\ExtractorInterface and register your class with the tag coreshop.seo.extractor:

-

Example

-

Let's implement a custom extractor for our Product class with a Video.

-
<?php
-//src/AppBundle/SEO/Extractor/ProductVideoExtractor.php
-
-namespace AppBundle\SEO\Extractor;
-
-use Pimcore\Model\DataObject\Product;
-use Pimcore\Tool;
-
-final class ProductVideoExtractor implements ExtractorInterface
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function supports($object)
-    {
-        return $object instanceof Product && $object->getVideoUrl();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function updateMetadata($object, SEOMetadataInterface $seoMetadata)
-    {
-        /**
-         * @var $object Product
-         */
-        $seoMetadata->addExtraProperty('og:video', Tool::getHostUrl() . $object->getVideoUrl());
-    }
-}
-
-

Now we need to register the service

-
# src/AppBundle/Resources/config/services.yml
-services:
-    AppBundle\SEO\Extractor:
-        tags:
-            - { name: coreshop.seo.extractor, type: product_video }
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Sequence_Bundle.html b/docs/generated-docs/Bundles/Sequence_Bundle.html deleted file mode 100644 index 98ab9cf686..0000000000 --- a/docs/generated-docs/Bundles/Sequence_Bundle.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - Sequence Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Sequence Bundle

-

Installation

-
$ composer require coreshop/sequence-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\SequenceBundle\CoreShopSequenceBundle(),
-    ]);
-}
-
-

Updating database schema

-

Run the following command.

-
$ php bin/console doctrine:schema:update --force
-
-

Usage

-

This Bundle integrates Sequence Component into Symfony and Doctrine

-

The sequence Bundle provides you with basic information needed for sequence generation.

-

Doctrine Entities

-
    -
  • Sequence
  • -
-

Get a new Sequence

-

-$container->get('coreshop.sequence.generator')->getNextSequenceForType('my_sequence');
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Shipping_Bundle.html b/docs/generated-docs/Bundles/Shipping_Bundle.html deleted file mode 100644 index 5b09c7e467..0000000000 --- a/docs/generated-docs/Bundles/Shipping_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Shipping Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Shipping Bundle

-

CoreShop Shipping Bundle is responsible for Shipping Calculations.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/StorageList_Bundle.html b/docs/generated-docs/Bundles/StorageList_Bundle.html deleted file mode 100644 index fba098228f..0000000000 --- a/docs/generated-docs/Bundles/StorageList_Bundle.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - StorageList Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Storage List Bundle

-

Storage List Component helps you with Lists/Collections of Objects like a Cart, Wishlist or Compare List.

-

Usage

-

To use it you need to have 3 models:

- -

The component already provides you with a basic implementation of Storage List and Storage Item. -You need to implement the StorageListProduct yourself.

-

To now mutate lists, the component gives you a Storage List Modifier, which takes care about creating and persisting the List.

-

Basic usage, Wishist example

-

For now, lets create a very basic Session based Wishlist:

-

We need to have following things:

-
    -
  • A Factory class for the Wishlist
  • -
  • A Factory class for the Wishlist Item
  • -
  • A StorageListManager to get the current list (more like a repository actually)
  • -
  • A StoreListModifier
  • -
-

CoreShop gives you Basic classes for these 4 things, we just need to instantiate them:

-

-use Symfony\Component\HttpFoundation\Session\Session;
-
-use CoreShop\Component\StorageList\Model\StorageList;
-use CoreShop\Component\StorageList\Model\StorageListItem;
-use CoreShop\Component\Resource\Factory\Factory;
-use CoreShop\Component\StorageList\SessionStorageManager;
-use CoreShop\Component\StorageList\SessionStorageListModifier;
-
-$session = new Session();
-$session->start();
-
-$wishlistFactory = new Factory(StorageList::class);
-$wishlistItemFactory = new Factory(StorageListItem::class);
-
-$wishlistManager = new SessionStorageManager($session, 'wishlist', $wishlistFactory);
-$wishlistModifier = new SessionStorageListModifier($wishlistItemFactory, $wishlistManager);
-
-//Now we can start putting data into our List
-$list = $wishlistManager->getStorageList();
-
-//Fetch our Product which implements CoreShop\Component\StorageList\Model\StorageListProductInterface
-$product = $productRepository->find(1);
-
-
-$listItem = $wishlistItemFactory->createNew();
-$listItem->setProduct($product);
-$listItem->setQuantity($quantity);
-
-//Lets add our Product
-$wishlistModifier->addToList($list, $listItem);
-
-//If we now want to remove it, we can either use the $listItem, or the Product
-//To do that with our item, we simply call
-$wishlistModifier->removeFromList($list, $listItem);
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Store_Bundle.html b/docs/generated-docs/Bundles/Store_Bundle.html deleted file mode 100644 index 6208737954..0000000000 --- a/docs/generated-docs/Bundles/Store_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Store Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Store Bundle

-

CoreShop Store Bundle provides the abstraction of a Pimcore Website and a CoreShop Store. It handles the configuration for base-currencies and themes.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Taxation_Bundle.html b/docs/generated-docs/Bundles/Taxation_Bundle.html deleted file mode 100644 index e6538df789..0000000000 --- a/docs/generated-docs/Bundles/Taxation_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Taxation Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Taxation Bundle

-

CoreShop Taxation Bundle is responsible for Tax Calculations.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Theme_Bundle.html b/docs/generated-docs/Bundles/Theme_Bundle.html deleted file mode 100644 index 469c376522..0000000000 --- a/docs/generated-docs/Bundles/Theme_Bundle.html +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - Theme Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Theme Bundle

-

CoreShop Theme Bundle provides you with a flexible and extensible way of having multiple themes in a Pimcore installation.

-

Installation

-
$ composer require coreshop/theme-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\ThemeBundle\CoreShopThemeBundle(),
-    ]);
-}
-
-

Configuration

-

Per Default, no Theme Resolver is enabled, you can enable on or multiples like:

-
core_shop_theme:
-    default_resolvers:
-      pimcore_site: true
-      pimcore_document_property: true
-
-

Pimcore Site

-

Resolves the Theme based on the Key of the Root Document of a Pimcore Site. So if the Site's Root Document is called "demo" it tries to find a theme called the same.

-

Pimcore Document Property

-

Resolves the Theme based on a Document Property of the Site. The Property is called "theme".

-

Custom Resolvers

-

You can also add custom resolvers like:

-
<?php
-
-declare(strict_types=1);
-
-namespace App\Theme;
-
-use CoreShop\Bundle\ThemeBundle\Service\ThemeNotResolvedException;
-use CoreShop\Bundle\ThemeBundle\Service\ThemeResolverInterface;
-use CoreShop\Component\Store\Context\StoreNotFoundException;
-
-final class CustomThemeResolver implements ThemeResolverInterface
-{
-    public function resolveTheme(): string
-    {
-        if(rand() === 1) {
-            // if you cannot resolve the theme, throw an exception
-            throw new ThemeNotResolvedException();
-        }
-    
-        return "custom/custom";
-    }
-}
-
-

You also need to Register the Theme Resolver:

-
services:
-  App\Theme\CustomThemeResolver:
-    tags:
-      - { name: coreshop.theme.resolver, type: custom, priority: 20 }
-
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Tracking_Bundle.html b/docs/generated-docs/Bundles/Tracking_Bundle.html deleted file mode 100644 index f532a2c90a..0000000000 --- a/docs/generated-docs/Bundles/Tracking_Bundle.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - Tracking Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/User_Bundle.html b/docs/generated-docs/Bundles/User_Bundle.html deleted file mode 100644 index 846a41f1e1..0000000000 --- a/docs/generated-docs/Bundles/User_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - User Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop User Bundle

-

CoreShop User Bundle is responsible for the User Management.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Variant_Bundle.html b/docs/generated-docs/Bundles/Variant_Bundle.html deleted file mode 100644 index 2f88d67ea0..0000000000 --- a/docs/generated-docs/Bundles/Variant_Bundle.html +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - Variant Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Variant Bundle

-

CoreShop Variant Bundle allows you to manage different Variants of a Product.

-

Installation

-
  composer require coreshop/variant-bundle
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\VariantBundle\CoreShopVariantBundle(),
-    ]);
-}
-
-

Abstract

-

Pimcore already supports variants. But it doesn't define what a Variant is, or how a variant differs from the Parent Product or other Variants.

-

In classical e-commerce scenarios, you usually have different Variation Types like Size and Color with different Values like XL or Red.

-

CoreShop describes these two types of entities as Group (CoreShop\Component\Variant\Model\AttributeGroupInterface) and Value (CoreShop\Component\Variant\Model\AttributeValueInterface

-

The "Product" itself than is a sort-of abstract entity that is used to define what Attribute Groups are allowed. The Pimcore Variants then, need to have the values of thse Groups filled.

-

Example:

-
    -
  • -

    AttributeGroup Color --AttributeValue Red --AttributeValue Blue

    -
  • -
  • -

    product (defines allowed groups for color)

    -
      -
    • variant-red (defines the AttributeValue Red in attributes)
    • -
    • variant-blue (defines the AttributeValue Blue in attributes)
    • -
    -
  • -
-

Usage

-

CoreShop Variant Bundle does NOT come with a Installer for certain Resources it requires. That is on purpose and you need to manually install what you need.

-

Per Default, it comes with 3 different Classes:

-
    -
  • -CoreShopAttributeGroup -
  • -
  • -CoreShopAttributeColor -
  • -
  • -CoreShopAttributeValue -
  • -
-

Whereas Color and Value are two Value types and Group is a Group type.

-

You can manually import the classes from this dir vendor/coreshop/variant-bundle/Resources/install/pimcore/classes

-

To create a "Product" Class, you need to implement the interface CoreShop\Component\Variant\Model\ProductVariantAwareInterface. The Class requires you to have these fields:

-
    -
  • attributes - ManyToManyObjectRelation for CoreShopAttributeColor/CoreShopAttributeValue -
  • -
  • allowedAttributeGroups - ManyToManyObjectRelation for CoreShopAttributeGroup -
  • -
  • mainVariant - ManyToOneRelation for Product (eg. your Class where you implemented the interface)
  • -
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Wishlist_Bundle.html b/docs/generated-docs/Bundles/Wishlist_Bundle.html deleted file mode 100644 index 0be7558ad0..0000000000 --- a/docs/generated-docs/Bundles/Wishlist_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Wishlist Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Order Bundle

-

CoreShop Order Wishlist provides a basic set of data for Wishlists. It is based on StorageList Bundle and shows how that can be integrated into a Pimcore Project.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/Workflow_Bundle.html b/docs/generated-docs/Bundles/Workflow_Bundle.html deleted file mode 100644 index 027f58ef1c..0000000000 --- a/docs/generated-docs/Bundles/Workflow_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Workflow Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Workflow Bundle

-

CoreShop Workflow Bundle is a extension of Symfony Workflow and adds some configuration features to it.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Bundles/index.html b/docs/generated-docs/Bundles/index.html deleted file mode 100644 index b6c03436cf..0000000000 --- a/docs/generated-docs/Bundles/index.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - Bundles - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Bundles

-

CoreShop is a set of Bundles that provide different functionality. Each Bundle is supposed to be independent and can be used without the other Bundles. Glued together, they provide a full e-commerce solution.

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Cart/CRUD.html b/docs/generated-docs/Development/Cart/CRUD.html deleted file mode 100644 index 239c9b96e0..0000000000 --- a/docs/generated-docs/Development/Cart/CRUD.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart

-

CoreShop uses Pimcore Data Objects to persist Cart Information. But, it adds a little wrapper around it to be mire -dynamic and configurable. It uses a Factory and Repository Pattern to do that.

-

Create

-

If you want to create a new Cart, we need to get our Factory Service for that:

-
$factory = $container->get('coreshop.factory.cart');
-$cart = $factory->createNew();
-
-

No we have a new Cart and we can set all needed values.

-

If you now want to save it, just call the save function

-
$cart->save();
-
-

Read

-

To get carts, you need to use the Repository Service CoreShop provides you.

-
$repository = $container->get('coreshop.repository.cart');
-
-
-// Query by ID
-$cartWithIdOne = $repository->findById(1);
-
-// Get a Listing how you know it from Pimcore
-$list = $repository->getList();
-$list->setCondition("total > 100");
-$carts = $list->getObjects();
-
-
-

Update

-

Update works the same as you are used to in Pimcore

-
$repository = $container->get('coreshop.repository.cart');
-
-
-// Query by ID
-$cartWithIdOne = $repository->findById(1);
-
-// Change values
-$cartWithIdOne->setCustomer($customer);
-$cartWithIdOne->save();
-
-

Delete

-

Delete works the same as you are used to in Pimcore

-
$repository = $container->get('coreshop.repository.cart');
-
-
-// Query by ID
-$cartWithIdOne = $repository->findById(1);
-$cartWithIdOne->delete();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Cart/Cart_Manager.html b/docs/generated-docs/Development/Cart/Cart_Manager.html deleted file mode 100644 index 701316b56b..0000000000 --- a/docs/generated-docs/Development/Cart/Cart_Manager.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - Cart Manager - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Cart/Cart_Modifier.html b/docs/generated-docs/Development/Cart/Cart_Modifier.html deleted file mode 100644 index 1ea2b147ca..0000000000 --- a/docs/generated-docs/Development/Cart/Cart_Modifier.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Cart Modifier - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Cart/Cart_Processor.html b/docs/generated-docs/Development/Cart/Cart_Processor.html deleted file mode 100644 index 6be7400d14..0000000000 --- a/docs/generated-docs/Development/Cart/Cart_Processor.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - Cart Processor - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart Processor

-

The Cart Processor takes care about refreshing the state and prices of carts for you. Everytime the persistCart function of the Cart-Manager is called -on a Cart, it gets triggered and re-calculates the cart.

-

Following Processors are implemented by default:

- -

These Processors calculate all necessary prices of the cart. If you need to extend the Cart and change calculations, you need -to create a new Processor.

-

Creating a Cart Processor

-

A Cart Processor needs to implement the Interface CoreShop\Component\Order\Processor\CartProcessorInterface and registered -into the container with the tag coreshop.cart_processor and a priority attribute.

-

Example of a Cart Processor

-

For example, we create a Cart Processor, which calculates a custom field in our Cart.

-
<?php
-
-namespace AppBundle\CoreShop\Order\Cart\Processor;
-
-use CoreShop\Component\Order\Model\OrderInterface;
-use CoreShop\Component\Order\Processor\CartProcessorInterface;
-
-final class CustomCartProcessor implements CartProcessorInterface
-{
-    public function process(OrderInterface $cart): void
-    {
-        $cart->setCustomField(uniqid());
-    }
-}
-
-

We now only need to register the class:

-
app.coreshop.cart.processor.custom:
-    class: AppBundle\CoreShop\Order\Cart\Processor\CustomCartProcessor
-    tags:
-      - { name: coreshop.cart_processor, priority: 200 }
-
-

On every Cart Update, our service now gets called a the custom field gets a new unique id.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Cart/Commands.html b/docs/generated-docs/Development/Cart/Commands.html deleted file mode 100644 index 5df9e7a9ad..0000000000 --- a/docs/generated-docs/Development/Cart/Commands.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - Commands - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart Commands

-

Expire Abandoned Carts

-
# Delete only anonymous carts
-$ bin/console coreshop:cart:expire --anonymous
-
-# Delete only user carts
-$ bin/console coreshop:cart:expire --user
-
-# Delete carts older than 20 days
-$ bin/console coreshop:cart:expire --days=20
-
-

Expire Abandoned Carts via Maintenance Mode

-

By default, this feature is disabled. -If you want to swipe abandoned carts by default you need to define a expiration date:

-
core_shop_order:
-    expiration:
-        cart:
-            days: 20
-            anonymous: true
-            customer: true
-
-

Read more about automation here.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Cart/Context.html b/docs/generated-docs/Development/Cart/Context.html deleted file mode 100644 index eb01edc02b..0000000000 --- a/docs/generated-docs/Development/Cart/Context.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart Context

-

For CoreShop to determine the current cart it uses a concept called context and context resolver.

-

The Cart Context implements the Interface CoreShop\Component\Order\Context\CartContextInterface and is implemented in the Service -coreshop.context.cart:

-

Getting the current Cart

-

If you want to get the current cart, you simply use the service:

-
$cartContext = $container->get('coreshop.context.cart');
-
-// Get current cart, if none exists, it creates a new one
-$cart = $cartContext->getCart();
-
-
-

Context

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NamePriorityDescription
FixedCartContext-100Used for testing purposes or for backend order creation
SessionAndStoreBasedCartContext-555Search for a valid session cart in given store context
CustomerAndStoreBasedCartContext-777Search for a cart based on a customer. Note: This context only triggers after a user has been successfully logged in. It searches for the last available cart a user may has left.
CartContext-999If all other context classes failed finally this context will create a fresh cart
-

Create a Custom Resolver

-

To register your context, you need to use the tag: coreshop.context.cart with an optional priority attribute.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Cart/index.html b/docs/generated-docs/Development/Cart/index.html deleted file mode 100644 index 9e1c41ae35..0000000000 --- a/docs/generated-docs/Development/Cart/index.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - Cart - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Checkout/Checkout_Manager.html b/docs/generated-docs/Development/Checkout/Checkout_Manager.html deleted file mode 100644 index 0e3abfcd84..0000000000 --- a/docs/generated-docs/Development/Checkout/Checkout_Manager.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - Checkout Manager - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Checkout Manager

-

CoreShop Checkout

-

CoreShop uses a CheckoutManager to handle Checkout steps. The default installation comes with following Steps:

-
    -
  • Cart
  • -
  • Customer
  • -
  • Address
  • -
  • Shipping
  • -
  • Payment
  • -
  • Summary
  • -
-

Create a Custom CheckoutManager

-

If you want to modify the Checkout Manager, you have two options:

-
    -
  • Create a total different Checkout Manager configuration
  • -
  • Modify the default configuration
  • -
-

Create a total different Checkout Manager

-
# app/config/config.yml
-core_shop_core:
-    checkout_manager: my_custom_manager
-    checkout:
-      my_custom_manager:
-        steps:
-          customer:
-            step: coreshop.checkout.step.customer
-            priority: 10
-          address:
-            step: coreshop.checkout.step.address
-            priority: 20
-          shipping:
-            step: coreshop.checkout.step.shipping
-            priority: 30
-          payment:
-            step: coreshop.checkout.step.payment
-            priority: 40
-          summary:
-            step: coreshop.checkout.step.summary
-            priority: 50
-
-

Modify the default configuration

-
# app/config/config.yml
-core_shop_core:
-    checkout:
-        default:
-            steps:
-              payment: false                                              # disables the payment step
-              shipping: false                                             # disables the shipping step
-              payment_shipping:                                           # adds a new PaymentShiping Step
-                  step: app_bundle.coreshop.checkout.payment_shipping     # This is your service-id, the service needs to implement CoreShop\Component\Order\Checkout\CheckoutStepInterface
-                  priority: 40                                            # Priority of this step
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Checkout/Checkout_Step.html b/docs/generated-docs/Development/Checkout/Checkout_Step.html deleted file mode 100644 index a90aa87df0..0000000000 --- a/docs/generated-docs/Development/Checkout/Checkout_Step.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - Checkout Step - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Checkout Step

-

If you want to implement a custom checkout step, you need to implement the interface CoreShop\Component\Order\Checkout\CheckoutStepInterface -and register your step into your Cart Manager:

-
# app/config/config.yml
-core_shop_core:
-    checkout:
-        default:
-            steps:
-              custom:
-                  step: app.coreshop.checkout.custom
-                  priority: 50
-
-

The Checkout Controller takes care about handling -the Checkout for you then.

-

Optional Checkout Step

-

If you have an optional checkout step - depending on the cart, your Checkout Step can implement the interface CoreShop\Component\Order\Checkout\OptionalCheckoutStepInterface.

-

You need to implement the function isRequired(OrderInterface $cart)

-

Optional Checkout Step Example

-
<?php
-
-namespace CoreShop\Bundle\CoreBundle\Checkout\Step;
-
-use CoreShop\Bundle\CoreBundle\Form\Type\Checkout\PaymentType;
-use CoreShop\Component\Order\Checkout\CheckoutException;
-use CoreShop\Component\Order\Checkout\CheckoutStepInterface;
-use CoreShop\Component\Order\Checkout\OptionalCheckoutStepInterface;
-use CoreShop\Component\Order\Checkout\ValidationCheckoutStepInterface;
-use CoreShop\Component\Order\Manager\CartManagerInterface;
-use CoreShop\Component\Order\Model\OrderInterface;
-use CoreShop\Component\Payment\Model\PaymentProviderInterface;
-use CoreShop\Component\Store\Context\StoreContextInterface;
-use Symfony\Component\Form\FormFactoryInterface;
-use Symfony\Component\HttpFoundation\Request;
-
-class PaymentCheckoutStep implements CheckoutStepInterface, OptionalCheckoutStepInterface, ValidationCheckoutStepInterface
-{
-    private FormFactoryInterface $formFactory;
-    private StoreContextInterface $storeContext;
-    private CartManagerInterface $cartManager;
-
-    public function __construct(
-        FormFactoryInterface $formFactory,
-        StoreContextInterface $storeContext,
-        CartManagerInterface $cartManager
-    )
-    {
-        $this->formFactory = $formFactory;
-        $this->storeContext = $storeContext;
-        $this->cartManager = $cartManager;
-    }
-
-    public function getIdentifier(): string
-    {
-        return 'payment';
-    }
-
-    public function doAutoForward(OrderInterface $cart): bool
-    {
-        return $cart->getTotal() > 0;
-    }
-
-    public function doAutoForward(OrderInterface $cart): bool
-    {
-        return false;
-    }
-
-    public function validate(OrderInterface $cart): bool
-    {
-        return $cart->hasItems() && $cart->getPaymentProvider() instanceof PaymentProviderInterface;
-    }
-
-    public function commitStep(OrderInterface $cart, Request $request): bool
-    {
-        $form = $this->createForm($request, $cart);
-
-        if ($form->isSubmitted()) {
-            if ($form->isValid()) {
-                $cart = $form->getData();
-
-                $this->cartManager->persistCart($cart);
-
-                return true;
-            } else {
-                throw new CheckoutException('Payment Form is invalid', 'coreshop.ui.error.coreshop_checkout_payment_form_invalid');
-            }
-        }
-
-        return false;
-    }
-
-    public function prepareStep(OrderInterface $cart, Request $request): array
-    {
-        return [
-            'form' => $this->createForm($request, $cart)->createView(),
-        ];
-    }
-
-    private function createForm(Request $request, OrderInterface $cart)
-    {
-        $form = $this->formFactory->createNamed('', PaymentType::class, $cart, [
-            'payment_subject' => $cart
-        ]);
-
-        if ($request->isMethod('post')) {
-            $form = $form->handleRequest($request);
-        }
-
-        return $form;
-    }
-}
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Checkout/index.html b/docs/generated-docs/Development/Checkout/index.html deleted file mode 100644 index 6c84796c4b..0000000000 --- a/docs/generated-docs/Development/Checkout/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Checkout - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Currency_Fractions/index.html b/docs/generated-docs/Development/Currency_Fractions/index.html deleted file mode 100644 index 6e0acdc14b..0000000000 --- a/docs/generated-docs/Development/Currency_Fractions/index.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - Currency Fractions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Fraction Digits

-

CoreShop allows you working with more than 2 digits for Currency Values. The default configuration looks like this:

-
core_shop_currency:
-    money_decimal_precision: 2
-    money_decimal_factor: 100
-
-
-

money_decimal_precision: 2

-
-

Having a global precision of 2

-
-

money_decimal_factor: 100

-
-

Displaying Currency with a factor of 100 (in Pimcore Backend).

-
-

WARNING If you change these settings in an existing Installation with Orders/Products etc. you also have to create -a migration to change all the values from a precision of 2 to your new setting.

-
-

In order to handle payment values with a precision of for example 4, we introduced a new Order Property called paymentTotal. -Within a Payment, you cannot deal with a precision > 2, since a currency only has eg. 100 Cents. Therefore, we round the total -Cart/Order value to a precision of 2 into the paymentTotal Value.

-

For example:

-

Your Cart/Order is "€ 1.000,5498", your payment total then is: "€ 1.000,55".

-

If you want to display the payment total in your cart, you can use this template:

-
{% if currency.convertAndFormat(cart.total) != currency.convertAndFormat(cart.paymentTotal, 2, 100) %}
-<tr>
-    <td class="text-right" colspan="3">	
-        <strong>{{ 'coreshop.ui.payment_total'|trans }}:</strong>
-    </td>
-    <td colspan="2" class="text-right cart-total-payment-price">
-        {{ currency.convertAndFormat(cart.paymentTotal, 2, 100) }}
-    </td>
-</tr>
-{% endif %}
-
-

c

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Customers/CRUD.html b/docs/generated-docs/Development/Customers/CRUD.html deleted file mode 100644 index 5fd1d5d5a8..0000000000 --- a/docs/generated-docs/Development/Customers/CRUD.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Custom

-

CoreShop uses Pimcore Data Objects to persist Customer Information. But, it adds a little wrapper around it to be mire -dynamic and configurable. It uses a Factory and Repository Pattern to do that.

-

Create

-

If you want to create a new Custom, we need to get our Factory Service for that:

-
$customerFactory = $container->get('coreshop.factory.customer');
-$customer = $customerFactory->createNew();
-
-

No we have our customer and we can set all needed values.

-

If you now want to save it, just call the save function

-
$customer->save();
-
-

Read

-

To get customers, you need to use the Repository Service CoreShop provides you.

-
$repository = $container->get('coreshop.repository.customer');
-
-
-// Query by ID
-$customerWithIdOne = $repository->findById(1);
-
-// Get a Listing how you know it from Pimcore
-$list = $repository->getList();
-$list->setCondition("active = 1");
-$customers = $list->getObjects();
-
-
-

Update

-

Update works the same as you are used to in Pimcore

-
$repository = $container->get('coreshop.repository.customer');
-
-
-// Query by ID
-$customerWithIdOne = $repository->findById(1);
-
-// Change values
-$customerWithIdOne->setName('test');
-$customerWithIdOne->save();
-
-

Delete

-

Delete works the same as you are used to in Pimcore

-
$repository = $container->get('coreshop.repository.customer');
-
-
-// Query by ID
-$customerWithIdOne = $repository->findById(1);
-$customerWithIdOne->delete();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Customers/Company_Extension.html b/docs/generated-docs/Development/Customers/Company_Extension.html deleted file mode 100644 index 6c204415ec..0000000000 --- a/docs/generated-docs/Development/Customers/Company_Extension.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - Company Extension - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Customer Company Extension

-

The Company Entity allows you to append customers to a given company. -After a customer has been connected to a company by using the 1to1 relation company, it's possible to share addresses between company and the self-assigned addresses.

-

Access Types

-
-

Note! This is only available if a customer already is connected to a valid company!

-
-

Own Only

-

If set, the customer can create, edit and delete own addresses and choose them in checkout as well. This is the default behaviour.

-

Company Only

-

If set, the customer can create, edit und delete company addresses and choose them in checkout as well. He's not able to add addresses to himself.

-

Own And Company

-

If set, the customer can create, edit and delete company and private addresses and choose them in checkout as well.

-

Plus, the own_and_company mode allows the customer to define and modify the allocation of the address. -To do so, coreshop renders an additional choice type to the address creation/modification form.

-

Note: If a customer switches the allocation after it has been created, the address also physically gets moved to its desired location. -In this example, the customer changes the allocation from own to company:

-

Before:

-
- company A
-    - addresses
-    - customer A
-        - addresses
-            - address A
-
-

After:

-
- company A
-    - addresses
-        - address A
-    - customer A
-        - addresses
-
-

Read more about this feature here.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Customers/Context.html b/docs/generated-docs/Development/Customers/Context.html deleted file mode 100644 index bf2a8f1ab8..0000000000 --- a/docs/generated-docs/Development/Customers/Context.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Customer Context

-

CoreShop Customer Security uses Symfony Firewall to handle authentication.

-

CoreShop implemented a Context based Wrapper around that to be more flexible. Currently CoreShop implements these Contexts for Customer determination:

- -

Create a Custom Resolver

-

A Store Context needs to implement the interface CoreShop\Component\Customer\Context\CustomerContextInterface. This interface -consists of one function called "getCustomer" which returns a CoreShop\Component\Customer\Model\CustomerInterface or throws an CoreShop\Component\Customer\Context\CustomerNotFoundException

-

To register your context, you need to use the tag: coreshop.context.customer with an optional priority attribute.

-

The use case of changing this is quite rare. But if you need to, you can create a Custom Resolver if you wish.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Customers/Customer_Manager.html b/docs/generated-docs/Development/Customers/Customer_Manager.html deleted file mode 100644 index cb9a7c873b..0000000000 --- a/docs/generated-docs/Development/Customers/Customer_Manager.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - Customer Manager - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Customer Manager

-

CoreShop already implements a Customer Manager which handles creating a Customer with Addresses. -The Customer Manager implements the Interface CoreShop\Bundle\CoreBundle\Customer\CustomerManagerInterface and CoreShop implements it using the service coreshop.customer.manager.

-

Usage

-

To use the Service, you need to pass a Customer. -In our example, we gonna do that from a Controller with a FormType.

-
$customer = $this->getCustomer();
-
-if ($customer instanceof CustomerInterface && null === $customer->getUser()) {
-    return $this->redirectToRoute('coreshop_customer_profile');
-}
-
-$form = $this->get('form.factory')->createNamed('customer', CustomerRegistrationType::class, $this->get('coreshop.factory.customer')->createNew());
-
-$redirect = $this->getParameterFromRequest($request, '_redirect', $this->generateUrl('coreshop_customer_profile'));
-
-if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) {
-    $form = $form->handleRequest($request);
-
-    if ($form->isValid()) {
-        $customer = $form->getData();
-        $customer->setLocaleCode($this->get('coreshop.context.locale')->getLocaleCode());
-
-        $this->get('coreshop.customer.manager')->persistCustomer($customer);
-
-        return $this->redirect($redirect);
-    }
-}
-
-return $this->render($this->templateConfigurator->findTemplate('Register/register.html'), [
-    'form' => $form->createView(),
-]);
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Customers/Registration_Types.html b/docs/generated-docs/Development/Customers/Registration_Types.html deleted file mode 100644 index a7ec6df08a..0000000000 --- a/docs/generated-docs/Development/Customers/Registration_Types.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - Registration Types - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Customer Registration Types

-

By default, a customer needs to provide a unique and valid email address to pass a registration.

-

Register By Email

-
-

This is the default setting!

-
-

To switch to registration by a unique and valid email address, you need set the identifier:

-
core_shop_customer:
-    login_identifier: 'email'
-
-

Register By Username

-

First, you need to make sure your customer object provides a username field. -By default, coreshop does not install this field to prevent unnecessary confusion. -To implement the username field, just open your class editor and add a text field called username and you're good to go!

-

To switch to registration by a unique username, you need change the identifier:

-
core_shop_customer:
-    login_identifier: 'username'
-
-

Security

-

Form (Frontend)

-

CoreShop comes with a preinstalled constraint which will tell your customer, if an email address or username - depending on your settings - is valid or not.

-

Backend / API

-

Plus, if you're going to update a customer by API or Backend, coreshop also checks if your customer entity has unique data.

-
-

Note: Both checks only apply to non-guest entities!

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Customers/index.html b/docs/generated-docs/Development/Customers/index.html deleted file mode 100644 index 9f26aac940..0000000000 --- a/docs/generated-docs/Development/Customers/index.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - Customers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Ecommerce_Tracking/index.html b/docs/generated-docs/Development/Ecommerce_Tracking/index.html deleted file mode 100644 index ca09e9194c..0000000000 --- a/docs/generated-docs/Development/Ecommerce_Tracking/index.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - Ecommerce Tracking - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop eCommerce Tracking

-

CoreShop currently implements Tracking for Analytics and Google Tag Manager. -Tracking is automatically available (but not enabled), as soon as you enable Tag Manager or Analytics in Pimcore.

-

Per default configuration, all the ecommerce trackers are disabled. You need to enable them manually.

-

Available Trackers

-
    -
  • google-analytics-enhanced-ecommerce
  • -
  • google-analytics-universal-ecommerce
  • -
  • google-gtag-enhanced-ecommerce
  • -
  • google-gtm-classic-ecommerce
  • -
  • google-gtm-enhanced-ecommerce
  • -
  • matomo (piwik)
  • -
-

Enabling Trackers

-
core_shop_tracking:
-    trackers:
-        google-analytics-enhanced-ecommerce:
-            enabled: false
-        google-analytics-universal-ecommerce:
-            enabled: false
-        google-gtag-enhanced-ecommerce:
-            enabled: false
-        google-gtm-classic-ecommerce:
-            enabled: false
-        google-gtm-enhanced-ecommerce:
-            enabled: false
-        matomo:
-            enabled: true
-
-

External

- -

Actions

-
Product Impression
-
$this->get('coreshop.tracking.manager')->trackProductImpression($product);
-
-
Product View
-
$this->get('coreshop.tracking.manager')->trackProduct($product);
-
-
Product Action Add from Cart
-
$this->get('coreshop.tracking.manager')->trackCartAdd($cart, $product);
-
-
Product Action Remove from Cart
-
$this->get('coreshop.tracking.manager')->trackCartRemove($cart, $product);
-
-
Checkout Step
-
$this->get('coreshop.tracking.manager')->trackCheckoutStep($cart, $stepIdentifier, $isFirstStep, $checkoutOption)
-
-
Checkout Complete
-
$this->get('coreshop.tracking.manager')->trackCheckoutComplete($order)
-
-

Add a custom Tracker

-

To add a custom tracker you need to implement the interface CoreShop\Component\Tracking\Tracker\TrackerInterface

-
app.tracking.tracker.my_tracker:
-    class: AppBundle\Tracker\CustomTracker
-    parent: coreshop.tracking.tracker.ecommerce_tracker
-    tags:
-        - { name: coreshop.tracking.tracker, type: app-custom-tracker }
-
-

Google Tag Manager

-

If you have enabled the gtm in backend, CoreShop sends some data to a dataLayer object which submits the object to gtm.

-

GTM Classic eCommerce

-

If you enable the classic mode only the order gets submitted if user has successfully reached the "thank-you" page.

-

GTM Enhanced eCommerce

-

There are six Impressions/Events for Google Tag Manager Enhanced eCommerce:

-

Product Impression

-

Tag Config Example:

-
-Tag type : Universal Analytics
-Track type : Pageview
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals gtm.dom
-
-

Product Detail View

-

Tag Config Example:

-
-Tag type : Universal Analytics
-Track type : Pageview
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals gtm.dom
-
-

Checkout Step:

-
-

Event-Name: csCheckout

-
-

Tag Config Example:

-
-Tag type : Universal Analytics
-Track type : Event
-Event Category: Ecommerce
-Event Action: Checkout
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals csCheckout
-
-

Checkout Complete (Purchase):

-

Tag Config Example:

-
-Tag type : Universal Analytics
-Track type : Pageview
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals gtm.dom
-
-

Remove Item from Cart

-
-

Event-Name: csRemoveFromCart

-
-

Tag Config Example:

-
-Tag type : Universal Analytics
-Track type : Event
-Event Category: Ecommerce
-Event Action: Remove from Cart
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals csRemoveFromCart
-
-

Add Item to Cart

-
-

Event-Name: csAddToCart

-
-

Tag Config Example:

-
-Tag type : Universal Analytics
-Track type : Event
-Event Category: Ecommerce
-Event Action: Add to Cart
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals csAddToCart
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Events/index.html b/docs/generated-docs/Development/Events/index.html deleted file mode 100644 index 6598824b20..0000000000 --- a/docs/generated-docs/Development/Events/index.html +++ /dev/null @@ -1,544 +0,0 @@ - - - - - - - Events - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Events

-

CoreShop comes with a lot of build-in events.

-

Frontend Controller

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.customer.update_postResourceControllerEventFires after Customer has updated the profile
coreshop.customer.change_password_postResourceControllerEventFires after Customer has changed the password
coreshop.customer.newsletter_confirm_postResourceControllerEventFires after Customer has confirmed his newsletter subscription
coreshop.address.add_postResourceControllerEventFires after Customer has added a new address
coreshop.address.update_postResourceControllerEventFires after Customer has updated a address
coreshop.address.delete_preResourceControllerEventFires before Customer deletes a address
-

Cart

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.cart.updateGenericEventFires after cart has been updated
coreshop.cart.pre_add_itemGenericEventFires before a item gets added to cart
coreshop.cart.post_add_itemGenericEventFires after a item gets added to cart
coreshop.cart.pre_remove_itemGenericEventFires before a item gets removed from cart
coreshop.cart.post_remove_itemGenericEventFires after a item gets removed from cart
-

Customer

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.customer.registerCustomerRegistrationEventFires after a new customer has been generated
coreshop.customer.request_password_resetRequestPasswordChangeEventFires after password reset has been requested
coreshop.customer.password_resetGenericEventFires after new password hast been applied to customer
-

Order Document

- - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.order.shipment.wkhtml.optionsWkhtmlOptionsEventOptions Event: Use it to change wkhtml options.
coreshop.order.invoice.wkhtml.optionsWkhtmlOptionsEventOptions Event: Use it to change wkhtml options.
-

Payment

- - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.payment_provider.supportsPaymentProviderSupportsEventSupport Event: Use it to modify available Payment Providers
-

Notes

- - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.note.*.post_addGenericEventFires after a note of type * has been created
coreshop.note.*.post_deleteGenericEventFires after a note of type * has been deleted
-

Rules

- - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.rule.availability_checkRuleAvailabilityCheckEventFires in RuleAvailabilityCheck maintenance/command for every active rule.
-

Replace symbol (*) with one of those note types:

-
    -
  • -payment -
  • -
  • -update_order -
  • -
  • -update_order_item -
  • -
  • -email -
  • -
  • -order_comment -
  • -
-

Workflow

- - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.workflow.valid_transitionsWorkflowTransitionEventValid Event: Use it if you need to extend the workflow transitions
-

Transformer

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.quote_item.pre_transformGenericEventFires before proposal item gets transformed to a quote item
coreshop.quote_item.post_transformGenericEventFires after proposal item has been transformed to a quote item
coreshop.order_item.pre_transformGenericEventFires before proposal item gets transformed to a order item
coreshop.order_item.post_transformGenericEventFires after proposal item has been transformed to a order item
coreshop.quote.pre_transformGenericEventFires before proposal gets transformed to a quote
coreshop.quote.post_transformGenericEventFires after proposal has been transformed to a quote
coreshop.order.pre_transformGenericEventFires before proposal gets transformed to a order
coreshop.order.post_transformGenericEventFires after proposal has been transformed to a order
coreshop.shipment_item.pre_transformGenericEventFires before proposal item gets transformed to a shipment item
coreshop.shipment_item.post_transformGenericEventFires after proposal item has been transformed to a shipment item
coreshop.shipment.pre_transformGenericEventFires before proposal gets transformed to a shipment
coreshop.shipment.post_transformGenericEventFires after proposal has been transformed to a shipment
coreshop.invoice.pre_transformGenericEventFires before proposal gets transformed to a invoice
coreshop.invoice.post_transformGenericEventFires after proposal has been transformed to a invoice
-

Backend Controller

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.*.pre_createResourceControllerEventFires before object gets created in backend
coreshop.*.post_createResourceControllerEventFires after object gets created in backend
coreshop.*.pre_saveResourceControllerEventFires before object gets saved in backend
coreshop.*.post_saveResourceControllerEventFires after object gets saved in backend
coreshop.*.pre_deleteResourceControllerEventFires before object gets deleted in backend
coreshop.*.post_deleteResourceControllerEventFires after object gets deleted in backend
-

Replace symbol (*) with one of those controller:

-
    -
  • -configuration -
  • -
  • -payment_provider -
  • -
  • -exchange_rate -
  • -
  • -filter -
  • -
  • -index -
  • -
  • -notification_rule -
  • -
  • -notification_rule -
  • -
  • -cart_price_rule -
  • -
  • -product_price_rule -
  • -
  • -shipping_rule -
  • -
  • -store -
  • -
  • -tax_rule_group -
  • -
-

Workflow Events

-

There are events vor every state machine transition. Read more about it here.

-

Model Events

-

You can use Pimcore Events for CoreShops Pimcore Models: Pimcore Events

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html b/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html deleted file mode 100644 index 04d7957695..0000000000 --- a/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Extend CoreShop DataObjects - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Extending CoreShop

-

CoreShop Data Objects (like CoreShopProduct or CoreShopOrder) can be changed directly within Pimcore.

-

Replace CoreShop Object Classes with your own Classes

-

CoreShop uses Pimcore Parameters to determine the Pimcore Object Class. To change it, simply add this to your config.yml

-
core_shop_order:
-    pimcore:
-        order:
-            classes:
-                model: 'Pimcore\Model\DataObject\MyOrderClass'
-                install_file: '@AppBundle/Resources/install/pimcore/classes/MyOrderClass.json'
-                repository: AppBundle\Repository\OrderRepository
-                factory: AppBundle\Factory\OrderFactory
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Forms.html b/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Forms.html deleted file mode 100644 index 93b21d477d..0000000000 --- a/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Forms.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - Extend CoreShop Forms - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Customizing Forms

-

The forms in CoreShop are placed in the CoreShop\Bundle\*BundleName*\Form\Type namespaces and the extensions -will be placed in AppBundle\Form\Extension.

-

Why would you customize a Form?

-

There are plenty of reasons to modify forms that have already been defined in CoreShop. -Your business needs may sometimes slightly differ from our internal assumptions.

-

You can:

-
    -
  • add completely new fields,
  • -
  • -modify existing fields, make them required, change their HTML class, change labels etc.,
  • -
  • -remove fields that are not used.
  • -
-

How to customize a CoreShop Resource Form?

-

If you want to modify the form for the Store in your system there are a few steps that you should take. -Assuming that you would like to (for example):

-
    -
  • Add a contactHours field,
  • -
-

These will be the steps that you will have to take to achieve that:

-

1. If your are planning to add new fields remember that beforehand they need to be added on the model that the form type is based on.

-

In case of our example if you need to have the contactHours on the model and the entity mapping for the Store resource. -To get to know how to prepare that go there

-

2. Create a Form Extension.

-

Your form has to extend a proper base class. How can you check that?

-

For the StoreType run:

-
$ php bin/console debug:container coreshop.form.type.store
-
-

As a result you will get the CoreShop\Bundle\StoreBundle\Form\Type\StoreType - this is the class that you need to be extending.

-
<?php
-
-namespace AppBundle\Form\Extension;
-
-use CoreShop\Bundle\StoreBundle\Form\Type\StoreType;
-use Symfony\Component\Form\AbstractTypeExtension;
-use Symfony\Component\Form\Extension\Core\Type\TextType;
-use Symfony\Component\Form\FormBuilderInterface;
-
-final class StoreTypeExtension extends AbstractTypeExtension
-{
-    public function buildForm(FormBuilderInterface $builder, array $options): void
-    {
-        // Adding new fields works just like in the parent form type.
-        $builder->add('contactHours', TextType::class, [
-            'required' => false
-        ]);
-    }
-
-    public static function getExtendedTypes(): array
-    {
-        return [StoreType::class];
-    }
-}
-
-

3. After creating your class, register this extension as a service in the AppBundle/Resources/config/services.yml:

-
services:
-    app.form.extension.type.customer_profile:
-        class: AppBundle\Form\Extension\StoreTypeExtension
-        tags:
-            - { name: form.type_extension, extended_type: CoreShop\Bundle\StoreBundle\Form\Type\StoreType }
-
-

In our case you will need to extend the ExtJs Form as well: src/AppBundle/Resources/public/pimcore/js/store.js.

-

In ExtJs your new store file need to like like this:

-
coreshop.store.item = Class.create(coreshop.store.item, {
-
-    getFormPanel: function ($super) {
-        var panel = $super();
-
-        panel.down("fieldset").add(
-            [
-                {
-                    xtype: 'textfield',
-                    fieldLabel: 'Contact Hours',
-                    name: 'contactHours'
-                }
-            ]
-        );
-
-        return this.formPanel;
-    }
-});
-
-

And you need to configure it to be loaded as well:

-
core_shop_store:
-    pimcore_admin:
-        js:
-            custom_store: '/bundles/app/pimcore/js/store.js'
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Resources.html b/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Resources.html deleted file mode 100644 index c3fb14bba7..0000000000 --- a/docs/generated-docs/Development/Extending_Guide/Extend_CoreShop_Resources.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - - Extend CoreShop Resources - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Extend CoreShop Resources

-

All models in Coreshop are placed in the Coreshop\Component\*ComponentName*\Model namespaces alongside with their interfaces.

-
-

Many models in CoreShop are extended in the Core component. If the model you are willing to override exists in the Core you should be extending the Core one, not the base model from the component.

-
-

How to Customize a Model

-

First things first: If you want to extend coreshop models your Bundle must extend the AbstractResourceBundle. Next you have set your supported drivers. Just add the following lines of code to your bundle class:

-
public function getSupportedDrivers(); array
-{
-    return [
-        CoreShopResourceBundle::DRIVER_DOCTRINE_ORM
-    ];
-}
-
-

After that have to tell the bundle where your models are. For that, add the override the following method in your bundle class and return the model namespace. Here is an example for the AppBundle

-
 protected function getModelNamespace(): string
-{
-    return "AppBundle\Model";
-} 
-
-

Here a quick overview for you which dictories are important for you, when customizing CoreShop models.

- - - - - - - - - - - - - - - - - - - - - -
FolderDescription
AcmeBundle/Model or AcmeBundle/EntityWhere your models are living
AcmeBundle/config/doctrine/modelPut your doctrine .yml config files in here
AcmeBundle/config/serializerThe serializer configs for the models
-

Let’s take the CoreShop\Component\Currency\Model\Currency as an example. This one is extended in Core. How can you check that?

-

First of all, you need to find the current used class by doing following:

-
$ php bin/console debug:container --parameter=coreshop.model.currency.class
-
-

As a result you will get the CoreShop\Component\Core\Model\Currency - this is the class that you need to be extending.

-

Assuming you want to add a field called flag

-

1. The first thing to do is to write your own class which will extend the base Currency class

-
<?php
-
-namespace AppBundle\Entity;
-
-use CoreShop\Component\Core\Model\Currency as BaseCurrency;
-
-class Currency extends BaseCurrency
-{
-    /**
-     * @var bool
-     */
-    private $flag;
-
-    /**
-     * @return bool
-     */
-    public function getFlag()
-    {
-        return $this->flag;
-    }
-
-    /**
-     * @param bool $flag
-     */
-    public function setFlag($flag)
-    {
-        $this->flag = $flag;
-    }
-}
-
-

2. Next define your entity’s mapping.

-

The file should be placed in AppBundle/Resources/config/doctrine/Currency.orm.yml

-
AppBundle\Entity\Currency:
-    type: mappedSuperclass
-    table: coreshop_currency
-    fields:
-        flag:
-            type: boolean
-            nullable: true
-
-

3. Finally you’ll need to override the model’s class in the app/config/config.yml.

-

Under the core_shop_* where * is the name of the bundle of the model you are customizing, in our case it will be the CoreShopCurrencyBundle -> core_shop_currency.

-
core_shop_currency:
-    resources:
-        currency:
-            classes:
-                model: AppBundle\Entity\Currency
-
-

4. Update the database. There are two ways to do it.

-

via direct database schema update:

-
$ php bin/console doctrine:schema:update --force
-
-

via migrations: -Which we strongly recommend over updating the schema.

-
$ php bin/console doctrine:migrations:diff
-$ php bin/console doctrine:migrations:migrate
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Extending_Guide/Extending_Rule_Actions.html b/docs/generated-docs/Development/Extending_Guide/Extending_Rule_Actions.html deleted file mode 100644 index 5899d4d0e8..0000000000 --- a/docs/generated-docs/Development/Extending_Guide/Extending_Rule_Actions.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - - Extending Rule Actions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Custom Price-Rule/Shipping-Rule/Notification-Rule Actions

-

Adding Price-, Shipping- or Notification-Rule Actions is the same for all of these types. Their only difference is the -tag you use and Interface you need to implement for them.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Action TypeTagInterface
Cart Price Rulecoreshop.cart_price_rule.actionCoreShop\Component\Order\Cart\Rule\Action\CartPriceRuleActionProcessorInterface
Product Price Rulecoreshop.product_price_rule.actionCoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface
Product Specific Pricecoreshop.product_specific_price_rule.actionCoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface
Shipping Rulecoreshop.shipping_rule.actionCoreShop\Component\Shipping\Rule\Action\CarrierPriceActionProcessorInterface
Notification Rulecoreshop.notification_rule.actionCoreShop\Component\Notification\Rule\Action\NotificationRuleProcessorInterface
-

Example Adding a new Action

-

Now, lets add a new Action for Product Price Rules.

-

To do so, we first need to create a new class and implement the interface listed in the table above. For Product Price Rules, we need to use -CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface

-
//AppBundle/CoreShop/CustomAction.php
-namespace AppBundle\CoreShop;
-
-final class CustomAction implements \CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface
-{
-    public function getPrice($subject, array $context, array $configuration): int 
-    {
-        //If your action gives the product a new Price, put your calculation here
-
-        return $configuration['some_value'];
-    }
-}
-
-

We also need a FormType for the actions configurations:

-
//AppBundle/Form/Type/CustomActionType.php
-namespace AppBundle\Form\Type;
-
-use Symfony\Component\Form\AbstractType;
-use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Form\Extension\Core\Type\TextType;
-
-final class CustomActionType extends AbstractType
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function buildForm(FormBuilderInterface $builder, array $options): void
-    {
-        $builder
-            ->add('some_value', TextType::class)
-        ;
-    }
-}
-
-

With configuration, comes a Javascript file as well:

-
//AppBundle/Resources/public/pimcore/js/custom_action.js
-
-pimcore.registerNS('coreshop.product.pricerule.actions.custom');
-coreshop.product.pricerule.actions.custom = Class.create(coreshop.rules.actions.abstract, {
-
-    type: 'custom',
-
-    getForm: function () {
-        var some_value = 0;
-        var me = this;
-
-        if (this.data) {
-            some_value = this.data.some_value / 100;
-        }
-
-        var some_valueField = new Ext.form.NumberField({
-            fieldLabel: t('custom'),
-            name: 'some_value',
-            value: some_value,
-            decimalPrecision: 2
-        });
-
-        this.form = new Ext.form.Panel({
-            items: [
-                some_valueField
-            ]
-        });
-
-        return this.form;
-    }
-});
-
-
-

Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony structure, omit the web.

-
bin/console assets:install web
-
-

Registering the Custom Action to the Container and load the Javascript File

-

We now need to create our Service Definition for our Custom Action:

-
app.product_price_rule.custom:
-    class: AppBundle\CoreShop\CustomAction
-    tags:
-      - { name: coreshop.product_price_rule.action, type: custom, form-type: AppBundle\Form\Type\CustomActionType }
-
-

and add this to your config.yml:

-
core_shop_product:
-    pimcore_admin:
-        js:
-            custom_action: '/bundles/app/pimcore/js/custom_action.js'
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Extending_Guide/Extending_Rule_Conditions.html b/docs/generated-docs/Development/Extending_Guide/Extending_Rule_Conditions.html deleted file mode 100644 index 808b46530a..0000000000 --- a/docs/generated-docs/Development/Extending_Guide/Extending_Rule_Conditions.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - - Extending Rule Conditions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Custom Price-Rule/Shipping-Rule/Notification-Rule Conditions

-

Adding Price-, Shipping- or Notification-Rule Conditions is the same for all of these types. They're only difference is the -tag you use and Interface you need to implement for them.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Action TypeTagInterface/AbstractClass
Cart Price Rulecoreshop.cart_price_rule.conditionCoreShop\Component\Order\Cart\Rule\Condition\AbstractConditionChecker
Product Price Rulecoreshop.product_price_rule.conditionCoreShop\Component\Rule\Condition\ConditionCheckerInterface
Product Specific Pricecoreshop.product_specific_price_rule.conditionCoreShop\Component\Rule\Condition\ConditionCheckerInterface
Shipping Rulecoreshop.shipping_rule.conditionCoreShop\Component\Shipping\Rule\Condition\CategoriesConditionChecker
Notification Rulecoreshop.notification_rule.conditionCoreShop\Component\Notification\Rule\Condition\AbstractConditionChecker
-

Example Adding a new Condition

-

Now, lets add a new Condition for Product Price Rules.

-

To do so, we first need to create a new class and implement the interface listed in the table above. For Product Price Rules, we need to use -CoreShop\Component\Rule\Condition\ConditionCheckerInterface

-
//AppBundle/CoreShop/CustomCondition.php
-namespace AppBundle\CoreShop;
-
-use CoreShop\Component\Resource\Model\ResourceInterface;
-use CoreShop\Component\Rule\Model\RuleInterface;
-
-final class CustomCondition implements \CoreShop\Component\Rule\Condition\ConditionCheckerInterface
-{
-    public function isValid(ResourceInterface $subject, RuleInterface $rule, array $configuration, array $params = []): bool
-    {
-        //return true if valid, false if not
-        return true;
-    }
-}
-
-

We also need a FormType for the conditions configurations:

-
//AppBundle/Form/Type/CustomConditionType.php
-namespace AppBundle\Form\Type;
-
-final class CustomConditionType extends AbstractType
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function buildForm(FormBuilderInterface $builder, array $options): void
-    {
-        $builder
-            ->add('some_value', TextType::class)
-        ;
-    }
-}
-
-

With configuration, comes a Javascript file as well:

-
//AppBundle/Resources/public/pimcore/js/custom_condition.js
-
-pimcore.registerNS('coreshop.product.pricerule.conditions.custom');
-coreshop.product.pricerule.conditions.custom = Class.create(coreshop.rules.conditions.abstract, {
-
-    type: 'custom',
-
-    getForm: function () {
-        var some_value = 0;
-        var me = this;
-
-        if (this.data) {
-            some_value = this.data.some_value / 100;
-        }
-
-        var some_valueField = new Ext.form.NumberField({
-            fieldLabel: t('custom'),
-            name: 'some_value',
-            value: some_value,
-            decimalPrecision: 2
-        });
-
-        this.form = new Ext.form.Panel({
-            items: [
-                some_valueField
-            ]
-        });
-
-        return this.form;
-    }
-});
-
-

Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony structure, omit the web.

-
bin/console assets:install web
-
-

Registering the Custom Condition to the Container and load the Javascript File

-

We now need to create our Service Definition for our Custom Condition:

-
app.product_price_rule.custom_condition:
-    class: AppBundle\CoreShop\CustomCondition
-    tags:
-      - { name: coreshop.product_price_rule.condition, type: custom, form-type: AppBundle\Form\Type\CustomConditionType }
-
-

and add this to your config.yml:

-
core_shop_product:
-    pimcore_admin:
-        js:
-            custom_condition: '/bundles/app/pimcore/js/custom_condition.js'
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Index_and_Filters/Filter/Custom_Filter.html b/docs/generated-docs/Development/Index_and_Filters/Filter/Custom_Filter.html deleted file mode 100644 index 2d6024db53..0000000000 --- a/docs/generated-docs/Development/Index_and_Filters/Filter/Custom_Filter.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - Custom Filter - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Filter - Create Custom Filter

-

1. We need to create 2 new files: -- FormType for processing the Input Data -- And a FilterConditionProcessorInterface, which checks if a cart fulfills the condition.

-
namespace AppBundle\Filter\Form\Type\Condition;
-
-use Symfony\Component\Form\AbstractType;
-use Symfony\Component\Form\Extension\Core\Type\IntegerType;
-use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Validator\Constraints\NotBlank;
-use Symfony\Component\Validator\Constraints\Type;
-
-final class MyFilterCondition extends AbstractType
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function buildForm(FormBuilderInterface $builder, array $options)
-    {
-        $builder
-            ->add('myData', IntegerType::class, [
-                'constraints' => [
-                    new NotBlank(['groups' => ['coreshop']]),
-                    new Type(['type' => 'numeric', 'groups' => ['coreshop']]),
-                ],
-            ])
-        ;
-    }
-}
-
-
-
namespace AppBundle\Filter;
-
-use CoreShop\Component\Address\Model\AddressInterface;
-use CoreShop\Component\Core\Model\CarrierInterface;
-
-class MyFilterCondition extends FilterConditionProcessorInterface
-{
-    public function prepareValuesForRendering(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter)
-    {
-        //Prepare values for rendering HTML
-    }
-
-    public function addCondition(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter, ParameterBag $parameterBag, $isPrecondition = false)
-    {
-        //Add Condition to Listing
-
-        return $currentFilter;
-    }
-
-}
-
-

2. Register MyFilterCondition as service with tag coreshop.filter.condition_type, type and form

-
app.coreshop.shipping_rule.condition.my_rule:
-    class: AppBundle\Shipping\Rule\Condition\MyRuleConditionChecker
-    tags:
-      - { name: coreshop.shipping_rule.condition, type: my_rule, form-type: AppBundle\Shipping\Form\Type\Condition\MyRuleConfigurationType }
-
-app.filter.condition_type.my_filter_condition:
-    class: AppBundle\Filter\MyFilterCondition
-    tags:
-      - { name: coreshop.filter.condition_type, type: app-my-filter, form-type: AppBundle\Filter\Form\Type\Condition\MyFilterCondition}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Index_and_Filters/Filter/index.html b/docs/generated-docs/Development/Index_and_Filters/Filter/index.html deleted file mode 100644 index 11f7174f94..0000000000 --- a/docs/generated-docs/Development/Index_and_Filters/Filter/index.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - Filter - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Filter

-

After creating the index, you can configure the Filters.

-

Create a new Filter

-

You can create different Filters for different Categories.

-

A filter exists of different settings, pre-conditions, filters and similar products.

-

You can even create Custom Filters

-

Filter Settings

-

Filter Settings

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldDescription
NameName of the Filter-Set
IndexWhich Index should be used
OrderOrder of the products
Order KeyOrder key (index-field) to sort from
Results per PageHow many products should be displayed per page, you can use Shop Settings, or override it
-

Pre-Conditions

-

Filter Pre-Conditions

-

You can define pre-filters for the index.

-

Conditions

-

Filter Conditions

-

Here you can define different kind of filters. These filters will be displayed on the front-page for customers to find products.

-

CoreShop currently supports 4 types of filters:

-
    -
  • -Select -
  • -
  • -Multiselect -
  • -
  • -Range -
  • -
  • -Boolean -
  • -
-

Select Condition

-

A select condition is basically just a simple dropdown field where customer can select one field.

-

Filter Condition Select

-

Multiselect Condition

-

A multi-select condition is basically a list of fields where customer can select multiple entries.

-

Filter Condition Select

-

Range Condition

-

A Range Condition is a slider of two ranges. The ranges are calculated automatically using MIN and MAX values.

-

Filter Condition Select

-

Boolean Condition

-

Boolean is a Condition where the customer can check different values.

-

Filter Condition Select

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Index_and_Filters/Index/Extension.html b/docs/generated-docs/Development/Index_and_Filters/Index/Extension.html deleted file mode 100644 index e7b3087f11..0000000000 --- a/docs/generated-docs/Development/Index_and_Filters/Index/Extension.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - Extension - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Index Extension

-

In order to make the index more flexible, it is possible for you to write extensions. Extensions allow you to do following things:

-
- Add more "default" columns and corresponding data
-- Pre Filter an mysql index
-
-

To create a new extension, you need to implement either the interface -CoreShop\Component\Index\Extension\IndexColumnsExtensionInterface -for column extensions or the interface -CoreShop\Bundle\IndexBundle\Extension\MysqlIndexQueryExtensionInterface -for mysql query extensions.

-

You then need to register your service using the tag coreshop.index.extension

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Index_and_Filters/Index/Interpreter.html b/docs/generated-docs/Development/Index_and_Filters/Index/Interpreter.html deleted file mode 100644 index 01d2f53150..0000000000 --- a/docs/generated-docs/Development/Index_and_Filters/Index/Interpreter.html +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - Interpreter - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Index Interpreter

-

To prepare your index and transform data, you use one of the existing Interpreter or create one yourself.

-

CoreShop currently has following Interpreters:

-
    -
  • -Object: converts an object or and object array to relations. It saves the values to the relations inex
  • -
  • -ObjectId: converts an object to its ID
  • -
  • -ObjectIdSum: calculates the sum of all IDs. (Could be used for similar products)
  • -
  • -ObjectProperty: calls a getter method of the value
  • -
  • -Soundex: calls PHP soundex function (Could be used for similar products)
  • -
-

Create a Custom Interpreter

-

1 We need to create 2 new files:

-
    -
  • FormType for processing the Input Data
  • -
  • And a InterpreterInterface, which interprets the data
  • -
-

-namespace AppBundle\Index\Form\Type;
-
-use Symfony\Component\Form\AbstractType;
-use Symfony\Component\Form\Extension\Core\Type\IntegerType;
-use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Validator\Constraints\NotBlank;
-use Symfony\Component\Validator\Constraints\Type;
-
-final class MyInterpreterType extends AbstractType
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function buildForm(FormBuilderInterface $builder, array $options)
-    {
-        $builder
-            ->add('myInterpreterData', IntegerType::class, [
-                'constraints' => [
-                    new NotBlank(['groups' => ['coreshop']]),
-                    new Type(['type' => 'numeric', 'groups' => ['coreshop']]),
-                ],
-            ])
-        ;
-    }
-}
-
-
-
namespace AppBundle\CoreShop\Index\Interpreter;
-
-use CoreShop\Component\Index\Interpreter\InterpreterInterface;
-
-class MyInterpreter implements InterpreterInterface
-{
-    public function interpret($value, IndexableInterface $indexable, IndexColumnInterface $config, array $interpreterConfig = []) {
-        //Do some interpretation here
-
-        return $value;
-    }
-}
-
-

2:Register MyInterpreter as service with tag coreshop.index.interpreter, type and form

-
app.index.interpreter.my_interpreter:
-    class: AppBundle\CoreShop\Index\Interpreter\MyInterpreter
-    tags:
-     - { name: coreshop.index.interpreter, type: my_interpreter, form-type: AppBundle\Index\Form\Type\MyInterpreterType}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Index_and_Filters/Index/index.html b/docs/generated-docs/Development/Index_and_Filters/Index/index.html deleted file mode 100644 index 41a45d7d03..0000000000 --- a/docs/generated-docs/Development/Index_and_Filters/Index/index.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - Index - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Index

-

To create a rich layered navigation (faceted navigation), you need to create an index of your Products.

-

Create a new Index

-

CoreShop currently supports two type of indexes:

-
    -
  • Mysql
  • -
  • ~~Elasticsearch~~
  • -
-

Add Fields

-

To add a new field, simply drag'n'drop the field from the left tree to the right tree.

-

Index Fields

-

Field Properties

-

Every field has some properties that needs to be configured

-

Field

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldDescription
KeyPimcore Field Name
NameName in the Index
Getter ClassGetter Class is important for field-types like "Localized Fields", "Classification Store", "Object Brick" and "Field Collection". CoreShop needs it to get the right value for the index
InterpreterUsing Interpreters helps you to transform values before they get stored in the index. For example: Resolving dependencies, create a similarity Index
TypeType of the field in the index, depends on which Index-Type you are using. MySql or Elasticsearch
Getter ConfigConfiguration depends on Getter, for example: Language for Localized Fields
-

Re-Index

-

If you make changes to the index, you need to re-index all of your products. To do that, there is a CLI command.

-
$ php bin/console coreshop:index
-
-

If you don't want to re-index all of your indices, you can pass the corresponding IDs or names of the indices separated -with a space as arguments to the CLI command. The following example will only re-index indices with IDs 1 and 2 and name -"Products". If none of those indices exist, nothing will be re-indexed.

-
$ php bin/console coreshop:index 1 2 Products
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Index_and_Filters/index.html b/docs/generated-docs/Development/Index_and_Filters/index.html deleted file mode 100644 index 2e7671a7c6..0000000000 --- a/docs/generated-docs/Development/Index_and_Filters/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Index and Filters - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Inventory/index.html b/docs/generated-docs/Development/Inventory/index.html deleted file mode 100644 index e28aeba65a..0000000000 --- a/docs/generated-docs/Development/Inventory/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Inventory - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Inventory

-

Twig Helper

-

There are some Helpers to check the product inventory.

-

Inventory Available

-
{% if coreshop_inventory_is_available(product) %}
-    {# show cart button since there is at least one item available #}
-{% endif %}
-
-

Inventory is Sufficient

-
{% if coreshop_inventory_is_sufficient(product, 10) %}
-    {# do something here since there are at least 10 items available #}
-{% endif %}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Countries/CRUD.html b/docs/generated-docs/Development/Localization/Countries/CRUD.html deleted file mode 100644 index df55381498..0000000000 --- a/docs/generated-docs/Development/Localization/Countries/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Countries

-

Create

-

If you want to create a Country via API, you can do following:

-
$newCountry = $container->get('coreshop.factory.country')->createNew();
-
-

Now you have a new Country, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.country')->persist($newCountry);
-$container->get('coreshop.manager.country')->flush();
-
-

You now have a new persisted Country.

-

Read

-

If you want to query for Countries, you can do following:

-
$countryRepository = $container->get('coreshop.repository.country');
-
-$queryBuilder = $countryRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$countries = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Country, you need to do following:

-
// Fetch Country
-
-$country = $countryRepository->findById(1);
-$country->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.country')->persist($country);
-$container->get('coreshop.manager.country')->flush();
-
-

Delete

-

If you want to update and existing Country, you need to do following:

-
// Fetch Country
-
-$country = $countryRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.country')->remove($country);
-$container->get('coreshop.manager.country')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Countries/Context.html b/docs/generated-docs/Development/Localization/Countries/Context.html deleted file mode 100644 index 575e951969..0000000000 --- a/docs/generated-docs/Development/Localization/Countries/Context.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - - Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Country Context

-

For CoreShop to determine the current country the visitor or customer comes from, -it uses a concept called context and context resolver.

-

Context

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NamePriorityTagDescription
FixedCountryContextdefaultcoreshop.context.countryUsed for testing purposes
CountryContextdefaultcoreshop.context.countryCheck for a country within the country request resolver
StoreAwareCountryContextdefaultcoreshop.context.countryCheck if current country is available in current store context
-

Resolver

- - - - - - - - - - - - - - - - - -
NamePriorityTagDescription
GeoLiteBasedRequestResolver10coreshop.context.country.request_based.resolverThis Resolver tries to determinate the users location by using the Geo Lite Database.
-

These resolver takes care about finding the correct country for the current request.

-

Create a Custom Resolver

-

A Country Context needs to implement the interface CoreShop\Component\Address\Context\CountryContextInterface. -This interface consists of one method called getCountry which returns a CoreShop\Component\Address\Model\CountryInterface or throws an CoreShop\Component\Address\Context\CountryNotFoundException.

-

To register your context, you need to use the tag: coreshop.context.country with an optional priority attribute.

-

Create a Request based Resolver

-

CoreShop already implements Request based country context resolver. -So if your Context depends on the current request, you can create a custom RequestBased Resolver. -To do that, implement the interface CoreShop\Component\Address\Context\RequestBased\RequestResolverInterface -with the method findCountry. This method either returns a country or null.

-

To register this resolver, use the tag: coreshop.context.country.request_based.resolver with an optional priority attribute.

-

Example

-

We want to a CountryContext to be based on the Pimcore Document. So if we are on site /de, we want to resolve to Austria, if we -are on page /en we want to resolve to Country Great Britain:

-

1: First of all we need to create our RequestBased Country Context:

-
<?php
-
-namespace AppBundle\CoreShop\Address\Context;
-
-use CoreShop\Component\Address\Context\RequestBased\RequestResolverInterface;
-use CoreShop\Component\Address\Repository\CountryRepositoryInterface;
-use Pimcore\Http\Request\Resolver\DocumentResolver;
-use Symfony\Component\HttpFoundation\Request;
-
-final class DocumentBasedRequestRequestResolver implements RequestResolverInterface
-{
-    /**
-     * @var DocumentResolver
-     */
-    private $pimcoreDocumentResolver;
-
-    /**
-     * @var CountryRepositoryInterface
-     */
-    private $countryRepository;
-
-    /**
-     * @param DocumentResolver $pimcoreDocumentResolver
-     * @param CountryRepositoryInterface $countryRepository
-     */
-    public function __construct(DocumentResolver $pimcoreDocumentResolver, CountryRepositoryInterface $countryRepository)
-    {
-        $this->pimcoreDocumentResolver = $pimcoreDocumentResolver;
-        $this->countryRepository = $countryRepository;
-    }
-
-    public function findCountry(Request $request)
-    {
-        $doc = $this->pimcoreDocumentResolver->getDocument($request);
-
-        if (substr($doc->getFullPath(), 0, 3) === '/en') {
-            return $this->countryRepository->findByCode('GB');
-        }
-
-        if (substr($doc->getFullPath(), 0, 3) === '/de') {
-            return $this->countryRepository->findByCode('AT');
-        }
-
-        return null;
-    }
-}
-
-

Now we need to configure the service in src/AppBundle/Resources/config/services.yml

-
services:
-  app.coreshop.country.context.request.document_based:
-    class: AppBundle\CoreShop\Address\Context\DocumentBasedRequestRequestResolver
-    arguments:
-      - '@Pimcore\Http\Request\Resolver\DocumentResolver'
-      - '@coreshop.repository.country'
-    tags:
-      - { name: coreshop.context.country.request_based.resolver }
-
-
-

CoreShop now tries to resolve the current country based on the Pimcore Site we are on.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Countries/index.html b/docs/generated-docs/Development/Localization/Countries/index.html deleted file mode 100644 index a71969dd57..0000000000 --- a/docs/generated-docs/Development/Localization/Countries/index.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - Countries - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Currencies/CRUD.html b/docs/generated-docs/Development/Localization/Currencies/CRUD.html deleted file mode 100644 index c0757dc6d5..0000000000 --- a/docs/generated-docs/Development/Localization/Currencies/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Currencies

-

Create

-

If you want to create a Currency via API, you can do following:

-
$newCurrency = $container->get('coreshop.factory.currency')->createNew();
-
-

Now you have a new Currency, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.currency')->persist($newCurrency);
-$container->get('coreshop.manager.currency')->flush();
-
-

You now have a new persisted Currency.

-

Read

-

If you want to query for Currencies, you can do following:

-
$currencyRepository = $container->get('coreshop.repository.currency');
-
-$queryBuilder = $currencyRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$currencies = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Currency, you need to do following:

-
// Fetch Currency
-
-$currency = $currencyRepository->findById(1);
-$currency->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.currency')->persist($currency);
-$container->get('coreshop.manager.currency')->flush();
-
-

Delete

-

If you want to update and existing Currency, you need to do following:

-
// Fetch Currency
-
-$currency = $currencyRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.currency')->remove($currency);
-$container->get('coreshop.manager.currency')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Currencies/Context.html b/docs/generated-docs/Development/Localization/Currencies/Context.html deleted file mode 100644 index a2701da269..0000000000 --- a/docs/generated-docs/Development/Localization/Currencies/Context.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Currency Context

-

For CoreShop to determine the current currency it uses a concept called context and context resolver.

-

Context

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NamePriorityTagDescription
FixedCurrencyContextdefaultcoreshop.context.currencyUsed for testing purposes
StorageBasedCurrencyContextdefaultcoreshop.context.currencycheck if a currency has been changed during a frontend request
CountryAwareCurrencyContextdefaultcoreshop.context.currencyMostly this context will apply since it will get the currency based on the current country context
-

These Contexts take care about finding the correct currency for the current request.

-

Create a Custom Resolver

-

A Currency Context needs to implement the interface CoreShop\Component\Currency\Context\CurrencyContextInterface. -This interface consists of one method called getCurrency which returns a CoreShop\Component\Currency\Model\CurrencyInterface or throws an CoreShop\Component\Currency\Context\CurrencyNotFoundException

-

To register your context, you need to use the tag: coreshop.context.currency with an optional priority attribute.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Currencies/index.html b/docs/generated-docs/Development/Localization/Currencies/index.html deleted file mode 100644 index 8fe83e5131..0000000000 --- a/docs/generated-docs/Development/Localization/Currencies/index.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - Currencies - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/States/CRUD.html b/docs/generated-docs/Development/Localization/States/CRUD.html deleted file mode 100644 index 549917cb6c..0000000000 --- a/docs/generated-docs/Development/Localization/States/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

States

-

Create

-

If you want to create a State via API, you can do following:

-
$newState = $container->get('coreshop.factory.state')->createNew();
-
-

Now you have a new State, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.state')->persist($newState);
-$container->get('coreshop.manager.state')->flush();
-
-

You now have a new persisted State.

-

Read

-

If you want to query for States, you can do following:

-
$stateRepository = $container->get('coreshop.repository.state');
-
-$queryBuilder = $stateRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$states = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing State, you need to do following:

-
// Fetch State
-
-$state = $stateRepository->findById(1);
-$state->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.state')->persist($state);
-$container->get('coreshop.manager.state')->flush();
-
-

Delete

-

If you want to update and existing State, you need to do following:

-
// Fetch State
-
-$state = $stateRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.state')->remove($state);
-$container->get('coreshop.manager.state')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/States/index.html b/docs/generated-docs/Development/Localization/States/index.html deleted file mode 100644 index a3e3686cca..0000000000 --- a/docs/generated-docs/Development/Localization/States/index.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - States - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Taxes/Tax_Rate/CRUD.html b/docs/generated-docs/Development/Localization/Taxes/Tax_Rate/CRUD.html deleted file mode 100644 index fad26a9a6f..0000000000 --- a/docs/generated-docs/Development/Localization/Taxes/Tax_Rate/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Tax Rates

-

Create

-

If you want to create a Zone via API, you can do following:

-
$newZone = $container->get('coreshop.factory.tax_rate')->createNew();
-
-

Now you have a new Zone, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.tax_rate')->persist($newZone);
-$container->get('coreshop.manager.tax_rate')->flush();
-
-

You now have a new persisted Zone.

-

Read

-

If you want to query for Tax Rates, you can do following:

-
$rateRepository = $container->get('coreshop.repository.tax_rate');
-
-$queryBuilder = $rateRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$rates = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Zone, you need to do following:

-
// Fetch Zone
-
-$rate = $rateRepository->findById(1);
-$rate->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.tax_rate')->persist($rate);
-$container->get('coreshop.manager.tax_rate')->flush();
-
-

Delete

-

If you want to update and existing Zone, you need to do following:

-
// Fetch Zone
-
-$rate = $rateRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.tax_rate')->remove($rate);
-$container->get('coreshop.manager.tax_rate')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Taxes/Tax_Rate/index.html b/docs/generated-docs/Development/Localization/Taxes/Tax_Rate/index.html deleted file mode 100644 index da2e3619d9..0000000000 --- a/docs/generated-docs/Development/Localization/Taxes/Tax_Rate/index.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - Tax Rate - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/CRUD.html b/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/CRUD.html deleted file mode 100644 index da2a8cb073..0000000000 --- a/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Tax Rules

-

Create

-

If you want to create a Tax Rule via API, you can do following:

-
$newTaxRule = $container->get('coreshop.factory.tax_rule')->createNew();
-
-

Now you have a new Tax Rule, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.tax_rule')->persist($newTaxRule);
-$container->get('coreshop.manager.tax_rule')->flush();
-
-

You now have a new persisted Tax Rule.

-

Read

-

If you want to query for Tax Rules, you can do following:

-
$ruleRepository = $container->get('coreshop.repository.tax_rule');
-
-$queryBuilder = $ruleRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$rules = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Tax Rule, you need to do following:

-
// Fetch Tax Rule
-
-$rule = $ruleRepository->findById(1);
-$rule->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.tax_rule')->persist($rule);
-$container->get('coreshop.manager.tax_rule')->flush();
-
-

Delete

-

If you want to update and existing Tax Rule, you need to do following:

-
// Fetch Tax Rule
-
-$rule = $ruleRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.tax_rule')->remove($rule);
-$container->get('coreshop.manager.tax_rule')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html b/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html deleted file mode 100644 index bc2f06ce7d..0000000000 --- a/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - Tax Factory - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/index.html b/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/index.html deleted file mode 100644 index 32db286484..0000000000 --- a/docs/generated-docs/Development/Localization/Taxes/Tax_Rule/index.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - Tax Rule - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Taxes/index.html b/docs/generated-docs/Development/Localization/Taxes/index.html deleted file mode 100644 index 295103fe69..0000000000 --- a/docs/generated-docs/Development/Localization/Taxes/index.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - Taxes - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Zones/CRUD.html b/docs/generated-docs/Development/Localization/Zones/CRUD.html deleted file mode 100644 index b8b47d2d7f..0000000000 --- a/docs/generated-docs/Development/Localization/Zones/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Zones

-

Create

-

If you want to create a Zone via API, you can do following:

-
$newZone = $container->get('coreshop.factory.zone')->createNew();
-
-

Now you have a new Zone, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.zone')->persist($newZone);
-$container->get('coreshop.manager.zone')->flush();
-
-

You now have a new persisted Zone.

-

Read

-

If you want to query for Zones, you can do following:

-
$zoneRepository = $container->get('coreshop.repository.zone');
-
-$queryBuilder = $zoneRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$zones = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Zone, you need to do following:

-
// Fetch Zone
-
-$zone = $zoneRepository->findById(1);
-$zone->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.zone')->persist($zone);
-$container->get('coreshop.manager.zone')->flush();
-
-

Delete

-

If you want to update and existing Zone, you need to do following:

-
// Fetch Zone
-
-$zone = $zoneRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.zone')->remove($zone);
-$container->get('coreshop.manager.zone')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/Zones/index.html b/docs/generated-docs/Development/Localization/Zones/index.html deleted file mode 100644 index fb37ad095e..0000000000 --- a/docs/generated-docs/Development/Localization/Zones/index.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - Zones - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Localization/index.html b/docs/generated-docs/Development/Localization/index.html deleted file mode 100644 index ab18a8c4cc..0000000000 --- a/docs/generated-docs/Development/Localization/index.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - Localization - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Notification_Rules/Custom_Actions.html b/docs/generated-docs/Development/Notification_Rules/Custom_Actions.html deleted file mode 100644 index ea30985811..0000000000 --- a/docs/generated-docs/Development/Notification_Rules/Custom_Actions.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - Custom Actions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Notification_Rules/Custom_Conditions.html b/docs/generated-docs/Development/Notification_Rules/Custom_Conditions.html deleted file mode 100644 index 7f3e484663..0000000000 --- a/docs/generated-docs/Development/Notification_Rules/Custom_Conditions.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - Custom Conditions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Notification_Rules/Custom_Types.html b/docs/generated-docs/Development/Notification_Rules/Custom_Types.html deleted file mode 100644 index 4567e7186f..0000000000 --- a/docs/generated-docs/Development/Notification_Rules/Custom_Types.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Custom Types - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Notification Rule Custom Type

-

Notification Types are registered dynamically by using tag-attributes on conditions and actions. If you want to have your own -type, you can do so by adding a new condition or action and specify your own type:

-
services:
-  app.coreshop.notification_rule.condition.order.custom_notification_condition:
-    class: AppBundle\CoreShop\Notification\CustomNotificationCondition
-    tags:
-      - { name: coreshop.notification_rule.condition, type: custom_condition, notification-type: custom, form-type: AppBundle\Form\Type\CoreShop\CustomConditionType }
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Notification_Rules/Triggering.html b/docs/generated-docs/Development/Notification_Rules/Triggering.html deleted file mode 100644 index 7ab7aba305..0000000000 --- a/docs/generated-docs/Development/Notification_Rules/Triggering.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - Triggering - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Notification Trigger Notifications

-

Triggering Notification events is quite easy, you can use the CoreShop\Component\Notification\Processor\RulesProcessorInterface implemented by service -@coreshop.notification_rule.processor

-

You also need to add different kinds of parameters based on your Notification Type. -In our case, we trigger an Order event.

-
$this->rulesProcessor->applyRules('order', $event->getProposal(), [
-    'fromState' => $event->getMarking()->getPlaces(),
-    'toState' => $event->getTransition()->getTos(),
-    '_locale' => $order->getLocaleCode(),
-    'recipient' => $customer->getEmail(),
-    'firstname' => $customer->getFirstname(),
-    'lastname' => $customer->getLastname(),
-    'orderNumber' => $order->getOrderNumber(),
-    'transition' => $event->getTransition()->getName()
-]);
-
-

The rest is now handled by CoreShop Notifications.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Notification_Rules/index.html b/docs/generated-docs/Development/Notification_Rules/index.html deleted file mode 100644 index 364f6fff20..0000000000 --- a/docs/generated-docs/Development/Notification_Rules/index.html +++ /dev/null @@ -1,703 +0,0 @@ - - - - - - - Notification Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Notification Rules

-

Notification Rules are responsible for all types of notification triggered by CoreShop. -It handles notification for following types:

-
    -
  • order
  • -
  • quote
  • -
  • invoice
  • -
  • shipment
  • -
  • user
  • -
  • payment
  • -
-

Overview

-

Let's checkout each notification type:

-

Order

-

Allowed Conditions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
Invoice StateDispatch if given Invoice State is active
Invoice TransitionDispatch if given Invoice Transition has been applied
Payment StateDispatch if given Payment State is active
Payment TransitionDispatch if given Payment Transition has been applied
Shipping StateDispatch if given Shipping State is active
Shipping TransitionDispatch if given Shipping Transition has been applied
Order StateDispatch if given Order State is active
Order TransitionDispatch if given Order Transition has been applied
CarriersDispatch if given Carrier has been selected in Order
CommentDispatch if a Comment Action has been applied. Available Types: create comment
-

Allowed Actions

- - - - - - - - - - - - - - - - - -
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
-

Available Placeholders keys for email templates

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyValue
objectObject of type OrderInterface
fromStateState identifier from which it is transitioning away from
toStateState identifier from which it is transitioning to
transitionUsed transition
_localeUsed locale
recipientCustomer E-Mail Address
firstnameCustomer Firstname
lastnameCustomer Lastname
orderNumberOrder Number
-

Available Placeholders keys for email templates for comment

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyValue
objectObject of type OrderInterface
_localeUsed locale
recipientCustomer E-Mail Address
firstnameCustomer Firstname
lastnameCustomer Lastname
orderNumberOrder Number
typeType of comment
submitAsEmailshould comment be sent as mail
commentcontents of the comment
-

Shipment

-

Allowed Conditions

- - - - - - - - - - - - - - - - - -
NameDescription
Shipping StateDispatch if given Shipping State is active
Shipping TransitionDispatch if given Shipping Transition has been applied
-

Allowed Actions

- - - - - - - - - - - - - - - - - -
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
-

Available Placeholders keys for email templates

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyValue
objectObject of type OrderShipmentInterface
orderObject of type OrderInterface
fromStateState identifier from which it is transitioning away from
toStateState identifier from which it is transitioning to
transitionUsed transition
-

Invoice

-

Allowed Conditions

- - - - - - - - - - - - - - - - - -
NameDescription
Invoice StateDispatch if given Invoice State is active
Invoice TransitionDispatch if given Invoice Transition has been applied
-

Allowed Actions

- - - - - - - - - - - - - - - - - -
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
-

Available Placeholders keys for email templates

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyValue
objectObject of type OrderInvoiceInterface
orderObject of type OrderInterface
fromStateState identifier from which it is transitioning away from
toStateState identifier from which it is transitioning to
transitionUsed transition
-

Payment

-

Allowed Conditions

- - - - - - - - - - - - - - - - - -
NameDescription
Payment StateDispatch if given Payment State is active
Payment TransitionDispatch if given Payment Transition has been applied
-

Allowed Actions

- - - - - - - - - - - - - - - - - -
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
-

Available Placeholders keys for email templates

- - - - - - - - - - - - - - - - - - - - - -
KeyValue
objectObject of type PaymentInterface
orderObject of type OrderInterface
paymentStateState of the Payment
-

User

-

Allowed Conditions

- - - - - - - - - - - - - -
NameDescription
User TypeDispatch if given Type has been applied. Allowed Types: new account, password reset
-

Allowed Actions

- - - - - - - - - - - - - -
NameDescription
EmailDefault Email without Order Object
-

Available Placeholders keys for email templates

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyValue
objectObject of type CustomerInterface
recipientCustomer E-Mail Address
genderCustomer Gender
firstnameCustomer Firstname
lastnameCustomer Lastname
emailCustomer E-Mail
typetype of customer notification
-

Additional Placeholders keys for Password Reset

- - - - - - - - - - - - - -
KeyValue
resetLinkLink where customer can reset his Password
-

Additional Placeholders keys for Request Newsletter

- - - - - - - - - - - - - - - - - -
KeyValue
confirmLinkLink where customer can confirm his Newsletter subscription
tokenConfirmation Token
-

Quote

-

Allowed Conditions

- - - - - - - - - - - - - -
NameDescription
CarriersDispatch if given Carrier has been selected in Order
-

Allowed Actions

- - - - - - - - - - - - - -
NameDescription
EmailDefault Email without Order Object
-

Available Placeholders keys for email templates

- - - - - - - - - - - - - -
KeyValue
objectObject of type QuoteInterface
-

Custom Implementation

-

It's also easy to implement custom notification rules. Read more about this here

-

Extend CoreShop Notification Rules

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Order/AdditionalData.html b/docs/generated-docs/Development/Order/AdditionalData.html deleted file mode 100644 index ca8ece04a9..0000000000 --- a/docs/generated-docs/Development/Order/AdditionalData.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - - AdditionalData - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Additional Data in Order

-

Sometimes you need to implement additional information in your order (Besides the comment field, which is available by default in the shipping checkout step).

-
-

Note: To add custom fields you need a custom checkout step.

-
-
    -
  1. Create your custom brick and apply it to the classes:
  2. -
-
    -
  • Cart (additionalData)
  • -
  • Order (additionalData)
  • -
  • Quote (additionalData)
  • -
-
    -
  1. Add fields to your custom checkout step (createForm()):
  2. -
-
$form->add('af_secretField', TextType::class, [
-    'required' => false,
-    'label' => 'coreshop.ui.your_secret_field'
-]);
-$form->add('af_secondSecretField', TextType::class, [
-    'required' => false,
-    'label' => 'coreshop.ui.your_second_secret_field'
-]);
-
-
    -
  1. Store data in cart (commitStep())
  2. -
-
use Pimcore\Model\DataObject\Objectbrick\Data\AdditionalField;
-
-if ($form->isSubmitted()) {
-    if ($form->isValid()) {
-        $formData = $form->getData();
-        if(!empty($formData['af_secretField'])) {
-            $brick = new AdditionalField($cart);
-            $brick->setSecretField($formData['af_secretField']);
-            $brick->setSecondSecretField($formData['af_secondSecretField']);
-            $cart->getAdditionalData()->setAdditionalField($brick);
-        }
-        $cart->save();
-        return true;
-    }
-}
-
-

That's it - your additional data is now available in backend. -If you want to display those fields in the overview, you need to add some JS:

-
core_shop_core:
-    pimcore_admin:
-        js:
-            filter_condition_relational_multi_select: '/bundles/app/additionalData.js'
-
-

This file has to extend coreshop.order.sale.detail.abstractBlock -and requires several methods: initBlock, updateSale, getPanel, getPriority and getPosition.

-
pimcore.registerNS('coreshop.order.order.detail.blocks.yourBlockName');
-coreshop.order.order.detail.blocks.yourBlockName = Class.create(coreshop.order.sale.detail.abstractBlock, {
-
-    saleInfo: {},
-    hasItems: true,
-
-    initBlock: function () {
-        this.saleInfo = Ext.create('Ext.panel.Panel', {
-            title: t('coreshop_order_additional_data'),
-            margin: '0 20 20 0',
-            border: true,
-            flex: 8
-        });
-    },
-
-    updateSale: function () {
-
-        var items = [],
-            subItems = [];
-
-        //console.log(this.sale.additionalData);
-
-        var items = [], subItems = [];
-
-        Ext.Array.each(this.sale.additionalData, function (block, i) {
-            var data = block.data;
-            subItems.push({
-                xtype: 'label',
-                style: 'font-weight:bold;display:block',
-                text: 'Title for your custom field A'
-            },
-            {
-                xtype: 'label',
-                style: 'display:block',
-                html: data.secretField
-            });
-            subItems.push({
-                xtype: 'label',
-                style: 'font-weight:bold;display:block',
-                text: 'Title for your custom field B'
-            },
-            {
-                xtype: 'label',
-                style: 'display:block',
-                html: data.secondSecretField
-            })
-        });
-
-        if (subItems.length === 0) {
-            this.hasItems = false;
-            return;
-        }
-
-        items.push({
-            xtype: 'panel',
-            bodyPadding: 10,
-            margin: '0 0 10px 0',
-            items: subItems
-        });
-
-        // remove all before adding new ones
-        // otherwise they will append during a refresh
-        this.saleInfo.removeAll();
-
-        this.saleInfo.add(items);
-    },
-
-    getPanel: function () {
-        return this.hasItems ? this.saleInfo : null;
-    },
-
-    getPriority: function () {
-        return 10;
-    },
-
-    getPosition: function () {
-        return 'right';
-    }
-});
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Order/Invoice/Invoice_Creation.html b/docs/generated-docs/Development/Order/Invoice/Invoice_Creation.html deleted file mode 100644 index 2d14a17a61..0000000000 --- a/docs/generated-docs/Development/Order/Invoice/Invoice_Creation.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - Invoice Creation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Invoice Creation

-

See Order Transformer for more.

-

Add a Invoice to an Order

-
/**
- * Note:
- *
- * The TRANSITION_REQUEST_INVOICE transition can only be applied once.
- * Only dispatch it with the creation of the first invoice.
- * This transition will inform the order invoice workflow that it's ready to initiate the invoice processing.
-*/
-$workflow = $this->getStateMachineManager()->get($order, 'coreshop_order_invoice');
-$workflow->apply($order, OrderInvoiceTransitions::TRANSITION_REQUEST_INVOICE);
-
-$order = '';
-
-/** @var InvoiceInterface $invoice */
-$invoice = $this->container->get('coreshop.factory.order_invoice')->createNew();
-$invoice->setState(InvoiceStates::STATE_NEW);
-
-$items = [];
-$invoice = $this->get('coreshop.order.transformer.order_to_invoice')->transform($order, $invoice, $items);
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Order/Invoice/index.html b/docs/generated-docs/Development/Order/Invoice/index.html deleted file mode 100644 index 841dfd574e..0000000000 --- a/docs/generated-docs/Development/Order/Invoice/index.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Invoice - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Order/OrderList/Action.html b/docs/generated-docs/Development/Order/OrderList/Action.html deleted file mode 100644 index e723f0c945..0000000000 --- a/docs/generated-docs/Development/Order/OrderList/Action.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - Action - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Order List Actions

-

Actions allows you to process orders rapidly, right in the order grid view.

-

filter

-

Register Filter Service

-
AppBundle\CoreShop\OrderList\Action\Demo:
-    arguments:
-        $stateMachineManager: '@coreshop.state_machine_manager'
-        $shipmentRepository: '@coreshop.repository.order_shipment'
-    tags:
-        - { name: coreshop.grid.action, type: demo }
-
-

Create PHP Class

-

In this example we want to apply the shipment transition "ship" to selected orders.

-
<?php
-
-namespace AppBundle\CoreShop\OrderList\Action;
-
-use CoreShop\Component\Order\Repository\OrderShipmentRepositoryInterface;
-use CoreShop\Bundle\WorkflowBundle\Manager\StateMachineManagerInterface;
-use CoreShop\Component\Pimcore\DataObject\Grid\GridActionInterface;
-use Pimcore\Model\DataObject\CoreShopOrder;
-
-class DemoAction implements GridActionInterface
-{
-    protected $stateMachineManager;
-
-    protected $shipmentRepository;
-
-    public function __construct(
-        StateMachineManagerInterface $stateMachineManager,
-        OrderShipmentRepositoryInterface $shipmentRepository
-    ) {
-        $this->stateMachineManager = $stateMachineManager;
-        $this->shipmentRepository = $shipmentRepository;
-    }
-
-    public function getName(): string
-    {
-        return 'coreshop.order.demo';
-    }
-
-    public function apply(array $processIds): string
-    {
-        $message = '';
-        $transition = 'ship';
-        $shipmentIds = [];
-
-        foreach ($processIds as $id) {
-
-            $m = [];
-            $order = CoreShopOrder::getById($id);
-            $shipments = $this->shipmentRepository->getDocuments($order);
-
-            if (count($shipments) === 0) {
-                $m[] = sprintf('- no shipments for order %s found. skipping....', $order->getId());
-            } else {
-                foreach ($shipments as $shipment) {
-                    if ($shipment->getState() === 'shipped') {
-                        $m[] = sprintf('- transition "%s" for shipment %s already applied. skipping...', $transition, $shipment->getId());
-                        continue;
-                    }
-                    $workflow = $this->stateMachineManager->get($shipment, 'coreshop_shipment');
-                    if (!$workflow->can($shipment, $transition)) {
-                        $m[] = sprintf('- transition "%s" for shipment %s not allowed.', $transition, $shipment->getId());
-                    } else {
-                        try {
-                            $workflow->apply($shipment, $transition);
-                            $shipmentIds[] = $shipment->getId();
-                            $m[] = sprintf('- transition "%s" for shipment id %s successfully applied.', $transition, $shipment->getId());
-                        } catch (\Exception $e) {
-                            $m[] = sprintf('- error while applying transition "%s" to shipment with id %s: %s.', $transition, $shipment->getId(), $e->getMessage());
-                        }
-                    }
-                }
-            }
-
-            $message .= sprintf('<strong>Order %s:</strong><br>%s<br>', $id, join('<br>', $m));
-
-        }
-
-        if (count($shipmentIds) > 0) {
-            $packingListUrl = '/admin/your-packing-list-generator-url?ids=' . join(',', $shipmentIds);
-            $message .= sprintf('<br><a href="%s" target="_blank">%s</a><br>', $packingListUrl, 'packing list');
-        }
-
-        return $message;
-    }
-
-    public function supports(string $listType): bool
-    {
-        return $listType === 'coreshop_order';
-    }
-}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Order/OrderList/Filter.html b/docs/generated-docs/Development/Order/OrderList/Filter.html deleted file mode 100644 index da0156ad0b..0000000000 --- a/docs/generated-docs/Development/Order/OrderList/Filter.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - Filter - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Order List Filter

-

This comes in handy if you need some special filtered data in your Order List. -Your Customer is able to filter orders on specific conditions.

-

filter

-

Register Filter Service

-
AppBundle\CoreShop\OrderList\Filter\DemoFilter:
-    tags:
-        - { name: coreshop.grid.filter, type: demo }
-
-

Create PHP Class

-

In this example we want to filter orders with available shipments in state "ready".

-
<?php
-
-namespace AppBundle\CoreShop\OrderList\Filter;
-
-use CoreShop\Component\Pimcore\DataObject\Grid\GridFilterInterface;
-use Pimcore\Db\ZendCompatibility\QueryBuilder;
-use Pimcore\Model\DataObject;
-
-class DemoFilter implements GridFilterInterface
-{
-    public function getName(): string
-    {
-        return 'coreshop.order_filter.shipment_apply';
-    }
-
-    public function filter(DataObject\Listing $list, array $context): DataObject\Listing
-    {
-        $list->onCreateQuery(function (QueryBuilder $select) use ($list) {
-            $select->join(
-                ['shipment' => 'object_query_4'],
-                'shipment.order__id = object_' . $list->getClassId() . '.o_id'
-            );
-        });
-
-        $list->addConditionParam('orderState = ?', 'confirmed');
-        $list->addConditionParam('shipment.state = ?', 'ready');
-
-        return $list;
-    }
-
-    public function supports(string $listType): bool
-    {
-        return $listType === 'coreshop_order';
-    }
-}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Order/Order_Creation.html b/docs/generated-docs/Development/Order/Order_Creation.html deleted file mode 100644 index 53a7f5a968..0000000000 --- a/docs/generated-docs/Development/Order/Order_Creation.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - Order Creation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Order Creation

-

Orders are usually getting created through the Checkout Step. If you ever need to create an Order manually, there are multiple ways.

-

Order CRUD

-

You can always use the Pimcore API to create Orders, in CoreShop you would do it through the Factory:

-
$factory = $container->get('coreshop.factory.order')->createNew();
-
-

You can now fill the Order with all necessary information.

-

The more usual way to create Orders is through Carts or Quotes. Therefore CoreShop implements Transformer for that.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Order/Order_Workflow.html b/docs/generated-docs/Development/Order/Order_Workflow.html deleted file mode 100644 index a5218b3a39..0000000000 --- a/docs/generated-docs/Development/Order/Order_Workflow.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Order Workflow - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Order/Purchasable.html b/docs/generated-docs/Development/Order/Purchasable.html deleted file mode 100644 index 51cf5e4381..0000000000 --- a/docs/generated-docs/Development/Order/Purchasable.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - Purchasable - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Order Purchasable

-

Items, you want to add to your Cart/Order/Quote, need to implement CoreShop\Component\Order\Model\PurchasableInterface.

-

The concept of Purchasable allows us to decouple CoreShops Order Component from the Product Component and makes the Cart/Quote/Order more flexible -in ways of which object types can be used.

-
-

A Purchasable does not a have Price directly -You need create a class that implements CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface. -in order to calculate price

-
-

Implementation of a new Purchasable Price Calculator

-

To implement a new custom Purchasable Price Calculator, you need to implement the interface CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface.

-

As an example, we create a ProductSetCalculator, which takes prices of each consisting Product:

-
<?php
-
-namespace AppBundle\CoreShop\Order\Calculator;
-
-use CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface;
-use CoreShop\Component\Order\Exception\NoPurchasablePriceFoundException;use CoreShop\Component\Order\Model\PurchasableInterface;
-use Pimcore\Model\Product\ProductSet;
-
-final class ProductSetCalculator implements PurchasablePriceCalculatorInterface
-{
-    private PurchasablePriceCalculatorInterface $purchasablePriceCalculator;
-
-    public function __construct(PurchasablePriceCalculatorInterface $purchasablePriceCalculator)
-    {
-        $this->purchasablePriceCalculator = $purchasablePriceCalculator;
-    }
-
-    public function getPrice(PurchasableInterface $purchasable, array $context, bool $includingDiscounts = false): int
-    {
-        if ($purchasable instanceof ProductSet) {
-            $price = 0;
-
-            foreach ($purchasable->getProducts() as $product) {
-                $price .= $this->purchasablePriceCalculator->getPrice($product);
-            }
-
-            return $price;
-        }
-
-        throw new NoPurchasablePriceFoundException($this);
-    }
-
-}
-
-

Now we need to register our Service to the Container:

-
app.coreshop.order.purchasable.price_calculator.product_set:
-    class: AppBundle\CoreShop\Order\Calculator\ProductSetCalculator
-    arguments:
-        - '@coreshop.order.purchasable.price_calculator'
-    tags:
-     - { name: coreshop.order.purchasable.price_calculator, type: product_set, priority: 20 }
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Order/Shipment/Shipment_Creation.html b/docs/generated-docs/Development/Order/Shipment/Shipment_Creation.html deleted file mode 100644 index 4f2f6ed204..0000000000 --- a/docs/generated-docs/Development/Order/Shipment/Shipment_Creation.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - Shipment Creation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Shipment Creation

-

See Order Transformer for more.

-

Add a Shipment to an Order

-
/**
- * Note:
- *
- * The TRANSITION_REQUEST_SHIPMENT transition can only be applied once.
- * Only dispatch it with the creation of the first shipment.
- * This transition will inform the order shipment workflow that it's ready to initiate the shipment processing.
-*/
-$workflow = $this->getStateMachineManager()->get($order, 'coreshop_order_shipment');
-$workflow->apply($order, OrderShipmentTransitions::TRANSITION_REQUEST_SHIPMENT);
-
-$order = '';
-
-/** @var ShipmentInterface $shipment */
-$shipment = $this->container->get('coreshop.factory.order_shipment')->createNew();
-$shipment->setState(ShipmentStates::STATE_NEW);
-
-$items = [];
-$shipment = $this->get('coreshop.order.transformer.order_to_shipment')->transform($order, $shipment, $items);
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Order/Shipment/index.html b/docs/generated-docs/Development/Order/Shipment/index.html deleted file mode 100644 index 4401485cc3..0000000000 --- a/docs/generated-docs/Development/Order/Shipment/index.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Shipment - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Shipment

-

CoreShop comes with an Shipment (Delivery Slip) creation feature. This means, it can create Shipments for Orders based on Workflow States.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Order/TemplateHelper.html b/docs/generated-docs/Development/Order/TemplateHelper.html deleted file mode 100644 index c174000dfa..0000000000 --- a/docs/generated-docs/Development/Order/TemplateHelper.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - TemplateHelper - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Order/Transformer.html b/docs/generated-docs/Development/Order/Transformer.html deleted file mode 100644 index 95e0970d1e..0000000000 --- a/docs/generated-docs/Development/Order/Transformer.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - Transformer - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Transfomers

-

Transfomers, as the name say, transform Data from different formats. A transformer converts between Object Types. For example: Cart -> Order. Following implementation do exist right now:

- -

The base transformer interface for all "Proposals" is CoreShop\Component\Order\Transformer\ProposalTransformerInterface

-

Extending Transfomers

-

If you ever have the need to adapt the transfomer, eg. hook into it and store some custom data into the order, you can do so -by decorating the default service. Following Services are used by CoreShop for all different Transfomers:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FromToService
OrderInvoicecoreshop.order.transformer.order_to_invoice
OrderItemInvoiceItemcoreshop.order_invoice.transformer.cart_item_to_order_item
OrderShipmentcoreshop.order.transformer.order_to_invoice
OrderItemShipmentItemcoreshop.order_invoice.transformer.order_item_to_shipment_item
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Order/index.html b/docs/generated-docs/Development/Order/index.html deleted file mode 100644 index b6569b399a..0000000000 --- a/docs/generated-docs/Development/Order/index.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - Order - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Payment/Omnipay_Bridge.html b/docs/generated-docs/Development/Payment/Omnipay_Bridge.html deleted file mode 100644 index 4c6a29dbf3..0000000000 --- a/docs/generated-docs/Development/Payment/Omnipay_Bridge.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - Omnipay Bridge - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Payum Ominpay Bridge

-

Here is a list of all available Omnipay Payment Providers.

-
-

As of now, Omnipay is not compatible with Symfony 3. They are already working on it, but will need some time to be finished. -But: You can use the dev-master Version Omnipay to add the Bridge

-
-

To add the Omnipay Bridge, do following:

-
$ composer require payum/omnipay-v3-bridge:dev-master
-
-

This will install the Bridge for you.

-

Now you still need to create your Gateway Configuration as described here.

-

Example of Omnipay Gateway Configuration

-

As example we add omnipay-worldpay:

-
-

Worldpay is currently in PR and I don't know when it is getting merged

-
-

1: add FormType for Worldpay Configuration:

-
<?php
-
-namespace AppBundle\Form\Type;
-
-use Symfony\Component\Form\AbstractType;
-use Symfony\Component\Form\Extension\Core\Type\PasswordType;
-use Symfony\Component\Form\Extension\Core\Type\TextType;
-use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Form\FormEvent;
-use Symfony\Component\Form\FormEvents;
-use Symfony\Component\Validator\Constraints\NotBlank;
-
-final class WorldpayType extends AbstractType
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function buildForm(FormBuilderInterface $builder, array $options)
-    {
-        $builder
-            ->add('serviceKey', TextType::class, [
-                'constraints' => [
-                    new NotBlank([
-                        'groups' => 'coreshop',
-                    ]),
-                ],
-            ])
-            ->add('clientKey', PasswordType::class, [
-                'constraints' => [
-                    new NotBlank([
-                        'groups' => 'coreshop',
-                    ]),
-                ],
-            ])
-            ->add('merchantId', TextType::class, [
-                'constraints' => [
-                    new NotBlank([
-                        'groups' => 'coreshop',
-                    ]),
-                ],
-            ])
-            ->add('factory', TextType::class, [
-                'data' => 'omnipay',
-                'empty_data' => 'omnipay'
-            ])
-            ->add('type', TextType::class, [
-                'data' => 'WorldPay\\Json',
-                'empty_data' => 'WorldPay\\Json'
-            ])
-            ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
-                $data = $event->getData();
-
-                $data['payum.http_client'] = '@coreshop.payum.http_client';
-            })
-        ;
-    }
-}
-
-
-

Register into the container:

-
services:
-  app.form.type.gateway_configuration.worldpay:
-    class: AppBundle\Form\Type\WorldpayType
-    tags:
-      - { name: coreshop.gateway_configuration_type, type: omnipay_worldpay }
-      - { name: form.type }
-
-
-

Its important that it starts with omnipay_ here

-
-

2: Add ExtJs Form:

-
pimcore.registerNS('coreshop.provider.gateways.omnipay_worldpay');
-coreshop.provider.gateways.omnipay_worldpay = Class.create(coreshop.provider.gateways.abstract, {
-
-    getLayout: function (config) {
-        return [
-            {
-                xtype: 'textfield',
-                fieldLabel: t('coreshop_worldpay_service_key'),
-                name: 'gatewayConfig.config.serviceKey',
-                length: 255,
-                value: config.serviceKey ? config.serviceKey : ""
-            },
-            {
-                xtype: 'textfield',
-                fieldLabel: t('coreshop_worldpay_client_key'),
-                name: 'gatewayConfig.config.clientKey',
-                length: 255,
-                value: config.clientKey
-            },
-            {
-                xtype: 'textfield',
-                fieldLabel: t('coreshop_worldpay_merchant_id'),
-                name: 'gatewayConfig.config.merchantId',
-                length: 255,
-                value: config.merchantId
-            }
-        ];
-    }
-
-});
-
-

Register JS File for CoreShop to be loaded:

-
core_shop_payment:
-    pimcore_admin:
-      js:
-        worldpay: /bundles/app/pimcore/static/js/payment/provider/worldpay.js
-
-

Thats it, now you can create a new Payment Provider in the Backend and use Omnipay WorldPay as Payment Provider.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Payment/Payment_Provider.html b/docs/generated-docs/Development/Payment/Payment_Provider.html deleted file mode 100644 index 77d5056d87..0000000000 --- a/docs/generated-docs/Development/Payment/Payment_Provider.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - Payment Provider - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Payment Providers

-

A Payment Provider represents a way that your customer pays during the checkout process. -It holds a reference to a specific gateway with custom configuration. -A gateway is configured for each payment method separately using the payment method form.

-

Payment Gateway configuration

-

Payment Gateways that already have a CoreShop bridge

-

First you need to create the configuration form type for your gateway. -Have a look at the configuration form types of Paypal and Sofort.

-

Then you should register its configuration form type with coreshop.gateway_configuration_type tag. -After that it will be available in the admin panel in the gateway choice dropdown.

-
-

If you are not sure how your configuration form type should look like, -head to Payum documentation.

-
-

Other Payment Gateways

-
-

Learn more about integrating payment gateways in the Payum docs.

-
-
-

You’ll probably need also this kind of configuration in your app/config/config.yml for the gateway’s factory:

-
payum:
-    gateways:
-       yourgateway:
-           factory: yourgateway
-
-
-

As an example, we add Sofort as a payment gateway factory. -To add a new gateway configuration you need to add 2 files:

-
    -
  • A new FormType for configuration values
  • -
  • A new Javascript File for ExtJs Form
  • -
-

1: Form Type for Configuration Values:

-

-namespace AppBundle\CoreShop\Form\Type;
-
-use Symfony\Component\Form\AbstractType;
-use Symfony\Component\Form\Extension\Core\Type\TextType;
-use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Form\FormEvent;
-use Symfony\Component\Form\FormEvents;
-use Symfony\Component\Validator\Constraints\NotBlank;
-
-final class SofortGatewayConfigurationType extends AbstractType
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function buildForm(FormBuilderInterface $builder, array $options)
-    {
-        $builder
-            ->add('config_key', TextType::class, [
-                'constraints' => [
-                    new NotBlank([
-                        'groups' => 'coreshop',
-                    ]),
-                ],
-            ])
-            ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
-                $data = $event->getData();
-
-                $data['payum.http_client'] = '@coreshop.payum.http_client';
-            })
-        ;
-    }
-}
-
-
-

Now we register the FormType into the container

-
services:
-  app.coreshop.form.type.gateway_configuration.sofort:
-    class: AppBundle\Form\Type\SofortGatewayConfigurationType
-    tags:
-      - { name: coreshop.gateway_configuration_type, type: sofort }
-      - { name: form.type }
-
-

2: Create the corresponding ExtJs Form:

-
-

You need to use the type attribute as identifier here

-
-
pimcore.registerNS('coreshop.provider.gateways.sofort');
-coreshop.provider.gateways.sofort = Class.create(coreshop.provider.gateways.abstract, {
-
-    getLayout: function (config) {
-        return [
-            {
-                xtype: 'textfield',
-                fieldLabel: t('config_key'),
-                name: 'gatewayConfig.config.config_key',
-                length: 255,
-                value: config.config_key ? config.config_key : ""
-            }
-        ];
-    }
-
-});
-
-
-

Next we need to register our new Gateway JS file to be loaded:

-
core_shop_payment:
-    pimcore_admin:
-        js:
-            sofort_gateway: '/bundles/app/pimcore/js/sofort.js'
-
-

Thats it, now after reloading Pimcore, you'll see a new Factory.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Payment/Payum_Providers.html b/docs/generated-docs/Development/Payment/Payum_Providers.html deleted file mode 100644 index 73d264db7f..0000000000 --- a/docs/generated-docs/Development/Payment/Payum_Providers.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Payum Providers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Payment/index.html b/docs/generated-docs/Development/Payment/index.html deleted file mode 100644 index 946188e89e..0000000000 --- a/docs/generated-docs/Development/Payment/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - Payment - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Payment

-

CoreShop contains a very flexible payments management system with support for many gateways (payment providers). -We are using a payment abstraction library - Payum, -which handles all sorts of capturing, refunding and recurring payments logic.

-

On CoreShop side, we integrate it into our checkout and manage all the payment data.

-

Available Payment Gateways for CoreShop

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameStateLinkSupportOffsiteSupports Server-NotificationSupports Refund
HeidelpaystableGithubPayPal, Klarna Sofort, Credit CardNoYesNo
SaferPaystableGithubSupported Payment MethodsYesYesPartially
PostFinancestableGithubPostFinance Card, PostFinance E-Finance, Visa, MasterCard, Diners Club, American Express, JCB, PayPal, TWINTYesYesNo
PowerPaydevGithubinvoice, automatic credit checkNoNo (not required)No
CuraBilldevGithubinvoice, instalments via iframeNoNo (not required)No
-

Payment

-

Every payment in CoreShop, successful or failed, is represented by the payment model, -which contains basic information and a reference to appropriate order.

-

Create a Payment programmatically

-

As usually, use a factory to create a new PaymentMethod and give it a unique code.

-
$payment = $this->container->get('coreshop.factory.payment')->createNew();
-
-$payment->setOrder($order);
-$payment->setCurrencyCode('EUR');
-
-$this->container->get('coreshop.repository.payment')->add($payment);
-
-

More

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Products/CRUD.html b/docs/generated-docs/Development/Products/CRUD.html deleted file mode 100644 index c2c9bf984d..0000000000 --- a/docs/generated-docs/Development/Products/CRUD.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product

-

CoreShop uses Pimcore Data Objects to persist Product Information. But, it adds a little wrapper around it to be more -dynamic and configurable. It uses a Factory and Repository Pattern to do that.

-

Create

-

If you want to create a new Product, we need to get our Factory Service for that:

-
$productFactory = $container->get('coreshop.factory.product');
-$product = $productFactory->createNew();
-
-

No we have our product and we can set all needed values.

-

If you now want to save it, just call the save function

-
$product->save();
-
-

Read

-

To get products, you need to use the Repository Service CoreShop provides you.

-
$repository = $container->get('coreshop.repository.product');
-
-
-// Query by ID
-$productWithIdOne = $repository->findById(1);
-
-// Get a Listing how you know it from Pimcore
-$list = $repository->getList();
-$list->setCondition("active = 1");
-$products = $list->getObjects();
-
-
-

Update

-

Update works the same as you are used to in Pimcore

-
$repository = $container->get('coreshop.repository.product');
-
-
-// Query by ID
-$productWithIdOne = $repository->findById(1);
-
-// Change values
-$productWithIdOne->setName('test');
-$productWithIdOne->save();
-
-

Delete

-

Delete works the same as you are used to in Pimcore

-
$repository = $container->get('coreshop.repository.product');
-
-
-// Query by ID
-$productWithIdOne = $repository->findById(1);
-$productWithIdOne->delete();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Products/Configuration.html b/docs/generated-docs/Development/Products/Configuration.html deleted file mode 100644 index fcbf139d1c..0000000000 --- a/docs/generated-docs/Development/Products/Configuration.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Configuration - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Configuration

-
core_shop_product:
-    pimcore:
-        product:
-            path: coreshop/products
-            classes:
-                repository: CoreShop\Bundle\CoreBundle\Pimcore\Repository\ProductRepository
-                install_file: '@CoreShopCoreBundle/Resources/install/pimcore/classes/CoreShopProductBundle/CoreShopProduct.json'
-                model: Pimcore\Model\DataObject\CoreShopProduct
-                interface: CoreShop\Component\Product\Model\ProductInterface
-                factory: CoreShop\Component\Resource\Factory\PimcoreFactory
-                type: object
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Products/Multiple_Product_DataObjects.html b/docs/generated-docs/Development/Products/Multiple_Product_DataObjects.html deleted file mode 100644 index 44761dac9a..0000000000 --- a/docs/generated-docs/Development/Products/Multiple_Product_DataObjects.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - - Multiple Product DataObjects - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Multiple Product DataObjects

-

CoreShop comes with one pre-installed Product Class (CoreShopProduct), which in most cases is enough. In some cases, you might want to use separated classes with different purposes. For example a ProductSet, which consists of multiple Products but also needs to be available for complex price calculations like Price Rules.

-

First of all, we need to create a new DataObject Class in Pimcore. A basic Purchasable Product only needs to implement \CoreShop\Component\Order\Model\PurchasableInterface but since we want to allow complex price calculation, we need to implement CoreShop\Component\Core\Model\ProductInterface.

-
-

Note -If your Product is very simple and you do not need complex price calculations -you then only need to implement \CoreShop\Component\Order\Model\PurchasableInterface

-
-

Easiest way to create the new class is:

-
    -
  • -1: Open Pimcore DataObject Editor
  • -
  • -2: Add a new Class called ProductSet
  • -
  • -3: Import CoreShop Default Product Class (CoreShopProduct.json)
  • -
  • -4: Adapt to your needs
  • -
  • -5: Register your ProductSet Class to CoreShop:
  • -
-
<?php
-
-//src/AppBundle/DependencyInjection/Configuration.php
-
-namespace AppBundle\DependencyInjection;
-
-use CoreShop\Bundle\ProductBundle\Pimcore\Repository\ProductRepository;
-use CoreShop\Bundle\ResourceBundle\CoreShopResourceBundle;
-use CoreShop\Component\Product\Model\ProductInterface;
-use CoreShop\Component\Resource\Factory\PimcoreFactory;
-use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
-use Symfony\Component\Config\Definition\Builder\TreeBuilder;
-use Symfony\Component\Config\Definition\ConfigurationInterface;
-
-final class Configuration implements ConfigurationInterface
-{
-    public function getConfigTreeBuilder()
-    {
-        $treeBuilder = new TreeBuilder();
-        $rootNode = $treeBuilder->root('app');
-
-        $rootNode
-            ->children()
-                ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end()
-            ->end()
-        ;
-
-        $this->addModelsSection($rootNode);
-
-        return $treeBuilder;
-    }
-
-    //Add your configuration here
-    private function addModelsSection(ArrayNodeDefinition $node)
-    {
-        $node
-            ->children()
-                ->arrayNode('pimcore')
-                    ->addDefaultsIfNotSet()
-                    ->children()
-                        ->arrayNode('product_set')
-                            ->addDefaultsIfNotSet()
-                            ->children()
-                                ->variableNode('options')->end()
-                                ->scalarNode('path')->defaultValue('products')->end()
-                                ->arrayNode('classes')
-                                    ->addDefaultsIfNotSet()
-                                    ->children()
-                                        ->scalarNode('model')->defaultValue('Pimcore\Model\DataObject\ProductSet')->cannotBeEmpty()->end()
-                                        ->scalarNode('interface')->defaultValue(ProductInterface::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('factory')->defaultValue(PimcoreFactory::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('repository')->defaultValue(ProductRepository::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('install_file')->defaultValue('@CoreShopProductBundle/Resources/install/pimcore/classes/CoreShopProduct.json')->end()
-                                        ->scalarNode('type')->defaultValue(CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT)->cannotBeOverwritten(true)->end()
-                                    ->end()
-                                ->end()
-                            ->end()
-                        ->end()
-                    ->end()
-                ->end()
-            ->end()
-        ;
-    }
-}
-
-
<?php
-
-//src/AppBundle/DependencyInjection/AppExtension.php
-
-namespace AppBundle\DependencyInjection;
-
-use CoreShop\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractModelExtension;
-use Symfony\Component\Config\FileLocator;
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
-
-class AppExtension extends AbstractModelExtension
-{
-    public function load(array $config, ContainerBuilder $container)
-    {
-        $config = $this->processConfiguration($this->getConfiguration([], $container), $config);
-        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
-
-        //Register the model to the container
-        $this->registerPimcoreModels('app', $config['pimcore'], $container);
-
-        //Alternative you can do it manually like:
-
-        $this->registerPimcoreModels('app', [
-            'product_set' => [
-                'path' => '/product-sets',
-                'classes' => [
-                    'model' => 'Pimcore\Model\DataObject\ProductSet',
-                    'interface' => ProductInterface::class,
-                    'factory' => PimcoreFactory::class,
-                    'type' => CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT
-                ]
-            ]
-        ], $container);
-
-        $loader->load('services.yml');
-    }
-}
-
-
    -
  • -6: You can now use the new ObjectClass as you wish, CoreShop automatically recognises it as ProductClass and your are allowed to use it in PriceRules.
  • -
-
-

Note: -For the Class to be allowed as href/multihref in Pimcore, you need to adapt following classes as well:

-
    -
  • CoreShopCartItem
  • -
  • CoreShopOrderItem
  • -
  • CoreShopQuoteItem
  • -
-

Check for the product field and add your new ProductSet there as allowed references.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Products/Price_Calculation.html b/docs/generated-docs/Development/Products/Price_Calculation.html deleted file mode 100644 index 4b3935e9ae..0000000000 --- a/docs/generated-docs/Development/Products/Price_Calculation.html +++ /dev/null @@ -1,255 +0,0 @@ - - - - - - - Price Calculation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Price Calculation

-

CoreShop uses multiple Price Calculators to determine the correct price for a product. Per default following Calculators are used

- -

These two are only the default implementations, if you need a custom Calculator, you need to implement the Interface

-

CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface and register your service with the tag -coreshop.product.price_calculator, a type attribute and a priority

-

What prices does CoreShop calculate?

-

CoreShop Price Calculation consists of 3 different prices:

-
    -
  • -Retail Price: Base Price without any discounts
  • -
  • -Discount Price: Special Price for promotions. Needs to return a price smaller than retail price, otherwise retail price is valid
  • -
  • -Discount: Discount from promotions
  • -
  • -Price: Retail Price or Discount Price (if available) minus discount rules
  • -
-

The default is always to use store values prices.

-

Calculator Service

-

If you want to calculate the Price for a Product, you need to use a special service to do that. There are two options:

-

1: coreshop.product.price_calculator which calculates prices without any tax regards.

-

2: coreshop.product.taxed_price_calculator which calculates prices with tax or without. (recommended one to use)

-

Templating

-

If you want to calculate the price within a Template, you can do so by using the filter coreshop_product_price

-
-
{{ (product|coreshop_product_price(true)) }}
-
-

Custom Price Calculator Example

-

Our Example Service will take the Property "price" - 1 as Product Price and -1 as Discount, therefore the price stays the same. -This example is only a show-case of how to add a new calculator.

-
-

CoreShop Price calculation always depends on a context. The context per default consists of following values:

-
    -
  • Store
  • -
  • Country
  • -
  • Currency
  • -
  • Customer (if logged in)
  • -
  • Cart
  • -
-
-
<?php
-
-namespace AppBundle\CoreShop\Product;
-
-use CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface;
-use CoreShop\Component\Product\Model\ProductInterface;
-
-final class CustomPriceCalculator implements ProductPriceCalculatorInterface
-{
-    /**
-     * Used to determine a retail price
-     */
-    public function getPrice(ProductInterface $subject, array $context, bool $withDiscount = true): int
-    {
-        $price = $this->getRetailPrice($subject, $context);
-
-        return $withDiscount ? $this->getDiscount($subject, $price) : $price;
-    }
-
-    /**
-     * Used to determine a retail price
-     */
-    public function getRetailPrice(ProductInterface $subject, array $context): int
-    {
-        return $subject->getStorePrice($context['store']);
-    }
-
-    /**
-     * Used to determine a discount
-     */
-    public function getDiscount(ProductInterface $subject, array $context, int $price): int
-    {
-        return 0;
-    }
-
-    /**
-     * Used to determine a discounted price
-     */
-    public function getDiscountPrice(ProductInterface $subject, array $context): int
-    {
-        return 0;
-    }
-}
-
-

Now we need to register our service to the container and add the calculator tag:

-
app.coreshop.product.price_calculator.custom:
-    class: AppBundle\CoreShop\Product\CustomPriceCalculator
-    tags:
-      - { name: coreshop.product.price_calculator, type: custom, priority: 1 }
-
-

CoreShop now uses our service for all Product Price Calculations.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Products/Price_Rules/index.html b/docs/generated-docs/Development/Products/Price_Rules/index.html deleted file mode 100644 index 51e94ad842..0000000000 --- a/docs/generated-docs/Development/Products/Price_Rules/index.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Price Rules

-

CoreShop gives you the ability of very complex price calculation methods. -Price Rules always consist of Conditions and Actions.

-

Price Rule Types

-

Product Price Rules

-
-

Checkout all available product price rules here

-
-

Product price rules are applied to multiple products based on conditions like category or manufacturer.

-

Specific Price Rules

-
-

Checkout all available specific price rules here

-
-

Specific price rules are applied to a single product based on conditions like customer or customer group.

-

Quantity Price Rules

-
-

Checkout all available quantity price rules here

-
-

Quantity price rules are applied to a single product based on conditions like the quantity of a cart item.

-

These rules apply only in the calculation of cart item prices. If you have only quantity rules configured, -the default price calculation of CoreShop will return zero outside of cart context.

-

Extending Conditions and Actions

- -

Template Helper

-

Get Formatted Price with all applied Rules

-
{% import '@CoreShopFrontend/Common/Macro/currency.html.twig' as currency %}
-{% import '@CoreShopFrontend/Common/Macro/product_price.html.twig' as product_price %}
-
-<div class="price">
-    <span class="price-head">{{ 'coreshop.ui.price'|trans }}:</span>
-    {{ product_price.display_product_price(product) }}
-</div>
-<div class="tax">
-    {{ 'coreshop_product_tax_inc'|trans|format(product|coreshop_product_tax_rate) }} ({{ currency.convertAndFormat(product|coreshop_product_tax_amount) }})
-</div>
-
-

Get Active Price Rules

-
{{ dump(product|coreshop_product_price_rules) }}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Products/Unit_Definitions.html b/docs/generated-docs/Development/Products/Unit_Definitions.html deleted file mode 100644 index 0f43addb81..0000000000 --- a/docs/generated-docs/Development/Products/Unit_Definitions.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - Unit Definitions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Unit Definitions

-

CoreShop has a great new feature for product units. E.g. you can sell items "per meter" etc.

-

First, add some product units in Pimcore > CoreShop > Product > Product Units. Click "Add" and fill all the fields.

-

Then you can add product-units directly in the product-objects inside Pimcore (take a look at the "Price"-tab). There, you can also add multiple product units (eg: 1 box contains of 12 items - CoreShop will show you different order-possibilities in the add-to-cart section in the webshop)

-

Using the API for product units:

-

Create Default UnitDefinition

-

If you want to create a new Product, we need to get our Factory Service for that:

-
/** @var DataObject\CoreShopProduct $product */
-$product = DataObject::getById(1);
-
-$unitRepository = $container->get('coreshop.repository.product_unit');
-
-/** @var ProductUnitDefinitionInterface $defaultUnitDefinition */
-$defaultUnitDefinition = $container->get('coreshop.factory.product_unit_definition')->createNew();
-$defaultUnitDefinition->setUnit($unitRepository->findByName('Kubikmeter'));
-
-/** @var ProductUnitDefinitionsInterface $unitDefinitions */
-$unitDefinitions = $container->get('coreshop.factory.product_unit_definitions')->createNew();
-
-$unitDefinitions->setDefaultUnitDefinition($defaultUnitDefinition);
-$unitDefinitions->setProduct($product);
-
-$product->setUnitDefinitions($unitDefinitions);
-
-$product->save();
-
-

Update Default UnitDefinition

-
/** @var DataObject\CoreShopProduct $product */
-$product = DataObject::getById(1);
-
-$unitRepository = $container->get('coreshop.repository.product_unit');
-
-$defaultUnitDefinition = $product->getUnitDefinitions()->getDefaultUnitDefinition();
-$defaultUnitDefinition->setUnit($unitRepository->findByName('Liter'));
-
-$unitDefinitionsRepository = $container->get('coreshop.repository.product_unit_definitions');
-
-/** @var ProductUnitDefinitions $unitDefinitions */
-$unitDefinitions = $unitDefinitionsRepository->findOneForProduct($product);
-$unitDefinitions->setDefaultUnitDefinition($defaultUnitDefinition);
-
-$product->setUnitDefinitions($unitDefinitions);
-
-$product->save();
-
-

Delete UnitDefinition

-

Deleting a UnitDefiniton from a product is done by finding the UnitDefinitions for the product in the product_unit_definitions repository and then deleting it.

-
/** @var DataObject\CoreShopProduct $product */
-$product = DataObject::getById(1);
-
-$unitDefinitionsRepository = $container->get('coreshop.repository.product_unit_definitions');
-$item = $unitDefinitionsRepository->findOneForProduct($product);
-
-$unitDefinitionsRepository->remove($item);
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Products/Units.html b/docs/generated-docs/Development/Products/Units.html deleted file mode 100644 index 323c2fa907..0000000000 --- a/docs/generated-docs/Development/Products/Units.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - Units - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Units

-

Units for Products can be defined globally in the Pimcore Backend on CoreShopMenu > Product > Product Units.

-

Each Product can have different units. Also each product/unit relation can have an own precision that differs to other relations. To archive that, the relation between products and units consists of three objects:

-
    -
  • ProductUnit
  • -
  • ProductUnitDefinition
  • -
  • ProductUnitDefinitions
  • -
-

As already said, the ProductUnit can be created in Pimcore Backend and consists mainly of the key for unit like PCS, CNT etc. and some localized fields for rendering in frontend.

-

To connect a ProductUnit to a CoreShopProduct in Backend you need to get the ProductUnit via repository and create a ProductUnitDefinition.

-
use CoreShop\Component\Product\Model\Product;
-use CoreShop\Component\Product\Model\ProductUnitInterface;
-use CoreShop\Component\Product\Model\ProductUnitDefinition;
-
-$product = Product::getById(1);
-
-/** @var ProductUnitInterface $unit */
-$unit = $this->unitRepository->findOneBy(['name' => '']);
-
-$unitDefinition = new ProductUnitDefinition();
-$unitDefinition->setConversionRate(1.0); // optional
-$unitDefinition->setPrecision(0);        // optional
-$unitDefinition->setUnit($unit);
-
-$product->getUnitDefinitions()->setDefaultUnitDefinition($unitDefinition);
-$product->save();
-
-

To add multiple units for a product use $product->addUnitDefinition($unitDefinition).

-

To change a unit override the default one $product->getUnitDefinitions()->getDefaultUnitDefinition()->setUnit($otherUnit).

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Products/index.html b/docs/generated-docs/Development/Products/index.html deleted file mode 100644 index 58bb816fa7..0000000000 --- a/docs/generated-docs/Development/Products/index.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - Products - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/SEO/index.html b/docs/generated-docs/Development/SEO/index.html deleted file mode 100644 index 1ee6434002..0000000000 --- a/docs/generated-docs/Development/SEO/index.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - SEO - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Shipping/Carrier/CRUD.html b/docs/generated-docs/Development/Shipping/Carrier/CRUD.html deleted file mode 100644 index 1a0ece41b7..0000000000 --- a/docs/generated-docs/Development/Shipping/Carrier/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Carrier

-

Create

-

If you want to create a Carrier via API, you can do following:

-
$newCarrier = $container->get('coreshop.factory.carrier')->createNew();
-
-

Now you have a new Carrier, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.carrier')->persist($newCarrier);
-$container->get('coreshop.manager.carrier')->flush();
-
-

You now have a new persisted Carrier.

-

Read

-

If you want to query for Carriers, you can do following:

-
$carrierRepository = $container->get('coreshop.repository.carrier');
-
-$queryBuilder = $carrierRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$carriers = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Carrier, you need to do following:

-
// Fetch Carrier
-
-$carrier = $carrierRepository->findById(1);
-$carrier->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.carrier')->persist($carrier);
-$container->get('coreshop.manager.carrier')->flush();
-
-

Delete

-

If you want to update and existing Carrier, you need to do following:

-
// Fetch Carrier
-
-$carrier = $carrierRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.carrier')->remove($carrier);
-$container->get('coreshop.manager.carrier')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Shipping/Carrier/Carrier_Discovery.html b/docs/generated-docs/Development/Shipping/Carrier/Carrier_Discovery.html deleted file mode 100644 index bbf3fadade..0000000000 --- a/docs/generated-docs/Development/Shipping/Carrier/Carrier_Discovery.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - Carrier Discovery - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Carrier Discovery

-

CoreShop uses a Service to discover available Carriers for a given Shippable. These Service implements the Interface CoreShop\Bundle\ShippingBundle\Discover\ShippableCarriersDiscoveryInterface. -The Interface is implemented by Service with ID coreshop.carrier.discovery

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Shipping/Carrier/Price_Calculation.html b/docs/generated-docs/Development/Shipping/Carrier/Price_Calculation.html deleted file mode 100644 index f847d07e36..0000000000 --- a/docs/generated-docs/Development/Shipping/Carrier/Price_Calculation.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - Price Calculation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Carrier Price Calculation

-

CoreShop Shipping/Carrier Calculation uses multiple Calculation methods to calculate the price for a given Carrier on a given -Cart. A Calculator needs to implement the Interface CoreShop\Component\Shipping\Calculator\CarrierPriceCalculatorInterface -and registered to the container using the tag coreshop.shipping.price_calculator, a type attribute and a priority

-

Default Implementation

-

The Default Implementation calculates the Price based on Shipping Rules.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Shipping/Carrier/index.html b/docs/generated-docs/Development/Shipping/Carrier/index.html deleted file mode 100644 index 81e573cb7d..0000000000 --- a/docs/generated-docs/Development/Shipping/Carrier/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Carrier - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Shipping/Shipping_Rules/index.html b/docs/generated-docs/Development/Shipping/Shipping_Rules/index.html deleted file mode 100644 index 2a04d42804..0000000000 --- a/docs/generated-docs/Development/Shipping/Shipping_Rules/index.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - Shipping Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Shipping Rules

-

Default Conditions and Actions

-

CoreShop comes with a set of default action and condition implementations:

-

Default Conditions

-
    -
  • Currencies
  • -
  • Customer Groups
  • -
  • Customers
  • -
  • Stores
  • -
  • Zones
  • -
  • Amount
  • -
  • Categories
  • -
  • Countries
  • -
  • Dimension
  • -
  • Post Codes
  • -
  • Products
  • -
  • Shipping Rule
  • -
  • Weight
  • -
  • Nested
  • -
-

Default Actions

-
    -
  • Addition Amount
  • -
  • Addition Percent
  • -
  • Discount Amount
  • -
  • Discount Percent
  • -
  • Price
  • -
  • Shipping Rule
  • -
-

Extending Conditions and Actions

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Shipping/index.html b/docs/generated-docs/Development/Shipping/index.html deleted file mode 100644 index d1b1776fd9..0000000000 --- a/docs/generated-docs/Development/Shipping/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Shipping - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/State_Machine/Available_Workflows.html b/docs/generated-docs/Development/State_Machine/Available_Workflows.html deleted file mode 100644 index 09bafdcf0d..0000000000 --- a/docs/generated-docs/Development/State_Machine/Available_Workflows.html +++ /dev/null @@ -1,635 +0,0 @@ - - - - - - - Available Workflows - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop State Machine - Available Workflows

-

Order Sale Workflow

-

In CoreShop 3.x the Cart, Order and Quote are the same DataObject. To differentiate between them, we use states with workflows.

-

State Machine: coreshop_order_sales_type

-

Available Places

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
cartInitial State - Cart
orderOnce the customer finishes the checkout, pre-payment, it becomes an order
quoteOnce the customer finishes the checkout and requests a quote
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
ordercart
cartcart
quotecart
-

Order Workflow

-

State Machine: coreshop_order -Description: The Order Workflow is the most simplest and also the most important one.

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
initializedInitial State. Just before a order gets saved for the very first time.
newa new order has been created
confirmedcustomer has successfully placed an order
cancelledorder has been cancelled
completethe order is complete (all payments and shipments have been successfully processed)
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
createinitialized
confirmnew
cancelnew, confirmed
completeconfirmed
-

Visualization

-

coreshop_order Workflow Visualization

-

Order Payment Workflow

-

State Machine: coreshop_order_payment -Description: Defines the summary payment state

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
neworder has been initial created
awaiting_paymenta payment has been captured
partially_paidone of the order payments has been paid
cancelledall payments has been cancelled
paidall order payments successfully paid
partially_refundedone of the order payments has been refunded
refundedall payments has been refunded
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
request_paymentnew
partially_payawaiting_payment, partially_paid
cancelawaiting_payment
partially_refundpaid, partially_paid, partially_refunded
refundpaid, partially_paid, partially_refunded
-

Visualization

-

coreshop_order_payment Workflow Visualization

-

Order Shipment Workflow

-

State Machine: coreshop_order_shipment -Description: Defines the summary shipment state

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
neworder has been initial created
cancelledall shipments has been cancelled
partially_shippedone of the order shipments has been shipped
shippedall order shipments has been shipped
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
partially_shipnew
cancelnew
shipnew, partially_shipped
-

Visualization

-

coreshop_order_shipment Workflow Visualization

-

Order Invoice Workflow

-

State Machine: coreshop_order_invoice -Description: Defines the summary invoice state

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
neworder has been initial created
cancelledall invoices has been cancelled
partially_invoicedone of the order invoices has been invoiced
invoicedall order invoices has been successfully invoiced
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
cancelnew
partially_invoicenew
invoicenew, partially_invoiced
-

Visualization

-

coreshop_order_invoice Workflow Visualization

-

Payment Workflow

-

State Machine: coreshop_payment -Description: Defines the single payment state

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newnew payment has been created
processingpayment has been captured
completedpayment is complete
failedpayment has failed
cancelledpayment has been canceled
refundedpayment has been refunded
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
processnew
completenew, processing
failnew, processing
cancelnew, processing
refundcompleted
-

Visualization

-

coreshop_payment Workflow Visualization

-

Shipment Workflow

-

State Machine: coreshop_shipment -Description: Defines the single shipment state

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newnew shipment has been created
readyshipment has been assigned to order
cancelledshipment has been cancelled
shippedshipment has been shipped
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
createnew
shipready
cancelready
-

Visualization

-

coreshop_shipment Workflow Visualization

-

Invoice Workflow

-

State Machine: coreshop_invoice -Description: Defines the single invoice state

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newnew invoice has been created
readyinvoice has been assigned to order
cancelledinvoice has been cancelled
completeinvoice has been completed
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
createnew
cancelready
completeready
-

Visualization

-

coreshop_invoice Workflow Visualization

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/State_Machine/Create_Callbacks.html b/docs/generated-docs/Development/State_Machine/Create_Callbacks.html deleted file mode 100644 index 9ecce52d45..0000000000 --- a/docs/generated-docs/Development/State_Machine/Create_Callbacks.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - Create Callbacks - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop State Machine - Callbacks

-

It's really simple to create a custom state machine callback.

-

After Callbacks

-

In this example we want to register a simple listener which gets triggered after a customer successfully placed a order:

-
core_shop_workflow:
-    state_machine:
-        coreshop_order:
-            callbacks:
-                after:
-                    do_something_special:
-                        on: ['confirm']
-                        do: ['@AppBundle\EventListener\SpecialListener', 'doSomething']
-                        args: ['object']
-                        priority: -10 # fire action early!
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
ontransition name
doservice and method to dispatch
argsobject or event. Object type depends on state machine type.
priorityset priority. default is 0
-

And your Service:

-
<?php
-
-namespace AppBundle\EventListener;
-
-use CoreShop\Component\Core\Model\CustomerInterface;
-use CoreShop\Component\Core\Model\OrderInterface;
-
-final class SpecialListener
-{
-    /**
-     * @param OrderInterface $order
-     */
-    public function doSomething(OrderInterface $order)
-    {
-        /** @var CustomerInterface $customer */
-        $customer = $order->getCustomer();
-
-        /** @var string $locale */
-        $locale = $order->getLocaleCode();
-
-        // your very special code.
-    }
-}
-
-

Before Callbacks

-

In this example we want to register a simple listener which gets triggered before a the shipment transaction ready gets applied:

-
core_shop_workflow:
-    state_machine:
-        coreshop_shipment:
-            callbacks:
-                before:
-                    check_something:
-                        on: ['create']
-                        do: ['@AppBundle\EventListener\SpecialListener', 'checkSomething']
-                        args: ['object']
-                        priority: 0
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
ontransition name
doservice and method to dispatch
argsobject or event. Object type depends on state machine type.
priorityset priority. default is 0
-

As you can see in the class below, the checkSomething() method throws an exception. -This prevents the state machine from switching to the ready state. -Just remove the exception and the transition gets applied as expected.

-
<?php
-
-namespace AppBundle\EventListener;
-
-use CoreShop\Component\Core\Model\OrderShipmentInterface;
-
-final class SpecialListener
-{
-    /**
-     * @param OrderShipmentInterface $shipment
-     */
-    public function checkSomething(OrderShipmentInterface $shipment)
-    {
-        // check something and throw an exeption
-        throw new \Exception('something is wrong...');
-    }
-}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/State_Machine/Extend_Workflows.html b/docs/generated-docs/Development/State_Machine/Extend_Workflows.html deleted file mode 100644 index e47559e3ce..0000000000 --- a/docs/generated-docs/Development/State_Machine/Extend_Workflows.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - Extend Workflows - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop State Machine - Extend Workflows

-

It's possible to extend all available CoreShop Workflow.

-

Example A: Extend Shipment Workflow

-

Workflow Configuration

-
core_shop_workflow:
-    state_machine:
-        coreshop_shipment:
-            # define a new place "reviewed"
-            places:
-                - reviewed
-            # define a new transition "review"
-            transitions:
-                review:
-                    from: [new, ready]
-                    to: reviewed
-            # add some colors for better ux
-            place_colors:
-                reviewed: '#2f819e'
-            transition_colors:
-                review: '#2f819e'
-
-

Add translations

-

Just use the Pimcore Backend/Frontend translation or just add it via default symfony translation context:

-
# app/Resources/translations/admin.en.yml
-coreshop_workflow_transition_coreshop_shipment_review: 'Review'
-coreshop_workflow_state_coreshop_shipment_reviewed: 'Reviewed'
-
-# app/Resources/translations/messages.en.yml
-coreshop.ui.workflow.state.coreshop_shipment.reviewed: 'Shipment under Review'
-
-

Inform CoreShop about new Transition of Shipment Workflow

-

Not all transitions should be available in backend. -To allow the transition to show up, you need to implement a simple event listener:

-
# app/config/services
-AppBundle\EventListener\WorkflowListener:
-    autowire: true
-    tags:
-        - { name: kernel.event_listener, event: coreshop.workflow.valid_transitions, method: parseTransitions}
-
-
<?php
-
-namespace AppBundle\EventListener;
-
-use CoreShop\Bundle\OrderBundle\Event\WorkflowTransitionEvent;
-
-class WorkflowListener
-{
-    public function parseTransitions(WorkflowTransitionEvent $event)
-    {
-        $workflowName = $event->getWorkflowName();
-        if($workflowName === 'coreshop_shipment') {
-            $event->addAllowedTransitions(['review']);
-        }
-    }
-}
-
-

Example B: Change default Transition Behaviour of Shipment Workflow

-
-

Note: Be careful while changing transitions. Test your application if a workflow still runs smoothly after changing it!

-
-

In this example we want to change the default shipping behavior.

-

Workflow before:

-

ready -> shipped -> cancelled

-

Workflow after:

-

ready -> reviewed -> shipped -> cancelled

-

Workflow Configuration

-
core_shop_workflow:
-    state_machine:
-        coreshop_shipment:
-            # define a new place "reviewed"
-            places:
-                - reviewed
-            # define a new transition "review"
-            transitions:
-                review:
-                    from: [ready]
-                    to: reviewed
-                # override the default "ship" transition
-                # which only allows [ready] as valid "from" dispatcher
-                ship:
-                    from: [reviewed]
-                    to: shipped
-            # add some colors for better ux
-            place_colors:
-                reviewed: '#2f819e'
-            transition_colors:
-                review: '#2f819e'
-
-

Example C: Callback Listener

-

If you need to implement some further business logic after the coreshop_shipment state has changed to reviewed -you need to define a callback:

-
-

Note: Please make sure your service is public available!

-
-
core_shop_workflow:
-    state_machine:
-        coreshop_shipment:
-            callbacks:
-                after:
-                    do_something_after_review:
-                        on: ['review']
-                        do: ['@your_service', 'yourAction']
-                        # in this context, "object" is the shipment item
-                        args: ['object']
-                        priority: -10 # fire action early!
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/State_Machine/Things_To_Know.html b/docs/generated-docs/Development/State_Machine/Things_To_Know.html deleted file mode 100644 index c65adea4b1..0000000000 --- a/docs/generated-docs/Development/State_Machine/Things_To_Know.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - Things To Know - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop State Machine - Important Things to Know

-

Canceling Orders

-

Within the CoreShop workflow architecture a lot of orders may stay forever in the new or confirmed state. -CoreShop will automatically cancel orders older than 20 days under following conditions:

-
    -
  • Order creationDate >= 20 days ago
  • -
  • Order State is initialized or new or confirmed -
  • -
  • Order Payment State is not paid -
  • -
-

Read more about automation here.

-

Expire Orders via Backend

-

There is also a cancel button in the order detail section.

-

Expire Orders via Command

-

There is also a command for that:

-
$ coreshop:order:expire
-
-

Change Orders Expiration Date

-
core_shop_order:
-    expiration:
-        order:
-            days: 30
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/State_Machine/index.html b/docs/generated-docs/Development/State_Machine/index.html deleted file mode 100644 index 22ede6341f..0000000000 --- a/docs/generated-docs/Development/State_Machine/index.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - State Machine - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop State Machine

-

The CoreShop State Machine is a important core feature which allows to determinate complex workflows securely and in a most modern way. -Unlike the most eCommerce Frameworks out there, CoreShop does not work with the messy and hard do extend "state/status" concept. -Every order-section and of course the order itself provides its own state machine which allows us to build a super strong state workflow.

-

Places

-

In State Machine context, the well-known "Status" Property is called "Places". -Every Workflow comes with a pre-defined set of Places.

-

Transition

-

To change the Place of a workflow we need to apply a transition. -If the transition is valid the new place gets stored.

-

Callbacks

-

There are several events for each transition which can be also extend by every project. -Example:: If all order payments has been successfully transformed to the completed place, -the coreshop_order_payment workflow will automatically change to paid.

-

Workflows

-

There are seven implemented Workflows:

-
    -
  • -coreshop_order -
  • -
  • -coreshop_order_payment -
  • -
  • -coreshop_order_shipment -
  • -
  • -coreshop_order_invoice -
  • -
  • -coreshop_payment -
  • -
  • -coreshop_shipment -
  • -
  • -coreshop_invoice -
  • -
-

Workflows are connected among themselves so every transition will trigger another Workflow and so on. -If a transition has been dispatched, it cannot be transformed back unless it has been defined in the available transitions.

-

So let's start:

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Store_Front/Controllers.html b/docs/generated-docs/Development/Store_Front/Controllers.html deleted file mode 100644 index d352e765d5..0000000000 --- a/docs/generated-docs/Development/Store_Front/Controllers.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - Controllers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Store Front Controller

-

If you use CoreShop FrontendBundle, you can change the Controllers it uses. Simply change the configuration for the controller:

-
core_shop_frontend:
-    controllers:
-        index: CoreShop\Bundle\FrontendBundle\Controller\IndexController
-        register: CoreShop\Bundle\FrontendBundle\Controller\RegisterController
-        customer: CoreShop\Bundle\FrontendBundle\Controller\CustomerController
-        currency: CoreShop\Bundle\FrontendBundle\Controller\CurrencyController
-        language: CoreShop\Bundle\FrontendBundle\Controller\LanguageController
-        search: CoreShop\Bundle\FrontendBundle\Controller\SearchController
-        cart: CoreShop\Bundle\FrontendBundle\Controller\CartController
-        checkout: CoreShop\Bundle\FrontendBundle\Controller\CheckoutController
-        category: CoreShop\Bundle\FrontendBundle\Controller\CategoryController
-        product: CoreShop\Bundle\FrontendBundle\Controller\ProductController
-        quote: CoreShop\Bundle\FrontendBundle\Controller\QuoteController
-        security: CoreShop\Bundle\FrontendBundle\Controller\SecurityController
-        payment: CoreShop\Bundle\PayumBundle\Controller\PaymentController
-
-

Example of using a Custom ProductController

-

1: Add a new Controller and inherit from the FrontendController

-
<?php
-
-namespace AppBundle\Controller;
-
-use CoreShop\Component\Core\Model\ProductInterface;
-use Symfony\Component\HttpFoundation\Request;
-
-class ProductController extends \CoreShop\Bundle\FrontendBundle\Controller\ProductController
-{
-    public function detailAction(Request $request)
-    {
-        //Do whatever you want in here
-
-        return parent::detailAction($request);
-    }
-}
-
-

2: Change Configuration of the Controller:

-
core_shop_frontend:
-    controllers:
-        product: AppBundle\Controller\ProductController
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Store_Front/index.html b/docs/generated-docs/Development/Store_Front/index.html deleted file mode 100644 index ab87672f7f..0000000000 --- a/docs/generated-docs/Development/Store_Front/index.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - Store Front - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Stores/CRUD.html b/docs/generated-docs/Development/Stores/CRUD.html deleted file mode 100644 index b0b2b34585..0000000000 --- a/docs/generated-docs/Development/Stores/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Stores

-

Create

-

If you want to create a Store via API, you can do following:

-
$newStore = $container->get('coreshop.factory.store')->createNew();
-
-

Now you have a new Store, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.store')->persist($newStore);
-$container->get('coreshop.manager.store')->flush();
-
-

You now have a new persisted Store.

-

Read

-

If you want to query for Stores, you can do following:

-
$storeRepository = $container->get('coreshop.repository.store');
-
-$queryBuilder = $storeRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$stores = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Store, you need to do following:

-
// Fetch Store
-
-$store = $storeRepository->findById(1);
-$store->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.store')->persist($store);
-$container->get('coreshop.manager.store')->flush();
-
-

Delete

-

If you want to update and existing Store, you need to do following:

-
// Fetch Store
-
-$store = $storeRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.store')->remove($store);
-$container->get('coreshop.manager.store')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Stores/Context.html b/docs/generated-docs/Development/Stores/Context.html deleted file mode 100644 index 642072514d..0000000000 --- a/docs/generated-docs/Development/Stores/Context.html +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Store Context

-

For CoreShop to determine the current store the visitor or customer comes from -it uses a concept called context and context resolver.

-

Context

- - - - - - - - - - - - - - - - - - - - - - - -
NamePriorityTagDescription
FixedStoreContext2coreshop.context.storeUsed for testing purposes
StoreContext1coreshop.context.storeLoad a store from given request resolver
-

Resolver

- - - - - - - - - - - - - - - - - - - - - - - -
NamePriorityTagDescription
SiteBasedRequestResolver100coreshop.context.store.request_based.resolverDetermines a store by a given pimcore frontend site
PimcoreAdminSiteBasedRequestResolver200coreshop.context.store.request_based.resolverDetermines a store by a given document in backend
-

These resolver take care about finding the correct store for the current request.

-

Create a Custom Resolver

-

A Store Context needs to implement the interface CoreShop\Component\Store\Context\StoreContextInterface. -This interface consists of one method called getStore which returns a CoreShop\Component\Store\Model\StoreInterface or throws an CoreShop\Component\Store\Context\StoreNotFoundException.

-

To register your context, you need to use the tag coreshop.context.store with an optional priority attribute.

-

Create a Request based Resolver

-

CoreShop already implements Request based store context resolver. So if your context depends on the current request, you can -create a custom RequestBased resolver. To do that, implement the interface CoreShop\Component\Store\Context\RequestBased\RequestResolverInterface -with the method findStore. This method either returns a store or null.

-

To register this resolver, use the tag: coreshop.context.store.request_based.resolver with an optional priority attribute.

-

Example

-

We want to a StoreContext to be based on the Pimcore Document. So if we are on site /de, we want to resolve to Store DE, if we -are on page /en we want to resolve to Store Store EN:

-

1: First of all we need to create our RequestBased Store Context:

-
<?php
-
-namespace AppBundle\CoreShop\Store\Context;
-
-use CoreShop\Component\Store\Context\RequestBased\RequestResolverInterface;
-use CoreShop\Component\Store\Repository\StoreRepositoryInterface;
-use Pimcore\Http\Request\Resolver\DocumentResolver;
-use Symfony\Component\HttpFoundation\Request;
-
-final class DocumentBasedRequestRequestResolver implements RequestResolverInterface
-{
-    private StoreRepositoryInterface $storeRepository;
-
-    public function __construct(StoreRepositoryInterface $storeRepository)
-    {
-        $this->storeRepository = $storeRepository;
-    }
-
-    public function findStore(Request $request): ?StoreInterface
-    {
-        if (substr($request->getPathInfo(), 0, 3) === '/en') {
-            return $this->storeRepository->find(1);
-        }
-
-        if (substr($request->getPathInfo(), 0, 3) === '/de') {
-            return $this->storeRepository->find(2);
-        }
-
-        return null;
-    }
-}
-
-

Now we need to configure the service in src/AppBundle/Resources/config/services.yml

-
services:
-  app.coreshop.store.context.request.document_based:
-    class: AppBundle\CoreShop\Store\Context\DocumentBasedRequestRequestResolver
-    arguments:
-      - '@coreshop.repository.store'
-    tags:
-      - { name: coreshop.context.store.request_based.resolver, priority: 300 }
-
-
-

CoreShop now tries to resolve the current Store based on the Pimcore Site we are on.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Stores/Theme.html b/docs/generated-docs/Development/Stores/Theme.html deleted file mode 100644 index de14a96284..0000000000 --- a/docs/generated-docs/Development/Stores/Theme.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - Theme - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/Stores/index.html b/docs/generated-docs/Development/Stores/index.html deleted file mode 100644 index e2bfed7dbc..0000000000 --- a/docs/generated-docs/Development/Stores/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Stores - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Development/index.html b/docs/generated-docs/Development/index.html deleted file mode 100644 index e344bf0508..0000000000 --- a/docs/generated-docs/Development/index.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - Development - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop

-

The Developer’s guide to leveraging the flexibility of CoreShop. Here you will find all the concepts used in CoreShop.

-

Introduction

-

CoreShop Resources

-

CoreShop uses Doctrine ORM for Custom Resources. ORM enables us great flexibility and extendability for simple models like Currencies and Countries. -CoreShop currently implements these Resources as ORM Model:

-
    -
  • Currency
  • -
  • Country and State
  • -
  • Tax Rate and Tax Rules
  • -
  • Price Rules
  • -
  • Carrier
  • -
  • Shipping Rules
  • -
  • Index and Filter Configuration
  • -
  • Notification Rule Configuration
  • -
  • Stores
  • -
  • Payments
  • -
-

Everytime something is called a Resource, we talk about ORM Models.

-

CoreShop Pimcore Models

-

CoreShop also takes advantage of Pimcores flexible data-model. -Objects that are heavily used and changed are implemented using Data Objects:

-
    -
  • Product
  • -
  • Product Category
  • -
  • Manufacturer
  • -
  • Cart
  • -
  • Order
  • -
  • Order Invoice
  • -
  • Order Shipment
  • -
  • Quote
  • -
  • Customer
  • -
  • Customer Group
  • -
  • Addresses
  • -
-

Everytime we talk about Objects, we talk about Pimcore Data Objects.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Getting_Started/Architecture_Overview.html b/docs/generated-docs/Getting_Started/Architecture_Overview.html deleted file mode 100644 index 0987c614f0..0000000000 --- a/docs/generated-docs/Getting_Started/Architecture_Overview.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - Architecture Overview - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Architecture

-

CoreShop is completely open source (GPl license) and free, maintained by diverse and creative community of developers and companies.

-

What are our core values and what makes us different from other solutions?

-
    -
  • Components based approach
  • -
  • Unlimited flexibility and simple customization
  • -
  • Developer-friendly, using latest technologies
  • -
  • Highest quality of code
  • -
-

The Three Natures of CoreShop

-

CoreShop is constructed from fully decoupled and flexible e-commerce components for PHP. -It is also a set of Symfony bundles, which integrate the components into the full-stack framework. -On top of that, CoreShop is also a complete eCommerce suite crafted from all these building blocks.

-

It is your choice how to use CoreShop, you can benefit from the components with any framework, -integrate selected bundles into existing or new Pimcore app or built your application on top of CoreShop Suite.

-

CoreShop Suite

-

This book is about our full-stack eCommerce suite, which is a standard Pimcore Bundle providing the most common webshop and a foundation for custom systems.

-

Leveraging Symfony Bundles

-

If you prefer to build your very custom system step by step and from scratch, -you can integrate the standalone Symfony bundles. -For the installation instructions, please refer to the appropriate bundle documentation.

-

Difference to the official Pimcore eCommerce Framework

-

The eCommerce Framework provides you with a basic Toolset for eCommerce Development. -CoreShop gives you a feature-rich Toolset of common needed Tools for rich and complex eCommerce Solutions.

-
-

Example I: the Framework does'nt give you the full opportunity for calculating complex Shipping Prices. -You need to code it by yourself. CoreShop provides you with Carriers and Shipping Rules to do that.

-
-

CoreShops Bundles are build to be used individually. The CoreBundle combines all the Features.

-

Architecture Overview

-

CoreShop Suite is build on CoreShop Components and Bundles. -The CoreBundle and CoreComponent glues all different Bundles and Components into one eCommerce Suite for B2B and B2C Solutions.

-

Architecture

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Getting_Started/Difference_to_ecommerce_Framework.html b/docs/generated-docs/Getting_Started/Difference_to_ecommerce_Framework.html deleted file mode 100644 index 02da2a7e26..0000000000 --- a/docs/generated-docs/Getting_Started/Difference_to_ecommerce_Framework.html +++ /dev/null @@ -1,501 +0,0 @@ - - - - - - - Difference to ecommerce Framework - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop vs. eCommerce Framework

-

The idea behind CoreShop is totally different to the eCommerce framework. The eCommerce framework gives you skeleton for building -eCommerce applications and heavily depends on you doing all the things.

-

CoreShop, on the other hand, comes full-featured with a rich toolset of optional Components which you can use, or not use, for your -ecommerce Application. In other words: CoreShop is the framework on steroids :)

-

Feature Comparison

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureeCommerce FrameworkCoreShop
Product Management
Product RestrictionsX
Product Variants
Category Management
Customer ManagementX
Customer Address ManagementX
LocalizationX
Currency ManagementX
Country ManagementX
Taxation
Payment Management
Supported Payment Providers
- Wirecard Qpay
- Wirecard Seamless
- Datatrans
- Klarna
- Recurring Payments
- PayPal ExpressX
- PayPal Pro CheckoutX
- PayPal Pro HostedX
- PayPal MasspayX
- PayPal RestX
- Stripe.jsX
- Stripe CheckoutX
- Authorize.NET AIMX
- Be2Bill Credit CardX
- Be2Bill OffsiteX
- PayexX
- OfflineX
- Payum and OmnipayX
Voucher Codes
Catalog Price Rules
Product Specific Price RulesX
Product Facet Index
Multi Theme SupportedX
Carrier ManagementX
Shipping CalculationX
Order Management
Order WorkflowX
Order Invoice GenerationX
Order Shipment GenerationX
Quotes ManagementX
ReportingX
Multi Store/Tenant
eCommerce Tracking
Configurable Mail RulesX
Backend Functionality
- Country ManagementX
- Currency ManagementX
- Taxation ManagementX
- Taxation ManagementX
- Index ManagementX
- Filter ManagementX
- Order ManagementX (partial)
- Voucher Rules
- Price Rules
- Order OverviewX (partial)
- Quote OverviewX
- Order DetailX (partial)
- Quote DetailX
- Order CreationX
- Quote CreationX
Checkout Manager
Modular/ComponentizedX (partial)
Extendable
-

To be fair, both Systems have their purpose and you can do the same with both systems. The ecommerce Framework is designed -to be very good extendable but you still need to implement a lot of stuff yourself. CoreShop gives you a lot of out-of-the-box -features to quickly create rich ecommerce systems.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Getting_Started/Installation.html b/docs/generated-docs/Getting_Started/Installation.html deleted file mode 100644 index 60b4ccc966..0000000000 --- a/docs/generated-docs/Getting_Started/Installation.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - Installation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Installation

-

You need a running instance of Pimcore on your system before you can install CoreShop.

-

You can setup your own example:

-
    -
  • Install with composer composer require coreshop/core-shop ^3.0 -
  • -
  • Run enable Bundle command -php bin/console pimcore:bundle:enable CoreShopCoreBundle -
  • -
  • Run Install Command -php bin/console coreshop:install -
  • -
  • Optional: Install Demo Data php bin/console coreshop:install:demo -
  • -
-

Messenger

-

CoreShop also uses Symfony Messenger for async tasks like sending E-Mails or Processing DataObjects for the Index. Please run these 2 transports to process the data

-
bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300
-
-

Payment

-

CoreShop uses Payum for Payment. Checkout Payums Documentation on how to add payment providers.

-

Payment providers are implemented as Pimcore Plugin. They can be installed using composer. Here you can find all available payment modules via composer

-

Payum Documentation

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Getting_Started/Upgrade_Notes.html b/docs/generated-docs/Getting_Started/Upgrade_Notes.html deleted file mode 100644 index 2c40daa1ce..0000000000 --- a/docs/generated-docs/Getting_Started/Upgrade_Notes.html +++ /dev/null @@ -1,444 +0,0 @@ - - - - - - - Upgrade Notes - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Upgrade Notes

-

Always check this page for some important upgrade notes before updating to the latest coreshop build.

-

2.0.0-beta.3 to 2.0.0-beta.4

-
    -
  • -BC break: All occurrences of parameters coreshop.all.stack.pimcore_class_ids, "application".model."class".pimcore_class_id, coreshop.all.pimcore_classes.ids have been removed. Inject the corresponding Repository and use classId function instead
  • -
  • -Pimcore: CoreShop now requires at least Pimcore 5.4.0. You need to update Pimcore to the at least 5.4.0 in order to use/update CoreShop.
  • -
-

Product Price Calculation

-

In order to allow custom price calculation on API Level, we changed the way CoreShop calculates product prices by introducing a new parameter to every PriceCalculation Interface. Price Calculator Conditions are not anymore using a Live context, instead it gets passed via API.

-

Following interfaces have changed:

-
    -
  • -CoreShop\Component\Core\Product\TaxedProductPriceCalculatorInterface -
  • -
  • -CoreShop\Component\Order\Calculator\PurchasableDiscountCalculatorInterface -
  • -
  • -CoreShop\Component\Order\Calculator\PurchasableDiscountPriceCalculatorInterface -
  • -
  • -CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface -
  • -
  • -CoreShop\Component\Order\Calculator\PurchasableRetailPriceCalculatorInterface -
  • -
  • -CoreShop\Component\Product\Calculator\ProductDiscountCalculatorInterface -
  • -
  • -CoreShop\Component\Product\Calculator\ProductDiscountPriceCalculatorInterface -
  • -
  • -CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface -
  • -
  • -CoreShop\Component\Product\Calculator\ProductRetailPriceCalculatorInterface -
  • -
  • -CoreShop\Component\Product\Rule\Action\ProductDiscountActionProcessorInterface -
  • -
  • -CoreShop\Component\Product\Rule\Action\ProductDiscountPriceActionProcessorInterface -
  • -
  • -CoreShop\Component\Product\Rule\Action\ProductDiscountPriceActionProcessorInterface -
  • -
  • -CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface -
  • -
  • -CoreShop\Component\Product\Rule\Fetcher\ValidRulesFetcherInterface -
  • -
-

If you have anything customized with those classes, please change them accordingly.

-

If you use the PriceCalculator Service directly, you also need to change the call from

-
$this->priceCalculator->getPrice($object, true)
-
-

to

-
$this->priceCalculator->getPrice($object, [
-    'store' => $store,
-    'country' => $country,
-    'customer' => $customer,
-    'currency' $currency,
-    'cart' => $cart
-], true)
-
-

The new second argument, is the Context for which you want to get the Price. This is highly depends on your -need. On a default CoreShop setup, the context can be fetched form the ShopperContext Service like this:

-
return  [
-    'store' => $this->shopperContext->getStore(),
-    'customer' => $this->shopperContext->hasCustomer() ? $this->shopperContext->getCustomer() : null,
-    'currency' => $this->shopperContext->getCurrency(),
-    'country' => $this->shopperContext->getCountry(),
-    'cart' => $this->shopperContext->getCart()
-];
-
-

CoreShop makes that easier for you, you can just use $this->shoppperContext->getContext(). But be aware, the Shopper Context is only in a Web Request available. -When you work on a CLI Level, you have to define the context yourself.

-

If you already have a cart and want to calculate the price for the cart, the context is a bit different, cause it resolves from the cart

-
$context = [
-    'store' => $cart->getStore(),
-    'customer' => $cart->getCustomer() ?: null,
-    'currency' => $cart->getCurrency(),
-    'country' => $cart->getStore()->getBaseCountry(),
-    'cart' => $cart
-];
-
-

Taxation

-

Tax Rule Store relation has been removed as it makes currently no sense.

-

Tracking

-

Tracking bundle has completely been refactored in order to support more use-cases than just ecommerce. If you have any customizations made, please check the current implementation to adapt your changes.

-

Order Invoice

-

Due to changes in adjustments, we also need to change OrderInvoice/OrderInvoiceItem.

-

After you have migrated to the latest version you also have to remove some fields:

-

CoreShopOrderInvoice

-
    -
  • totalTax
  • -
  • baseTotalTax
  • -
  • subtotalTax
  • -
  • baseSubtotalTax
  • -
  • shippingTax
  • -
  • baseShippingTax
  • -
  • taxes
  • -
  • baseTaxes
  • -
  • discountTax
  • -
  • baseDiscountTax
  • -
  • discountNet
  • -
  • discountGross
  • -
  • baseDiscountNet
  • -
  • baseDiscountGross
  • -
  • shippingNet
  • -
  • shippingGross
  • -
  • baseShippingNet
  • -
  • baseShippingGross
  • -
  • shippingTaxRate
  • -
-

CoreShopOrderInvoiceItem

-
    -
  • totalTax
  • -
  • baseTotalTax
  • -
  • taxes
  • -
  • baseTaxes
  • -
-

Adjustments

-
-

BC break / New Feature

-
-

There are several deprecated class fields. -After you have migrated to the latest version you also have to remove them:

-

CoreShopOrder / CoreShopQuote

-
    -
  • shippingGross
  • -
  • shippingNet
  • -
  • shippingTax
  • -
  • discountGross
  • -
  • discountNet
  • -
  • discountTax
  • -
  • baseShippingNet
  • -
  • baseShippingGross
  • -
  • baseShippingTax
  • -
  • baseDiscountNet
  • -
  • baseDiscountGross
  • -
  • totalTax
  • -
  • baseTotalTax
  • -
  • subTotalTax
  • -
  • baseSubtotalTax
  • -
-

CoreShopOrderItem / CoreShopQuoteItem

-
    -
  • totalTax
  • -
  • baseTotalTax
  • -
-

CoreShopCart

-
    -
  • shippingGross
  • -
  • shippingNet
  • -
  • discountGross
  • -
  • discountNet
  • -
-

2.0.0-beta.2 to 2.0.0-beta.3

-
    -
  • -

    BC break Signature of following interfaces changed:

    -
      -
    • -CoreShop\Component\Index\Interpreter\InterpreterInterface: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []);
    • -
    • -CoreShop\Component\Index\Interpreter\LocalizedInterpreterInterface: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []);
    • -
    • -CoreShop\Component\Index\Interpreter\RelationInterpreterInterface: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config, $interpreterConfig = []);
    • -
    • -CoreShop\Component\Customer\Model\UserInterface::ROLE_DEFAULT renamed CoreShop\Component\Customer\Model\UserInterface::CORESHOP_ROLE_DEFAULT -
    • -
    • -CoreShop\Component\Customer\Model\UserInterface::ROLE_SUPER_ADMIN renamed CoreShop\Component\Customer\Model\UserInterface::CORESHOP_ROLE_SUPER_ADMIN -
    • -
    -
  • -
  • -

    BC break Shipment / Invoice Creation via API changed

    -
      -
    • Before adding a new Shipment / Invoice you need to dispatch a request state to your order. Read more about it here and here.
    • -
    -
  • -
  • -

    BC break getName in CoreShop\Component\Index\Model\IndexableInterface has been changed to getIndexableName as getName could eventually conflict with a non localized Pimcore Field

    -
  • -
  • -

    BC break getEnabled in CoreShop\Component\Index\Model\IndexableInterface has been changed to getIndexableEnabled as getEnabled could eventually conflict with a localized Pimcore Field

    -
  • -
-

2.0.0-beta.1 to 2.0.0-beta.2

-
    -
  • Link Generator implemented. If you want to use nice urls, you need to add the link generator service: -
      -
    • CoreShopProduct: add @coreshop.object.link_generator.product as Link Provider
    • -
    • CoreShopCategory: add @coreshop.object.link_generator.category as Link Provider
    • -
    • Change {{ path('') }} to {{ coreshop_path('') }}. You may want to checkout the FrontendBundle to get a deeper insight.
    • -
    -
  • -
  • Deprecated Field Names in - CoreShop\Component\Payment\Model\PaymentInterface`: -
      -
    • getName is now getTitle
    • -
    • getOrderId is now getOrder and directly returns a OrderInterface
    • -
    -
  • -
  • Deprecated Field Names in - CoreShop\Component\Shipping\Model\CarrierInterface: -
      -
    • getLabel is not getTitle
    • -
    • getName is now getIdentifier
    • -
    -
  • -
-

2.0.0-alpha.4 to 2.0.0-beta.1

-
    -
  • -

    BC break Signature of following interfaces changed:

    -
      -
    • -CoreShop\Component\Index\Interpreter\InterpreterInterface: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config);
    • -
    • -CoreShop\Component\Index\Interpreter\LocalizedInterpreterInterface: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config);
    • -
    • -CoreShop\Component\Index\Interpreter\RelationInterpreterInterface: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config);
    • -
    -
  • -
  • -

    BC break CoreShop now takes advantage of the dependent bundle feature introduced in Pimcore 5.1.2. Therefore, -all bundles are now automatically loaded. This is a BC break, as when updating, you might run into issues. -To solve the issues, check following things:

    -
      -
    • remove RegisterBundles entry from app/AppKernel.php -
    • -
    • remove loading CoreShopCoreBundle Configuration in app/config.yml -
    • -
    • enable CoreShopCoreBundle via CLI or manually in var/config/extensions.php: "CoreShop\\Bundle\\CoreBundle\\CoreShopCoreBundle" => TRUE -
    • -
    -
  • -
  • -

    BC break Upgraded Default Layout to Bootstrap 4. This will most certainly cause issues when you just override certain templates. Best would be to copy all templates from before the Bootstrap 4 Upgrade.

    -
  • -
-

2.0.0-alpha.4 to 2.0.0-alpha.5

-
    -
  • -BC break added Component\Core\Model\OrderItem and Component\Core\Model\QuoteItem. If you already customized them, inherit them from the Core Models.
  • -
  • -BC break changed the way CoreShop processes Cart-Rules. If you implemented a custom-condition, inherit from CoreShop\Component\Order\Cart\Rule\Condition\AbstractConditionChecker and implement isCartRuleValid instead of isValid -
  • -
  • Deprecated: remove cart/add-price-rule/ static route.
  • -
-

2.0.0-alpha.3 to 2.0.0-alpha.4

-
    -
  • -BC break decoupled MoneyBundle from CurrencyBundle, therefore the Twig Extension for Money Conversion went to the CurrencyBundle. Therefore the name of that extension was renamed from -coreshop_convert_money to coreshop_convert_currency. If you use it directly in your code, please rename all of them.
  • -
  • Deprecated CoreShopAdminBundle which responsability was only handling installation and deliviering pimcore resources like JS and CSS files. -
      -
    • Installation has been moved to CoreShopCoreBundle
    • -
    • Delivering of resources is now handled by CoreShopResourceBundle, this also makes it easier to use CoreShop Bundles without handling resources yourself.
    • -
    -
  • -
-

2.0.0-alpha.2 to 2.0.0-alpha.3

-
    -
  • -

    BC break getPrice in PurchasableInterface and ProductInterface has been removed. In favor of this a new coreShopStorePrice editable has been introduced, which stores prices for each store. This makes handling of multiple currencies way more elegant.

    -

    If you still want to use the old getPrice, create a new Subclass of \CoreShop\Component\Core\Model\Product, implement \CoreShop\Component\Order\Model\PriceAwarePurchasableInterface and set your class to CoreShopProduct parents.

    -
  • -
-

V1 to V2

-
    -
  • CoreShop 2 is not backward compatible. Due to the framework change, we decided to re-make CoreShop from scratch. If you still have instances running and want to migrate, there is a basic migration way which gets you data from V1 to V2.
  • -
  • -Export from CoreShop1 -
  • -
  • -Import into CoreShop2 -
  • -
-

Within V1

-
    -
  • Nothing available
  • -
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/Getting_Started/index.html b/docs/generated-docs/Getting_Started/index.html deleted file mode 100644 index b28796fba4..0000000000 --- a/docs/generated-docs/Getting_Started/index.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - Getting Started - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Automation/index.html b/docs/generated-docs/User_Documentation/Automation/index.html deleted file mode 100644 index d555c223d6..0000000000 --- a/docs/generated-docs/User_Documentation/Automation/index.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - Automation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Automation

-

In CoreShop there are several automation mechanism implemented.

-

Order Cancellation

-
-

Execution Time: Once per day via maintenance job

-
-

CoreShop will automatically cancel orders older than 20 days.

-

Change Orders Expiration Date

-
core_shop_order:
-    expiration:
-        order:
-            days: 30
-
-

Expired Carts

-
-

Execution Time: Once per day via maintenance job

-
-
-

Note: By default, this feature is disabled.

-
-

By default, this feature is disabled (days = 0) so no carts will be removed by default. -If you want to remove older carts, just enable it via configuration:

-

Change Cart Expiration Date

-
core_shop_order:
-    expiration:
-        cart:
-            days: 20
-            anonymous: true
-            customer: true
-
-

Expired Rules

-
-

Execution Time: Once per day via maintenance job

-
-

If you're having a lot of active rules in your system, you may want to disable them via automation. -CoreShop already comes with a time-span check, which means all rules with time-span elements will be disabled if they're outdated. -If you want do implement some further availability logic, you could use the coreshop.rule.availability_check Event to define -the availability of the rule. Just use the setAvailability() method to override the system availability suggestion.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Cart/index.html b/docs/generated-docs/User_Documentation/Cart/index.html deleted file mode 100644 index 60f140ad50..0000000000 --- a/docs/generated-docs/User_Documentation/Cart/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Cart - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart

-

Inventory Change

-

If a customer adds a item to the cart CoreShop will check if product stock is sufficient. If not, a form error will show up.

-

Disable / Delete Products

-

If a product gets disabled or deleted in backend CoreShop will automatically remove this product from all active carts. -A form error will notify every customer in frontend if the cart has been modified.

-

Abandoned Carts

-

No cart gets deleted by default. This allows you to:

-
    -
  • check abandoned cart statistics
  • -
  • build your own business logic in case you want to inform customers within a follow-up email for example
  • -
-

There is a expire cart command to remove abandoned carts, please checkout the development section.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Catalog/Categories.html b/docs/generated-docs/User_Documentation/Catalog/Categories.html deleted file mode 100644 index fe02f8c542..0000000000 --- a/docs/generated-docs/User_Documentation/Catalog/Categories.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Categories - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Categories Documentation

-

Categories in CoreShop provide a way to organize and structure the products in your e-commerce store built on the Pimcore platform. Using categories, you can create a hierarchical navigation system that allows customers to browse and find products easily.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Catalog/Product_Variants.html b/docs/generated-docs/User_Documentation/Catalog/Product_Variants.html deleted file mode 100644 index 5cacffb455..0000000000 --- a/docs/generated-docs/User_Documentation/Catalog/Product_Variants.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Product Variants - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Catalog/Products.html b/docs/generated-docs/User_Documentation/Catalog/Products.html deleted file mode 100644 index 4a7dc0047b..0000000000 --- a/docs/generated-docs/User_Documentation/Catalog/Products.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Products - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Products Documentation

-

Products are the core of any e-commerce store built on the Pimcore platform. CoreShop provides a flexible and feature-rich system for managing products, including product variants, attributes, images, and more.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Catalog/index.html b/docs/generated-docs/User_Documentation/Catalog/index.html deleted file mode 100644 index c9e6825d60..0000000000 --- a/docs/generated-docs/User_Documentation/Catalog/index.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - Catalog - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Geo_IP.html b/docs/generated-docs/User_Documentation/Geo_IP.html deleted file mode 100644 index e069779e85..0000000000 --- a/docs/generated-docs/User_Documentation/Geo_IP.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Geo IP - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop can use GeoIP to locate visitors countries using IP-Addresses.

-

CoreShop uses the already existing Pimcore GeoIP Database located in: /var/config/GeoLite2-City.mmdb

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Inventory/index.html b/docs/generated-docs/User_Documentation/Inventory/index.html deleted file mode 100644 index c070e8e34e..0000000000 --- a/docs/generated-docs/User_Documentation/Inventory/index.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - Inventory - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Inventory

-

The Inventory is a complex topic since there is a lot of business logic you need to know about.

-

Product Inventory

-

Every Product object comes with a "Stock" Tab. Let's have a look about the configuration:

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
Is TrackedDefine if a product should get tracked
On HandAmount of available products.
On HoldDefines how many elements are currently locked. Do not change that value unless you know what you're doing.
-

Is Tracked

-

If you want to enable the inventory feature for a product, you need to check this setting. -After that this product is not orderable in frontend if stock is insufficient.

-
-

Note: Only if you enable "Is Tracked" the inventory stock is active! -Otherwise the product is always available regardless of it's stock amount.

-
-

On Hand

-

Define a available amount for each product. -With every successfully order, an arbitrary amount will be subtracted.

-

On Hold

-

This one needs some further explanation: -After the checkout is complete, all ordered items will be removed from "On Hand" and get moved to "On Hold" until the payment is complete:

-
    -
  • If the unpaid order gets cancelled, the reserved "On Hold" amount gets back to "On Hand".
  • -
  • If the order payment status switches to paid, the reserved "On Hold" amount gets subtracted.
  • -
-

Cart / Checkout

-

If a product stock gets insufficient during a customers checkout, the product gets removed from customers cart following by a form error.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Localization/Countries.html b/docs/generated-docs/User_Documentation/Localization/Countries.html deleted file mode 100644 index 63c8633f15..0000000000 --- a/docs/generated-docs/User_Documentation/Localization/Countries.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - Countries - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Country

-

A Country consists of following values:

-
    -
  • Name
  • -
  • ISO-Code
  • -
  • Active: Determines if customers from this country are able to purchase from your store
  • -
  • Use Store default Currency: If checked, your stores default currency will be applied to the country
  • -
  • Currency
  • -
  • Zone
  • -
  • Stores: Determines for which Stores this Country is available.
  • -
-

Countries

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Localization/Currencies.html b/docs/generated-docs/User_Documentation/Localization/Currencies.html deleted file mode 100644 index 7fe32d283c..0000000000 --- a/docs/generated-docs/User_Documentation/Localization/Currencies.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - Currencies - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Currencies

-

A Currency consists of following values:

-
    -
  • Name
  • -
  • ISO Code
  • -
  • Numeric ISO Code
  • -
  • Symbol
  • -
  • Exchange Rate: Is used to convert between different currencies
  • -
-

If you are going to use Currency conversion, you need to update exchange ranges regularly.

-

Currencies

-

Automated Exchange Rates

-

CoreShop supports mulitple providers to get exchange ranges from. Currently supported:

-
    -
  • CentralBankOfRepulicTurkey
  • -
  • EuropeanCentralBank
  • -
  • GoogleFinance
  • -
  • NationalBankOfRomania
  • -
  • YahooFinance
  • -
  • WebserviceX
  • -
-

To activate this feature, enable it within CoreShop Settings and choose your provider.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Localization/States.html b/docs/generated-docs/User_Documentation/Localization/States.html deleted file mode 100644 index 575100765c..0000000000 --- a/docs/generated-docs/User_Documentation/Localization/States.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - States - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Localization/TaxRules.html b/docs/generated-docs/User_Documentation/Localization/TaxRules.html deleted file mode 100644 index 5fc3943955..0000000000 --- a/docs/generated-docs/User_Documentation/Localization/TaxRules.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - TaxRules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Tax Rules

-

Tax Rules determine which Tax Rate should be used for the customers country/state. This Tax Rule is then applied to a product.

-

A Tax Rule consists of following values:

-
    -
  • Name
  • -
  • Active
  • -
  • Stores: In which Stores this Tax-Rule can be used.
  • -
  • Rules: Which Country and/or State should use which Tax Rate and what should happen when multiple Tax Rates apply.
  • -
-

Tax Rules

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Localization/Taxes.html b/docs/generated-docs/User_Documentation/Localization/Taxes.html deleted file mode 100644 index 62000b9206..0000000000 --- a/docs/generated-docs/User_Documentation/Localization/Taxes.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - Taxes - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Taxes

-

A Tax Rate consists of following values:

-
    -
  • Localized Name: This name can also be seen in the cart or on invoices
  • -
  • Rate: Tax Rate, for example 20%
  • -
  • Active
  • -
-

Taxes are going to be used in Tax Rules.

-

Taxes

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Localization/Zones.html b/docs/generated-docs/User_Documentation/Localization/Zones.html deleted file mode 100644 index 9581b838b2..0000000000 --- a/docs/generated-docs/User_Documentation/Localization/Zones.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - Zones - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Localization/index.html b/docs/generated-docs/User_Documentation/Localization/index.html deleted file mode 100644 index 08a1446be2..0000000000 --- a/docs/generated-docs/User_Documentation/Localization/index.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - Localization - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Order/Order_Comments.html b/docs/generated-docs/User_Documentation/Order/Order_Comments.html deleted file mode 100644 index aa91f52a1a..0000000000 --- a/docs/generated-docs/User_Documentation/Order/Order_Comments.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - Order Comments - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Order Comments

-

Comment -Comment

-

CoreShop provides a simple comment interface which allows you to add simple notes to every order. -It's also possible to send the order comment to the customer. Just check "Submit Comment to Customer".

-
-

Note: You need a valid Notification Rule to send comments to user.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Order/Order_Detail.html b/docs/generated-docs/User_Documentation/Order/Order_Detail.html deleted file mode 100644 index 3450953825..0000000000 --- a/docs/generated-docs/User_Documentation/Order/Order_Detail.html +++ /dev/null @@ -1,310 +0,0 @@ - - - - - - - Order Detail - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Order Detail

-

State / Price Overview

-

Please read more about the order workflow process here

-

Besides some useful information about the order store and the total order amount, -there're also several order states:

-

State

-

This is the main state and represents the summary of all order states.

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newNew order has been placed.
confirmedNew order has been successfully created (after a offline order or a customer returns from payment gateway regardless of its state).
cancelledOrder has been cancelled.
completeOrder is complete.
-

Payment State

-

Global payment states per order and represents the summary of all order payments:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newNew payment has been created.
awaiting_paymentWaiting for payment: User is on payment offsite or payment is offline.
partially_paidSome order payments have been paid.
paidAll payments have been paid.
cancelledOrder is complete.
partially_refundedSome order payments have been refunded.
refundedAll payments have been refunded.
-

Shipment State

-

Global shipment states per order and represents the summary of all order shipments:

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newNew shipment has been placed.
cancelledShipment has been cancelled
partially_shippedSome order items have been shipped.
shippedAll items have been shipped.
-

Invoice State

-

Global invoice states per order and represents the summary of all order invoices:

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newNew invoice has been created.
cancelledInvoice has been cancelled
partially_invoicedSome invoices have been invoiced.
invoicedAll invoices have been invoiced.
-

Carrier/Payment Provider Info

-
    -
  • Currency of Order
  • -
  • Overall weight of Order Items
  • -
  • Carrier
  • -
  • Total Amount
  • -
-

Order History

-

The Order History shows you when specific states have been changed.

-

Payments

-

--

-

Shipments

-

--

-

Invoices

-

--

-

Mail Correspondence

-

--

-

Customer

-

--

-

Comments

-

--

-

Additional Data

-

--

-

Products

-

--

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Order/Order_Workflow.html b/docs/generated-docs/User_Documentation/Order/Order_Workflow.html deleted file mode 100644 index 6bb9bc07a9..0000000000 --- a/docs/generated-docs/User_Documentation/Order/Order_Workflow.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - - Order Workflow - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Order Workflow

-
-

Technical Overview of CoreShop Workflows.

-
-

Change States

-

States can be changed for: Order, Payment, Shipment and Invoice. -If any transition is available, you'll find a colored state button. -Click on that button to change the state.

-

Order Completion

-

In CoreShop a order is complete after the order payment reaches the paid state -and order shipment reaches the shipped state. If you also want to include the order invoice state invoiced -before a order gets completed, you need to enable a configuration flag:

-
## app/config/config.yml
-parameters:
-    coreshop.workflow.include_invoice_state_to_complete_order: true
-
-

Order Cancellation

-

In CoreShop a order rarely gets cancelled. Some reasons are:

-

Front-End Revise -After a customer has cancelled his payment he will reach a so called revise page. -From there he's able to reselect a payment gateway to start over. In revise mode, however, it's possible to cancel the order and restore the cart. -Only than the order gets cancelled.

-

Back-End Revise -In CoreShop it's possible to create orders in Back-End. Instead of adding sensitive payment information, -you're able to provide a revise link to your customer which then works the same as the Front-End revise process -(except that your customer is not able to restore a cart since there never was one).

-

Please read more about the canceling process here

-

Payment Workflow

-

Create a Payment

-

Just use the green bottom on the right top corner to add a new shipment. -A payment creation normally gets created by a frontend payment gateway. -This gateway also handles all the payment state changes.

-

Workflow Rules

-
    -
  • A payment reaches the new state after its creation.
  • -
  • A payment can be canceled as long it's in the new or processing state.
  • -
  • After a payment reaches completed state it only can get refunded.
  • -
-
-

Attention: The Refund process is not implemented yet in Coreshop!

-
-

Shipment Workflow

-

Create a Shipment

-

Just use the green bottom on the right top corner to add a new shipment. -If there are enough shippable items you can create a shipment.

-

Workflow Rules

-
    -
  • A shipment reaches the ready state (triggered by a create transition) after its creation.
  • -
  • A shipment can be canceled as long it's in the ready state
  • -
  • After you provoked the ship state a shipment can't be cancelled anymore.
  • -
-

Invoice Workflow

-

Create Invoice

-

Just use the green bottom on the right top corner to add a new invoice. -If there are enough invoiceable items you can create a invoice.

-

Workflow Rules

-
    -
  • A invoice reaches the ready state (triggered by a create transition) after its creation.
  • -
  • A invoice can be canceled as long it's in the ready state. Please note: Cancelling an invoice is not a refund action. You're allowed to create another invoice after cancelling the previous one.
  • -
  • After you provoked the complete state a invoice can't be cancelled anymore which means the invoice has been finally captured. After that you need to go on with a refund process
  • -
-
-

Attention: The Refund process is not implemented yet in Coreshop!

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Order/Orders.html b/docs/generated-docs/User_Documentation/Order/Orders.html deleted file mode 100644 index f47e951007..0000000000 --- a/docs/generated-docs/User_Documentation/Order/Orders.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - Orders - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Orders

-

Grid View

-

The default order list is based on the pimcore grid view. -CoreShop comes with a default column configuration:

-
    -
  • On the right side, click "Column configuration" and select "Order Overview".
  • -
  • Now click that button again and select "Set as favorite".
  • -
-

Filters in Grid View

-

It's possible to add custom filter definitions based on your project. -This has to be done via a php service. Read more about it here.

-

Apply Actions in Grid View

-

It's possible to apply custom bulk actions for selected orders. -This has to be done via a php service. Read more about it here.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Order/index.html b/docs/generated-docs/User_Documentation/Order/index.html deleted file mode 100644 index b63c6a937e..0000000000 --- a/docs/generated-docs/User_Documentation/Order/index.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - Order - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Actions.html b/docs/generated-docs/User_Documentation/Price_Rules/Actions.html deleted file mode 100644 index 83863a9273..0000000000 --- a/docs/generated-docs/User_Documentation/Price_Rules/Actions.html +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - Actions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Price Rule Actions

-

Get a brief overview of all the available Price Rule Actions in CoreShop.

-

Free Shipping

-
-

Available for: Cart Price Rules

-
-

Add this action to allow free shipping.

-

Gift Product

-
-

Available for: Cart Price Rules

-
-

Add this action to place a gift in customers cart.

-

Options

- - - - - - - - - - - - - -
NameDescription
Gift ProductNeeds to be a coreshop registered product object
-

Discount Amount

-
-

Available for: Cart Price Rules, Specific Product Price, Product Price

-
-

Set a arbitrary amount of discount.

-

Options

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
AmountDefine Amount
GrossIf given Amount has included VAT, check it
CurrencySet Currency of given amount
Apply OnSelect Between total and subtotal. Note: This option is only available in the cart rule context
-

Discount Percent

-
-

Available for: Cart Price Rules, Specific Product Price, Product Price

-
-

Set a arbitrary percentage amount of discount.

-

Options

- - - - - - - - - - - - - - - - - -
NameDescription
PercentDefine Amount
Apply OnSelect Between total and subtotal. Note: This option is only available in the cart rule context
-

New Price

-
-

Available for: Specific Product Price, Product Price

-
-

Define a new Price.

-
-

Note: This will be used as a new price in frontend so there is no "special discount price" labelling. -If you need a highlighted discount price, use the Discount Price Action.

-
-

Options

- - - - - - - - - - - - - - - - - -
NameDescription
PriceSet new Price
CurrencySet Currency of given amount
-

Discount Price

-
-

Available for: Specific Product Price, Product Price

-
-

Define a discount Price.

-

Options

- - - - - - - - - - - - - - - - - -
NameDescription
PriceSet discount Price
CurrencySet Currency of given amount
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Cart_Price_Rules.html b/docs/generated-docs/User_Documentation/Price_Rules/Cart_Price_Rules.html deleted file mode 100644 index 5154896094..0000000000 --- a/docs/generated-docs/User_Documentation/Price_Rules/Cart_Price_Rules.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - Cart Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart Price Rules Documentation

-

Cart price rules in CoreShop provide a flexible way to offer discounts and promotions in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions, such as cart subtotal, specific products, customer groups, or other criteria. This documentation will guide you through creating and managing cart price rules in CoreShop.

-

Cart Price Rules

-

Available Actions

- -

Available Conditions

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Conditions.html b/docs/generated-docs/User_Documentation/Price_Rules/Conditions.html deleted file mode 100644 index d79cbaa632..0000000000 --- a/docs/generated-docs/User_Documentation/Price_Rules/Conditions.html +++ /dev/null @@ -1,435 +0,0 @@ - - - - - - - Conditions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Price Rules Conditions

-

Get a brief overview of all the available Price Rule Conditions in CoreShop.

-

Customers

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Define one ore more customers to whom the price rule should get applied.

-

Options

- - - - - - - - - - - - - -
NameDescription
CustomersOne ore multiple CoreShop Customer Objects
-

Customer Groups

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Define one ore more customer groups to whom the price rule should get applied.

-

Options

- - - - - - - - - - - - - -
NameDescription
GroupsOne ore multiple CoreShop Customer Group Objects
-

Time Span

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Define a time span in which range the price rule is valid

-

Options

- - - - - - - - - - - - - - - - - -
NameDescription
Date FromDate/Time Start
Date ToDate/Time End
-

Voucher

-
-

Available for: Cart Price Rules

-
-

Define some Voucher Conditions. Check out the Voucher Section to learn more about Voucher Configuration.

-

Options

- - - - - - - - - - - - - - - - - -
NameDescription
Max. Usage per CodeDefine how often a voucher code can be used.
Allow only one Voucher per CodeIf checked, only one Voucher per Cart is allowed.
-

Amount

-
-

Available for: Cart Price Rules

-
-

Define a Price range within the price rule should get applied.

-

Options

- - - - - - - - - - - - - - - - - -
NameDescription
Min AmountThe min amount of cart
Max AmountThe max amount of cart
-

Countries

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Bind a specific country to the price rule. -Important: This Condition is connected with the Country Context Resolver. -This Condition does not implies to use the Users current location since the Resolver could be also store related.

-

Options

- - - - - - - - - - - - - -
NameDescription
CountriesSelect one or multiple Countries
-

Zones

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Bind a specific zone to the price rule. -Important: This Condition is connected with the Country Context Resolver. -This Condition does not implies to use the Users current location since the Resolver could be also store related.

-

Options

- - - - - - - - - - - - - -
NameDescription
ZonesSelect one or multiple Zones
-

Stores

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Bind a specific store to the price rule.

-

Options

- - - - - - - - - - - - - -
NameDescription
StoresSelect one or multiple Stores
-

Currencies

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Define which currencies are valid to apply the price rule

-

Options

- - - - - - - - - - - - - -
NameDescription
CurrenciesSelect one or multiple Currencies
-

Carriers

-
-

Available for: Cart Price Rules

-
-

Define which carriers are valid to apply the price rule

-

Options

- - - - - - - - - - - - - -
NameDescription
CarriersSelect one or multiple Carriers
-

Nested Rules

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Build complex AND, OR and NOT nested conditions. -Within a nested rules it's possible to add any other condition again.

-

Options

- - - - - - - - - - - - - -
NameDescription
OperatorAND, OR and NOT
-

Products

-
-

Available for: Cart Price Rules, Product Price

-
-

Apply rule only if given products are available.

-

Options

- - - - - - - - - - - - - -
NameDescription
ProductsOne ore multiple CoreShop Product Objects
-

Categories

-
-

Available for: Cart Price Rules, Product Price

-
-

Apply rule only if products linked with given categories are available.

-

Options

- - - - - - - - - - - - - -
NameDescription
CategoriesOne ore multiple CoreShop Category Objects
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Product_Price_Rules.html b/docs/generated-docs/User_Documentation/Price_Rules/Product_Price_Rules.html deleted file mode 100644 index d78bc382d4..0000000000 --- a/docs/generated-docs/User_Documentation/Price_Rules/Product_Price_Rules.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - Product Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Price Rules Documentation

-

Product price rules in CoreShop offer a flexible way to provide discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions and can apply to specific products, categories, or customer groups. This documentation will guide you through creating and managing product price rules in CoreShop.

-

Cart Price Rules

-

Available Actions

- -

Available Conditions

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html b/docs/generated-docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html deleted file mode 100644 index e0f16147e1..0000000000 --- a/docs/generated-docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - Quantity Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Quantity Price Rules Documentation

-

CoreShop Quantity Price Rules provide a flexible way to offer volume-based discounts for products in your e-commerce store built on the Pimcore platform. These rules apply to specific products and offer tiered pricing depending on the quantity purchased. This documentation will guide you through creating and managing quantity price rules in CoreShop.

-

Specific Price Rules

-

Available Conditions

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Specific_Price_Rules.html b/docs/generated-docs/User_Documentation/Price_Rules/Specific_Price_Rules.html deleted file mode 100644 index 10561c6043..0000000000 --- a/docs/generated-docs/User_Documentation/Price_Rules/Specific_Price_Rules.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - Specific Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Specific Price Rules Documentation

-

Specific price rules in CoreShop provide a flexible way to create targeted discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules apply directly to individual products or variants and can be based on customer groups, currencies, or countries. This documentation will guide you through creating and managing specific price rules in CoreShop.

-

Specific Price Rules

-

Available Actions

- -

Available Conditions

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Price_Rules/Vouchers.html b/docs/generated-docs/User_Documentation/Price_Rules/Vouchers.html deleted file mode 100644 index 26cf16cb7c..0000000000 --- a/docs/generated-docs/User_Documentation/Price_Rules/Vouchers.html +++ /dev/null @@ -1,264 +0,0 @@ - - - - - - - Vouchers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Vouchers

-
-

Info: In CoreShop Vouchers are Price Rules too. -To use or generate Vouchers you need to add a Cart Price Rule.

-
-

How to create Vouchers

-

Simple create a new cart price rule and activate "Is Voucher Rule". -With that, the "Voucher Codes" tab gets enabled.

-

Voucher

-

Voucher Condition

-

Voucher

-

If you need more control about handling Vouchers you need to add the "Voucher" Condition:

- - - - - - - - - - - - - - - - - -
NameDescription
Max. Usage per CodeDefine how often a voucher code can be used.
Allow only one Voucher per CodeIf checked, only one Voucher per Cart is allowed.
-

Voucher Codes

-

Voucher

-

Within the "Voucher Codes" tab you're able to manage codes for the current price rule. -It's also possible to export generated codes to csv file.

-
-

If you need more globally statistics about vouchers please use the voucher report.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
CodeGenerated voucher code
Creation DateVoucher creation date
UsedIf the Voucher has been used you'll see a true statement
UsesAmount of uses per code
ActionIt's possible to delete voucher codes as long they're not in use
-

Create Voucher Code

-

There are two ways to generate Codes:

-

Single Voucher Code

-

Create a single voucher code. -The input field allows any string input, however if you already have added a code with the same string, you'll get a unique error message.

-

Voucher Codes Generator

-

This is the more advanced option to generate voucher codes:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
AmountDefine how many voucher codes should be generated
LengthDefine the Voucher Code Length
FormatVoucher Format. Possible Values: Alphanumeric, Alphabetic, Numeric
PrefixDefine a prefix for each code. For example SHOP-
SuffixDefine a suffix for each code. For example -SHOP
Hyphens all X charactersAdd a Dash (-) after every X character
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Price_Rules/index.html b/docs/generated-docs/User_Documentation/Price_Rules/index.html deleted file mode 100644 index 85dfec0600..0000000000 --- a/docs/generated-docs/User_Documentation/Price_Rules/index.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Price Rules

-

CoreShop Price Rules are very powerful tools for price calculation. -This section will help you to get a detailed overview about how price calculation works in CoreShop:

-

Types of Price Rules

-

There are three Price Rule Types.

-

1. Cart Price Rules

-

Apply Price Rule to the customers cart.

-

2. Product Price Rules

-

Apply Price Rule globally.

-

3. Specific Product Prices

-

Apply Price Rules to specific products.

-

Global Priority

-
    -
  • Product Price Rules first
  • -
  • Specific Price Rules second
  • -
-

Example 1:

-
    -
  • Given: Product A with price 100,-
  • -
  • Product Price Rule for Product A: New Price 50,-
  • -
  • Specific Price Rule for Product A: New Price: 20,-
  • -
  • Given Price: 20,-
  • -
-

Example 2:

-
    -
  • Given: Product A with price 100,-
  • -
  • Product Price Rule for Product A: Discount Percentage 50%
  • -
  • Specific Price Rule for Product A: New Price: 50,-
  • -
  • Given Price: 25,-
  • -
-

Specific Price Priority

-

Since it's possible to add multiple Specific Price Rules per Product you can adjust the -priority via the priority number field.

-

Automatic Rule Availability Checker

-

Rules with time-span elements included on root level will be disabled automatically if they're outdated. -Read more about automation here.

-

More Information

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Reports/Abandoned_Carts.html b/docs/generated-docs/User_Documentation/Reports/Abandoned_Carts.html deleted file mode 100644 index 585506d389..0000000000 --- a/docs/generated-docs/User_Documentation/Reports/Abandoned_Carts.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - Abandoned Carts - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Abandoned Carts Report

- - - - - - - - - - - - - -
TypeHas Pagination
ListYes
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Grid Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
Customer NameCustomer name (if available)
EmailCustomer Email (if available)
Selected PaymentName of selected Payment
Creation DateCreation Date
Modification DateModification Date
Items in CartAmount of Items in Cart
ActionOpen Cart Object
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Reports/Carrier_Distribution.html b/docs/generated-docs/User_Documentation/Reports/Carrier_Distribution.html deleted file mode 100644 index b1ffa22f8f..0000000000 --- a/docs/generated-docs/User_Documentation/Reports/Carrier_Distribution.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - Carrier Distribution - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Carrier Distribution Report

-

Carrier Distribution

- - - - - - - - - - - - - -
TypeHas Pagination
Pie ChartNo
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Chart Fields

-

Carrier Distribution

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Reports/Carts.html b/docs/generated-docs/User_Documentation/Reports/Carts.html deleted file mode 100644 index 7153bc7d5c..0000000000 --- a/docs/generated-docs/User_Documentation/Reports/Carts.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - Carts - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart/Order Conversion Report

-

Carts Report

- - - - - - - - - - - - - -
TypeHas Pagination
Cartesian ChartNo
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Chart Fields

- - - - - - - - - - - - - - - - - -
NameDescription
YAmount (Cart, Order)
XDate
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Reports/Categories.html b/docs/generated-docs/User_Documentation/Reports/Categories.html deleted file mode 100644 index 697421e94e..0000000000 --- a/docs/generated-docs/User_Documentation/Reports/Categories.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - Categories - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Categories Report

-

Categories Report

- - - - - - - - - - - - - -
TypeHas Pagination
ListNo
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Grid Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
NameProduct Name
Order CountAmount of Orders
QuantityQuantity
SalesSales
ProfitProfit
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Reports/Customers.html b/docs/generated-docs/User_Documentation/Reports/Customers.html deleted file mode 100644 index af8cfa820e..0000000000 --- a/docs/generated-docs/User_Documentation/Reports/Customers.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - - Customers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Customers Report

-

Customers Report

- - - - - - - - - - - - - -
TypeHas Pagination
ListNo
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Grid Fields

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
NameCustomer Name
Order CountAmount of Orders
SalesSales
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Reports/Payment_Distribution.html b/docs/generated-docs/User_Documentation/Reports/Payment_Distribution.html deleted file mode 100644 index 1c247846e8..0000000000 --- a/docs/generated-docs/User_Documentation/Reports/Payment_Distribution.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - Payment Distribution - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Payment Distribution Report

-

Payment Distribution

- - - - - - - - - - - - - -
TypeHas Pagination
Pie ChartNo
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Chart Fields

-

Payment Provider Distribution

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Reports/Products.html b/docs/generated-docs/User_Documentation/Reports/Products.html deleted file mode 100644 index 751dfb981e..0000000000 --- a/docs/generated-docs/User_Documentation/Reports/Products.html +++ /dev/null @@ -1,281 +0,0 @@ - - - - - - - Products - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Products Report

-

Products Report

- - - - - - - - - - - - - -
TypeHas Pagination
ListYes
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
Product TypesGroup Filter by Main Products, Variants, Container Products
-

Product Types

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
Main ProductsOnly show Products without Variant inclusion
VariantsOnly show Variant Product Types
Container ProductsShow Sum of Products and Child-Products. Note: Container Products are bounded to the original pimcore objects. The products will be ignored in this report, if those main-objects have been deleted!
-

Available Grid Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
NameProduct Name
Order CountAmount of Order
QuantityQuantity
Sale PriceSale Price
SalesAmount of Sales
ProfitAmount of Profit
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Reports/Sales.html b/docs/generated-docs/User_Documentation/Reports/Sales.html deleted file mode 100644 index f519956915..0000000000 --- a/docs/generated-docs/User_Documentation/Reports/Sales.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - - Sales - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Sales Report

-

Sales Report

- - - - - - - - - - - - - -
TypeHas Pagination
Cartesian ChartNo
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
Group ByGroup Filter by Day, Month, Year
-

Available Chart Fields

- - - - - - - - - - - - - - - - - -
NameDescription
YAmount (Sales)
XDate
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Reports/Vouchers.html b/docs/generated-docs/User_Documentation/Reports/Vouchers.html deleted file mode 100644 index 6fb7c3fe9a..0000000000 --- a/docs/generated-docs/User_Documentation/Reports/Vouchers.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - Vouchers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Voucher Report

- - - - - - - - - - - - - -
TypeHas Pagination
ListYes
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Grid Fields

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
CodeApplied Code
DiscountAmount of Discount
Price RuleName of applied Price Rule
Applied DateApplied Date
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Reports/index.html b/docs/generated-docs/User_Documentation/Reports/index.html deleted file mode 100644 index f0e0aa9ba6..0000000000 --- a/docs/generated-docs/User_Documentation/Reports/index.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - Reports - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Settings.html b/docs/generated-docs/User_Documentation/Settings.html deleted file mode 100644 index 42b2a20812..0000000000 --- a/docs/generated-docs/User_Documentation/Settings.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - Settings - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop's Settings are divided into each "sub"-shop and some system settings.

-

Shop-Settings

-

Settings can be different for each Store.

-

Settings

-

Base

-
    -
  • Catalog-Mode: With catalog-mode enabled, the cart and checkout are disabled. Products can only be viewed.
  • -
  • Guest-Checkout: Enables or disables guest-checkout feature
  • -
-

Customer Service

-
    -
  • Customer Email Document: Email document used to send customer messages
  • -
  • Customer Re Email Document: Email document used to send customer reply messages
  • -
  • Contact Email Document: Email document used to send contact messages
  • -
  • Contact Sales: Default contact used for sales messages
  • -
  • Contact Technology: Default contact used for technology messages
  • -
-

Stock

-
    -
  • Default Stock Behaviour: Describes the default stock behaviour for products
  • -
-

Tax

-
    -
  • Validate VAT: Describes if the VAT-Number for European Countries should be validated
  • -
  • Disable VAT for Base Country: Disable VAT-Free Shopping for Customers, with valid Vat-Number, in Base Country
  • -
  • Taxation Address: Describes witch address is responsibly for taxation
  • -
-

Prices

-
    -
  • Prices are gross prices: Determines if entered prices in CoreShop are with or without tax included.
  • -
-

Shipping

-
    -
  • Free Shipping starts at weight: Describes free shipping at weight. It's also much faster using this than price-rules
  • -
  • Free Shipping starts at Currency: Describes free shipping at cart value. It's also much faster using this than price-rules
  • -
  • Carrier Sort: Describes how the Carriers should be sorted
  • -
-

Product

-
    -
  • Default Image: Defines an default image for products if no image is available.
  • -
  • Number of days as new: Defines the time of days a product is marked as new.
  • -
-

Category

-
    -
  • Default Image: Defines an default image for categories if no image is available.
  • -
-

Invoice

-
    -
  • Create Invoice for Orders: Defines if invoices are going to be created on an paid order.
  • -
  • Prefix: Prefix string for Order and Invoice numbers
  • -
  • Suffix: Suffix string for Orders and Invoice numbers.
  • -
  • WKHTMLTOPDF Parameters: Parameters which will be passed to WKHTMLTOPDF
  • -
-

Mail Settings

-
    -
  • admin email-addresses to send order notification (CSV): Email addresses which will be notified on new orders
  • -
  • Send OrderStates as BCC to admin email-addresses: Determines if order-state emails should also be sent to admin-emails
  • -
-

Cart

-
    -
  • Activate automatic cart cleanup: Activate automatic cart cleanup -> cleans inactive and empty carts
  • -
-

System - Settings

-

System Settings are defined one time for all shops.

-

System Settings

-

System Settings

-
    -
  • Send Usagelog to CoreShop: Sends an anonymous usagelog to CoreShop Developer
  • -
-

Currency

-
    -
  • Automatic Exchange Rates: Describes if exchange rates should be fetched automatically
  • -
  • Exchange Rate Provider: Describes which exchange rate provider should be used.
  • -
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Shipping/Carriers.html b/docs/generated-docs/User_Documentation/Shipping/Carriers.html deleted file mode 100644 index a874852f23..0000000000 --- a/docs/generated-docs/User_Documentation/Shipping/Carriers.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - Carriers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Carriers Documentation

-

CoreShop Carriers are an essential part of the shipping process in the CoreShop e-commerce framework, built on the Pimcore platform. Carriers represent shipping providers (e.g., UPS, FedEx, or DHL) and are responsible for delivering orders to customers. This documentation will guide you through the process of creating and managing carriers in CoreShop.

-

Creating a Carrier

-

To create a carrier, follow these steps:

-
    -
  • Log in to the CoreShop admin interface.
  • -
  • Navigate to the "Shipping" tab and click on "Carriers."
  • -
  • Click the "Add new" button to create a new carrier.
  • -
  • Enter a name for the carrier and configure the other available options as needed.
  • -
-

Carrier Options

-

When creating a carrier, you can configure various options to customize its behavior:

-
    -
  • Name: A descriptive name for the carrier (e.g., UPS, FedEx, or DHL).
  • -
  • Tracking Url: A string value that indicates the tracking url
  • -
  • Tax Rule Group: The tax rule group applied to shipping costs for this carrier. If you want to apply taxes to shipping costs, you'll need to create a tax rule group and assign it to the carrier.
  • -
  • Shipping Rules: The shipping rules associated with this carrier. Shipping rules define shipping costs based on various conditions such as weight, price, dimensions, and destination. You can assign multiple shipping rules to a carrier, and the system will evaluate them in order of priority to determine the final shipping cost.
  • -
-

Summary

-

CoreShop Carriers provide a robust way to manage shipping providers and their associated services. By creating carriers and configuring their options, you can offer customers a range of shipping choices based on factors such as delivery time and cost. Combined with shipping rules, carriers give you the flexibility to create a tailored shipping experience for your e-commerce store.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Shipping/Shipping_Rules.html b/docs/generated-docs/User_Documentation/Shipping/Shipping_Rules.html deleted file mode 100644 index c4d6d2f293..0000000000 --- a/docs/generated-docs/User_Documentation/Shipping/Shipping_Rules.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - Shipping Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Shipping Rules Documentation

-

CoreShop Shipping Rules is a powerful feature within the CoreShop e-commerce framework built on the Pimcore platform. It allows you to create flexible and customizable shipping rules that define shipping costs based on various conditions such as weight, price, dimensions, and shipping destination.

-

Overview

-

Shipping rules in CoreShop can be composed of conditions and actions. Conditions determine whether a rule should be applied, while actions define the changes to the shipping costs.

-

CoreShop provides a user-friendly interface for creating and managing shipping rules. You can create multiple rules, each with different conditions and actions, to cover various scenarios.

-

Creating Shipping Rules

-
    -
  • Navigate to the "Shipping" tab and click on "Shipping Rules."
  • -
  • Click the "Add new" button to create a new shipping rule.
  • -
  • Enter a name for the rule and configure the other available options as needed.
  • -
-

Configuring Conditions

-

Conditions determine whether the shipping rule should be applied to an order. You can create multiple conditions for a single rule, and all conditions must be met for the rule to be applied. CoreShop offers several types of conditions, including:

-
    -
  • Weight: Based on the total weight of the order.
  • -
  • Price: Based on the total price of the order.
  • -
  • Dimension: Based on the dimensions (length, width, and height) of the order.
  • -
  • Quantity: Based on the total quantity of items in the order.
  • -
  • Countries: Based on the shipping destination country.
  • -
  • Zones: Based on the shipping destination zone (a group of countries).
  • -
-

To add a condition to your shipping rule:

-
    -
  • Click the "Add Condition" button in the "Conditions" section of the shipping rule.
  • -
  • Choose the desired condition type from the dropdown menu.
  • -
  • Configure the condition parameters as needed.
  • -
-

For example, if you want to apply a shipping rule only to orders with a total weight of over 10kg, you would add a weight condition and set the minimum weight to 10kg.

-

Configuring Actions

-

Actions define the changes to the shipping costs when a rule is applied. You can create multiple actions for a single rule. CoreShop offers several types of actions, including:

-
    -
  • Discount Amount: Apply a fixed discount amount to the shipping cost.
  • -
  • Discount Percentage: Apply a percentage discount to the shipping cost.
  • -
  • Add Amount: Add a fixed amount to the shipping cost.
  • -
  • Add Percentage: Add a percentage amount to the shipping cost.
  • -
-

To add an action to your shipping rule:

-
    -
  • Click the "Add Action" button in the "Actions" section of the shipping rule.
  • -
  • Choose the desired action type from the dropdown menu.
  • -
  • Configure the action parameters as needed.
  • -
-

For example, if you want to apply a 20% discount to the shipping cost when the rule is applied, you would add a discount percentage action and set the percentage value to 20.

-

Summary

-

CoreShop Shipping Rules offer a powerful and flexible way to define and manage shipping costs for your e-commerce store. By creating various conditions and actions, you can customize shipping costs based on factors such as weight, price, dimensions, and destination. This allows you to cater to different customer needs and provide more accurate shipping estimates.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Shipping/index.html b/docs/generated-docs/User_Documentation/Shipping/index.html deleted file mode 100644 index d268ef2d7c..0000000000 --- a/docs/generated-docs/User_Documentation/Shipping/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Shipping - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/Stores.html b/docs/generated-docs/User_Documentation/Stores.html deleted file mode 100644 index ff735bc941..0000000000 --- a/docs/generated-docs/User_Documentation/Stores.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - Stores - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Stores

-

Every CoreShop Installation is bounded to a default Store. -By default a store is connected with a pimcore Site.

-

Stores

-

Domain based Store

-

This is CoreShops default behaviour. One store for your default page, which is also your default store. -If you have multiple Domains it's possible to add a store to each domain.

-
-

Tip: Learn more about pimcore multi sites: Pimcore Sites

-
-

Custom Store Locator

-

Sometimes you have just one site installation but you want do use different Stores. -Example: /de-at should use a austrian store and /de-de a german one. -For that you need to build a custom store locator to do so, checkout the dev section to find out how this can be achieved.

-

Configure CoreShop Stores

-

Open CoreShop Menu -> "Stores". There should be already a default store, connected to your default (main-domain) site. -To create a new store, click on the "Add" button. Proceed wih configuring your new store.

-

Examples

-

Stores can be used in many ways, checkout the examples to find out which solution suits you most.

-

Example 1: Global Store

-

Use a Store to handle multiple currencies, countries and tax calculations. -Depending on your product and price strategy, it's possible to use it within one store.

-

Example 2: Country Store

-

Use a Store for each Country. This allows you to restrict your shop within a country context.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/User_Documentation/index.html b/docs/generated-docs/User_Documentation/index.html deleted file mode 100644 index ff7968564f..0000000000 --- a/docs/generated-docs/User_Documentation/index.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - User Documentation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

User Documentation

-

This section provides a quick getting started tutorial for CoreShop and covers the following topics:

-
    -
  1. -Stores -
  2. -
  3. -Settings -
  4. -
  5. -Price Rules -
      -
    1. -Cart Price Rules -
    2. -
    3. -Product Price Rules -
    4. -
    5. -Specific Product Price -
    6. -
    7. -Vouchers -
    8. -
    9. -Available Actions -
    10. -
    11. -Available Conditions -
    12. -
    -
  6. -
  7. -Localization -
      -
    1. -Countries -
    2. -
    3. -States -
    4. -
    5. -Zones -
    6. -
    7. -Taxes -
    8. -
    9. -Taxes -
    10. -
    11. -TaxRules -
    12. -
    -
  8. -
  9. -Shipping -
      -
    1. -Carriers -
    2. -
    3. -Shipping Rules -
    4. -
    -
  10. -
  11. -Cart -
  12. -
  13. -Order -
      -
    1. -Orders -
    2. -
    3. -Order Detail -
    4. -
    5. -Order Workflow -
    6. -
    7. -Order Comments -
    8. -
    -
  14. -
  15. -Catalog -
      -
    1. -Products -
    2. -
    3. -Product Variants -
    4. -
    5. -Categories -
    6. -
    -
  16. -
  17. -Inventory -
  18. -
  19. -GEO IP -
  20. -
  21. -Reports -
      -
    1. -Sales -
    2. -
    3. -Cart/Order Conversion -
    4. -
    5. -Abandoned Carts -
    6. -
    7. -Products -
    8. -
    9. -Categories -
    10. -
    11. -Customers -
    12. -
    13. -Carrier Distribution -
    14. -
    15. -Payment Distribution -
    16. -
    17. -Vouchers -
    18. -
    -
  22. -
  23. -Automation -
  24. -
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Address_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Address_Bundle.html deleted file mode 100644 index 6a062154d7..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Address_Bundle.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Address Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Address Bundle

-

CoreShop Address Bundle provides a basic set of data for Addressing Information like:

-
    -
  • Country
  • -
  • State
  • -
  • Address
  • -
-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Configuration_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Configuration_Bundle.html deleted file mode 100644 index b7618e99de..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Configuration_Bundle.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - Configuration Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Configuration Bundle

-

Installation

-
$ composer require coreshop/configuration-bundle:^3.0
-
-

Usage

-

Configuration Component helps you store your configurations in database.

-
    $service = new CoreShop\Component\Configuration\Service\ConfigurationService($doctrineEntityManager, $configRepo, $configFactory);
-    $service->set('key', 'value');
-
-    $service->get('key');
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Core_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Core_Bundle.html deleted file mode 100644 index 3fa93009f6..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Core_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Core Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Core Bundle

-

Core Bundle glues all independent CoreShop Bundles into one e-commerce suite and extends certain parts accordingly.

-
-

This Bundle is not advised to be installed seperately!

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Currency_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Currency_Bundle.html deleted file mode 100644 index a72c1ccfe9..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Currency_Bundle.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - Currency Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Currency Bundle

-

Currency Bundle provides you with Models for persisting Currencies and resolving Currency Contexts.

-
    -
  • Symfony Profiler
  • -
  • Pimcore Core Extensions
  • -
  • Doctrine Mappings
  • -
  • Symfony Forms
  • -
  • Money Formatter
  • -
  • Twig Extensions -
      -
    • Currency Formatting
    • -
    • Currency Conversion
    • -
    • Currency Code to Symbol
    • -
    -
  • -
-

Installation

-
$ composer require coreshop/currency-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\CurrencyBundle\CoreShopCurrencyBundle(),
-    ]);
-}
-
-

Updating database schema

-

Run the following command.

-
$ php bin/console doctrine:schema:update --force
-
-

Usage

-

This Bundle integrates Currency Component into Symfony and Doctrine

-

The Currency Bundle provides you with basic information needed for Currencies: Currency, Exchange Rates, Conversion and Formatting

-

Doctrine Entities

-
    -
  • Currency
  • -
-

Pimcore UI

-
    -
  • Currency
  • -
  • Exchange Rate
  • -
-

How to use?

-
coreshop.global.resource.open('coreshop.currency', 'currency');
-coreshop.global.resource.open('coreshop.currency', 'exchange_rate');
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Customer_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Customer_Bundle.html deleted file mode 100644 index 6a5c89c5e4..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Customer_Bundle.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - Customer Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Customer Bundle

-

Installation

-
$ composer require coreshop/customer-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\CustomerBundle\CoreShopCustomerBundle(),
-    ]);
-}
-
-

Updating database schema

-

Run the following command.

-
$ php bin/console doctrine:schema:update --force
-
-

Install Pimcore Entities

-
$ php bin/console coreshop:resources:install
-
-

Learn more about overriding Pimcore Classes here)

-

Usage

-

This Bundle integrates Customer Component into Symfony and Doctrine

-

The Customer Bundle provides you with basic information needed for a Customer: Customer and CustomerGroup

-

The Bundle also introduces an Customer Context, which helps you determine the current Customer.

-

Pimcore Entities

-
    -
  • Customer (CoreShopCustomer)
  • -
  • CustomerGroup (CoreShopCustomerGroup)
  • -
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Fixture_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Fixture_Bundle.html deleted file mode 100644 index ef17dac419..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Fixture_Bundle.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - Fixture Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Fixture Bundle

-

Fixture Bundle allows us to Install certain data needed for runtime of CoreShop or for the Demo.

-

Installation

-
$ composer require coreshop/fixture-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\FixtureBundle\CoreShopFixtureBundle(),
-    ]);
-}
-
-

Updating database schema

-

Run the following command.

-
$ php bin/console doctrine:schema:update --force
-
-

Creating a new Fixture

-

Create a new File in your Bundle within the Namespace Fixtures\Data\Application for app fixtures and Fixtures\Data\Demo for Demo fixtures. The FixtureBundle -will automatically recognize your fixtures.

-
<?php
-
-namespace CoreShop\Bundle\CoreBundle\Fixtures\Application;
-
-use CoreShop\Bundle\FixtureBundle\Fixture\VersionedFixtureInterface;
-use Doctrine\Common\DataFixtures\AbstractFixture;
-use Doctrine\Common\Persistence\ObjectManager;
-use Symfony\Component\DependencyInjection\ContainerAwareInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-class ConfigurationFixture extends AbstractFixture implements ContainerAwareInterface, VersionedFixtureInterface
-{
-    /**
-     * @var ContainerInterface
-     */
-    private $container;
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getVersion()
-    {
-        return '2.0';
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function setContainer(ContainerInterface $container = null)
-    {
-        $this->container = $container;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function load(ObjectManager $manager)
-    {
-        $configurations = [
-            'system.guest.checkout' => true,
-            'system.category.list.mode' => 'list',
-            'system.category.list.per_page' => [12, 24, 36],
-            'system.category.list.per_page.default' => 12,
-            'system.category.grid.per_page' => [5, 10, 15, 20, 25],
-            'system.category.grid.per_page.default' => 10,
-            'system.category.variant_mode' => 'hide',
-            'system.order.prefix' => 'O',
-            'system.order.suffix' => '',
-            'system.quote.prefix' => 'Q',
-            'system.quote.suffix' => '',
-            'system.invoice.prefix' => 'IN',
-            'system.invoice.suffix' => '',
-            'system.invoice.wkhtml' => '-T 40mm -B 15mm -L 10mm -R 10mm --header-spacing 5 --footer-spacing 5',
-            'system.shipment.prefix' => 'SH',
-            'system.shipment.suffix' => '',
-            'system.shipment.wkhtml' => '-T 40mm -B 15mm -L 10mm -R 10mm --header-spacing 5 --footer-spacing 5',
-        ];
-
-        foreach ($configurations as $key => $value) {
-            $this->container->get('coreshop.configuration.service')->set($key, $value);
-        }
-    }
-}
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Frontend_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Frontend_Bundle.html deleted file mode 100644 index 6c261bf208..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Frontend_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Frontend Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Frontend Bundle

-

CoreShop FrontendBundle provides some FrontendControllers as well as a default Implementation for the Frontend.

-
-

This Bundle is not advised to be installed seperately!

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Index_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Index_Bundle.html deleted file mode 100644 index 2d778f94af..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Index_Bundle.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - Index Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Index Bundle

-

Installation

-
$ composer require coreshop/index-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\IndexBundle\CoreShopIndexBundle(),
-    ]);
-}
-
-

Updating database schema

-

Run the following command.

-
$ php bin/console doctrine:schema:update --force
-
-

Usage

-

This Bundle integrates Index Component into Symfony and Doctrine

-

The Index Bundle provides you with basic information needed for a Indexing Pimcore Models: Index, Filters and Conditions

-

It also provides you with ListingServices and FilterServices

-

Get Listing from Index

-

How to get a Listing from an Index?

-
$filter = $this->get('coreshop.repository.filter')->find(1); //Get Filter by ID 1
-$filteredList = $this->get('coreshop.factory.filter.list')->createList($filter, $request->request);
-$filteredList->setVariantMode(ListingInterface::VARIANT_MODE_HIDE);
-$filteredList->setCategory($category);
-$this->get('coreshop.filter.processor')->processConditions($filter, $filteredList, $request->query);
-$filteredList->load();
-
-

Pimcore UI

-
    -
  • Index Configuration
  • -
  • Filter Configuration
  • -
-

How to use?

-
coreshop.global.resource.open('coreshop.index', 'index');
-coreshop.global.resource.open('coreshop.index', 'filter');
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Inventory_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Inventory_Bundle.html deleted file mode 100644 index a29fceebdd..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Inventory_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Inventory Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Inventory Bundle

-

CoreShop Inventory Bundle provides a Basic implementation to handle Inventory for a Product.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Locale_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Locale_Bundle.html deleted file mode 100644 index 4209e2d1f1..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Locale_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Locale Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Locale Bundle

-

CoreShop Locale Bundle provides a basic set of data for Locale Information.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Menu_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Menu_Bundle.html deleted file mode 100644 index c5fabef061..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Menu_Bundle.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - Menu Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Menu Bundle

-

Menu Bundle makes it easy creating Pimcore Menus based on permissions.

-

Installation

-
$ composer require coreshop/menu-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\MenuBundle\CoreShopMenuBundle(),
-    ]);
-}
-
-

Usage

-

Create a new Menu by creating a new Class, let's call it MyMenuBuilder

-

-namespace AppBundle\Menu;
-
-use CoreShop\Bundle\MenuBundle\Builder\MenuBuilderInterface;
-use Knp\Menu\FactoryInterface;
-use Knp\Menu\ItemInterface;
-
-class MyMenuBuilder implements MenuBuilderInterface
-{
-    public function buildMenu(ItemInterface $menuItem, FactoryInterface $factory, string $type) 
-    {
-        //Create a new direct sub-menu item
-        $menuItem
-            ->addChild('my-menu-item')
-            ->setLabel('my-menu-item')
-            ->setAttribute('permission', 'my_menu_item')
-            ->setAttribute('iconCls', 'pimcore_icon_delete')
-        ;
-    }
-}
-
-

You then need to register your class to the symfony container:

-
    app.my_menu:
-        class: AppBundle\Menu\MyMenuBuilder
-        tags:
-            - { name: coreshop.menu, type: my_menu, menu: my_menu }
-
-
-

Where the menu attribute defines your unique identifier for your menu. You can also register multiple Builders -for your Menu with the same menu attribute, this will load them one after another.

-

Now, lets do the ExtJs Javascript part. In your Bundle. I assume you already have a working Bundle for that. In your -Bundle.php file, add this file to the jsPaths array:

-
'/admin/coreshop/coreshop.my_menu/menu.js'
-
-

Where my_menu here again is your defined identifier. This will load a basic helper file that will build your menu. -Now, let's actually build the menu.

-

You should already have a startup.js somehwere in your Bundle. In there, you can instantiate the menu by calling:

-
new coreshop.menu.coreshop.my_menu();
-
-

That will build the menu automatically for you.

-

In order now to do something when a menu-item is clicked, you can attach to the event that is fired:

-
pimcore.eventDispatcher.registerTarget('coreshopMenuOpen', new (Class.create({
-    coreshopMenuOpen: function(type, item) {
-        if (item.id === 'my-menu-item') {
-            alert('My Menu Item has been clicked');
-        }
-    }
-})));
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Messenger_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Messenger_Bundle.html deleted file mode 100644 index 6d5e772043..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Messenger_Bundle.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - Messenger Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Messenger Bundle

-

CoreShop Messenger Bundle provides you with a nice UI to see what Messenger Tasks are queued in which queues:

-

Messenger

-

Installation

-
$ composer require coreshop/messenger-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\MessengerBundle\CoreShopMessengerBundle(),
-    ]);
-}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Money_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Money_Bundle.html deleted file mode 100644 index 1c174d8a06..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Money_Bundle.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - Money Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Money Bundle

-

Installation

-
$ composer require coreshop/money-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\MoneyBundle\CoreShopMoneyBundle(),
-    ]);
-}
-
-

Usage

-

Money Bundle adds a new core-extension to pimcore which allows you to store currency values as integer.

-

You also get a Twig Extension to format money values.

-
{{ value|coreshop_format_money('€', 'de'); }}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Notification_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Notification_Bundle.html deleted file mode 100644 index 2e742a9a08..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Notification_Bundle.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - Notification Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Notification Bundle

-

CoreShop Notification Bundle handles all communication between CoreShop and the outside world. It provides a basic set of data for Notifications like:

-
    -
  • Notification Rules
  • -
  • Notification Rule Conditions
  • -
  • Notification Rule Actions
  • -
-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-

Usage

-

Notifications run async in a Symfony messenger queue:

-
bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/OptimisticEntityLock_Bundle.html b/docs/generated-docs/generated_docs/Bundles/OptimisticEntityLock_Bundle.html deleted file mode 100644 index 33fff358bb..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/OptimisticEntityLock_Bundle.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - OptimisticEntityLock Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Optimistic Entity Lock Bundle

-

The CoreShop Optimistic Entity Lock Bundle is a package for the CoreShop e-commerce framework, based on the Pimcore platform, designed to handle optimistic entity locking. This bundle helps prevent conflicts when multiple users try to edit the same entity concurrently by implementing an optimistic locking strategy. -Messenger

-

Installation

-
$ composer require optimistic-entity-lock-bundle
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\OptimisticEntityLockBundle\CoreShopOptimisticEntityLockBundle(),
-    ]);
-}
-
-

Usage

-

Your Pimcore DataObject Class needs to implement the Interface CoreShop\Bundle\OptimisticEntityLockBundle\Model\OptimisticLockedInterface.

-

You can therefore add the field optimisticLockVersion to your Pimcore Class Definition.

-

From now on, everytime the DataObject gets saved, CoreShop compares the Versions and increases it before saving. If the version is different, someone else saved the entity before you and you get a exception.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Order_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Order_Bundle.html deleted file mode 100644 index 9eac334ac1..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Order_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Order Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Order Bundle

-

CoreShop Order Bundle provides a basic set of data for Orders.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Payment_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Payment_Bundle.html deleted file mode 100644 index d46e10cbeb..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Payment_Bundle.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - Payment Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Payment Bundle

-

Installation

-
$ composer require coreshop/payment-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\PaymentBundle\CoreShopPaymentBundle(),
-    ]);
-}
-
-

Updating database schema

-

Run the following command.

-
$ php bin/console doctrine:schema:update --force
-
-

Usage

-

This Bundle integrates Payment Component into Symfony and Doctrine

-

The Payment Bundle provides you with basic information needed for payment: Payment

-

The Bundle also introduces an Address Formatter, which formats addresses in country based formats.

-

Doctrine Entities

-
    -
  • Payment
  • -
-

Pimcore UI

-
    -
  • Payment Provider
  • -
-

How to use?

-
coreshop.global.resource.open('coreshop.payment', 'payment_provider');
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/PayumPayment_Bundle.html b/docs/generated-docs/generated_docs/Bundles/PayumPayment_Bundle.html deleted file mode 100644 index 24ba9550ce..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/PayumPayment_Bundle.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - PayumPayment Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Payum_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Payum_Bundle.html deleted file mode 100644 index 549c8f3013..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Payum_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Payum Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Payum Bundle

-

Handles the Payum Integration with CoreShop. This Bundle requires the Core and can only be used in the full installation.

-
-

This Bundle is not advised to be installed seperately!

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Pimcore_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Pimcore_Bundle.html deleted file mode 100644 index c865befffa..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Pimcore_Bundle.html +++ /dev/null @@ -1,422 +0,0 @@ - - - - - - - Pimcore Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Pimcore Bundle

-

Installation

-
$ composer require coreshop/pimcore-bundle:^3.0
-
-

Activating Bundle

-

You need to enable the bundle inside the kernel or with the Pimcore Extension Manager.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\PimcoreBundle\CoreShopPimcoreBundle()
-    ]);
-}
-
-

Usage

-

The CoreShopPimcoreBundle integrates the CoreShop Pimcore Component into Symfony automatically registers a lot of services for you.

-

JS/CSS Resource Loading

-

With Pimcore, every bundle needs to take care about loading static assets themselve. PimcoreBundle helps you out here, follow these steps to use it:

-
    -
  • Create a DependencyInjection Extension class like:
  • -
-
<?php
-
-namespace AppBundle\DependencyInjection;
-
-use CoreShop\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractModelExtension;
-use Symfony\Component\Config\FileLocator;
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
-
-class AppExtension extends AbstractModelExtension
-{
-    public function load(array $config, ContainerBuilder $container)
-    {
-        $config = $this->processConfiguration($this->getConfiguration([], $container), $config);
-
-        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
-        $loader->load('services.yml');
-
-        $this->registerPimcoreResources('coreshop', $config['pimcore_admin'], $container);
-    }
-}
-
-
    -
  • Create a DependencyInjection Configuration class like:
  • -
-
<?php
-
-namespace AppBundle\DependencyInjection;
-
-use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
-use Symfony\Component\Config\Definition\Builder\TreeBuilder;
-use Symfony\Component\Config\Definition\ConfigurationInterface;
-
-final class Configuration implements ConfigurationInterface
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function getConfigTreeBuilder()
-    {
-        $treeBuilder = new TreeBuilder();
-        $rootNode = $treeBuilder->root('app');
-
-        $this->addPimcoreResourcesSection($rootNode);
-
-        return $treeBuilder;
-    }
-
-    /**
-     * @param ArrayNodeDefinition $node
-     */
-    private function addPimcoreResourcesSection(ArrayNodeDefinition $node)
-    {
-        $node->children()
-            ->arrayNode('pimcore_admin')
-                ->addDefaultsIfNotSet()
-                ->children()
-                    ->arrayNode('js')
-                        ->addDefaultsIfNotSet()
-                        ->ignoreExtraKeys(false)
-                        ->children()
-                            ->scalarNode('test')->defaultValue('/bundles/app/pimcore/js/test.js')->end()
-                        ->end()
-                    ->end()
-                    ->arrayNode('css')
-                        ->addDefaultsIfNotSet()
-                        ->ignoreExtraKeys(false)
-                        ->children()
-                            ->scalarNode('test')->defaultValue('/bundles/app/pimcore/css/pimcore.css')->end()
-                        ->end()
-                    ->end()
-                ->end()
-            ->end()
-        ->end();
-    }
-}
-
-
-
    -
  • That's it, PimcoreBundle now takes care about loading your resources and also bundles them in non DEV-Mode.
  • -
-

DataObject Extensions

-

Serialized Data

-

This extension allows you to store SerializedData inside a Pimcore DataObject.

-

Slug

-

Pimcore comes with quite useful objects slugs. But it doesn't come with a Slug Generator. CoreShop for the rescue. In Order to use it, -your class needs to implement CoreShop\Component\Pimcore\Slug\SluggableInterface and CoreShop automatically generates slugs for you.

-

Extensions / Influence the slug generation

-

If you want to change the generated slug or prefix it, you can use the CoreShop\Component\Pimcore\Event\SlugGenerationEvent Event.

-
<?php
-
-declare(strict_types=1);
-
-namespace App\EventListener;
-
-use CoreShop\Component\Pimcore\Event\SlugGenerationEvent;
-use Pimcore\Model\DataObject\PressRelease;
-use Pimcore\Model\Document;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
-
-final class SlugEventListener implements EventSubscriberInterface
-{
-    public static function getSubscribedEvents()
-    {
-        return [
-            SlugGenerationEvent::class => 'onGenerate',
-        ];
-    }
-
-    public function onGenerate(SlugGenerationEvent $event): void
-    {
-        $event->setSlug($event->getSlug() . '-bar');
-    }
-}
-
-

Data Object Features

-

Class Converter and Data Migrate

-

Class converter is a small utility, which lets you migrate all Data from one class to another. Usage:

-
<?php
-
-use CoreShop\Component\Pimcore\Migrate;
-
-$currentClassName = 'Product';
-$newClassName = 'NewProduct';
-$options = [
-    'delete_existing_class' => true,
-    'parentClass' => 'AppBundle\Model\MyProduct'
-];
-
-//Copies $currentClassName Definition to $newClassName
-//$options can overwrite some properties like parentClass
-Migrate::migrateClass($currentClassName, $newClassName, $options);
-
-//This function migrates all data from $currentClassName to $newClassName
-//It uses SQL Commands to increase performance of migration
-Migrate::migrateData($currentClassName, $newClassName);
-
-

Class Installer

-

Class Installer helps you importing Classes/FieldCollections/ObjectBricks into Pimcore based of a JSON Definition:

-

-use CoreShop\Component\Pimcore\ClassInstaller;
-
-$installer = new ClassInstaller();
-
-// For Bricks use
-$installer->createBrick($pathToJson, $brickName);
-
-// For Classes use
-$installer->createClass($pathToJson, $className, $updateExistingClass);
-
-// For FieldCollections use
-$installer->createFieldCollection($pathToJson, $fcName);
-
-
-

Class/Brick/Field Collection Updater

-

Definition Updaters help you in migrating your Pimcore Class/Bricks or Field Collection Definitions to be properly -migrated from Release to Release.

-

To update a Pimcore class use it like this:

-
use CoreShop\Component\Pimcore\DataObject\ClassUpdate;
-
-$classUpdater = new ClassUpdate('Product');
-
-//Your JSON Definition from Pimcore
-$payment = [
-    'fieldtype' => 'coreShopSerializedData',
-    'phpdocType' => 'array',
-    'allowedTypes' =>
-        [
-        ],
-    'maxItems' => 1,
-    'name' => 'paymentSettings',
-    'title' => 'Payment Settings',
-    'tooltip' => '',
-    'mandatory' => false,
-    'noteditable' => true,
-    'index' => false,
-    'locked' => null,
-    'style' => '',
-    'permissions' => null,
-    'datatype' => 'data',
-    'columnType' => null,
-    'queryColumnType' => null,
-    'relationType' => false,
-    'invisible' => false,
-    'visibleGridView' => false,
-    'visibleSearch' => false,
-];
-
-//Check if field exists
-if (!$classUpdater->hasField('paymentSettings')) {
-    //If not insert field after a specific field and save the definition
-    $classUpdater->insertFieldAfter('paymentProvider', $payment);
-    $classUpdater->save();
-}
-
-
-

Thats it, the same works for FieldCollections with the class CoreShop\Component\Pimcore\DataObject\FieldCollectionDefinitionUpdate -and for Bricks with the class CoreShop\Component\Pimcore\DataObject\BrickDefinitionUpdate

-

Inheritance Helper

-

Inhertiance Helper is a small little but very useful helper class to enable Pimcore inheritance only with a closure function like this:

-

-use CoreShop\Component\Pimcore\DataObject\InheritanceHelper;
-
-$inheritedValue = InheritanceHelper::useInheritedValues(function() use($object) {
-    return $object->getValueInherited();
-}, true);
-
-
-

Version Helper

-

Version Helper is a small little but very useful helper class to disabling or enablind Pimcore Versioning.

-

-use CoreShop\Component\Pimcore\DataObject\VersionHelper;
-
-VersionHelper::useVersioning(function() use($object) {
-    //Object will be saved without creating a new Version
-    $object->save();
-}, false);
-
-
-

Unpublished Helper

-

Unpublsihed Helper is a small little but very useful helper class to get unpublished objects in Pimcore Frontend.

-

-use CoreShop\Component\Pimcore\DataObject\UnpublishedHelper;
-
-$allProducts = UnpublishedHelper::hideUnpublished(function() use($object) {
-    //Will return all products, even the unpbulished ones
-    return $object->getProducts();
-}, false);
-
-
-

Expression Language Features

-

CoreShop adds some features to the Symfony Expression language like:

-
    -
  • PimcoreLanguageProvider: to get Pimcore Objects, Assets or Documents inside a Expression Language Query
  • -
-

Migration Features

-

Pimcore Shared Translations

-

Helps you to install new Shared Translations during Migration:

-
use CoreShop\Component\Pimcore\Migration\SharedTranslation;
-
-SharedTranslation::add('key', 'en', 'value');
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/ProductQuantityPriceRules_Bundle.html b/docs/generated-docs/generated_docs/Bundles/ProductQuantityPriceRules_Bundle.html deleted file mode 100644 index 50c91e7b13..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/ProductQuantityPriceRules_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - ProductQuantityPriceRules Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Quantity Price Rules Bundle

-

This Bundle implements the Quantity Price Rules for CoreShop.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Product_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Product_Bundle.html deleted file mode 100644 index 20a1925877..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Product_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Product Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Bundle

-

CoreShop Product Bundle is responsible for the Product Management.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/CustomEntities.html b/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/CustomEntities.html deleted file mode 100644 index 7abe1b63c2..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/CustomEntities.html +++ /dev/null @@ -1,446 +0,0 @@ - - - - - - - CustomEntities - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Adding a new custom entity

-

Create Translatable Entity

-

First of all, we need to create our Entity Class. In this case, we create a Translatable Entity.

-
<?php
-
-//AppBundle/Model/CustomEntityInterface.php
-
-interface CustomEntityInterface extends ResourceInterface, TranslatableInterface {
-    public function getName($language = null);
-
-    public function setName($name, $language = null);
-}
-
-
<?php
-
-//AppBundle/Model/CustomEntity.php
-
-class CustomEntity implements CustomEntityInterface {
-    use TranslatableTrait {
-        __construct as private initializeTranslationsCollection;
-    }
-
-    protected $id;
-    protected $name;
-
-    public function __construct()
-    {
-        $this->initializeTranslationsCollection();
-    }
-
-    public function getId()
-    {
-        return $this->id;
-    }
-
-    public function getName($language = null)
-    {
-        return $this->getTranslation($language)->getName();
-    }
-
-    public function setName($name, $language = null)
-    {
-        $this->getTranslation($language, false)->setName($name);
-
-        return $this;
-    }
-
-    protected function createTranslation()
-    {
-        return new CustomEntityTranslation();
-    }
-}
-
-

Since our Entity is Translatable, we need to add our Translation Entity as well.

-
<?php
-
-//AppBundle/Model/CustomEntityTranslationInterface.php
-
-interface CustomEntityTranslationInterface extends ResourceInterface, TimestampableInterface
-{
-    /**
-     * @return string
-     */
-    public function getName();
-
-    /**
-     * @param string $name
-     */
-    public function setName($name);
-}
-
-
<?php
-
-//AppBundle/Model/CustomEntityTranslation.php
-
-class CustomEntityTranslation extends AbstractTranslation implements CustomEntityTranslationInterface
-{
-    protected $id;
-    protected $name;
-
-    public function getId()
-    {
-        return $this->id;
-    }
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function setName($name)
-    {
-        $this->name = $name;
-    }
-}
-
-

Create Doctrine Configuration

-
# AppBundle/Resources/config/doctrine/model/CustomEntity.orm.yml
-
-AppBundle\Model\CustomEntity:
-  type: mappedSuperclass
-  table: app_custom_entity
-  fields:
-    id:
-      type: integer
-      column: id
-      id: true
-      generator:
-        strategy: AUTO
-
-

Our Translation Doctrine definition:

-
# AppBundle/Resources/config/doctrine/model/CustomEntityTranslation.orm.yml
-
-AppBundle\Model\CustomEntityTranslation:
-  type: mappedSuperclass
-  table: app_custom_entity_translation
-  fields:
-    id:
-      type: integer
-      column: id
-      id: true
-      generator:
-        strategy: AUTO
-    name:
-      type: string
-      column: name
-
-

Create DI Configuration

-
<?php
-
-//AppBundle/DependencyInjection/Configuration.php
-
-namespace CoreShop\Bundle\AddressBundle\DependencyInjection;
-
-final class Configuration implements ConfigurationInterface
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function getConfigTreeBuilder()
-    {
-        $treeBuilder = new TreeBuilder();
-        $rootNode = $treeBuilder->root('app');
-
-        $rootNode
-            ->children()
-                ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end()
-            ->end()
-        ;
-        $this->addModelsSection($rootNode);
-
-        return $treeBuilder;
-    }
-
-    /**
-     * @param ArrayNodeDefinition $node
-     */
-    private function addModelsSection(ArrayNodeDefinition $node)
-    {
-        $node
-            ->children()
-                ->arrayNode('resources')
-                    ->addDefaultsIfNotSet()
-                    ->children()
-                        ->arrayNode('custom_entity')
-                            ->addDefaultsIfNotSet()
-                            ->children()
-                                ->variableNode('options')->end()
-                                ->scalarNode('permission')->defaultValue('custom_entity')->cannotBeOverwritten()->end()
-                                ->arrayNode('classes')
-                                    ->addDefaultsIfNotSet()
-                                    ->children()
-                                        ->scalarNode('model')->defaultValue(CustomEntity::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('interface')->defaultValue(CustomEntityInterface::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('admin_controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('factory')->defaultValue(TranslatableFactory::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('repository')->defaultValue(CustomEntityRepository::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('form')->defaultValue(CustomEntityType::class)->cannotBeEmpty()->end()
-                                    ->end()
-                                ->end()
-                                ->arrayNode('translation')
-                                    ->addDefaultsIfNotSet()
-                                    ->children()
-                                        ->variableNode('options')->end()
-                                        ->arrayNode('classes')
-                                            ->addDefaultsIfNotSet()
-                                            ->children()
-                                                ->scalarNode('model')->defaultValue(CustomEntityTranslation::class)->cannotBeEmpty()->end()
-                                                ->scalarNode('interface')->defaultValue(CustomEntityTranslationInterface::class)->cannotBeEmpty()->end()
-                                                ->scalarNode('controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end()
-                                                ->scalarNode('repository')->cannotBeEmpty()->end()
-                                                ->scalarNode('factory')->defaultValue(Factory::class)->end()
-                                                ->scalarNode('form')->defaultValue(CustomEntityTranslationType::class)->cannotBeEmpty()->end()
-                                            ->end()
-                                        ->end()
-                                    ->end()
-                                ->end()
-                            ->end()
-                        ->end()
-                    ->end()
-                ->end()
-            ->end()
-        ;
-    }
-}
-
-
<?php
-
-//AppBundle/DependencyInjection/AppExtension.php
-
-final class AppExtension extends AbstractModelExtension
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function load(array $config, ContainerBuilder $container)
-    {
-        $config = $this->processConfiguration($this->getConfiguration([], $container), $config);
-        //'app' is the application name
-        $this->registerResources('app', $config['driver'], $config['resources'], $container);
-    }
-}
-
-
-
<?php
-
-//AppBundle/DependencyInjection/AppExtension.php
-
-final class AppBundle extends AbstractResourceBundle
-{
-    public function getSupportedDrivers()
-    {
-        return [
-            CoreShopResourceBundle::DRIVER_DOCTRINE_ORM,
-        ];
-    }
-
-    protected function getModelNamespace()
-    {
-        return 'AppBundle\Model';
-    }
-}
-
-
-

Create Serialization Definition if you want to serialize your Entity

-
# AppBundle/Resources/config/serializer/Model.CustomEntity.yml
-
-AppBundle\Model\CustomEntity:
-  exclusion_policy: ALL
-  xml_root_name: custom_entity
-  properties:
-    id:
-      expose: true
-      type: integer
-      groups: [List, Detailed]
-    translations:
-      expose: true
-      type: array
-      groups: [Detailed]
-  virtual_properties:
-    getName:
-      serialized_name: name
-      groups: [List, Detailed]
-
-
# AppBundle/Resources/config/serializer/Model.CustomEntityTranslation.yml
-
-AppBundle\Model\CustomEntityTranslation:
-  exclusion_policy: ALL
-  xml_root_name: custom_entity_translation
-  properties:
-    name:
-      expose: true
-      type: string
-      groups: [Detailed]
-
-

Create Routes to ResourceController

-
# AppBundle/Resources/config/pimcore/routing.yml
-
-app_custom_entity:
-  type: coreshop.resources
-  resource: |
-    alias: app.custom_entity
-
-
-

This will create all CRUD routes: (app is the application name specified in AppExtension.php)

-

GET: /admin/app/custom_entity/list -GET: /admin/app/custom_entity/get -POST: /admin/app/custom_entity/add -POST: /admin/app/custom_entity/save -DELETE: /admin/app/custom_entity/delete

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/Installation.html b/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/Installation.html deleted file mode 100644 index 956481aa17..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/Installation.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - Installation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Adding new files that needs to be installed

-

Resource Bundles takes care about installing your resources. It can handle following types: -- Object Classes -- Field Collection Classes -- Objectbrick Classes -- Routes -- Permissions -- SQL Files

-

Object Classes, Field Collections and Objectbrick Classes

-

To install object classes, you need to configure your classes inside your Bundle and register them to Resource Bundle. (as described here)

-

Routes, SQL and Permissions

-

To install routes, permissions or execute sql files, configure them in your Bundle likes this:

-
<?php
-
-namespace AppBundle\DependencyInjection;
-
-final class Configuration implements ConfigurationInterface
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function getConfigTreeBuilder()
-    {
-        $treeBuilder = new TreeBuilder();
-        $rootNode = $treeBuilder->root('AppBundle');
-
-        $this->addPimcoreResourcesSection($rootNode);
-
-        return $treeBuilder;
-    }
-
-    private function addPimcoreResourcesSection(ArrayNodeDefinition $node)
-    {
-        $node->children()
-            ->arrayNode('pimcore_admin')
-                ->addDefaultsIfNotSet()
-                ->children()
-                    ->arrayNode('install')
-                        ->addDefaultsIfNotSet()
-                        ->children()
-                            ->scalarNode('routes')->defaultValue(['@AppBundle/Resources/install/pimcore/routes.yml'])->end()
-                            ->scalarNode('sql')->defaultValue(['@AppBundle/Resources/install/pimcore/data.sql'])->end()
-                        ->end()
-                    ->end()
-                    ->scalarNode('permissions')
-                        ->cannotBeOverwritten()
-                        ->defaultValue(['name_of_permission'])
-                    ->end()
-                ->end()
-            ->end()
-        ->end();
-    }
-}
-
-
-

Routes Example File

-
yeah_route:
-  pattern: "/(\\w+)\\/yeah-route/"
-  reverse: "/%_locale/yeah\-route"
-  module: AppBundle
-  controller: "@app.frontend.controller.controller"
-  action: doSomething
-  variables: _locale
-  priority: 2
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/PimcoreEntities.html b/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/PimcoreEntities.html deleted file mode 100644 index cde008ece6..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/PimcoreEntities.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - PimcoreEntities - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Adding a new Pimcore Entity with automated installation

-
    -
  1. Add a new Pimcore Class in Pimcore.
  2. -
  3. Add a Parent Class to your Pimcore Entity
  4. -
  5. Export Class Definition to AppBundle/Resources/install/pimcore/classes/PimcoreEntity.json -
  6. -
-

Create Parent Class

-
<?php
-//AppBundle/Model/PimcoreEntityInterface.php
-
-interface PimcoreEntityInterface extends ResourceInterface
-    public function getName($language = null);
-
-    public function setName($name, $language = null);
-}
-
-
<?php
-//AppBundle/Model/PimcoreEntity.php
-
-class PimcoreEntity extends AbstractPimcoreModel implements PimcoreEntityInterface, PimcoreModelInterface {
-    public function getName($language = null) {
-        throw new ImplementedByPimcoreException(__CLASS__, __METHOD__);
-    }
-
-    public function setName($name, $language = null) {
-        throw new ImplementedByPimcoreException(__CLASS__, __METHOD__);
-    }
-}
-
-

Create Dependency Injection Configuration

-
<?php
-//AppBundle/DependencyInjection/Configuration.php
-
-namespace AppBundle\DependencyInjection;
-
-final class Configuration implements ConfigurationInterface
-{
-    public function getConfigTreeBuilder()
-    {
-        $treeBuilder = new TreeBuilder();
-        $rootNode = $treeBuilder->root('app_custom');
-
-        $this->addModelsSection($rootNode);
-
-        return $treeBuilder;
-    }
-
-    private function addModelsSection(ArrayNodeDefinition $node)
-    {
-        $node
-            ->children()
-                ->arrayNode('pimcore')
-                    ->addDefaultsIfNotSet()
-                    ->children()
-                        ->arrayNode('pimcore_entity')
-                            ->addDefaultsIfNotSet()
-                            ->children()
-                                ->variableNode('PimcoreEntity')->end()
-                                ->arrayNode('options')
-                                    ->scalarNode('path')->defaultValue('path/within/pimcore')->end()
-                                    ->scalarNode('permission')->defaultValue('pimcore_entity')->cannotBeOverwritten()->end()
-                                    ->addDefaultsIfNotSet()
-                                    ->children()
-                                        ->scalarNode('model')->defaultValue('Pimcore\Model\Object\PimcoreEntity')->cannotBeEmpty()->end()
-                                        ->scalarNode('interface')->defaultValue(PimcoreEntity::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('factory')->defaultValue(PimcoreFactory::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('repository')->cannotBeEmpty()->end()
-                                        ->scalarNode('admin_controller')->cannotBeEmpty()->end()
-                                        ->scalarNode('install_file')->defaultValue('@AppBundle/Resources/install/pimcore/classes/PimcoreEntity.json')->end()
-                                        ->scalarNode('type')->defaultValue(CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT)->cannotBeOverwritten(true)->end()
-                                    ->end()
-                                ->end()
-                            ->end()
-                        ->end()
-                    ->end()
-                ->end()
-            ->end()
-        ;
-    }
-}
-
-
<?php
-//AppBundle/DependencyInjection/AppBundleExtension.php
-
-namespace AppBundle\DependencyInjection;
-
-final class AppBundleExtension extends AbstractModelExtension
-{
-    public function load(array $config, ContainerBuilder $container)
-    {
-        $this->registerPimcoreModels('app', $config['pimcore'], $container);
-    }
-}
-
-
-

Use your Pimcore Entity

-

You can either use Pimcore Listing Classes like:

-
$list = new Pimcore\Model\Object\PimcoreEntity\Listing();
-
-

or use automated generated Factory/Repository Classes

-
$pimcoreEntityObject = $container->get('app.repository.pimcore_entity')->findBy($id);
-
-$list = $container->get('app.repository.pimcore_entity')->getList();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/index.html b/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/index.html deleted file mode 100644 index 7737fcdbb6..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Resource_Bundle/index.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - Resource Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Resource Bundle

-

Resource Bundle is the Heart of CoreShops Model. It handles saving/deleting/updating/creating of CoreShop Models. It handles -Doctrine ORM Mappings and Translations. As well as Routing, Event Dispatching, Serialization and CRUD.

-

Resource Bundle also takes care about installation of Pimcore Class Definitions, Object Brick Definitions, Field Collection Definitions, -Static Routes and SQL.

-

You can use Resource Bundle as base for all your Custom Pimcore Entities.

-

Installation

-
$ composer require coreshop/resource-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \JMS\SerializerBundle\JMSSerializerBundle(),
-        new \CoreShop\Bundle\ResourceBundle\CoreShopResourceBundle(),
-        new \Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle(),
-        new \Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle()
-    ]);
-}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Rule_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Rule_Bundle.html deleted file mode 100644 index aa43e87b40..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Rule_Bundle.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - Rule Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Rule Bundle

-

CoreShop Rule Bundle is the base Bundle for all Rule Based Systems in CoreShop. It provides a basic set of data for Rules like:

-
    -
  • Rule Conditions
  • -
  • Rule Actions
  • -
-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/SEO_Bundle.html b/docs/generated-docs/generated_docs/Bundles/SEO_Bundle.html deleted file mode 100644 index 38f8cf6104..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/SEO_Bundle.html +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - SEO Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop SEO Bundle

-

Installation

-
$ composer require coreshop/seo-bundle:^3.0
-
-

Activating Bundle

-

You need to enable the bundle inside the kernel or with the Pimcore Extension Manager.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\SEOBundle\CoreShopSEOBundle()
-    ]);
-}
-
-

Usage

-

The SEO Bundle provides you with services to make SEO more manageable. It depends on Pimcore's HeadLink and HeadMeta Helper.

-

There are multiple ways of making use of this bundle:

-
    -
  • Implement SEO interfaces provided with this bundle
  • -
  • Implement Custom Extractors and add them to the SEOMetadata Model
  • -
-

To update the SEO Information, you need to use the service coreshop.seo.presentation:

-

-//From a Controller
-$this->get('coreshop.seo.presentation')->updateSeoMetadata($object);
-
-

Implement SEO Interfaces

-

SEO Bundle comes with 3 SEO Aware interfaces you can take advantage of:

-
    -
  • -CoreShop\Component\SEO\Model\SEOAwareInterface for meta-title and meta-description
  • -
  • -CoreShop\Component\SEO\Model\SEOImageAwareInterface for og-image attribute
  • -
  • -CoreShop\Component\SEO\Model\SEOImageAwareInterface for og-title, og-type and pg-description attribute
  • -
-

Implement SEO Extractors

-

To add a new Extractor, you need to implement the interface CoreShop\Component\SEO\Extractor\ExtractorInterface and register your class with the tag coreshop.seo.extractor:

-

Example

-

Let's implement a custom extractor for our Product class with a Video.

-
<?php
-//src/AppBundle/SEO/Extractor/ProductVideoExtractor.php
-
-namespace AppBundle\SEO\Extractor;
-
-use Pimcore\Model\DataObject\Product;
-use Pimcore\Tool;
-
-final class ProductVideoExtractor implements ExtractorInterface
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function supports($object)
-    {
-        return $object instanceof Product && $object->getVideoUrl();
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function updateMetadata($object, SEOMetadataInterface $seoMetadata)
-    {
-        /**
-         * @var $object Product
-         */
-        $seoMetadata->addExtraProperty('og:video', Tool::getHostUrl() . $object->getVideoUrl());
-    }
-}
-
-

Now we need to register the service

-
# src/AppBundle/Resources/config/services.yml
-services:
-    AppBundle\SEO\Extractor:
-        tags:
-            - { name: coreshop.seo.extractor, type: product_video }
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Sequence_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Sequence_Bundle.html deleted file mode 100644 index 98ab9cf686..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Sequence_Bundle.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - Sequence Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Sequence Bundle

-

Installation

-
$ composer require coreshop/sequence-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\SequenceBundle\CoreShopSequenceBundle(),
-    ]);
-}
-
-

Updating database schema

-

Run the following command.

-
$ php bin/console doctrine:schema:update --force
-
-

Usage

-

This Bundle integrates Sequence Component into Symfony and Doctrine

-

The sequence Bundle provides you with basic information needed for sequence generation.

-

Doctrine Entities

-
    -
  • Sequence
  • -
-

Get a new Sequence

-

-$container->get('coreshop.sequence.generator')->getNextSequenceForType('my_sequence');
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Shipping_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Shipping_Bundle.html deleted file mode 100644 index 5b09c7e467..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Shipping_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Shipping Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Shipping Bundle

-

CoreShop Shipping Bundle is responsible for Shipping Calculations.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/StorageList_Bundle.html b/docs/generated-docs/generated_docs/Bundles/StorageList_Bundle.html deleted file mode 100644 index fba098228f..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/StorageList_Bundle.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - StorageList Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Storage List Bundle

-

Storage List Component helps you with Lists/Collections of Objects like a Cart, Wishlist or Compare List.

-

Usage

-

To use it you need to have 3 models:

- -

The component already provides you with a basic implementation of Storage List and Storage Item. -You need to implement the StorageListProduct yourself.

-

To now mutate lists, the component gives you a Storage List Modifier, which takes care about creating and persisting the List.

-

Basic usage, Wishist example

-

For now, lets create a very basic Session based Wishlist:

-

We need to have following things:

-
    -
  • A Factory class for the Wishlist
  • -
  • A Factory class for the Wishlist Item
  • -
  • A StorageListManager to get the current list (more like a repository actually)
  • -
  • A StoreListModifier
  • -
-

CoreShop gives you Basic classes for these 4 things, we just need to instantiate them:

-

-use Symfony\Component\HttpFoundation\Session\Session;
-
-use CoreShop\Component\StorageList\Model\StorageList;
-use CoreShop\Component\StorageList\Model\StorageListItem;
-use CoreShop\Component\Resource\Factory\Factory;
-use CoreShop\Component\StorageList\SessionStorageManager;
-use CoreShop\Component\StorageList\SessionStorageListModifier;
-
-$session = new Session();
-$session->start();
-
-$wishlistFactory = new Factory(StorageList::class);
-$wishlistItemFactory = new Factory(StorageListItem::class);
-
-$wishlistManager = new SessionStorageManager($session, 'wishlist', $wishlistFactory);
-$wishlistModifier = new SessionStorageListModifier($wishlistItemFactory, $wishlistManager);
-
-//Now we can start putting data into our List
-$list = $wishlistManager->getStorageList();
-
-//Fetch our Product which implements CoreShop\Component\StorageList\Model\StorageListProductInterface
-$product = $productRepository->find(1);
-
-
-$listItem = $wishlistItemFactory->createNew();
-$listItem->setProduct($product);
-$listItem->setQuantity($quantity);
-
-//Lets add our Product
-$wishlistModifier->addToList($list, $listItem);
-
-//If we now want to remove it, we can either use the $listItem, or the Product
-//To do that with our item, we simply call
-$wishlistModifier->removeFromList($list, $listItem);
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Store_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Store_Bundle.html deleted file mode 100644 index 6208737954..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Store_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Store Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Store Bundle

-

CoreShop Store Bundle provides the abstraction of a Pimcore Website and a CoreShop Store. It handles the configuration for base-currencies and themes.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Taxation_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Taxation_Bundle.html deleted file mode 100644 index e6538df789..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Taxation_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Taxation Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Taxation Bundle

-

CoreShop Taxation Bundle is responsible for Tax Calculations.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Theme_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Theme_Bundle.html deleted file mode 100644 index 469c376522..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Theme_Bundle.html +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - Theme Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Theme Bundle

-

CoreShop Theme Bundle provides you with a flexible and extensible way of having multiple themes in a Pimcore installation.

-

Installation

-
$ composer require coreshop/theme-bundle:^3.0
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\ThemeBundle\CoreShopThemeBundle(),
-    ]);
-}
-
-

Configuration

-

Per Default, no Theme Resolver is enabled, you can enable on or multiples like:

-
core_shop_theme:
-    default_resolvers:
-      pimcore_site: true
-      pimcore_document_property: true
-
-

Pimcore Site

-

Resolves the Theme based on the Key of the Root Document of a Pimcore Site. So if the Site's Root Document is called "demo" it tries to find a theme called the same.

-

Pimcore Document Property

-

Resolves the Theme based on a Document Property of the Site. The Property is called "theme".

-

Custom Resolvers

-

You can also add custom resolvers like:

-
<?php
-
-declare(strict_types=1);
-
-namespace App\Theme;
-
-use CoreShop\Bundle\ThemeBundle\Service\ThemeNotResolvedException;
-use CoreShop\Bundle\ThemeBundle\Service\ThemeResolverInterface;
-use CoreShop\Component\Store\Context\StoreNotFoundException;
-
-final class CustomThemeResolver implements ThemeResolverInterface
-{
-    public function resolveTheme(): string
-    {
-        if(rand() === 1) {
-            // if you cannot resolve the theme, throw an exception
-            throw new ThemeNotResolvedException();
-        }
-    
-        return "custom/custom";
-    }
-}
-
-

You also need to Register the Theme Resolver:

-
services:
-  App\Theme\CustomThemeResolver:
-    tags:
-      - { name: coreshop.theme.resolver, type: custom, priority: 20 }
-
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Tracking_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Tracking_Bundle.html deleted file mode 100644 index f532a2c90a..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Tracking_Bundle.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - Tracking Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/User_Bundle.html b/docs/generated-docs/generated_docs/Bundles/User_Bundle.html deleted file mode 100644 index 846a41f1e1..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/User_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - User Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop User Bundle

-

CoreShop User Bundle is responsible for the User Management.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Variant_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Variant_Bundle.html deleted file mode 100644 index 2f88d67ea0..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Variant_Bundle.html +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - Variant Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Variant Bundle

-

CoreShop Variant Bundle allows you to manage different Variants of a Product.

-

Installation

-
  composer require coreshop/variant-bundle
-
-

Adding required bundles to kernel

-

You need to enable the bundle inside the kernel.

-
<?php
-
-// app/AppKernel.php
-
-public function registerBundlesToCollection(BundleCollection $collection)
-{
-    $collection->addBundles([
-        new \CoreShop\Bundle\VariantBundle\CoreShopVariantBundle(),
-    ]);
-}
-
-

Abstract

-

Pimcore already supports variants. But it doesn't define what a Variant is, or how a variant differs from the Parent Product or other Variants.

-

In classical e-commerce scenarios, you usually have different Variation Types like Size and Color with different Values like XL or Red.

-

CoreShop describes these two types of entities as Group (CoreShop\Component\Variant\Model\AttributeGroupInterface) and Value (CoreShop\Component\Variant\Model\AttributeValueInterface

-

The "Product" itself than is a sort-of abstract entity that is used to define what Attribute Groups are allowed. The Pimcore Variants then, need to have the values of thse Groups filled.

-

Example:

-
    -
  • -

    AttributeGroup Color --AttributeValue Red --AttributeValue Blue

    -
  • -
  • -

    product (defines allowed groups for color)

    -
      -
    • variant-red (defines the AttributeValue Red in attributes)
    • -
    • variant-blue (defines the AttributeValue Blue in attributes)
    • -
    -
  • -
-

Usage

-

CoreShop Variant Bundle does NOT come with a Installer for certain Resources it requires. That is on purpose and you need to manually install what you need.

-

Per Default, it comes with 3 different Classes:

-
    -
  • -CoreShopAttributeGroup -
  • -
  • -CoreShopAttributeColor -
  • -
  • -CoreShopAttributeValue -
  • -
-

Whereas Color and Value are two Value types and Group is a Group type.

-

You can manually import the classes from this dir vendor/coreshop/variant-bundle/Resources/install/pimcore/classes

-

To create a "Product" Class, you need to implement the interface CoreShop\Component\Variant\Model\ProductVariantAwareInterface. The Class requires you to have these fields:

-
    -
  • attributes - ManyToManyObjectRelation for CoreShopAttributeColor/CoreShopAttributeValue -
  • -
  • allowedAttributeGroups - ManyToManyObjectRelation for CoreShopAttributeGroup -
  • -
  • mainVariant - ManyToOneRelation for Product (eg. your Class where you implemented the interface)
  • -
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Wishlist_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Wishlist_Bundle.html deleted file mode 100644 index 0be7558ad0..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Wishlist_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Wishlist Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Order Bundle

-

CoreShop Order Wishlist provides a basic set of data for Wishlists. It is based on StorageList Bundle and shows how that can be integrated into a Pimcore Project.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/Workflow_Bundle.html b/docs/generated-docs/generated_docs/Bundles/Workflow_Bundle.html deleted file mode 100644 index 027f58ef1c..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/Workflow_Bundle.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - Workflow Bundle - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Workflow Bundle

-

CoreShop Workflow Bundle is a extension of Symfony Workflow and adds some configuration features to it.

-
-

This Bundle can be used separately, but doesn't provide any detail information how to use it.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Bundles/index.html b/docs/generated-docs/generated_docs/Bundles/index.html deleted file mode 100644 index b6c03436cf..0000000000 --- a/docs/generated-docs/generated_docs/Bundles/index.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - Bundles - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Bundles

-

CoreShop is a set of Bundles that provide different functionality. Each Bundle is supposed to be independent and can be used without the other Bundles. Glued together, they provide a full e-commerce solution.

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Cart/CRUD.html b/docs/generated-docs/generated_docs/Development/Cart/CRUD.html deleted file mode 100644 index 239c9b96e0..0000000000 --- a/docs/generated-docs/generated_docs/Development/Cart/CRUD.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart

-

CoreShop uses Pimcore Data Objects to persist Cart Information. But, it adds a little wrapper around it to be mire -dynamic and configurable. It uses a Factory and Repository Pattern to do that.

-

Create

-

If you want to create a new Cart, we need to get our Factory Service for that:

-
$factory = $container->get('coreshop.factory.cart');
-$cart = $factory->createNew();
-
-

No we have a new Cart and we can set all needed values.

-

If you now want to save it, just call the save function

-
$cart->save();
-
-

Read

-

To get carts, you need to use the Repository Service CoreShop provides you.

-
$repository = $container->get('coreshop.repository.cart');
-
-
-// Query by ID
-$cartWithIdOne = $repository->findById(1);
-
-// Get a Listing how you know it from Pimcore
-$list = $repository->getList();
-$list->setCondition("total > 100");
-$carts = $list->getObjects();
-
-
-

Update

-

Update works the same as you are used to in Pimcore

-
$repository = $container->get('coreshop.repository.cart');
-
-
-// Query by ID
-$cartWithIdOne = $repository->findById(1);
-
-// Change values
-$cartWithIdOne->setCustomer($customer);
-$cartWithIdOne->save();
-
-

Delete

-

Delete works the same as you are used to in Pimcore

-
$repository = $container->get('coreshop.repository.cart');
-
-
-// Query by ID
-$cartWithIdOne = $repository->findById(1);
-$cartWithIdOne->delete();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Cart/Cart_Manager.html b/docs/generated-docs/generated_docs/Development/Cart/Cart_Manager.html deleted file mode 100644 index 701316b56b..0000000000 --- a/docs/generated-docs/generated_docs/Development/Cart/Cart_Manager.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - Cart Manager - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Cart/Cart_Modifier.html b/docs/generated-docs/generated_docs/Development/Cart/Cart_Modifier.html deleted file mode 100644 index 1ea2b147ca..0000000000 --- a/docs/generated-docs/generated_docs/Development/Cart/Cart_Modifier.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Cart Modifier - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Cart/Cart_Processor.html b/docs/generated-docs/generated_docs/Development/Cart/Cart_Processor.html deleted file mode 100644 index 6be7400d14..0000000000 --- a/docs/generated-docs/generated_docs/Development/Cart/Cart_Processor.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - Cart Processor - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart Processor

-

The Cart Processor takes care about refreshing the state and prices of carts for you. Everytime the persistCart function of the Cart-Manager is called -on a Cart, it gets triggered and re-calculates the cart.

-

Following Processors are implemented by default:

- -

These Processors calculate all necessary prices of the cart. If you need to extend the Cart and change calculations, you need -to create a new Processor.

-

Creating a Cart Processor

-

A Cart Processor needs to implement the Interface CoreShop\Component\Order\Processor\CartProcessorInterface and registered -into the container with the tag coreshop.cart_processor and a priority attribute.

-

Example of a Cart Processor

-

For example, we create a Cart Processor, which calculates a custom field in our Cart.

-
<?php
-
-namespace AppBundle\CoreShop\Order\Cart\Processor;
-
-use CoreShop\Component\Order\Model\OrderInterface;
-use CoreShop\Component\Order\Processor\CartProcessorInterface;
-
-final class CustomCartProcessor implements CartProcessorInterface
-{
-    public function process(OrderInterface $cart): void
-    {
-        $cart->setCustomField(uniqid());
-    }
-}
-
-

We now only need to register the class:

-
app.coreshop.cart.processor.custom:
-    class: AppBundle\CoreShop\Order\Cart\Processor\CustomCartProcessor
-    tags:
-      - { name: coreshop.cart_processor, priority: 200 }
-
-

On every Cart Update, our service now gets called a the custom field gets a new unique id.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Cart/Commands.html b/docs/generated-docs/generated_docs/Development/Cart/Commands.html deleted file mode 100644 index 5df9e7a9ad..0000000000 --- a/docs/generated-docs/generated_docs/Development/Cart/Commands.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - Commands - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart Commands

-

Expire Abandoned Carts

-
# Delete only anonymous carts
-$ bin/console coreshop:cart:expire --anonymous
-
-# Delete only user carts
-$ bin/console coreshop:cart:expire --user
-
-# Delete carts older than 20 days
-$ bin/console coreshop:cart:expire --days=20
-
-

Expire Abandoned Carts via Maintenance Mode

-

By default, this feature is disabled. -If you want to swipe abandoned carts by default you need to define a expiration date:

-
core_shop_order:
-    expiration:
-        cart:
-            days: 20
-            anonymous: true
-            customer: true
-
-

Read more about automation here.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Cart/Context.html b/docs/generated-docs/generated_docs/Development/Cart/Context.html deleted file mode 100644 index eb01edc02b..0000000000 --- a/docs/generated-docs/generated_docs/Development/Cart/Context.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart Context

-

For CoreShop to determine the current cart it uses a concept called context and context resolver.

-

The Cart Context implements the Interface CoreShop\Component\Order\Context\CartContextInterface and is implemented in the Service -coreshop.context.cart:

-

Getting the current Cart

-

If you want to get the current cart, you simply use the service:

-
$cartContext = $container->get('coreshop.context.cart');
-
-// Get current cart, if none exists, it creates a new one
-$cart = $cartContext->getCart();
-
-
-

Context

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NamePriorityDescription
FixedCartContext-100Used for testing purposes or for backend order creation
SessionAndStoreBasedCartContext-555Search for a valid session cart in given store context
CustomerAndStoreBasedCartContext-777Search for a cart based on a customer. Note: This context only triggers after a user has been successfully logged in. It searches for the last available cart a user may has left.
CartContext-999If all other context classes failed finally this context will create a fresh cart
-

Create a Custom Resolver

-

To register your context, you need to use the tag: coreshop.context.cart with an optional priority attribute.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Cart/index.html b/docs/generated-docs/generated_docs/Development/Cart/index.html deleted file mode 100644 index 9e1c41ae35..0000000000 --- a/docs/generated-docs/generated_docs/Development/Cart/index.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - Cart - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Checkout/Checkout_Manager.html b/docs/generated-docs/generated_docs/Development/Checkout/Checkout_Manager.html deleted file mode 100644 index 0e3abfcd84..0000000000 --- a/docs/generated-docs/generated_docs/Development/Checkout/Checkout_Manager.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - Checkout Manager - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Checkout Manager

-

CoreShop Checkout

-

CoreShop uses a CheckoutManager to handle Checkout steps. The default installation comes with following Steps:

-
    -
  • Cart
  • -
  • Customer
  • -
  • Address
  • -
  • Shipping
  • -
  • Payment
  • -
  • Summary
  • -
-

Create a Custom CheckoutManager

-

If you want to modify the Checkout Manager, you have two options:

-
    -
  • Create a total different Checkout Manager configuration
  • -
  • Modify the default configuration
  • -
-

Create a total different Checkout Manager

-
# app/config/config.yml
-core_shop_core:
-    checkout_manager: my_custom_manager
-    checkout:
-      my_custom_manager:
-        steps:
-          customer:
-            step: coreshop.checkout.step.customer
-            priority: 10
-          address:
-            step: coreshop.checkout.step.address
-            priority: 20
-          shipping:
-            step: coreshop.checkout.step.shipping
-            priority: 30
-          payment:
-            step: coreshop.checkout.step.payment
-            priority: 40
-          summary:
-            step: coreshop.checkout.step.summary
-            priority: 50
-
-

Modify the default configuration

-
# app/config/config.yml
-core_shop_core:
-    checkout:
-        default:
-            steps:
-              payment: false                                              # disables the payment step
-              shipping: false                                             # disables the shipping step
-              payment_shipping:                                           # adds a new PaymentShiping Step
-                  step: app_bundle.coreshop.checkout.payment_shipping     # This is your service-id, the service needs to implement CoreShop\Component\Order\Checkout\CheckoutStepInterface
-                  priority: 40                                            # Priority of this step
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Checkout/Checkout_Step.html b/docs/generated-docs/generated_docs/Development/Checkout/Checkout_Step.html deleted file mode 100644 index a90aa87df0..0000000000 --- a/docs/generated-docs/generated_docs/Development/Checkout/Checkout_Step.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - Checkout Step - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Checkout Step

-

If you want to implement a custom checkout step, you need to implement the interface CoreShop\Component\Order\Checkout\CheckoutStepInterface -and register your step into your Cart Manager:

-
# app/config/config.yml
-core_shop_core:
-    checkout:
-        default:
-            steps:
-              custom:
-                  step: app.coreshop.checkout.custom
-                  priority: 50
-
-

The Checkout Controller takes care about handling -the Checkout for you then.

-

Optional Checkout Step

-

If you have an optional checkout step - depending on the cart, your Checkout Step can implement the interface CoreShop\Component\Order\Checkout\OptionalCheckoutStepInterface.

-

You need to implement the function isRequired(OrderInterface $cart)

-

Optional Checkout Step Example

-
<?php
-
-namespace CoreShop\Bundle\CoreBundle\Checkout\Step;
-
-use CoreShop\Bundle\CoreBundle\Form\Type\Checkout\PaymentType;
-use CoreShop\Component\Order\Checkout\CheckoutException;
-use CoreShop\Component\Order\Checkout\CheckoutStepInterface;
-use CoreShop\Component\Order\Checkout\OptionalCheckoutStepInterface;
-use CoreShop\Component\Order\Checkout\ValidationCheckoutStepInterface;
-use CoreShop\Component\Order\Manager\CartManagerInterface;
-use CoreShop\Component\Order\Model\OrderInterface;
-use CoreShop\Component\Payment\Model\PaymentProviderInterface;
-use CoreShop\Component\Store\Context\StoreContextInterface;
-use Symfony\Component\Form\FormFactoryInterface;
-use Symfony\Component\HttpFoundation\Request;
-
-class PaymentCheckoutStep implements CheckoutStepInterface, OptionalCheckoutStepInterface, ValidationCheckoutStepInterface
-{
-    private FormFactoryInterface $formFactory;
-    private StoreContextInterface $storeContext;
-    private CartManagerInterface $cartManager;
-
-    public function __construct(
-        FormFactoryInterface $formFactory,
-        StoreContextInterface $storeContext,
-        CartManagerInterface $cartManager
-    )
-    {
-        $this->formFactory = $formFactory;
-        $this->storeContext = $storeContext;
-        $this->cartManager = $cartManager;
-    }
-
-    public function getIdentifier(): string
-    {
-        return 'payment';
-    }
-
-    public function doAutoForward(OrderInterface $cart): bool
-    {
-        return $cart->getTotal() > 0;
-    }
-
-    public function doAutoForward(OrderInterface $cart): bool
-    {
-        return false;
-    }
-
-    public function validate(OrderInterface $cart): bool
-    {
-        return $cart->hasItems() && $cart->getPaymentProvider() instanceof PaymentProviderInterface;
-    }
-
-    public function commitStep(OrderInterface $cart, Request $request): bool
-    {
-        $form = $this->createForm($request, $cart);
-
-        if ($form->isSubmitted()) {
-            if ($form->isValid()) {
-                $cart = $form->getData();
-
-                $this->cartManager->persistCart($cart);
-
-                return true;
-            } else {
-                throw new CheckoutException('Payment Form is invalid', 'coreshop.ui.error.coreshop_checkout_payment_form_invalid');
-            }
-        }
-
-        return false;
-    }
-
-    public function prepareStep(OrderInterface $cart, Request $request): array
-    {
-        return [
-            'form' => $this->createForm($request, $cart)->createView(),
-        ];
-    }
-
-    private function createForm(Request $request, OrderInterface $cart)
-    {
-        $form = $this->formFactory->createNamed('', PaymentType::class, $cart, [
-            'payment_subject' => $cart
-        ]);
-
-        if ($request->isMethod('post')) {
-            $form = $form->handleRequest($request);
-        }
-
-        return $form;
-    }
-}
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Checkout/index.html b/docs/generated-docs/generated_docs/Development/Checkout/index.html deleted file mode 100644 index 6c84796c4b..0000000000 --- a/docs/generated-docs/generated_docs/Development/Checkout/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Checkout - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Currency_Fractions/index.html b/docs/generated-docs/generated_docs/Development/Currency_Fractions/index.html deleted file mode 100644 index 6e0acdc14b..0000000000 --- a/docs/generated-docs/generated_docs/Development/Currency_Fractions/index.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - Currency Fractions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Fraction Digits

-

CoreShop allows you working with more than 2 digits for Currency Values. The default configuration looks like this:

-
core_shop_currency:
-    money_decimal_precision: 2
-    money_decimal_factor: 100
-
-
-

money_decimal_precision: 2

-
-

Having a global precision of 2

-
-

money_decimal_factor: 100

-
-

Displaying Currency with a factor of 100 (in Pimcore Backend).

-
-

WARNING If you change these settings in an existing Installation with Orders/Products etc. you also have to create -a migration to change all the values from a precision of 2 to your new setting.

-
-

In order to handle payment values with a precision of for example 4, we introduced a new Order Property called paymentTotal. -Within a Payment, you cannot deal with a precision > 2, since a currency only has eg. 100 Cents. Therefore, we round the total -Cart/Order value to a precision of 2 into the paymentTotal Value.

-

For example:

-

Your Cart/Order is "€ 1.000,5498", your payment total then is: "€ 1.000,55".

-

If you want to display the payment total in your cart, you can use this template:

-
{% if currency.convertAndFormat(cart.total) != currency.convertAndFormat(cart.paymentTotal, 2, 100) %}
-<tr>
-    <td class="text-right" colspan="3">	
-        <strong>{{ 'coreshop.ui.payment_total'|trans }}:</strong>
-    </td>
-    <td colspan="2" class="text-right cart-total-payment-price">
-        {{ currency.convertAndFormat(cart.paymentTotal, 2, 100) }}
-    </td>
-</tr>
-{% endif %}
-
-

c

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Customers/CRUD.html b/docs/generated-docs/generated_docs/Development/Customers/CRUD.html deleted file mode 100644 index 5fd1d5d5a8..0000000000 --- a/docs/generated-docs/generated_docs/Development/Customers/CRUD.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Custom

-

CoreShop uses Pimcore Data Objects to persist Customer Information. But, it adds a little wrapper around it to be mire -dynamic and configurable. It uses a Factory and Repository Pattern to do that.

-

Create

-

If you want to create a new Custom, we need to get our Factory Service for that:

-
$customerFactory = $container->get('coreshop.factory.customer');
-$customer = $customerFactory->createNew();
-
-

No we have our customer and we can set all needed values.

-

If you now want to save it, just call the save function

-
$customer->save();
-
-

Read

-

To get customers, you need to use the Repository Service CoreShop provides you.

-
$repository = $container->get('coreshop.repository.customer');
-
-
-// Query by ID
-$customerWithIdOne = $repository->findById(1);
-
-// Get a Listing how you know it from Pimcore
-$list = $repository->getList();
-$list->setCondition("active = 1");
-$customers = $list->getObjects();
-
-
-

Update

-

Update works the same as you are used to in Pimcore

-
$repository = $container->get('coreshop.repository.customer');
-
-
-// Query by ID
-$customerWithIdOne = $repository->findById(1);
-
-// Change values
-$customerWithIdOne->setName('test');
-$customerWithIdOne->save();
-
-

Delete

-

Delete works the same as you are used to in Pimcore

-
$repository = $container->get('coreshop.repository.customer');
-
-
-// Query by ID
-$customerWithIdOne = $repository->findById(1);
-$customerWithIdOne->delete();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Customers/Company_Extension.html b/docs/generated-docs/generated_docs/Development/Customers/Company_Extension.html deleted file mode 100644 index 6c204415ec..0000000000 --- a/docs/generated-docs/generated_docs/Development/Customers/Company_Extension.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - Company Extension - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Customer Company Extension

-

The Company Entity allows you to append customers to a given company. -After a customer has been connected to a company by using the 1to1 relation company, it's possible to share addresses between company and the self-assigned addresses.

-

Access Types

-
-

Note! This is only available if a customer already is connected to a valid company!

-
-

Own Only

-

If set, the customer can create, edit and delete own addresses and choose them in checkout as well. This is the default behaviour.

-

Company Only

-

If set, the customer can create, edit und delete company addresses and choose them in checkout as well. He's not able to add addresses to himself.

-

Own And Company

-

If set, the customer can create, edit and delete company and private addresses and choose them in checkout as well.

-

Plus, the own_and_company mode allows the customer to define and modify the allocation of the address. -To do so, coreshop renders an additional choice type to the address creation/modification form.

-

Note: If a customer switches the allocation after it has been created, the address also physically gets moved to its desired location. -In this example, the customer changes the allocation from own to company:

-

Before:

-
- company A
-    - addresses
-    - customer A
-        - addresses
-            - address A
-
-

After:

-
- company A
-    - addresses
-        - address A
-    - customer A
-        - addresses
-
-

Read more about this feature here.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Customers/Context.html b/docs/generated-docs/generated_docs/Development/Customers/Context.html deleted file mode 100644 index bf2a8f1ab8..0000000000 --- a/docs/generated-docs/generated_docs/Development/Customers/Context.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Customer Context

-

CoreShop Customer Security uses Symfony Firewall to handle authentication.

-

CoreShop implemented a Context based Wrapper around that to be more flexible. Currently CoreShop implements these Contexts for Customer determination:

- -

Create a Custom Resolver

-

A Store Context needs to implement the interface CoreShop\Component\Customer\Context\CustomerContextInterface. This interface -consists of one function called "getCustomer" which returns a CoreShop\Component\Customer\Model\CustomerInterface or throws an CoreShop\Component\Customer\Context\CustomerNotFoundException

-

To register your context, you need to use the tag: coreshop.context.customer with an optional priority attribute.

-

The use case of changing this is quite rare. But if you need to, you can create a Custom Resolver if you wish.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Customers/Customer_Manager.html b/docs/generated-docs/generated_docs/Development/Customers/Customer_Manager.html deleted file mode 100644 index cb9a7c873b..0000000000 --- a/docs/generated-docs/generated_docs/Development/Customers/Customer_Manager.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - Customer Manager - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Customer Manager

-

CoreShop already implements a Customer Manager which handles creating a Customer with Addresses. -The Customer Manager implements the Interface CoreShop\Bundle\CoreBundle\Customer\CustomerManagerInterface and CoreShop implements it using the service coreshop.customer.manager.

-

Usage

-

To use the Service, you need to pass a Customer. -In our example, we gonna do that from a Controller with a FormType.

-
$customer = $this->getCustomer();
-
-if ($customer instanceof CustomerInterface && null === $customer->getUser()) {
-    return $this->redirectToRoute('coreshop_customer_profile');
-}
-
-$form = $this->get('form.factory')->createNamed('customer', CustomerRegistrationType::class, $this->get('coreshop.factory.customer')->createNew());
-
-$redirect = $this->getParameterFromRequest($request, '_redirect', $this->generateUrl('coreshop_customer_profile'));
-
-if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) {
-    $form = $form->handleRequest($request);
-
-    if ($form->isValid()) {
-        $customer = $form->getData();
-        $customer->setLocaleCode($this->get('coreshop.context.locale')->getLocaleCode());
-
-        $this->get('coreshop.customer.manager')->persistCustomer($customer);
-
-        return $this->redirect($redirect);
-    }
-}
-
-return $this->render($this->templateConfigurator->findTemplate('Register/register.html'), [
-    'form' => $form->createView(),
-]);
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Customers/Registration_Types.html b/docs/generated-docs/generated_docs/Development/Customers/Registration_Types.html deleted file mode 100644 index a7ec6df08a..0000000000 --- a/docs/generated-docs/generated_docs/Development/Customers/Registration_Types.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - Registration Types - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Customer Registration Types

-

By default, a customer needs to provide a unique and valid email address to pass a registration.

-

Register By Email

-
-

This is the default setting!

-
-

To switch to registration by a unique and valid email address, you need set the identifier:

-
core_shop_customer:
-    login_identifier: 'email'
-
-

Register By Username

-

First, you need to make sure your customer object provides a username field. -By default, coreshop does not install this field to prevent unnecessary confusion. -To implement the username field, just open your class editor and add a text field called username and you're good to go!

-

To switch to registration by a unique username, you need change the identifier:

-
core_shop_customer:
-    login_identifier: 'username'
-
-

Security

-

Form (Frontend)

-

CoreShop comes with a preinstalled constraint which will tell your customer, if an email address or username - depending on your settings - is valid or not.

-

Backend / API

-

Plus, if you're going to update a customer by API or Backend, coreshop also checks if your customer entity has unique data.

-
-

Note: Both checks only apply to non-guest entities!

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Customers/index.html b/docs/generated-docs/generated_docs/Development/Customers/index.html deleted file mode 100644 index 9f26aac940..0000000000 --- a/docs/generated-docs/generated_docs/Development/Customers/index.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - Customers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Ecommerce_Tracking/index.html b/docs/generated-docs/generated_docs/Development/Ecommerce_Tracking/index.html deleted file mode 100644 index ca09e9194c..0000000000 --- a/docs/generated-docs/generated_docs/Development/Ecommerce_Tracking/index.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - Ecommerce Tracking - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop eCommerce Tracking

-

CoreShop currently implements Tracking for Analytics and Google Tag Manager. -Tracking is automatically available (but not enabled), as soon as you enable Tag Manager or Analytics in Pimcore.

-

Per default configuration, all the ecommerce trackers are disabled. You need to enable them manually.

-

Available Trackers

-
    -
  • google-analytics-enhanced-ecommerce
  • -
  • google-analytics-universal-ecommerce
  • -
  • google-gtag-enhanced-ecommerce
  • -
  • google-gtm-classic-ecommerce
  • -
  • google-gtm-enhanced-ecommerce
  • -
  • matomo (piwik)
  • -
-

Enabling Trackers

-
core_shop_tracking:
-    trackers:
-        google-analytics-enhanced-ecommerce:
-            enabled: false
-        google-analytics-universal-ecommerce:
-            enabled: false
-        google-gtag-enhanced-ecommerce:
-            enabled: false
-        google-gtm-classic-ecommerce:
-            enabled: false
-        google-gtm-enhanced-ecommerce:
-            enabled: false
-        matomo:
-            enabled: true
-
-

External

- -

Actions

-
Product Impression
-
$this->get('coreshop.tracking.manager')->trackProductImpression($product);
-
-
Product View
-
$this->get('coreshop.tracking.manager')->trackProduct($product);
-
-
Product Action Add from Cart
-
$this->get('coreshop.tracking.manager')->trackCartAdd($cart, $product);
-
-
Product Action Remove from Cart
-
$this->get('coreshop.tracking.manager')->trackCartRemove($cart, $product);
-
-
Checkout Step
-
$this->get('coreshop.tracking.manager')->trackCheckoutStep($cart, $stepIdentifier, $isFirstStep, $checkoutOption)
-
-
Checkout Complete
-
$this->get('coreshop.tracking.manager')->trackCheckoutComplete($order)
-
-

Add a custom Tracker

-

To add a custom tracker you need to implement the interface CoreShop\Component\Tracking\Tracker\TrackerInterface

-
app.tracking.tracker.my_tracker:
-    class: AppBundle\Tracker\CustomTracker
-    parent: coreshop.tracking.tracker.ecommerce_tracker
-    tags:
-        - { name: coreshop.tracking.tracker, type: app-custom-tracker }
-
-

Google Tag Manager

-

If you have enabled the gtm in backend, CoreShop sends some data to a dataLayer object which submits the object to gtm.

-

GTM Classic eCommerce

-

If you enable the classic mode only the order gets submitted if user has successfully reached the "thank-you" page.

-

GTM Enhanced eCommerce

-

There are six Impressions/Events for Google Tag Manager Enhanced eCommerce:

-

Product Impression

-

Tag Config Example:

-
-Tag type : Universal Analytics
-Track type : Pageview
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals gtm.dom
-
-

Product Detail View

-

Tag Config Example:

-
-Tag type : Universal Analytics
-Track type : Pageview
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals gtm.dom
-
-

Checkout Step:

-
-

Event-Name: csCheckout

-
-

Tag Config Example:

-
-Tag type : Universal Analytics
-Track type : Event
-Event Category: Ecommerce
-Event Action: Checkout
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals csCheckout
-
-

Checkout Complete (Purchase):

-

Tag Config Example:

-
-Tag type : Universal Analytics
-Track type : Pageview
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals gtm.dom
-
-

Remove Item from Cart

-
-

Event-Name: csRemoveFromCart

-
-

Tag Config Example:

-
-Tag type : Universal Analytics
-Track type : Event
-Event Category: Ecommerce
-Event Action: Remove from Cart
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals csRemoveFromCart
-
-

Add Item to Cart

-
-

Event-Name: csAddToCart

-
-

Tag Config Example:

-
-Tag type : Universal Analytics
-Track type : Event
-Event Category: Ecommerce
-Event Action: Add to Cart
-Enable Enhanced Ecommerce Features: true
-Use Data Layer: true
-Trigger: event equals csAddToCart
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Events/index.html b/docs/generated-docs/generated_docs/Development/Events/index.html deleted file mode 100644 index 6598824b20..0000000000 --- a/docs/generated-docs/generated_docs/Development/Events/index.html +++ /dev/null @@ -1,544 +0,0 @@ - - - - - - - Events - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Events

-

CoreShop comes with a lot of build-in events.

-

Frontend Controller

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.customer.update_postResourceControllerEventFires after Customer has updated the profile
coreshop.customer.change_password_postResourceControllerEventFires after Customer has changed the password
coreshop.customer.newsletter_confirm_postResourceControllerEventFires after Customer has confirmed his newsletter subscription
coreshop.address.add_postResourceControllerEventFires after Customer has added a new address
coreshop.address.update_postResourceControllerEventFires after Customer has updated a address
coreshop.address.delete_preResourceControllerEventFires before Customer deletes a address
-

Cart

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.cart.updateGenericEventFires after cart has been updated
coreshop.cart.pre_add_itemGenericEventFires before a item gets added to cart
coreshop.cart.post_add_itemGenericEventFires after a item gets added to cart
coreshop.cart.pre_remove_itemGenericEventFires before a item gets removed from cart
coreshop.cart.post_remove_itemGenericEventFires after a item gets removed from cart
-

Customer

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.customer.registerCustomerRegistrationEventFires after a new customer has been generated
coreshop.customer.request_password_resetRequestPasswordChangeEventFires after password reset has been requested
coreshop.customer.password_resetGenericEventFires after new password hast been applied to customer
-

Order Document

- - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.order.shipment.wkhtml.optionsWkhtmlOptionsEventOptions Event: Use it to change wkhtml options.
coreshop.order.invoice.wkhtml.optionsWkhtmlOptionsEventOptions Event: Use it to change wkhtml options.
-

Payment

- - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.payment_provider.supportsPaymentProviderSupportsEventSupport Event: Use it to modify available Payment Providers
-

Notes

- - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.note.*.post_addGenericEventFires after a note of type * has been created
coreshop.note.*.post_deleteGenericEventFires after a note of type * has been deleted
-

Rules

- - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.rule.availability_checkRuleAvailabilityCheckEventFires in RuleAvailabilityCheck maintenance/command for every active rule.
-

Replace symbol (*) with one of those note types:

-
    -
  • -payment -
  • -
  • -update_order -
  • -
  • -update_order_item -
  • -
  • -email -
  • -
  • -order_comment -
  • -
-

Workflow

- - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.workflow.valid_transitionsWorkflowTransitionEventValid Event: Use it if you need to extend the workflow transitions
-

Transformer

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.quote_item.pre_transformGenericEventFires before proposal item gets transformed to a quote item
coreshop.quote_item.post_transformGenericEventFires after proposal item has been transformed to a quote item
coreshop.order_item.pre_transformGenericEventFires before proposal item gets transformed to a order item
coreshop.order_item.post_transformGenericEventFires after proposal item has been transformed to a order item
coreshop.quote.pre_transformGenericEventFires before proposal gets transformed to a quote
coreshop.quote.post_transformGenericEventFires after proposal has been transformed to a quote
coreshop.order.pre_transformGenericEventFires before proposal gets transformed to a order
coreshop.order.post_transformGenericEventFires after proposal has been transformed to a order
coreshop.shipment_item.pre_transformGenericEventFires before proposal item gets transformed to a shipment item
coreshop.shipment_item.post_transformGenericEventFires after proposal item has been transformed to a shipment item
coreshop.shipment.pre_transformGenericEventFires before proposal gets transformed to a shipment
coreshop.shipment.post_transformGenericEventFires after proposal has been transformed to a shipment
coreshop.invoice.pre_transformGenericEventFires before proposal gets transformed to a invoice
coreshop.invoice.post_transformGenericEventFires after proposal has been transformed to a invoice
-

Backend Controller

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameEventTypeDescription
coreshop.*.pre_createResourceControllerEventFires before object gets created in backend
coreshop.*.post_createResourceControllerEventFires after object gets created in backend
coreshop.*.pre_saveResourceControllerEventFires before object gets saved in backend
coreshop.*.post_saveResourceControllerEventFires after object gets saved in backend
coreshop.*.pre_deleteResourceControllerEventFires before object gets deleted in backend
coreshop.*.post_deleteResourceControllerEventFires after object gets deleted in backend
-

Replace symbol (*) with one of those controller:

-
    -
  • -configuration -
  • -
  • -payment_provider -
  • -
  • -exchange_rate -
  • -
  • -filter -
  • -
  • -index -
  • -
  • -notification_rule -
  • -
  • -notification_rule -
  • -
  • -cart_price_rule -
  • -
  • -product_price_rule -
  • -
  • -shipping_rule -
  • -
  • -store -
  • -
  • -tax_rule_group -
  • -
-

Workflow Events

-

There are events vor every state machine transition. Read more about it here.

-

Model Events

-

You can use Pimcore Events for CoreShops Pimcore Models: Pimcore Events

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html deleted file mode 100644 index 04d7957695..0000000000 --- a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_DataObjects.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Extend CoreShop DataObjects - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Extending CoreShop

-

CoreShop Data Objects (like CoreShopProduct or CoreShopOrder) can be changed directly within Pimcore.

-

Replace CoreShop Object Classes with your own Classes

-

CoreShop uses Pimcore Parameters to determine the Pimcore Object Class. To change it, simply add this to your config.yml

-
core_shop_order:
-    pimcore:
-        order:
-            classes:
-                model: 'Pimcore\Model\DataObject\MyOrderClass'
-                install_file: '@AppBundle/Resources/install/pimcore/classes/MyOrderClass.json'
-                repository: AppBundle\Repository\OrderRepository
-                factory: AppBundle\Factory\OrderFactory
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Forms.html b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Forms.html deleted file mode 100644 index 93b21d477d..0000000000 --- a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Forms.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - Extend CoreShop Forms - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Customizing Forms

-

The forms in CoreShop are placed in the CoreShop\Bundle\*BundleName*\Form\Type namespaces and the extensions -will be placed in AppBundle\Form\Extension.

-

Why would you customize a Form?

-

There are plenty of reasons to modify forms that have already been defined in CoreShop. -Your business needs may sometimes slightly differ from our internal assumptions.

-

You can:

-
    -
  • add completely new fields,
  • -
  • -modify existing fields, make them required, change their HTML class, change labels etc.,
  • -
  • -remove fields that are not used.
  • -
-

How to customize a CoreShop Resource Form?

-

If you want to modify the form for the Store in your system there are a few steps that you should take. -Assuming that you would like to (for example):

-
    -
  • Add a contactHours field,
  • -
-

These will be the steps that you will have to take to achieve that:

-

1. If your are planning to add new fields remember that beforehand they need to be added on the model that the form type is based on.

-

In case of our example if you need to have the contactHours on the model and the entity mapping for the Store resource. -To get to know how to prepare that go there

-

2. Create a Form Extension.

-

Your form has to extend a proper base class. How can you check that?

-

For the StoreType run:

-
$ php bin/console debug:container coreshop.form.type.store
-
-

As a result you will get the CoreShop\Bundle\StoreBundle\Form\Type\StoreType - this is the class that you need to be extending.

-
<?php
-
-namespace AppBundle\Form\Extension;
-
-use CoreShop\Bundle\StoreBundle\Form\Type\StoreType;
-use Symfony\Component\Form\AbstractTypeExtension;
-use Symfony\Component\Form\Extension\Core\Type\TextType;
-use Symfony\Component\Form\FormBuilderInterface;
-
-final class StoreTypeExtension extends AbstractTypeExtension
-{
-    public function buildForm(FormBuilderInterface $builder, array $options): void
-    {
-        // Adding new fields works just like in the parent form type.
-        $builder->add('contactHours', TextType::class, [
-            'required' => false
-        ]);
-    }
-
-    public static function getExtendedTypes(): array
-    {
-        return [StoreType::class];
-    }
-}
-
-

3. After creating your class, register this extension as a service in the AppBundle/Resources/config/services.yml:

-
services:
-    app.form.extension.type.customer_profile:
-        class: AppBundle\Form\Extension\StoreTypeExtension
-        tags:
-            - { name: form.type_extension, extended_type: CoreShop\Bundle\StoreBundle\Form\Type\StoreType }
-
-

In our case you will need to extend the ExtJs Form as well: src/AppBundle/Resources/public/pimcore/js/store.js.

-

In ExtJs your new store file need to like like this:

-
coreshop.store.item = Class.create(coreshop.store.item, {
-
-    getFormPanel: function ($super) {
-        var panel = $super();
-
-        panel.down("fieldset").add(
-            [
-                {
-                    xtype: 'textfield',
-                    fieldLabel: 'Contact Hours',
-                    name: 'contactHours'
-                }
-            ]
-        );
-
-        return this.formPanel;
-    }
-});
-
-

And you need to configure it to be loaded as well:

-
core_shop_store:
-    pimcore_admin:
-        js:
-            custom_store: '/bundles/app/pimcore/js/store.js'
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Resources.html b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Resources.html deleted file mode 100644 index c3fb14bba7..0000000000 --- a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extend_CoreShop_Resources.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - - Extend CoreShop Resources - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Extend CoreShop Resources

-

All models in Coreshop are placed in the Coreshop\Component\*ComponentName*\Model namespaces alongside with their interfaces.

-
-

Many models in CoreShop are extended in the Core component. If the model you are willing to override exists in the Core you should be extending the Core one, not the base model from the component.

-
-

How to Customize a Model

-

First things first: If you want to extend coreshop models your Bundle must extend the AbstractResourceBundle. Next you have set your supported drivers. Just add the following lines of code to your bundle class:

-
public function getSupportedDrivers(); array
-{
-    return [
-        CoreShopResourceBundle::DRIVER_DOCTRINE_ORM
-    ];
-}
-
-

After that have to tell the bundle where your models are. For that, add the override the following method in your bundle class and return the model namespace. Here is an example for the AppBundle

-
 protected function getModelNamespace(): string
-{
-    return "AppBundle\Model";
-} 
-
-

Here a quick overview for you which dictories are important for you, when customizing CoreShop models.

- - - - - - - - - - - - - - - - - - - - - -
FolderDescription
AcmeBundle/Model or AcmeBundle/EntityWhere your models are living
AcmeBundle/config/doctrine/modelPut your doctrine .yml config files in here
AcmeBundle/config/serializerThe serializer configs for the models
-

Let’s take the CoreShop\Component\Currency\Model\Currency as an example. This one is extended in Core. How can you check that?

-

First of all, you need to find the current used class by doing following:

-
$ php bin/console debug:container --parameter=coreshop.model.currency.class
-
-

As a result you will get the CoreShop\Component\Core\Model\Currency - this is the class that you need to be extending.

-

Assuming you want to add a field called flag

-

1. The first thing to do is to write your own class which will extend the base Currency class

-
<?php
-
-namespace AppBundle\Entity;
-
-use CoreShop\Component\Core\Model\Currency as BaseCurrency;
-
-class Currency extends BaseCurrency
-{
-    /**
-     * @var bool
-     */
-    private $flag;
-
-    /**
-     * @return bool
-     */
-    public function getFlag()
-    {
-        return $this->flag;
-    }
-
-    /**
-     * @param bool $flag
-     */
-    public function setFlag($flag)
-    {
-        $this->flag = $flag;
-    }
-}
-
-

2. Next define your entity’s mapping.

-

The file should be placed in AppBundle/Resources/config/doctrine/Currency.orm.yml

-
AppBundle\Entity\Currency:
-    type: mappedSuperclass
-    table: coreshop_currency
-    fields:
-        flag:
-            type: boolean
-            nullable: true
-
-

3. Finally you’ll need to override the model’s class in the app/config/config.yml.

-

Under the core_shop_* where * is the name of the bundle of the model you are customizing, in our case it will be the CoreShopCurrencyBundle -> core_shop_currency.

-
core_shop_currency:
-    resources:
-        currency:
-            classes:
-                model: AppBundle\Entity\Currency
-
-

4. Update the database. There are two ways to do it.

-

via direct database schema update:

-
$ php bin/console doctrine:schema:update --force
-
-

via migrations: -Which we strongly recommend over updating the schema.

-
$ php bin/console doctrine:migrations:diff
-$ php bin/console doctrine:migrations:migrate
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Actions.html b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Actions.html deleted file mode 100644 index 5899d4d0e8..0000000000 --- a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Actions.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - - Extending Rule Actions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Custom Price-Rule/Shipping-Rule/Notification-Rule Actions

-

Adding Price-, Shipping- or Notification-Rule Actions is the same for all of these types. Their only difference is the -tag you use and Interface you need to implement for them.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Action TypeTagInterface
Cart Price Rulecoreshop.cart_price_rule.actionCoreShop\Component\Order\Cart\Rule\Action\CartPriceRuleActionProcessorInterface
Product Price Rulecoreshop.product_price_rule.actionCoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface
Product Specific Pricecoreshop.product_specific_price_rule.actionCoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface
Shipping Rulecoreshop.shipping_rule.actionCoreShop\Component\Shipping\Rule\Action\CarrierPriceActionProcessorInterface
Notification Rulecoreshop.notification_rule.actionCoreShop\Component\Notification\Rule\Action\NotificationRuleProcessorInterface
-

Example Adding a new Action

-

Now, lets add a new Action for Product Price Rules.

-

To do so, we first need to create a new class and implement the interface listed in the table above. For Product Price Rules, we need to use -CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface

-
//AppBundle/CoreShop/CustomAction.php
-namespace AppBundle\CoreShop;
-
-final class CustomAction implements \CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface
-{
-    public function getPrice($subject, array $context, array $configuration): int 
-    {
-        //If your action gives the product a new Price, put your calculation here
-
-        return $configuration['some_value'];
-    }
-}
-
-

We also need a FormType for the actions configurations:

-
//AppBundle/Form/Type/CustomActionType.php
-namespace AppBundle\Form\Type;
-
-use Symfony\Component\Form\AbstractType;
-use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Form\Extension\Core\Type\TextType;
-
-final class CustomActionType extends AbstractType
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function buildForm(FormBuilderInterface $builder, array $options): void
-    {
-        $builder
-            ->add('some_value', TextType::class)
-        ;
-    }
-}
-
-

With configuration, comes a Javascript file as well:

-
//AppBundle/Resources/public/pimcore/js/custom_action.js
-
-pimcore.registerNS('coreshop.product.pricerule.actions.custom');
-coreshop.product.pricerule.actions.custom = Class.create(coreshop.rules.actions.abstract, {
-
-    type: 'custom',
-
-    getForm: function () {
-        var some_value = 0;
-        var me = this;
-
-        if (this.data) {
-            some_value = this.data.some_value / 100;
-        }
-
-        var some_valueField = new Ext.form.NumberField({
-            fieldLabel: t('custom'),
-            name: 'some_value',
-            value: some_value,
-            decimalPrecision: 2
-        });
-
-        this.form = new Ext.form.Panel({
-            items: [
-                some_valueField
-            ]
-        });
-
-        return this.form;
-    }
-});
-
-
-

Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony structure, omit the web.

-
bin/console assets:install web
-
-

Registering the Custom Action to the Container and load the Javascript File

-

We now need to create our Service Definition for our Custom Action:

-
app.product_price_rule.custom:
-    class: AppBundle\CoreShop\CustomAction
-    tags:
-      - { name: coreshop.product_price_rule.action, type: custom, form-type: AppBundle\Form\Type\CustomActionType }
-
-

and add this to your config.yml:

-
core_shop_product:
-    pimcore_admin:
-        js:
-            custom_action: '/bundles/app/pimcore/js/custom_action.js'
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Conditions.html b/docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Conditions.html deleted file mode 100644 index 808b46530a..0000000000 --- a/docs/generated-docs/generated_docs/Development/Extending_Guide/Extending_Rule_Conditions.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - - Extending Rule Conditions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Custom Price-Rule/Shipping-Rule/Notification-Rule Conditions

-

Adding Price-, Shipping- or Notification-Rule Conditions is the same for all of these types. They're only difference is the -tag you use and Interface you need to implement for them.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Action TypeTagInterface/AbstractClass
Cart Price Rulecoreshop.cart_price_rule.conditionCoreShop\Component\Order\Cart\Rule\Condition\AbstractConditionChecker
Product Price Rulecoreshop.product_price_rule.conditionCoreShop\Component\Rule\Condition\ConditionCheckerInterface
Product Specific Pricecoreshop.product_specific_price_rule.conditionCoreShop\Component\Rule\Condition\ConditionCheckerInterface
Shipping Rulecoreshop.shipping_rule.conditionCoreShop\Component\Shipping\Rule\Condition\CategoriesConditionChecker
Notification Rulecoreshop.notification_rule.conditionCoreShop\Component\Notification\Rule\Condition\AbstractConditionChecker
-

Example Adding a new Condition

-

Now, lets add a new Condition for Product Price Rules.

-

To do so, we first need to create a new class and implement the interface listed in the table above. For Product Price Rules, we need to use -CoreShop\Component\Rule\Condition\ConditionCheckerInterface

-
//AppBundle/CoreShop/CustomCondition.php
-namespace AppBundle\CoreShop;
-
-use CoreShop\Component\Resource\Model\ResourceInterface;
-use CoreShop\Component\Rule\Model\RuleInterface;
-
-final class CustomCondition implements \CoreShop\Component\Rule\Condition\ConditionCheckerInterface
-{
-    public function isValid(ResourceInterface $subject, RuleInterface $rule, array $configuration, array $params = []): bool
-    {
-        //return true if valid, false if not
-        return true;
-    }
-}
-
-

We also need a FormType for the conditions configurations:

-
//AppBundle/Form/Type/CustomConditionType.php
-namespace AppBundle\Form\Type;
-
-final class CustomConditionType extends AbstractType
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function buildForm(FormBuilderInterface $builder, array $options): void
-    {
-        $builder
-            ->add('some_value', TextType::class)
-        ;
-    }
-}
-
-

With configuration, comes a Javascript file as well:

-
//AppBundle/Resources/public/pimcore/js/custom_condition.js
-
-pimcore.registerNS('coreshop.product.pricerule.conditions.custom');
-coreshop.product.pricerule.conditions.custom = Class.create(coreshop.rules.conditions.abstract, {
-
-    type: 'custom',
-
-    getForm: function () {
-        var some_value = 0;
-        var me = this;
-
-        if (this.data) {
-            some_value = this.data.some_value / 100;
-        }
-
-        var some_valueField = new Ext.form.NumberField({
-            fieldLabel: t('custom'),
-            name: 'some_value',
-            value: some_value,
-            decimalPrecision: 2
-        });
-
-        this.form = new Ext.form.Panel({
-            items: [
-                some_valueField
-            ]
-        });
-
-        return this.form;
-    }
-});
-
-

Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony structure, omit the web.

-
bin/console assets:install web
-
-

Registering the Custom Condition to the Container and load the Javascript File

-

We now need to create our Service Definition for our Custom Condition:

-
app.product_price_rule.custom_condition:
-    class: AppBundle\CoreShop\CustomCondition
-    tags:
-      - { name: coreshop.product_price_rule.condition, type: custom, form-type: AppBundle\Form\Type\CustomConditionType }
-
-

and add this to your config.yml:

-
core_shop_product:
-    pimcore_admin:
-        js:
-            custom_condition: '/bundles/app/pimcore/js/custom_condition.js'
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/Custom_Filter.html b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/Custom_Filter.html deleted file mode 100644 index 2d6024db53..0000000000 --- a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/Custom_Filter.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - Custom Filter - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Filter - Create Custom Filter

-

1. We need to create 2 new files: -- FormType for processing the Input Data -- And a FilterConditionProcessorInterface, which checks if a cart fulfills the condition.

-
namespace AppBundle\Filter\Form\Type\Condition;
-
-use Symfony\Component\Form\AbstractType;
-use Symfony\Component\Form\Extension\Core\Type\IntegerType;
-use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Validator\Constraints\NotBlank;
-use Symfony\Component\Validator\Constraints\Type;
-
-final class MyFilterCondition extends AbstractType
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function buildForm(FormBuilderInterface $builder, array $options)
-    {
-        $builder
-            ->add('myData', IntegerType::class, [
-                'constraints' => [
-                    new NotBlank(['groups' => ['coreshop']]),
-                    new Type(['type' => 'numeric', 'groups' => ['coreshop']]),
-                ],
-            ])
-        ;
-    }
-}
-
-
-
namespace AppBundle\Filter;
-
-use CoreShop\Component\Address\Model\AddressInterface;
-use CoreShop\Component\Core\Model\CarrierInterface;
-
-class MyFilterCondition extends FilterConditionProcessorInterface
-{
-    public function prepareValuesForRendering(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter)
-    {
-        //Prepare values for rendering HTML
-    }
-
-    public function addCondition(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter, ParameterBag $parameterBag, $isPrecondition = false)
-    {
-        //Add Condition to Listing
-
-        return $currentFilter;
-    }
-
-}
-
-

2. Register MyFilterCondition as service with tag coreshop.filter.condition_type, type and form

-
app.coreshop.shipping_rule.condition.my_rule:
-    class: AppBundle\Shipping\Rule\Condition\MyRuleConditionChecker
-    tags:
-      - { name: coreshop.shipping_rule.condition, type: my_rule, form-type: AppBundle\Shipping\Form\Type\Condition\MyRuleConfigurationType }
-
-app.filter.condition_type.my_filter_condition:
-    class: AppBundle\Filter\MyFilterCondition
-    tags:
-      - { name: coreshop.filter.condition_type, type: app-my-filter, form-type: AppBundle\Filter\Form\Type\Condition\MyFilterCondition}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/index.html b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/index.html deleted file mode 100644 index 11f7174f94..0000000000 --- a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Filter/index.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - Filter - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Filter

-

After creating the index, you can configure the Filters.

-

Create a new Filter

-

You can create different Filters for different Categories.

-

A filter exists of different settings, pre-conditions, filters and similar products.

-

You can even create Custom Filters

-

Filter Settings

-

Filter Settings

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldDescription
NameName of the Filter-Set
IndexWhich Index should be used
OrderOrder of the products
Order KeyOrder key (index-field) to sort from
Results per PageHow many products should be displayed per page, you can use Shop Settings, or override it
-

Pre-Conditions

-

Filter Pre-Conditions

-

You can define pre-filters for the index.

-

Conditions

-

Filter Conditions

-

Here you can define different kind of filters. These filters will be displayed on the front-page for customers to find products.

-

CoreShop currently supports 4 types of filters:

-
    -
  • -Select -
  • -
  • -Multiselect -
  • -
  • -Range -
  • -
  • -Boolean -
  • -
-

Select Condition

-

A select condition is basically just a simple dropdown field where customer can select one field.

-

Filter Condition Select

-

Multiselect Condition

-

A multi-select condition is basically a list of fields where customer can select multiple entries.

-

Filter Condition Select

-

Range Condition

-

A Range Condition is a slider of two ranges. The ranges are calculated automatically using MIN and MAX values.

-

Filter Condition Select

-

Boolean Condition

-

Boolean is a Condition where the customer can check different values.

-

Filter Condition Select

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Extension.html b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Extension.html deleted file mode 100644 index e7b3087f11..0000000000 --- a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Extension.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - Extension - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Index Extension

-

In order to make the index more flexible, it is possible for you to write extensions. Extensions allow you to do following things:

-
- Add more "default" columns and corresponding data
-- Pre Filter an mysql index
-
-

To create a new extension, you need to implement either the interface -CoreShop\Component\Index\Extension\IndexColumnsExtensionInterface -for column extensions or the interface -CoreShop\Bundle\IndexBundle\Extension\MysqlIndexQueryExtensionInterface -for mysql query extensions.

-

You then need to register your service using the tag coreshop.index.extension

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Interpreter.html b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Interpreter.html deleted file mode 100644 index 01d2f53150..0000000000 --- a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/Interpreter.html +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - Interpreter - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Index Interpreter

-

To prepare your index and transform data, you use one of the existing Interpreter or create one yourself.

-

CoreShop currently has following Interpreters:

-
    -
  • -Object: converts an object or and object array to relations. It saves the values to the relations inex
  • -
  • -ObjectId: converts an object to its ID
  • -
  • -ObjectIdSum: calculates the sum of all IDs. (Could be used for similar products)
  • -
  • -ObjectProperty: calls a getter method of the value
  • -
  • -Soundex: calls PHP soundex function (Could be used for similar products)
  • -
-

Create a Custom Interpreter

-

1 We need to create 2 new files:

-
    -
  • FormType for processing the Input Data
  • -
  • And a InterpreterInterface, which interprets the data
  • -
-

-namespace AppBundle\Index\Form\Type;
-
-use Symfony\Component\Form\AbstractType;
-use Symfony\Component\Form\Extension\Core\Type\IntegerType;
-use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Validator\Constraints\NotBlank;
-use Symfony\Component\Validator\Constraints\Type;
-
-final class MyInterpreterType extends AbstractType
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function buildForm(FormBuilderInterface $builder, array $options)
-    {
-        $builder
-            ->add('myInterpreterData', IntegerType::class, [
-                'constraints' => [
-                    new NotBlank(['groups' => ['coreshop']]),
-                    new Type(['type' => 'numeric', 'groups' => ['coreshop']]),
-                ],
-            ])
-        ;
-    }
-}
-
-
-
namespace AppBundle\CoreShop\Index\Interpreter;
-
-use CoreShop\Component\Index\Interpreter\InterpreterInterface;
-
-class MyInterpreter implements InterpreterInterface
-{
-    public function interpret($value, IndexableInterface $indexable, IndexColumnInterface $config, array $interpreterConfig = []) {
-        //Do some interpretation here
-
-        return $value;
-    }
-}
-
-

2:Register MyInterpreter as service with tag coreshop.index.interpreter, type and form

-
app.index.interpreter.my_interpreter:
-    class: AppBundle\CoreShop\Index\Interpreter\MyInterpreter
-    tags:
-     - { name: coreshop.index.interpreter, type: my_interpreter, form-type: AppBundle\Index\Form\Type\MyInterpreterType}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/index.html b/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/index.html deleted file mode 100644 index 41a45d7d03..0000000000 --- a/docs/generated-docs/generated_docs/Development/Index_and_Filters/Index/index.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - Index - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Index

-

To create a rich layered navigation (faceted navigation), you need to create an index of your Products.

-

Create a new Index

-

CoreShop currently supports two type of indexes:

-
    -
  • Mysql
  • -
  • ~~Elasticsearch~~
  • -
-

Add Fields

-

To add a new field, simply drag'n'drop the field from the left tree to the right tree.

-

Index Fields

-

Field Properties

-

Every field has some properties that needs to be configured

-

Field

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldDescription
KeyPimcore Field Name
NameName in the Index
Getter ClassGetter Class is important for field-types like "Localized Fields", "Classification Store", "Object Brick" and "Field Collection". CoreShop needs it to get the right value for the index
InterpreterUsing Interpreters helps you to transform values before they get stored in the index. For example: Resolving dependencies, create a similarity Index
TypeType of the field in the index, depends on which Index-Type you are using. MySql or Elasticsearch
Getter ConfigConfiguration depends on Getter, for example: Language for Localized Fields
-

Re-Index

-

If you make changes to the index, you need to re-index all of your products. To do that, there is a CLI command.

-
$ php bin/console coreshop:index
-
-

If you don't want to re-index all of your indices, you can pass the corresponding IDs or names of the indices separated -with a space as arguments to the CLI command. The following example will only re-index indices with IDs 1 and 2 and name -"Products". If none of those indices exist, nothing will be re-indexed.

-
$ php bin/console coreshop:index 1 2 Products
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Index_and_Filters/index.html b/docs/generated-docs/generated_docs/Development/Index_and_Filters/index.html deleted file mode 100644 index 2e7671a7c6..0000000000 --- a/docs/generated-docs/generated_docs/Development/Index_and_Filters/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Index and Filters - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Inventory/index.html b/docs/generated-docs/generated_docs/Development/Inventory/index.html deleted file mode 100644 index e28aeba65a..0000000000 --- a/docs/generated-docs/generated_docs/Development/Inventory/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Inventory - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Inventory

-

Twig Helper

-

There are some Helpers to check the product inventory.

-

Inventory Available

-
{% if coreshop_inventory_is_available(product) %}
-    {# show cart button since there is at least one item available #}
-{% endif %}
-
-

Inventory is Sufficient

-
{% if coreshop_inventory_is_sufficient(product, 10) %}
-    {# do something here since there are at least 10 items available #}
-{% endif %}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Countries/CRUD.html b/docs/generated-docs/generated_docs/Development/Localization/Countries/CRUD.html deleted file mode 100644 index df55381498..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Countries/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Countries

-

Create

-

If you want to create a Country via API, you can do following:

-
$newCountry = $container->get('coreshop.factory.country')->createNew();
-
-

Now you have a new Country, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.country')->persist($newCountry);
-$container->get('coreshop.manager.country')->flush();
-
-

You now have a new persisted Country.

-

Read

-

If you want to query for Countries, you can do following:

-
$countryRepository = $container->get('coreshop.repository.country');
-
-$queryBuilder = $countryRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$countries = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Country, you need to do following:

-
// Fetch Country
-
-$country = $countryRepository->findById(1);
-$country->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.country')->persist($country);
-$container->get('coreshop.manager.country')->flush();
-
-

Delete

-

If you want to update and existing Country, you need to do following:

-
// Fetch Country
-
-$country = $countryRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.country')->remove($country);
-$container->get('coreshop.manager.country')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Countries/Context.html b/docs/generated-docs/generated_docs/Development/Localization/Countries/Context.html deleted file mode 100644 index 575e951969..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Countries/Context.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - - Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Country Context

-

For CoreShop to determine the current country the visitor or customer comes from, -it uses a concept called context and context resolver.

-

Context

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NamePriorityTagDescription
FixedCountryContextdefaultcoreshop.context.countryUsed for testing purposes
CountryContextdefaultcoreshop.context.countryCheck for a country within the country request resolver
StoreAwareCountryContextdefaultcoreshop.context.countryCheck if current country is available in current store context
-

Resolver

- - - - - - - - - - - - - - - - - -
NamePriorityTagDescription
GeoLiteBasedRequestResolver10coreshop.context.country.request_based.resolverThis Resolver tries to determinate the users location by using the Geo Lite Database.
-

These resolver takes care about finding the correct country for the current request.

-

Create a Custom Resolver

-

A Country Context needs to implement the interface CoreShop\Component\Address\Context\CountryContextInterface. -This interface consists of one method called getCountry which returns a CoreShop\Component\Address\Model\CountryInterface or throws an CoreShop\Component\Address\Context\CountryNotFoundException.

-

To register your context, you need to use the tag: coreshop.context.country with an optional priority attribute.

-

Create a Request based Resolver

-

CoreShop already implements Request based country context resolver. -So if your Context depends on the current request, you can create a custom RequestBased Resolver. -To do that, implement the interface CoreShop\Component\Address\Context\RequestBased\RequestResolverInterface -with the method findCountry. This method either returns a country or null.

-

To register this resolver, use the tag: coreshop.context.country.request_based.resolver with an optional priority attribute.

-

Example

-

We want to a CountryContext to be based on the Pimcore Document. So if we are on site /de, we want to resolve to Austria, if we -are on page /en we want to resolve to Country Great Britain:

-

1: First of all we need to create our RequestBased Country Context:

-
<?php
-
-namespace AppBundle\CoreShop\Address\Context;
-
-use CoreShop\Component\Address\Context\RequestBased\RequestResolverInterface;
-use CoreShop\Component\Address\Repository\CountryRepositoryInterface;
-use Pimcore\Http\Request\Resolver\DocumentResolver;
-use Symfony\Component\HttpFoundation\Request;
-
-final class DocumentBasedRequestRequestResolver implements RequestResolverInterface
-{
-    /**
-     * @var DocumentResolver
-     */
-    private $pimcoreDocumentResolver;
-
-    /**
-     * @var CountryRepositoryInterface
-     */
-    private $countryRepository;
-
-    /**
-     * @param DocumentResolver $pimcoreDocumentResolver
-     * @param CountryRepositoryInterface $countryRepository
-     */
-    public function __construct(DocumentResolver $pimcoreDocumentResolver, CountryRepositoryInterface $countryRepository)
-    {
-        $this->pimcoreDocumentResolver = $pimcoreDocumentResolver;
-        $this->countryRepository = $countryRepository;
-    }
-
-    public function findCountry(Request $request)
-    {
-        $doc = $this->pimcoreDocumentResolver->getDocument($request);
-
-        if (substr($doc->getFullPath(), 0, 3) === '/en') {
-            return $this->countryRepository->findByCode('GB');
-        }
-
-        if (substr($doc->getFullPath(), 0, 3) === '/de') {
-            return $this->countryRepository->findByCode('AT');
-        }
-
-        return null;
-    }
-}
-
-

Now we need to configure the service in src/AppBundle/Resources/config/services.yml

-
services:
-  app.coreshop.country.context.request.document_based:
-    class: AppBundle\CoreShop\Address\Context\DocumentBasedRequestRequestResolver
-    arguments:
-      - '@Pimcore\Http\Request\Resolver\DocumentResolver'
-      - '@coreshop.repository.country'
-    tags:
-      - { name: coreshop.context.country.request_based.resolver }
-
-
-

CoreShop now tries to resolve the current country based on the Pimcore Site we are on.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Countries/index.html b/docs/generated-docs/generated_docs/Development/Localization/Countries/index.html deleted file mode 100644 index a71969dd57..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Countries/index.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - Countries - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Currencies/CRUD.html b/docs/generated-docs/generated_docs/Development/Localization/Currencies/CRUD.html deleted file mode 100644 index c0757dc6d5..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Currencies/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Currencies

-

Create

-

If you want to create a Currency via API, you can do following:

-
$newCurrency = $container->get('coreshop.factory.currency')->createNew();
-
-

Now you have a new Currency, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.currency')->persist($newCurrency);
-$container->get('coreshop.manager.currency')->flush();
-
-

You now have a new persisted Currency.

-

Read

-

If you want to query for Currencies, you can do following:

-
$currencyRepository = $container->get('coreshop.repository.currency');
-
-$queryBuilder = $currencyRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$currencies = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Currency, you need to do following:

-
// Fetch Currency
-
-$currency = $currencyRepository->findById(1);
-$currency->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.currency')->persist($currency);
-$container->get('coreshop.manager.currency')->flush();
-
-

Delete

-

If you want to update and existing Currency, you need to do following:

-
// Fetch Currency
-
-$currency = $currencyRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.currency')->remove($currency);
-$container->get('coreshop.manager.currency')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Currencies/Context.html b/docs/generated-docs/generated_docs/Development/Localization/Currencies/Context.html deleted file mode 100644 index a2701da269..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Currencies/Context.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Currency Context

-

For CoreShop to determine the current currency it uses a concept called context and context resolver.

-

Context

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NamePriorityTagDescription
FixedCurrencyContextdefaultcoreshop.context.currencyUsed for testing purposes
StorageBasedCurrencyContextdefaultcoreshop.context.currencycheck if a currency has been changed during a frontend request
CountryAwareCurrencyContextdefaultcoreshop.context.currencyMostly this context will apply since it will get the currency based on the current country context
-

These Contexts take care about finding the correct currency for the current request.

-

Create a Custom Resolver

-

A Currency Context needs to implement the interface CoreShop\Component\Currency\Context\CurrencyContextInterface. -This interface consists of one method called getCurrency which returns a CoreShop\Component\Currency\Model\CurrencyInterface or throws an CoreShop\Component\Currency\Context\CurrencyNotFoundException

-

To register your context, you need to use the tag: coreshop.context.currency with an optional priority attribute.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Currencies/index.html b/docs/generated-docs/generated_docs/Development/Localization/Currencies/index.html deleted file mode 100644 index 8fe83e5131..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Currencies/index.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - Currencies - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/States/CRUD.html b/docs/generated-docs/generated_docs/Development/Localization/States/CRUD.html deleted file mode 100644 index 549917cb6c..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/States/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

States

-

Create

-

If you want to create a State via API, you can do following:

-
$newState = $container->get('coreshop.factory.state')->createNew();
-
-

Now you have a new State, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.state')->persist($newState);
-$container->get('coreshop.manager.state')->flush();
-
-

You now have a new persisted State.

-

Read

-

If you want to query for States, you can do following:

-
$stateRepository = $container->get('coreshop.repository.state');
-
-$queryBuilder = $stateRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$states = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing State, you need to do following:

-
// Fetch State
-
-$state = $stateRepository->findById(1);
-$state->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.state')->persist($state);
-$container->get('coreshop.manager.state')->flush();
-
-

Delete

-

If you want to update and existing State, you need to do following:

-
// Fetch State
-
-$state = $stateRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.state')->remove($state);
-$container->get('coreshop.manager.state')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/States/index.html b/docs/generated-docs/generated_docs/Development/Localization/States/index.html deleted file mode 100644 index a3e3686cca..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/States/index.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - States - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/CRUD.html b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/CRUD.html deleted file mode 100644 index fad26a9a6f..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Tax Rates

-

Create

-

If you want to create a Zone via API, you can do following:

-
$newZone = $container->get('coreshop.factory.tax_rate')->createNew();
-
-

Now you have a new Zone, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.tax_rate')->persist($newZone);
-$container->get('coreshop.manager.tax_rate')->flush();
-
-

You now have a new persisted Zone.

-

Read

-

If you want to query for Tax Rates, you can do following:

-
$rateRepository = $container->get('coreshop.repository.tax_rate');
-
-$queryBuilder = $rateRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$rates = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Zone, you need to do following:

-
// Fetch Zone
-
-$rate = $rateRepository->findById(1);
-$rate->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.tax_rate')->persist($rate);
-$container->get('coreshop.manager.tax_rate')->flush();
-
-

Delete

-

If you want to update and existing Zone, you need to do following:

-
// Fetch Zone
-
-$rate = $rateRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.tax_rate')->remove($rate);
-$container->get('coreshop.manager.tax_rate')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/index.html b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/index.html deleted file mode 100644 index da2e3619d9..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rate/index.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - Tax Rate - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/CRUD.html b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/CRUD.html deleted file mode 100644 index da2a8cb073..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Tax Rules

-

Create

-

If you want to create a Tax Rule via API, you can do following:

-
$newTaxRule = $container->get('coreshop.factory.tax_rule')->createNew();
-
-

Now you have a new Tax Rule, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.tax_rule')->persist($newTaxRule);
-$container->get('coreshop.manager.tax_rule')->flush();
-
-

You now have a new persisted Tax Rule.

-

Read

-

If you want to query for Tax Rules, you can do following:

-
$ruleRepository = $container->get('coreshop.repository.tax_rule');
-
-$queryBuilder = $ruleRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$rules = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Tax Rule, you need to do following:

-
// Fetch Tax Rule
-
-$rule = $ruleRepository->findById(1);
-$rule->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.tax_rule')->persist($rule);
-$container->get('coreshop.manager.tax_rule')->flush();
-
-

Delete

-

If you want to update and existing Tax Rule, you need to do following:

-
// Fetch Tax Rule
-
-$rule = $ruleRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.tax_rule')->remove($rule);
-$container->get('coreshop.manager.tax_rule')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html deleted file mode 100644 index bc2f06ce7d..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/Tax_Factory.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - Tax Factory - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/index.html b/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/index.html deleted file mode 100644 index 32db286484..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Taxes/Tax_Rule/index.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - Tax Rule - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Taxes/index.html b/docs/generated-docs/generated_docs/Development/Localization/Taxes/index.html deleted file mode 100644 index 295103fe69..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Taxes/index.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - Taxes - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Zones/CRUD.html b/docs/generated-docs/generated_docs/Development/Localization/Zones/CRUD.html deleted file mode 100644 index b8b47d2d7f..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Zones/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Zones

-

Create

-

If you want to create a Zone via API, you can do following:

-
$newZone = $container->get('coreshop.factory.zone')->createNew();
-
-

Now you have a new Zone, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.zone')->persist($newZone);
-$container->get('coreshop.manager.zone')->flush();
-
-

You now have a new persisted Zone.

-

Read

-

If you want to query for Zones, you can do following:

-
$zoneRepository = $container->get('coreshop.repository.zone');
-
-$queryBuilder = $zoneRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$zones = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Zone, you need to do following:

-
// Fetch Zone
-
-$zone = $zoneRepository->findById(1);
-$zone->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.zone')->persist($zone);
-$container->get('coreshop.manager.zone')->flush();
-
-

Delete

-

If you want to update and existing Zone, you need to do following:

-
// Fetch Zone
-
-$zone = $zoneRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.zone')->remove($zone);
-$container->get('coreshop.manager.zone')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/Zones/index.html b/docs/generated-docs/generated_docs/Development/Localization/Zones/index.html deleted file mode 100644 index fb37ad095e..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/Zones/index.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - Zones - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Localization/index.html b/docs/generated-docs/generated_docs/Development/Localization/index.html deleted file mode 100644 index ab18a8c4cc..0000000000 --- a/docs/generated-docs/generated_docs/Development/Localization/index.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - Localization - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Actions.html b/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Actions.html deleted file mode 100644 index ea30985811..0000000000 --- a/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Actions.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - Custom Actions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Conditions.html b/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Conditions.html deleted file mode 100644 index 7f3e484663..0000000000 --- a/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Conditions.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - Custom Conditions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Types.html b/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Types.html deleted file mode 100644 index 4567e7186f..0000000000 --- a/docs/generated-docs/generated_docs/Development/Notification_Rules/Custom_Types.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Custom Types - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Notification Rule Custom Type

-

Notification Types are registered dynamically by using tag-attributes on conditions and actions. If you want to have your own -type, you can do so by adding a new condition or action and specify your own type:

-
services:
-  app.coreshop.notification_rule.condition.order.custom_notification_condition:
-    class: AppBundle\CoreShop\Notification\CustomNotificationCondition
-    tags:
-      - { name: coreshop.notification_rule.condition, type: custom_condition, notification-type: custom, form-type: AppBundle\Form\Type\CoreShop\CustomConditionType }
-
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Notification_Rules/Triggering.html b/docs/generated-docs/generated_docs/Development/Notification_Rules/Triggering.html deleted file mode 100644 index 7ab7aba305..0000000000 --- a/docs/generated-docs/generated_docs/Development/Notification_Rules/Triggering.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - Triggering - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Notification Trigger Notifications

-

Triggering Notification events is quite easy, you can use the CoreShop\Component\Notification\Processor\RulesProcessorInterface implemented by service -@coreshop.notification_rule.processor

-

You also need to add different kinds of parameters based on your Notification Type. -In our case, we trigger an Order event.

-
$this->rulesProcessor->applyRules('order', $event->getProposal(), [
-    'fromState' => $event->getMarking()->getPlaces(),
-    'toState' => $event->getTransition()->getTos(),
-    '_locale' => $order->getLocaleCode(),
-    'recipient' => $customer->getEmail(),
-    'firstname' => $customer->getFirstname(),
-    'lastname' => $customer->getLastname(),
-    'orderNumber' => $order->getOrderNumber(),
-    'transition' => $event->getTransition()->getName()
-]);
-
-

The rest is now handled by CoreShop Notifications.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Notification_Rules/index.html b/docs/generated-docs/generated_docs/Development/Notification_Rules/index.html deleted file mode 100644 index 364f6fff20..0000000000 --- a/docs/generated-docs/generated_docs/Development/Notification_Rules/index.html +++ /dev/null @@ -1,703 +0,0 @@ - - - - - - - Notification Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Notification Rules

-

Notification Rules are responsible for all types of notification triggered by CoreShop. -It handles notification for following types:

-
    -
  • order
  • -
  • quote
  • -
  • invoice
  • -
  • shipment
  • -
  • user
  • -
  • payment
  • -
-

Overview

-

Let's checkout each notification type:

-

Order

-

Allowed Conditions

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
Invoice StateDispatch if given Invoice State is active
Invoice TransitionDispatch if given Invoice Transition has been applied
Payment StateDispatch if given Payment State is active
Payment TransitionDispatch if given Payment Transition has been applied
Shipping StateDispatch if given Shipping State is active
Shipping TransitionDispatch if given Shipping Transition has been applied
Order StateDispatch if given Order State is active
Order TransitionDispatch if given Order Transition has been applied
CarriersDispatch if given Carrier has been selected in Order
CommentDispatch if a Comment Action has been applied. Available Types: create comment
-

Allowed Actions

- - - - - - - - - - - - - - - - - -
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
-

Available Placeholders keys for email templates

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyValue
objectObject of type OrderInterface
fromStateState identifier from which it is transitioning away from
toStateState identifier from which it is transitioning to
transitionUsed transition
_localeUsed locale
recipientCustomer E-Mail Address
firstnameCustomer Firstname
lastnameCustomer Lastname
orderNumberOrder Number
-

Available Placeholders keys for email templates for comment

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyValue
objectObject of type OrderInterface
_localeUsed locale
recipientCustomer E-Mail Address
firstnameCustomer Firstname
lastnameCustomer Lastname
orderNumberOrder Number
typeType of comment
submitAsEmailshould comment be sent as mail
commentcontents of the comment
-

Shipment

-

Allowed Conditions

- - - - - - - - - - - - - - - - - -
NameDescription
Shipping StateDispatch if given Shipping State is active
Shipping TransitionDispatch if given Shipping Transition has been applied
-

Allowed Actions

- - - - - - - - - - - - - - - - - -
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
-

Available Placeholders keys for email templates

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyValue
objectObject of type OrderShipmentInterface
orderObject of type OrderInterface
fromStateState identifier from which it is transitioning away from
toStateState identifier from which it is transitioning to
transitionUsed transition
-

Invoice

-

Allowed Conditions

- - - - - - - - - - - - - - - - - -
NameDescription
Invoice StateDispatch if given Invoice State is active
Invoice TransitionDispatch if given Invoice Transition has been applied
-

Allowed Actions

- - - - - - - - - - - - - - - - - -
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
-

Available Placeholders keys for email templates

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyValue
objectObject of type OrderInvoiceInterface
orderObject of type OrderInterface
fromStateState identifier from which it is transitioning away from
toStateState identifier from which it is transitioning to
transitionUsed transition
-

Payment

-

Allowed Conditions

- - - - - - - - - - - - - - - - - -
NameDescription
Payment StateDispatch if given Payment State is active
Payment TransitionDispatch if given Payment Transition has been applied
-

Allowed Actions

- - - - - - - - - - - - - - - - - -
NameDescription
Order EmailEmail with Order Object
EmailDefault Email without Order Object
-

Available Placeholders keys for email templates

- - - - - - - - - - - - - - - - - - - - - -
KeyValue
objectObject of type PaymentInterface
orderObject of type OrderInterface
paymentStateState of the Payment
-

User

-

Allowed Conditions

- - - - - - - - - - - - - -
NameDescription
User TypeDispatch if given Type has been applied. Allowed Types: new account, password reset
-

Allowed Actions

- - - - - - - - - - - - - -
NameDescription
EmailDefault Email without Order Object
-

Available Placeholders keys for email templates

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyValue
objectObject of type CustomerInterface
recipientCustomer E-Mail Address
genderCustomer Gender
firstnameCustomer Firstname
lastnameCustomer Lastname
emailCustomer E-Mail
typetype of customer notification
-

Additional Placeholders keys for Password Reset

- - - - - - - - - - - - - -
KeyValue
resetLinkLink where customer can reset his Password
-

Additional Placeholders keys for Request Newsletter

- - - - - - - - - - - - - - - - - -
KeyValue
confirmLinkLink where customer can confirm his Newsletter subscription
tokenConfirmation Token
-

Quote

-

Allowed Conditions

- - - - - - - - - - - - - -
NameDescription
CarriersDispatch if given Carrier has been selected in Order
-

Allowed Actions

- - - - - - - - - - - - - -
NameDescription
EmailDefault Email without Order Object
-

Available Placeholders keys for email templates

- - - - - - - - - - - - - -
KeyValue
objectObject of type QuoteInterface
-

Custom Implementation

-

It's also easy to implement custom notification rules. Read more about this here

-

Extend CoreShop Notification Rules

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Order/AdditionalData.html b/docs/generated-docs/generated_docs/Development/Order/AdditionalData.html deleted file mode 100644 index ca8ece04a9..0000000000 --- a/docs/generated-docs/generated_docs/Development/Order/AdditionalData.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - - AdditionalData - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Additional Data in Order

-

Sometimes you need to implement additional information in your order (Besides the comment field, which is available by default in the shipping checkout step).

-
-

Note: To add custom fields you need a custom checkout step.

-
-
    -
  1. Create your custom brick and apply it to the classes:
  2. -
-
    -
  • Cart (additionalData)
  • -
  • Order (additionalData)
  • -
  • Quote (additionalData)
  • -
-
    -
  1. Add fields to your custom checkout step (createForm()):
  2. -
-
$form->add('af_secretField', TextType::class, [
-    'required' => false,
-    'label' => 'coreshop.ui.your_secret_field'
-]);
-$form->add('af_secondSecretField', TextType::class, [
-    'required' => false,
-    'label' => 'coreshop.ui.your_second_secret_field'
-]);
-
-
    -
  1. Store data in cart (commitStep())
  2. -
-
use Pimcore\Model\DataObject\Objectbrick\Data\AdditionalField;
-
-if ($form->isSubmitted()) {
-    if ($form->isValid()) {
-        $formData = $form->getData();
-        if(!empty($formData['af_secretField'])) {
-            $brick = new AdditionalField($cart);
-            $brick->setSecretField($formData['af_secretField']);
-            $brick->setSecondSecretField($formData['af_secondSecretField']);
-            $cart->getAdditionalData()->setAdditionalField($brick);
-        }
-        $cart->save();
-        return true;
-    }
-}
-
-

That's it - your additional data is now available in backend. -If you want to display those fields in the overview, you need to add some JS:

-
core_shop_core:
-    pimcore_admin:
-        js:
-            filter_condition_relational_multi_select: '/bundles/app/additionalData.js'
-
-

This file has to extend coreshop.order.sale.detail.abstractBlock -and requires several methods: initBlock, updateSale, getPanel, getPriority and getPosition.

-
pimcore.registerNS('coreshop.order.order.detail.blocks.yourBlockName');
-coreshop.order.order.detail.blocks.yourBlockName = Class.create(coreshop.order.sale.detail.abstractBlock, {
-
-    saleInfo: {},
-    hasItems: true,
-
-    initBlock: function () {
-        this.saleInfo = Ext.create('Ext.panel.Panel', {
-            title: t('coreshop_order_additional_data'),
-            margin: '0 20 20 0',
-            border: true,
-            flex: 8
-        });
-    },
-
-    updateSale: function () {
-
-        var items = [],
-            subItems = [];
-
-        //console.log(this.sale.additionalData);
-
-        var items = [], subItems = [];
-
-        Ext.Array.each(this.sale.additionalData, function (block, i) {
-            var data = block.data;
-            subItems.push({
-                xtype: 'label',
-                style: 'font-weight:bold;display:block',
-                text: 'Title for your custom field A'
-            },
-            {
-                xtype: 'label',
-                style: 'display:block',
-                html: data.secretField
-            });
-            subItems.push({
-                xtype: 'label',
-                style: 'font-weight:bold;display:block',
-                text: 'Title for your custom field B'
-            },
-            {
-                xtype: 'label',
-                style: 'display:block',
-                html: data.secondSecretField
-            })
-        });
-
-        if (subItems.length === 0) {
-            this.hasItems = false;
-            return;
-        }
-
-        items.push({
-            xtype: 'panel',
-            bodyPadding: 10,
-            margin: '0 0 10px 0',
-            items: subItems
-        });
-
-        // remove all before adding new ones
-        // otherwise they will append during a refresh
-        this.saleInfo.removeAll();
-
-        this.saleInfo.add(items);
-    },
-
-    getPanel: function () {
-        return this.hasItems ? this.saleInfo : null;
-    },
-
-    getPriority: function () {
-        return 10;
-    },
-
-    getPosition: function () {
-        return 'right';
-    }
-});
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Order/Invoice/Invoice_Creation.html b/docs/generated-docs/generated_docs/Development/Order/Invoice/Invoice_Creation.html deleted file mode 100644 index 2d14a17a61..0000000000 --- a/docs/generated-docs/generated_docs/Development/Order/Invoice/Invoice_Creation.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - Invoice Creation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Invoice Creation

-

See Order Transformer for more.

-

Add a Invoice to an Order

-
/**
- * Note:
- *
- * The TRANSITION_REQUEST_INVOICE transition can only be applied once.
- * Only dispatch it with the creation of the first invoice.
- * This transition will inform the order invoice workflow that it's ready to initiate the invoice processing.
-*/
-$workflow = $this->getStateMachineManager()->get($order, 'coreshop_order_invoice');
-$workflow->apply($order, OrderInvoiceTransitions::TRANSITION_REQUEST_INVOICE);
-
-$order = '';
-
-/** @var InvoiceInterface $invoice */
-$invoice = $this->container->get('coreshop.factory.order_invoice')->createNew();
-$invoice->setState(InvoiceStates::STATE_NEW);
-
-$items = [];
-$invoice = $this->get('coreshop.order.transformer.order_to_invoice')->transform($order, $invoice, $items);
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Order/Invoice/index.html b/docs/generated-docs/generated_docs/Development/Order/Invoice/index.html deleted file mode 100644 index 841dfd574e..0000000000 --- a/docs/generated-docs/generated_docs/Development/Order/Invoice/index.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Invoice - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Order/OrderList/Action.html b/docs/generated-docs/generated_docs/Development/Order/OrderList/Action.html deleted file mode 100644 index e723f0c945..0000000000 --- a/docs/generated-docs/generated_docs/Development/Order/OrderList/Action.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - Action - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Order List Actions

-

Actions allows you to process orders rapidly, right in the order grid view.

-

filter

-

Register Filter Service

-
AppBundle\CoreShop\OrderList\Action\Demo:
-    arguments:
-        $stateMachineManager: '@coreshop.state_machine_manager'
-        $shipmentRepository: '@coreshop.repository.order_shipment'
-    tags:
-        - { name: coreshop.grid.action, type: demo }
-
-

Create PHP Class

-

In this example we want to apply the shipment transition "ship" to selected orders.

-
<?php
-
-namespace AppBundle\CoreShop\OrderList\Action;
-
-use CoreShop\Component\Order\Repository\OrderShipmentRepositoryInterface;
-use CoreShop\Bundle\WorkflowBundle\Manager\StateMachineManagerInterface;
-use CoreShop\Component\Pimcore\DataObject\Grid\GridActionInterface;
-use Pimcore\Model\DataObject\CoreShopOrder;
-
-class DemoAction implements GridActionInterface
-{
-    protected $stateMachineManager;
-
-    protected $shipmentRepository;
-
-    public function __construct(
-        StateMachineManagerInterface $stateMachineManager,
-        OrderShipmentRepositoryInterface $shipmentRepository
-    ) {
-        $this->stateMachineManager = $stateMachineManager;
-        $this->shipmentRepository = $shipmentRepository;
-    }
-
-    public function getName(): string
-    {
-        return 'coreshop.order.demo';
-    }
-
-    public function apply(array $processIds): string
-    {
-        $message = '';
-        $transition = 'ship';
-        $shipmentIds = [];
-
-        foreach ($processIds as $id) {
-
-            $m = [];
-            $order = CoreShopOrder::getById($id);
-            $shipments = $this->shipmentRepository->getDocuments($order);
-
-            if (count($shipments) === 0) {
-                $m[] = sprintf('- no shipments for order %s found. skipping....', $order->getId());
-            } else {
-                foreach ($shipments as $shipment) {
-                    if ($shipment->getState() === 'shipped') {
-                        $m[] = sprintf('- transition "%s" for shipment %s already applied. skipping...', $transition, $shipment->getId());
-                        continue;
-                    }
-                    $workflow = $this->stateMachineManager->get($shipment, 'coreshop_shipment');
-                    if (!$workflow->can($shipment, $transition)) {
-                        $m[] = sprintf('- transition "%s" for shipment %s not allowed.', $transition, $shipment->getId());
-                    } else {
-                        try {
-                            $workflow->apply($shipment, $transition);
-                            $shipmentIds[] = $shipment->getId();
-                            $m[] = sprintf('- transition "%s" for shipment id %s successfully applied.', $transition, $shipment->getId());
-                        } catch (\Exception $e) {
-                            $m[] = sprintf('- error while applying transition "%s" to shipment with id %s: %s.', $transition, $shipment->getId(), $e->getMessage());
-                        }
-                    }
-                }
-            }
-
-            $message .= sprintf('<strong>Order %s:</strong><br>%s<br>', $id, join('<br>', $m));
-
-        }
-
-        if (count($shipmentIds) > 0) {
-            $packingListUrl = '/admin/your-packing-list-generator-url?ids=' . join(',', $shipmentIds);
-            $message .= sprintf('<br><a href="%s" target="_blank">%s</a><br>', $packingListUrl, 'packing list');
-        }
-
-        return $message;
-    }
-
-    public function supports(string $listType): bool
-    {
-        return $listType === 'coreshop_order';
-    }
-}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Order/OrderList/Filter.html b/docs/generated-docs/generated_docs/Development/Order/OrderList/Filter.html deleted file mode 100644 index da0156ad0b..0000000000 --- a/docs/generated-docs/generated_docs/Development/Order/OrderList/Filter.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - Filter - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Order List Filter

-

This comes in handy if you need some special filtered data in your Order List. -Your Customer is able to filter orders on specific conditions.

-

filter

-

Register Filter Service

-
AppBundle\CoreShop\OrderList\Filter\DemoFilter:
-    tags:
-        - { name: coreshop.grid.filter, type: demo }
-
-

Create PHP Class

-

In this example we want to filter orders with available shipments in state "ready".

-
<?php
-
-namespace AppBundle\CoreShop\OrderList\Filter;
-
-use CoreShop\Component\Pimcore\DataObject\Grid\GridFilterInterface;
-use Pimcore\Db\ZendCompatibility\QueryBuilder;
-use Pimcore\Model\DataObject;
-
-class DemoFilter implements GridFilterInterface
-{
-    public function getName(): string
-    {
-        return 'coreshop.order_filter.shipment_apply';
-    }
-
-    public function filter(DataObject\Listing $list, array $context): DataObject\Listing
-    {
-        $list->onCreateQuery(function (QueryBuilder $select) use ($list) {
-            $select->join(
-                ['shipment' => 'object_query_4'],
-                'shipment.order__id = object_' . $list->getClassId() . '.o_id'
-            );
-        });
-
-        $list->addConditionParam('orderState = ?', 'confirmed');
-        $list->addConditionParam('shipment.state = ?', 'ready');
-
-        return $list;
-    }
-
-    public function supports(string $listType): bool
-    {
-        return $listType === 'coreshop_order';
-    }
-}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Order/Order_Creation.html b/docs/generated-docs/generated_docs/Development/Order/Order_Creation.html deleted file mode 100644 index 53a7f5a968..0000000000 --- a/docs/generated-docs/generated_docs/Development/Order/Order_Creation.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - Order Creation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Order Creation

-

Orders are usually getting created through the Checkout Step. If you ever need to create an Order manually, there are multiple ways.

-

Order CRUD

-

You can always use the Pimcore API to create Orders, in CoreShop you would do it through the Factory:

-
$factory = $container->get('coreshop.factory.order')->createNew();
-
-

You can now fill the Order with all necessary information.

-

The more usual way to create Orders is through Carts or Quotes. Therefore CoreShop implements Transformer for that.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Order/Order_Workflow.html b/docs/generated-docs/generated_docs/Development/Order/Order_Workflow.html deleted file mode 100644 index a5218b3a39..0000000000 --- a/docs/generated-docs/generated_docs/Development/Order/Order_Workflow.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Order Workflow - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Order/Purchasable.html b/docs/generated-docs/generated_docs/Development/Order/Purchasable.html deleted file mode 100644 index 51cf5e4381..0000000000 --- a/docs/generated-docs/generated_docs/Development/Order/Purchasable.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - Purchasable - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Order Purchasable

-

Items, you want to add to your Cart/Order/Quote, need to implement CoreShop\Component\Order\Model\PurchasableInterface.

-

The concept of Purchasable allows us to decouple CoreShops Order Component from the Product Component and makes the Cart/Quote/Order more flexible -in ways of which object types can be used.

-
-

A Purchasable does not a have Price directly -You need create a class that implements CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface. -in order to calculate price

-
-

Implementation of a new Purchasable Price Calculator

-

To implement a new custom Purchasable Price Calculator, you need to implement the interface CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface.

-

As an example, we create a ProductSetCalculator, which takes prices of each consisting Product:

-
<?php
-
-namespace AppBundle\CoreShop\Order\Calculator;
-
-use CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface;
-use CoreShop\Component\Order\Exception\NoPurchasablePriceFoundException;use CoreShop\Component\Order\Model\PurchasableInterface;
-use Pimcore\Model\Product\ProductSet;
-
-final class ProductSetCalculator implements PurchasablePriceCalculatorInterface
-{
-    private PurchasablePriceCalculatorInterface $purchasablePriceCalculator;
-
-    public function __construct(PurchasablePriceCalculatorInterface $purchasablePriceCalculator)
-    {
-        $this->purchasablePriceCalculator = $purchasablePriceCalculator;
-    }
-
-    public function getPrice(PurchasableInterface $purchasable, array $context, bool $includingDiscounts = false): int
-    {
-        if ($purchasable instanceof ProductSet) {
-            $price = 0;
-
-            foreach ($purchasable->getProducts() as $product) {
-                $price .= $this->purchasablePriceCalculator->getPrice($product);
-            }
-
-            return $price;
-        }
-
-        throw new NoPurchasablePriceFoundException($this);
-    }
-
-}
-
-

Now we need to register our Service to the Container:

-
app.coreshop.order.purchasable.price_calculator.product_set:
-    class: AppBundle\CoreShop\Order\Calculator\ProductSetCalculator
-    arguments:
-        - '@coreshop.order.purchasable.price_calculator'
-    tags:
-     - { name: coreshop.order.purchasable.price_calculator, type: product_set, priority: 20 }
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Order/Shipment/Shipment_Creation.html b/docs/generated-docs/generated_docs/Development/Order/Shipment/Shipment_Creation.html deleted file mode 100644 index 4f2f6ed204..0000000000 --- a/docs/generated-docs/generated_docs/Development/Order/Shipment/Shipment_Creation.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - Shipment Creation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Shipment Creation

-

See Order Transformer for more.

-

Add a Shipment to an Order

-
/**
- * Note:
- *
- * The TRANSITION_REQUEST_SHIPMENT transition can only be applied once.
- * Only dispatch it with the creation of the first shipment.
- * This transition will inform the order shipment workflow that it's ready to initiate the shipment processing.
-*/
-$workflow = $this->getStateMachineManager()->get($order, 'coreshop_order_shipment');
-$workflow->apply($order, OrderShipmentTransitions::TRANSITION_REQUEST_SHIPMENT);
-
-$order = '';
-
-/** @var ShipmentInterface $shipment */
-$shipment = $this->container->get('coreshop.factory.order_shipment')->createNew();
-$shipment->setState(ShipmentStates::STATE_NEW);
-
-$items = [];
-$shipment = $this->get('coreshop.order.transformer.order_to_shipment')->transform($order, $shipment, $items);
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Order/Shipment/index.html b/docs/generated-docs/generated_docs/Development/Order/Shipment/index.html deleted file mode 100644 index 4401485cc3..0000000000 --- a/docs/generated-docs/generated_docs/Development/Order/Shipment/index.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Shipment - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Shipment

-

CoreShop comes with an Shipment (Delivery Slip) creation feature. This means, it can create Shipments for Orders based on Workflow States.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Order/TemplateHelper.html b/docs/generated-docs/generated_docs/Development/Order/TemplateHelper.html deleted file mode 100644 index c174000dfa..0000000000 --- a/docs/generated-docs/generated_docs/Development/Order/TemplateHelper.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - TemplateHelper - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Order/Transformer.html b/docs/generated-docs/generated_docs/Development/Order/Transformer.html deleted file mode 100644 index 95e0970d1e..0000000000 --- a/docs/generated-docs/generated_docs/Development/Order/Transformer.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - Transformer - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Transfomers

-

Transfomers, as the name say, transform Data from different formats. A transformer converts between Object Types. For example: Cart -> Order. Following implementation do exist right now:

- -

The base transformer interface for all "Proposals" is CoreShop\Component\Order\Transformer\ProposalTransformerInterface

-

Extending Transfomers

-

If you ever have the need to adapt the transfomer, eg. hook into it and store some custom data into the order, you can do so -by decorating the default service. Following Services are used by CoreShop for all different Transfomers:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FromToService
OrderInvoicecoreshop.order.transformer.order_to_invoice
OrderItemInvoiceItemcoreshop.order_invoice.transformer.cart_item_to_order_item
OrderShipmentcoreshop.order.transformer.order_to_invoice
OrderItemShipmentItemcoreshop.order_invoice.transformer.order_item_to_shipment_item
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Order/index.html b/docs/generated-docs/generated_docs/Development/Order/index.html deleted file mode 100644 index b6569b399a..0000000000 --- a/docs/generated-docs/generated_docs/Development/Order/index.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - Order - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Payment/Omnipay_Bridge.html b/docs/generated-docs/generated_docs/Development/Payment/Omnipay_Bridge.html deleted file mode 100644 index 4c6a29dbf3..0000000000 --- a/docs/generated-docs/generated_docs/Development/Payment/Omnipay_Bridge.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - Omnipay Bridge - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Payum Ominpay Bridge

-

Here is a list of all available Omnipay Payment Providers.

-
-

As of now, Omnipay is not compatible with Symfony 3. They are already working on it, but will need some time to be finished. -But: You can use the dev-master Version Omnipay to add the Bridge

-
-

To add the Omnipay Bridge, do following:

-
$ composer require payum/omnipay-v3-bridge:dev-master
-
-

This will install the Bridge for you.

-

Now you still need to create your Gateway Configuration as described here.

-

Example of Omnipay Gateway Configuration

-

As example we add omnipay-worldpay:

-
-

Worldpay is currently in PR and I don't know when it is getting merged

-
-

1: add FormType for Worldpay Configuration:

-
<?php
-
-namespace AppBundle\Form\Type;
-
-use Symfony\Component\Form\AbstractType;
-use Symfony\Component\Form\Extension\Core\Type\PasswordType;
-use Symfony\Component\Form\Extension\Core\Type\TextType;
-use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Form\FormEvent;
-use Symfony\Component\Form\FormEvents;
-use Symfony\Component\Validator\Constraints\NotBlank;
-
-final class WorldpayType extends AbstractType
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function buildForm(FormBuilderInterface $builder, array $options)
-    {
-        $builder
-            ->add('serviceKey', TextType::class, [
-                'constraints' => [
-                    new NotBlank([
-                        'groups' => 'coreshop',
-                    ]),
-                ],
-            ])
-            ->add('clientKey', PasswordType::class, [
-                'constraints' => [
-                    new NotBlank([
-                        'groups' => 'coreshop',
-                    ]),
-                ],
-            ])
-            ->add('merchantId', TextType::class, [
-                'constraints' => [
-                    new NotBlank([
-                        'groups' => 'coreshop',
-                    ]),
-                ],
-            ])
-            ->add('factory', TextType::class, [
-                'data' => 'omnipay',
-                'empty_data' => 'omnipay'
-            ])
-            ->add('type', TextType::class, [
-                'data' => 'WorldPay\\Json',
-                'empty_data' => 'WorldPay\\Json'
-            ])
-            ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
-                $data = $event->getData();
-
-                $data['payum.http_client'] = '@coreshop.payum.http_client';
-            })
-        ;
-    }
-}
-
-
-

Register into the container:

-
services:
-  app.form.type.gateway_configuration.worldpay:
-    class: AppBundle\Form\Type\WorldpayType
-    tags:
-      - { name: coreshop.gateway_configuration_type, type: omnipay_worldpay }
-      - { name: form.type }
-
-
-

Its important that it starts with omnipay_ here

-
-

2: Add ExtJs Form:

-
pimcore.registerNS('coreshop.provider.gateways.omnipay_worldpay');
-coreshop.provider.gateways.omnipay_worldpay = Class.create(coreshop.provider.gateways.abstract, {
-
-    getLayout: function (config) {
-        return [
-            {
-                xtype: 'textfield',
-                fieldLabel: t('coreshop_worldpay_service_key'),
-                name: 'gatewayConfig.config.serviceKey',
-                length: 255,
-                value: config.serviceKey ? config.serviceKey : ""
-            },
-            {
-                xtype: 'textfield',
-                fieldLabel: t('coreshop_worldpay_client_key'),
-                name: 'gatewayConfig.config.clientKey',
-                length: 255,
-                value: config.clientKey
-            },
-            {
-                xtype: 'textfield',
-                fieldLabel: t('coreshop_worldpay_merchant_id'),
-                name: 'gatewayConfig.config.merchantId',
-                length: 255,
-                value: config.merchantId
-            }
-        ];
-    }
-
-});
-
-

Register JS File for CoreShop to be loaded:

-
core_shop_payment:
-    pimcore_admin:
-      js:
-        worldpay: /bundles/app/pimcore/static/js/payment/provider/worldpay.js
-
-

Thats it, now you can create a new Payment Provider in the Backend and use Omnipay WorldPay as Payment Provider.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Payment/Payment_Provider.html b/docs/generated-docs/generated_docs/Development/Payment/Payment_Provider.html deleted file mode 100644 index 77d5056d87..0000000000 --- a/docs/generated-docs/generated_docs/Development/Payment/Payment_Provider.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - Payment Provider - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Payment Providers

-

A Payment Provider represents a way that your customer pays during the checkout process. -It holds a reference to a specific gateway with custom configuration. -A gateway is configured for each payment method separately using the payment method form.

-

Payment Gateway configuration

-

Payment Gateways that already have a CoreShop bridge

-

First you need to create the configuration form type for your gateway. -Have a look at the configuration form types of Paypal and Sofort.

-

Then you should register its configuration form type with coreshop.gateway_configuration_type tag. -After that it will be available in the admin panel in the gateway choice dropdown.

-
-

If you are not sure how your configuration form type should look like, -head to Payum documentation.

-
-

Other Payment Gateways

-
-

Learn more about integrating payment gateways in the Payum docs.

-
-
-

You’ll probably need also this kind of configuration in your app/config/config.yml for the gateway’s factory:

-
payum:
-    gateways:
-       yourgateway:
-           factory: yourgateway
-
-
-

As an example, we add Sofort as a payment gateway factory. -To add a new gateway configuration you need to add 2 files:

-
    -
  • A new FormType for configuration values
  • -
  • A new Javascript File for ExtJs Form
  • -
-

1: Form Type for Configuration Values:

-

-namespace AppBundle\CoreShop\Form\Type;
-
-use Symfony\Component\Form\AbstractType;
-use Symfony\Component\Form\Extension\Core\Type\TextType;
-use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Form\FormEvent;
-use Symfony\Component\Form\FormEvents;
-use Symfony\Component\Validator\Constraints\NotBlank;
-
-final class SofortGatewayConfigurationType extends AbstractType
-{
-    /**
-     * {@inheritdoc}
-     */
-    public function buildForm(FormBuilderInterface $builder, array $options)
-    {
-        $builder
-            ->add('config_key', TextType::class, [
-                'constraints' => [
-                    new NotBlank([
-                        'groups' => 'coreshop',
-                    ]),
-                ],
-            ])
-            ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
-                $data = $event->getData();
-
-                $data['payum.http_client'] = '@coreshop.payum.http_client';
-            })
-        ;
-    }
-}
-
-
-

Now we register the FormType into the container

-
services:
-  app.coreshop.form.type.gateway_configuration.sofort:
-    class: AppBundle\Form\Type\SofortGatewayConfigurationType
-    tags:
-      - { name: coreshop.gateway_configuration_type, type: sofort }
-      - { name: form.type }
-
-

2: Create the corresponding ExtJs Form:

-
-

You need to use the type attribute as identifier here

-
-
pimcore.registerNS('coreshop.provider.gateways.sofort');
-coreshop.provider.gateways.sofort = Class.create(coreshop.provider.gateways.abstract, {
-
-    getLayout: function (config) {
-        return [
-            {
-                xtype: 'textfield',
-                fieldLabel: t('config_key'),
-                name: 'gatewayConfig.config.config_key',
-                length: 255,
-                value: config.config_key ? config.config_key : ""
-            }
-        ];
-    }
-
-});
-
-
-

Next we need to register our new Gateway JS file to be loaded:

-
core_shop_payment:
-    pimcore_admin:
-        js:
-            sofort_gateway: '/bundles/app/pimcore/js/sofort.js'
-
-

Thats it, now after reloading Pimcore, you'll see a new Factory.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Payment/Payum_Providers.html b/docs/generated-docs/generated_docs/Development/Payment/Payum_Providers.html deleted file mode 100644 index 73d264db7f..0000000000 --- a/docs/generated-docs/generated_docs/Development/Payment/Payum_Providers.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Payum Providers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Payment/index.html b/docs/generated-docs/generated_docs/Development/Payment/index.html deleted file mode 100644 index 946188e89e..0000000000 --- a/docs/generated-docs/generated_docs/Development/Payment/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - Payment - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Payment

-

CoreShop contains a very flexible payments management system with support for many gateways (payment providers). -We are using a payment abstraction library - Payum, -which handles all sorts of capturing, refunding and recurring payments logic.

-

On CoreShop side, we integrate it into our checkout and manage all the payment data.

-

Available Payment Gateways for CoreShop

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameStateLinkSupportOffsiteSupports Server-NotificationSupports Refund
HeidelpaystableGithubPayPal, Klarna Sofort, Credit CardNoYesNo
SaferPaystableGithubSupported Payment MethodsYesYesPartially
PostFinancestableGithubPostFinance Card, PostFinance E-Finance, Visa, MasterCard, Diners Club, American Express, JCB, PayPal, TWINTYesYesNo
PowerPaydevGithubinvoice, automatic credit checkNoNo (not required)No
CuraBilldevGithubinvoice, instalments via iframeNoNo (not required)No
-

Payment

-

Every payment in CoreShop, successful or failed, is represented by the payment model, -which contains basic information and a reference to appropriate order.

-

Create a Payment programmatically

-

As usually, use a factory to create a new PaymentMethod and give it a unique code.

-
$payment = $this->container->get('coreshop.factory.payment')->createNew();
-
-$payment->setOrder($order);
-$payment->setCurrencyCode('EUR');
-
-$this->container->get('coreshop.repository.payment')->add($payment);
-
-

More

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Products/CRUD.html b/docs/generated-docs/generated_docs/Development/Products/CRUD.html deleted file mode 100644 index c2c9bf984d..0000000000 --- a/docs/generated-docs/generated_docs/Development/Products/CRUD.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product

-

CoreShop uses Pimcore Data Objects to persist Product Information. But, it adds a little wrapper around it to be more -dynamic and configurable. It uses a Factory and Repository Pattern to do that.

-

Create

-

If you want to create a new Product, we need to get our Factory Service for that:

-
$productFactory = $container->get('coreshop.factory.product');
-$product = $productFactory->createNew();
-
-

No we have our product and we can set all needed values.

-

If you now want to save it, just call the save function

-
$product->save();
-
-

Read

-

To get products, you need to use the Repository Service CoreShop provides you.

-
$repository = $container->get('coreshop.repository.product');
-
-
-// Query by ID
-$productWithIdOne = $repository->findById(1);
-
-// Get a Listing how you know it from Pimcore
-$list = $repository->getList();
-$list->setCondition("active = 1");
-$products = $list->getObjects();
-
-
-

Update

-

Update works the same as you are used to in Pimcore

-
$repository = $container->get('coreshop.repository.product');
-
-
-// Query by ID
-$productWithIdOne = $repository->findById(1);
-
-// Change values
-$productWithIdOne->setName('test');
-$productWithIdOne->save();
-
-

Delete

-

Delete works the same as you are used to in Pimcore

-
$repository = $container->get('coreshop.repository.product');
-
-
-// Query by ID
-$productWithIdOne = $repository->findById(1);
-$productWithIdOne->delete();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Products/Configuration.html b/docs/generated-docs/generated_docs/Development/Products/Configuration.html deleted file mode 100644 index fcbf139d1c..0000000000 --- a/docs/generated-docs/generated_docs/Development/Products/Configuration.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Configuration - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Configuration

-
core_shop_product:
-    pimcore:
-        product:
-            path: coreshop/products
-            classes:
-                repository: CoreShop\Bundle\CoreBundle\Pimcore\Repository\ProductRepository
-                install_file: '@CoreShopCoreBundle/Resources/install/pimcore/classes/CoreShopProductBundle/CoreShopProduct.json'
-                model: Pimcore\Model\DataObject\CoreShopProduct
-                interface: CoreShop\Component\Product\Model\ProductInterface
-                factory: CoreShop\Component\Resource\Factory\PimcoreFactory
-                type: object
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Products/Multiple_Product_DataObjects.html b/docs/generated-docs/generated_docs/Development/Products/Multiple_Product_DataObjects.html deleted file mode 100644 index 44761dac9a..0000000000 --- a/docs/generated-docs/generated_docs/Development/Products/Multiple_Product_DataObjects.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - - Multiple Product DataObjects - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Multiple Product DataObjects

-

CoreShop comes with one pre-installed Product Class (CoreShopProduct), which in most cases is enough. In some cases, you might want to use separated classes with different purposes. For example a ProductSet, which consists of multiple Products but also needs to be available for complex price calculations like Price Rules.

-

First of all, we need to create a new DataObject Class in Pimcore. A basic Purchasable Product only needs to implement \CoreShop\Component\Order\Model\PurchasableInterface but since we want to allow complex price calculation, we need to implement CoreShop\Component\Core\Model\ProductInterface.

-
-

Note -If your Product is very simple and you do not need complex price calculations -you then only need to implement \CoreShop\Component\Order\Model\PurchasableInterface

-
-

Easiest way to create the new class is:

-
    -
  • -1: Open Pimcore DataObject Editor
  • -
  • -2: Add a new Class called ProductSet
  • -
  • -3: Import CoreShop Default Product Class (CoreShopProduct.json)
  • -
  • -4: Adapt to your needs
  • -
  • -5: Register your ProductSet Class to CoreShop:
  • -
-
<?php
-
-//src/AppBundle/DependencyInjection/Configuration.php
-
-namespace AppBundle\DependencyInjection;
-
-use CoreShop\Bundle\ProductBundle\Pimcore\Repository\ProductRepository;
-use CoreShop\Bundle\ResourceBundle\CoreShopResourceBundle;
-use CoreShop\Component\Product\Model\ProductInterface;
-use CoreShop\Component\Resource\Factory\PimcoreFactory;
-use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
-use Symfony\Component\Config\Definition\Builder\TreeBuilder;
-use Symfony\Component\Config\Definition\ConfigurationInterface;
-
-final class Configuration implements ConfigurationInterface
-{
-    public function getConfigTreeBuilder()
-    {
-        $treeBuilder = new TreeBuilder();
-        $rootNode = $treeBuilder->root('app');
-
-        $rootNode
-            ->children()
-                ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end()
-            ->end()
-        ;
-
-        $this->addModelsSection($rootNode);
-
-        return $treeBuilder;
-    }
-
-    //Add your configuration here
-    private function addModelsSection(ArrayNodeDefinition $node)
-    {
-        $node
-            ->children()
-                ->arrayNode('pimcore')
-                    ->addDefaultsIfNotSet()
-                    ->children()
-                        ->arrayNode('product_set')
-                            ->addDefaultsIfNotSet()
-                            ->children()
-                                ->variableNode('options')->end()
-                                ->scalarNode('path')->defaultValue('products')->end()
-                                ->arrayNode('classes')
-                                    ->addDefaultsIfNotSet()
-                                    ->children()
-                                        ->scalarNode('model')->defaultValue('Pimcore\Model\DataObject\ProductSet')->cannotBeEmpty()->end()
-                                        ->scalarNode('interface')->defaultValue(ProductInterface::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('factory')->defaultValue(PimcoreFactory::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('repository')->defaultValue(ProductRepository::class)->cannotBeEmpty()->end()
-                                        ->scalarNode('install_file')->defaultValue('@CoreShopProductBundle/Resources/install/pimcore/classes/CoreShopProduct.json')->end()
-                                        ->scalarNode('type')->defaultValue(CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT)->cannotBeOverwritten(true)->end()
-                                    ->end()
-                                ->end()
-                            ->end()
-                        ->end()
-                    ->end()
-                ->end()
-            ->end()
-        ;
-    }
-}
-
-
<?php
-
-//src/AppBundle/DependencyInjection/AppExtension.php
-
-namespace AppBundle\DependencyInjection;
-
-use CoreShop\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractModelExtension;
-use Symfony\Component\Config\FileLocator;
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
-
-class AppExtension extends AbstractModelExtension
-{
-    public function load(array $config, ContainerBuilder $container)
-    {
-        $config = $this->processConfiguration($this->getConfiguration([], $container), $config);
-        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
-
-        //Register the model to the container
-        $this->registerPimcoreModels('app', $config['pimcore'], $container);
-
-        //Alternative you can do it manually like:
-
-        $this->registerPimcoreModels('app', [
-            'product_set' => [
-                'path' => '/product-sets',
-                'classes' => [
-                    'model' => 'Pimcore\Model\DataObject\ProductSet',
-                    'interface' => ProductInterface::class,
-                    'factory' => PimcoreFactory::class,
-                    'type' => CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT
-                ]
-            ]
-        ], $container);
-
-        $loader->load('services.yml');
-    }
-}
-
-
    -
  • -6: You can now use the new ObjectClass as you wish, CoreShop automatically recognises it as ProductClass and your are allowed to use it in PriceRules.
  • -
-
-

Note: -For the Class to be allowed as href/multihref in Pimcore, you need to adapt following classes as well:

-
    -
  • CoreShopCartItem
  • -
  • CoreShopOrderItem
  • -
  • CoreShopQuoteItem
  • -
-

Check for the product field and add your new ProductSet there as allowed references.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Products/Price_Calculation.html b/docs/generated-docs/generated_docs/Development/Products/Price_Calculation.html deleted file mode 100644 index 4b3935e9ae..0000000000 --- a/docs/generated-docs/generated_docs/Development/Products/Price_Calculation.html +++ /dev/null @@ -1,255 +0,0 @@ - - - - - - - Price Calculation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Price Calculation

-

CoreShop uses multiple Price Calculators to determine the correct price for a product. Per default following Calculators are used

- -

These two are only the default implementations, if you need a custom Calculator, you need to implement the Interface

-

CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface and register your service with the tag -coreshop.product.price_calculator, a type attribute and a priority

-

What prices does CoreShop calculate?

-

CoreShop Price Calculation consists of 3 different prices:

-
    -
  • -Retail Price: Base Price without any discounts
  • -
  • -Discount Price: Special Price for promotions. Needs to return a price smaller than retail price, otherwise retail price is valid
  • -
  • -Discount: Discount from promotions
  • -
  • -Price: Retail Price or Discount Price (if available) minus discount rules
  • -
-

The default is always to use store values prices.

-

Calculator Service

-

If you want to calculate the Price for a Product, you need to use a special service to do that. There are two options:

-

1: coreshop.product.price_calculator which calculates prices without any tax regards.

-

2: coreshop.product.taxed_price_calculator which calculates prices with tax or without. (recommended one to use)

-

Templating

-

If you want to calculate the price within a Template, you can do so by using the filter coreshop_product_price

-
-
{{ (product|coreshop_product_price(true)) }}
-
-

Custom Price Calculator Example

-

Our Example Service will take the Property "price" - 1 as Product Price and -1 as Discount, therefore the price stays the same. -This example is only a show-case of how to add a new calculator.

-
-

CoreShop Price calculation always depends on a context. The context per default consists of following values:

-
    -
  • Store
  • -
  • Country
  • -
  • Currency
  • -
  • Customer (if logged in)
  • -
  • Cart
  • -
-
-
<?php
-
-namespace AppBundle\CoreShop\Product;
-
-use CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface;
-use CoreShop\Component\Product\Model\ProductInterface;
-
-final class CustomPriceCalculator implements ProductPriceCalculatorInterface
-{
-    /**
-     * Used to determine a retail price
-     */
-    public function getPrice(ProductInterface $subject, array $context, bool $withDiscount = true): int
-    {
-        $price = $this->getRetailPrice($subject, $context);
-
-        return $withDiscount ? $this->getDiscount($subject, $price) : $price;
-    }
-
-    /**
-     * Used to determine a retail price
-     */
-    public function getRetailPrice(ProductInterface $subject, array $context): int
-    {
-        return $subject->getStorePrice($context['store']);
-    }
-
-    /**
-     * Used to determine a discount
-     */
-    public function getDiscount(ProductInterface $subject, array $context, int $price): int
-    {
-        return 0;
-    }
-
-    /**
-     * Used to determine a discounted price
-     */
-    public function getDiscountPrice(ProductInterface $subject, array $context): int
-    {
-        return 0;
-    }
-}
-
-

Now we need to register our service to the container and add the calculator tag:

-
app.coreshop.product.price_calculator.custom:
-    class: AppBundle\CoreShop\Product\CustomPriceCalculator
-    tags:
-      - { name: coreshop.product.price_calculator, type: custom, priority: 1 }
-
-

CoreShop now uses our service for all Product Price Calculations.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Products/Price_Rules/index.html b/docs/generated-docs/generated_docs/Development/Products/Price_Rules/index.html deleted file mode 100644 index 51e94ad842..0000000000 --- a/docs/generated-docs/generated_docs/Development/Products/Price_Rules/index.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Price Rules

-

CoreShop gives you the ability of very complex price calculation methods. -Price Rules always consist of Conditions and Actions.

-

Price Rule Types

-

Product Price Rules

-
-

Checkout all available product price rules here

-
-

Product price rules are applied to multiple products based on conditions like category or manufacturer.

-

Specific Price Rules

-
-

Checkout all available specific price rules here

-
-

Specific price rules are applied to a single product based on conditions like customer or customer group.

-

Quantity Price Rules

-
-

Checkout all available quantity price rules here

-
-

Quantity price rules are applied to a single product based on conditions like the quantity of a cart item.

-

These rules apply only in the calculation of cart item prices. If you have only quantity rules configured, -the default price calculation of CoreShop will return zero outside of cart context.

-

Extending Conditions and Actions

- -

Template Helper

-

Get Formatted Price with all applied Rules

-
{% import '@CoreShopFrontend/Common/Macro/currency.html.twig' as currency %}
-{% import '@CoreShopFrontend/Common/Macro/product_price.html.twig' as product_price %}
-
-<div class="price">
-    <span class="price-head">{{ 'coreshop.ui.price'|trans }}:</span>
-    {{ product_price.display_product_price(product) }}
-</div>
-<div class="tax">
-    {{ 'coreshop_product_tax_inc'|trans|format(product|coreshop_product_tax_rate) }} ({{ currency.convertAndFormat(product|coreshop_product_tax_amount) }})
-</div>
-
-

Get Active Price Rules

-
{{ dump(product|coreshop_product_price_rules) }}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Products/Unit_Definitions.html b/docs/generated-docs/generated_docs/Development/Products/Unit_Definitions.html deleted file mode 100644 index 0f43addb81..0000000000 --- a/docs/generated-docs/generated_docs/Development/Products/Unit_Definitions.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - Unit Definitions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Unit Definitions

-

CoreShop has a great new feature for product units. E.g. you can sell items "per meter" etc.

-

First, add some product units in Pimcore > CoreShop > Product > Product Units. Click "Add" and fill all the fields.

-

Then you can add product-units directly in the product-objects inside Pimcore (take a look at the "Price"-tab). There, you can also add multiple product units (eg: 1 box contains of 12 items - CoreShop will show you different order-possibilities in the add-to-cart section in the webshop)

-

Using the API for product units:

-

Create Default UnitDefinition

-

If you want to create a new Product, we need to get our Factory Service for that:

-
/** @var DataObject\CoreShopProduct $product */
-$product = DataObject::getById(1);
-
-$unitRepository = $container->get('coreshop.repository.product_unit');
-
-/** @var ProductUnitDefinitionInterface $defaultUnitDefinition */
-$defaultUnitDefinition = $container->get('coreshop.factory.product_unit_definition')->createNew();
-$defaultUnitDefinition->setUnit($unitRepository->findByName('Kubikmeter'));
-
-/** @var ProductUnitDefinitionsInterface $unitDefinitions */
-$unitDefinitions = $container->get('coreshop.factory.product_unit_definitions')->createNew();
-
-$unitDefinitions->setDefaultUnitDefinition($defaultUnitDefinition);
-$unitDefinitions->setProduct($product);
-
-$product->setUnitDefinitions($unitDefinitions);
-
-$product->save();
-
-

Update Default UnitDefinition

-
/** @var DataObject\CoreShopProduct $product */
-$product = DataObject::getById(1);
-
-$unitRepository = $container->get('coreshop.repository.product_unit');
-
-$defaultUnitDefinition = $product->getUnitDefinitions()->getDefaultUnitDefinition();
-$defaultUnitDefinition->setUnit($unitRepository->findByName('Liter'));
-
-$unitDefinitionsRepository = $container->get('coreshop.repository.product_unit_definitions');
-
-/** @var ProductUnitDefinitions $unitDefinitions */
-$unitDefinitions = $unitDefinitionsRepository->findOneForProduct($product);
-$unitDefinitions->setDefaultUnitDefinition($defaultUnitDefinition);
-
-$product->setUnitDefinitions($unitDefinitions);
-
-$product->save();
-
-

Delete UnitDefinition

-

Deleting a UnitDefiniton from a product is done by finding the UnitDefinitions for the product in the product_unit_definitions repository and then deleting it.

-
/** @var DataObject\CoreShopProduct $product */
-$product = DataObject::getById(1);
-
-$unitDefinitionsRepository = $container->get('coreshop.repository.product_unit_definitions');
-$item = $unitDefinitionsRepository->findOneForProduct($product);
-
-$unitDefinitionsRepository->remove($item);
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Products/Units.html b/docs/generated-docs/generated_docs/Development/Products/Units.html deleted file mode 100644 index 323c2fa907..0000000000 --- a/docs/generated-docs/generated_docs/Development/Products/Units.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - Units - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Units

-

Units for Products can be defined globally in the Pimcore Backend on CoreShopMenu > Product > Product Units.

-

Each Product can have different units. Also each product/unit relation can have an own precision that differs to other relations. To archive that, the relation between products and units consists of three objects:

-
    -
  • ProductUnit
  • -
  • ProductUnitDefinition
  • -
  • ProductUnitDefinitions
  • -
-

As already said, the ProductUnit can be created in Pimcore Backend and consists mainly of the key for unit like PCS, CNT etc. and some localized fields for rendering in frontend.

-

To connect a ProductUnit to a CoreShopProduct in Backend you need to get the ProductUnit via repository and create a ProductUnitDefinition.

-
use CoreShop\Component\Product\Model\Product;
-use CoreShop\Component\Product\Model\ProductUnitInterface;
-use CoreShop\Component\Product\Model\ProductUnitDefinition;
-
-$product = Product::getById(1);
-
-/** @var ProductUnitInterface $unit */
-$unit = $this->unitRepository->findOneBy(['name' => '']);
-
-$unitDefinition = new ProductUnitDefinition();
-$unitDefinition->setConversionRate(1.0); // optional
-$unitDefinition->setPrecision(0);        // optional
-$unitDefinition->setUnit($unit);
-
-$product->getUnitDefinitions()->setDefaultUnitDefinition($unitDefinition);
-$product->save();
-
-

To add multiple units for a product use $product->addUnitDefinition($unitDefinition).

-

To change a unit override the default one $product->getUnitDefinitions()->getDefaultUnitDefinition()->setUnit($otherUnit).

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Products/index.html b/docs/generated-docs/generated_docs/Development/Products/index.html deleted file mode 100644 index 58bb816fa7..0000000000 --- a/docs/generated-docs/generated_docs/Development/Products/index.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - Products - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/SEO/index.html b/docs/generated-docs/generated_docs/Development/SEO/index.html deleted file mode 100644 index 1ee6434002..0000000000 --- a/docs/generated-docs/generated_docs/Development/SEO/index.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - SEO - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Shipping/Carrier/CRUD.html b/docs/generated-docs/generated_docs/Development/Shipping/Carrier/CRUD.html deleted file mode 100644 index 1a0ece41b7..0000000000 --- a/docs/generated-docs/generated_docs/Development/Shipping/Carrier/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Carrier

-

Create

-

If you want to create a Carrier via API, you can do following:

-
$newCarrier = $container->get('coreshop.factory.carrier')->createNew();
-
-

Now you have a new Carrier, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.carrier')->persist($newCarrier);
-$container->get('coreshop.manager.carrier')->flush();
-
-

You now have a new persisted Carrier.

-

Read

-

If you want to query for Carriers, you can do following:

-
$carrierRepository = $container->get('coreshop.repository.carrier');
-
-$queryBuilder = $carrierRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$carriers = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Carrier, you need to do following:

-
// Fetch Carrier
-
-$carrier = $carrierRepository->findById(1);
-$carrier->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.carrier')->persist($carrier);
-$container->get('coreshop.manager.carrier')->flush();
-
-

Delete

-

If you want to update and existing Carrier, you need to do following:

-
// Fetch Carrier
-
-$carrier = $carrierRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.carrier')->remove($carrier);
-$container->get('coreshop.manager.carrier')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Shipping/Carrier/Carrier_Discovery.html b/docs/generated-docs/generated_docs/Development/Shipping/Carrier/Carrier_Discovery.html deleted file mode 100644 index bbf3fadade..0000000000 --- a/docs/generated-docs/generated_docs/Development/Shipping/Carrier/Carrier_Discovery.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - Carrier Discovery - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Carrier Discovery

-

CoreShop uses a Service to discover available Carriers for a given Shippable. These Service implements the Interface CoreShop\Bundle\ShippingBundle\Discover\ShippableCarriersDiscoveryInterface. -The Interface is implemented by Service with ID coreshop.carrier.discovery

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Shipping/Carrier/Price_Calculation.html b/docs/generated-docs/generated_docs/Development/Shipping/Carrier/Price_Calculation.html deleted file mode 100644 index f847d07e36..0000000000 --- a/docs/generated-docs/generated_docs/Development/Shipping/Carrier/Price_Calculation.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - Price Calculation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Carrier Price Calculation

-

CoreShop Shipping/Carrier Calculation uses multiple Calculation methods to calculate the price for a given Carrier on a given -Cart. A Calculator needs to implement the Interface CoreShop\Component\Shipping\Calculator\CarrierPriceCalculatorInterface -and registered to the container using the tag coreshop.shipping.price_calculator, a type attribute and a priority

-

Default Implementation

-

The Default Implementation calculates the Price based on Shipping Rules.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Shipping/Carrier/index.html b/docs/generated-docs/generated_docs/Development/Shipping/Carrier/index.html deleted file mode 100644 index 81e573cb7d..0000000000 --- a/docs/generated-docs/generated_docs/Development/Shipping/Carrier/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Carrier - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Shipping/Shipping_Rules/index.html b/docs/generated-docs/generated_docs/Development/Shipping/Shipping_Rules/index.html deleted file mode 100644 index 2a04d42804..0000000000 --- a/docs/generated-docs/generated_docs/Development/Shipping/Shipping_Rules/index.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - Shipping Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Shipping Rules

-

Default Conditions and Actions

-

CoreShop comes with a set of default action and condition implementations:

-

Default Conditions

-
    -
  • Currencies
  • -
  • Customer Groups
  • -
  • Customers
  • -
  • Stores
  • -
  • Zones
  • -
  • Amount
  • -
  • Categories
  • -
  • Countries
  • -
  • Dimension
  • -
  • Post Codes
  • -
  • Products
  • -
  • Shipping Rule
  • -
  • Weight
  • -
  • Nested
  • -
-

Default Actions

-
    -
  • Addition Amount
  • -
  • Addition Percent
  • -
  • Discount Amount
  • -
  • Discount Percent
  • -
  • Price
  • -
  • Shipping Rule
  • -
-

Extending Conditions and Actions

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Shipping/index.html b/docs/generated-docs/generated_docs/Development/Shipping/index.html deleted file mode 100644 index d1b1776fd9..0000000000 --- a/docs/generated-docs/generated_docs/Development/Shipping/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Shipping - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/State_Machine/Available_Workflows.html b/docs/generated-docs/generated_docs/Development/State_Machine/Available_Workflows.html deleted file mode 100644 index 09bafdcf0d..0000000000 --- a/docs/generated-docs/generated_docs/Development/State_Machine/Available_Workflows.html +++ /dev/null @@ -1,635 +0,0 @@ - - - - - - - Available Workflows - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop State Machine - Available Workflows

-

Order Sale Workflow

-

In CoreShop 3.x the Cart, Order and Quote are the same DataObject. To differentiate between them, we use states with workflows.

-

State Machine: coreshop_order_sales_type

-

Available Places

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
cartInitial State - Cart
orderOnce the customer finishes the checkout, pre-payment, it becomes an order
quoteOnce the customer finishes the checkout and requests a quote
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
ordercart
cartcart
quotecart
-

Order Workflow

-

State Machine: coreshop_order -Description: The Order Workflow is the most simplest and also the most important one.

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
initializedInitial State. Just before a order gets saved for the very first time.
newa new order has been created
confirmedcustomer has successfully placed an order
cancelledorder has been cancelled
completethe order is complete (all payments and shipments have been successfully processed)
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
createinitialized
confirmnew
cancelnew, confirmed
completeconfirmed
-

Visualization

-

coreshop_order Workflow Visualization

-

Order Payment Workflow

-

State Machine: coreshop_order_payment -Description: Defines the summary payment state

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
neworder has been initial created
awaiting_paymenta payment has been captured
partially_paidone of the order payments has been paid
cancelledall payments has been cancelled
paidall order payments successfully paid
partially_refundedone of the order payments has been refunded
refundedall payments has been refunded
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
request_paymentnew
partially_payawaiting_payment, partially_paid
cancelawaiting_payment
partially_refundpaid, partially_paid, partially_refunded
refundpaid, partially_paid, partially_refunded
-

Visualization

-

coreshop_order_payment Workflow Visualization

-

Order Shipment Workflow

-

State Machine: coreshop_order_shipment -Description: Defines the summary shipment state

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
neworder has been initial created
cancelledall shipments has been cancelled
partially_shippedone of the order shipments has been shipped
shippedall order shipments has been shipped
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
partially_shipnew
cancelnew
shipnew, partially_shipped
-

Visualization

-

coreshop_order_shipment Workflow Visualization

-

Order Invoice Workflow

-

State Machine: coreshop_order_invoice -Description: Defines the summary invoice state

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
neworder has been initial created
cancelledall invoices has been cancelled
partially_invoicedone of the order invoices has been invoiced
invoicedall order invoices has been successfully invoiced
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
cancelnew
partially_invoicenew
invoicenew, partially_invoiced
-

Visualization

-

coreshop_order_invoice Workflow Visualization

-

Payment Workflow

-

State Machine: coreshop_payment -Description: Defines the single payment state

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newnew payment has been created
processingpayment has been captured
completedpayment is complete
failedpayment has failed
cancelledpayment has been canceled
refundedpayment has been refunded
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
processnew
completenew, processing
failnew, processing
cancelnew, processing
refundcompleted
-

Visualization

-

coreshop_payment Workflow Visualization

-

Shipment Workflow

-

State Machine: coreshop_shipment -Description: Defines the single shipment state

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newnew shipment has been created
readyshipment has been assigned to order
cancelledshipment has been cancelled
shippedshipment has been shipped
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
createnew
shipready
cancelready
-

Visualization

-

coreshop_shipment Workflow Visualization

-

Invoice Workflow

-

State Machine: coreshop_invoice -Description: Defines the single invoice state

-

Available Places

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newnew invoice has been created
readyinvoice has been assigned to order
cancelledinvoice has been cancelled
completeinvoice has been completed
-

Available Transition

- - - - - - - - - - - - - - - - - - - - - -
NameAllowed from Places
createnew
cancelready
completeready
-

Visualization

-

coreshop_invoice Workflow Visualization

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/State_Machine/Create_Callbacks.html b/docs/generated-docs/generated_docs/Development/State_Machine/Create_Callbacks.html deleted file mode 100644 index 9ecce52d45..0000000000 --- a/docs/generated-docs/generated_docs/Development/State_Machine/Create_Callbacks.html +++ /dev/null @@ -1,282 +0,0 @@ - - - - - - - Create Callbacks - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop State Machine - Callbacks

-

It's really simple to create a custom state machine callback.

-

After Callbacks

-

In this example we want to register a simple listener which gets triggered after a customer successfully placed a order:

-
core_shop_workflow:
-    state_machine:
-        coreshop_order:
-            callbacks:
-                after:
-                    do_something_special:
-                        on: ['confirm']
-                        do: ['@AppBundle\EventListener\SpecialListener', 'doSomething']
-                        args: ['object']
-                        priority: -10 # fire action early!
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
ontransition name
doservice and method to dispatch
argsobject or event. Object type depends on state machine type.
priorityset priority. default is 0
-

And your Service:

-
<?php
-
-namespace AppBundle\EventListener;
-
-use CoreShop\Component\Core\Model\CustomerInterface;
-use CoreShop\Component\Core\Model\OrderInterface;
-
-final class SpecialListener
-{
-    /**
-     * @param OrderInterface $order
-     */
-    public function doSomething(OrderInterface $order)
-    {
-        /** @var CustomerInterface $customer */
-        $customer = $order->getCustomer();
-
-        /** @var string $locale */
-        $locale = $order->getLocaleCode();
-
-        // your very special code.
-    }
-}
-
-

Before Callbacks

-

In this example we want to register a simple listener which gets triggered before a the shipment transaction ready gets applied:

-
core_shop_workflow:
-    state_machine:
-        coreshop_shipment:
-            callbacks:
-                before:
-                    check_something:
-                        on: ['create']
-                        do: ['@AppBundle\EventListener\SpecialListener', 'checkSomething']
-                        args: ['object']
-                        priority: 0
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
ontransition name
doservice and method to dispatch
argsobject or event. Object type depends on state machine type.
priorityset priority. default is 0
-

As you can see in the class below, the checkSomething() method throws an exception. -This prevents the state machine from switching to the ready state. -Just remove the exception and the transition gets applied as expected.

-
<?php
-
-namespace AppBundle\EventListener;
-
-use CoreShop\Component\Core\Model\OrderShipmentInterface;
-
-final class SpecialListener
-{
-    /**
-     * @param OrderShipmentInterface $shipment
-     */
-    public function checkSomething(OrderShipmentInterface $shipment)
-    {
-        // check something and throw an exeption
-        throw new \Exception('something is wrong...');
-    }
-}
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/State_Machine/Extend_Workflows.html b/docs/generated-docs/generated_docs/Development/State_Machine/Extend_Workflows.html deleted file mode 100644 index e47559e3ce..0000000000 --- a/docs/generated-docs/generated_docs/Development/State_Machine/Extend_Workflows.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - Extend Workflows - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop State Machine - Extend Workflows

-

It's possible to extend all available CoreShop Workflow.

-

Example A: Extend Shipment Workflow

-

Workflow Configuration

-
core_shop_workflow:
-    state_machine:
-        coreshop_shipment:
-            # define a new place "reviewed"
-            places:
-                - reviewed
-            # define a new transition "review"
-            transitions:
-                review:
-                    from: [new, ready]
-                    to: reviewed
-            # add some colors for better ux
-            place_colors:
-                reviewed: '#2f819e'
-            transition_colors:
-                review: '#2f819e'
-
-

Add translations

-

Just use the Pimcore Backend/Frontend translation or just add it via default symfony translation context:

-
# app/Resources/translations/admin.en.yml
-coreshop_workflow_transition_coreshop_shipment_review: 'Review'
-coreshop_workflow_state_coreshop_shipment_reviewed: 'Reviewed'
-
-# app/Resources/translations/messages.en.yml
-coreshop.ui.workflow.state.coreshop_shipment.reviewed: 'Shipment under Review'
-
-

Inform CoreShop about new Transition of Shipment Workflow

-

Not all transitions should be available in backend. -To allow the transition to show up, you need to implement a simple event listener:

-
# app/config/services
-AppBundle\EventListener\WorkflowListener:
-    autowire: true
-    tags:
-        - { name: kernel.event_listener, event: coreshop.workflow.valid_transitions, method: parseTransitions}
-
-
<?php
-
-namespace AppBundle\EventListener;
-
-use CoreShop\Bundle\OrderBundle\Event\WorkflowTransitionEvent;
-
-class WorkflowListener
-{
-    public function parseTransitions(WorkflowTransitionEvent $event)
-    {
-        $workflowName = $event->getWorkflowName();
-        if($workflowName === 'coreshop_shipment') {
-            $event->addAllowedTransitions(['review']);
-        }
-    }
-}
-
-

Example B: Change default Transition Behaviour of Shipment Workflow

-
-

Note: Be careful while changing transitions. Test your application if a workflow still runs smoothly after changing it!

-
-

In this example we want to change the default shipping behavior.

-

Workflow before:

-

ready -> shipped -> cancelled

-

Workflow after:

-

ready -> reviewed -> shipped -> cancelled

-

Workflow Configuration

-
core_shop_workflow:
-    state_machine:
-        coreshop_shipment:
-            # define a new place "reviewed"
-            places:
-                - reviewed
-            # define a new transition "review"
-            transitions:
-                review:
-                    from: [ready]
-                    to: reviewed
-                # override the default "ship" transition
-                # which only allows [ready] as valid "from" dispatcher
-                ship:
-                    from: [reviewed]
-                    to: shipped
-            # add some colors for better ux
-            place_colors:
-                reviewed: '#2f819e'
-            transition_colors:
-                review: '#2f819e'
-
-

Example C: Callback Listener

-

If you need to implement some further business logic after the coreshop_shipment state has changed to reviewed -you need to define a callback:

-
-

Note: Please make sure your service is public available!

-
-
core_shop_workflow:
-    state_machine:
-        coreshop_shipment:
-            callbacks:
-                after:
-                    do_something_after_review:
-                        on: ['review']
-                        do: ['@your_service', 'yourAction']
-                        # in this context, "object" is the shipment item
-                        args: ['object']
-                        priority: -10 # fire action early!
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/State_Machine/Things_To_Know.html b/docs/generated-docs/generated_docs/Development/State_Machine/Things_To_Know.html deleted file mode 100644 index c65adea4b1..0000000000 --- a/docs/generated-docs/generated_docs/Development/State_Machine/Things_To_Know.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - Things To Know - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop State Machine - Important Things to Know

-

Canceling Orders

-

Within the CoreShop workflow architecture a lot of orders may stay forever in the new or confirmed state. -CoreShop will automatically cancel orders older than 20 days under following conditions:

-
    -
  • Order creationDate >= 20 days ago
  • -
  • Order State is initialized or new or confirmed -
  • -
  • Order Payment State is not paid -
  • -
-

Read more about automation here.

-

Expire Orders via Backend

-

There is also a cancel button in the order detail section.

-

Expire Orders via Command

-

There is also a command for that:

-
$ coreshop:order:expire
-
-

Change Orders Expiration Date

-
core_shop_order:
-    expiration:
-        order:
-            days: 30
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/State_Machine/index.html b/docs/generated-docs/generated_docs/Development/State_Machine/index.html deleted file mode 100644 index 22ede6341f..0000000000 --- a/docs/generated-docs/generated_docs/Development/State_Machine/index.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - State Machine - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop State Machine

-

The CoreShop State Machine is a important core feature which allows to determinate complex workflows securely and in a most modern way. -Unlike the most eCommerce Frameworks out there, CoreShop does not work with the messy and hard do extend "state/status" concept. -Every order-section and of course the order itself provides its own state machine which allows us to build a super strong state workflow.

-

Places

-

In State Machine context, the well-known "Status" Property is called "Places". -Every Workflow comes with a pre-defined set of Places.

-

Transition

-

To change the Place of a workflow we need to apply a transition. -If the transition is valid the new place gets stored.

-

Callbacks

-

There are several events for each transition which can be also extend by every project. -Example:: If all order payments has been successfully transformed to the completed place, -the coreshop_order_payment workflow will automatically change to paid.

-

Workflows

-

There are seven implemented Workflows:

-
    -
  • -coreshop_order -
  • -
  • -coreshop_order_payment -
  • -
  • -coreshop_order_shipment -
  • -
  • -coreshop_order_invoice -
  • -
  • -coreshop_payment -
  • -
  • -coreshop_shipment -
  • -
  • -coreshop_invoice -
  • -
-

Workflows are connected among themselves so every transition will trigger another Workflow and so on. -If a transition has been dispatched, it cannot be transformed back unless it has been defined in the available transitions.

-

So let's start:

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Store_Front/Controllers.html b/docs/generated-docs/generated_docs/Development/Store_Front/Controllers.html deleted file mode 100644 index d352e765d5..0000000000 --- a/docs/generated-docs/generated_docs/Development/Store_Front/Controllers.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - Controllers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Store Front Controller

-

If you use CoreShop FrontendBundle, you can change the Controllers it uses. Simply change the configuration for the controller:

-
core_shop_frontend:
-    controllers:
-        index: CoreShop\Bundle\FrontendBundle\Controller\IndexController
-        register: CoreShop\Bundle\FrontendBundle\Controller\RegisterController
-        customer: CoreShop\Bundle\FrontendBundle\Controller\CustomerController
-        currency: CoreShop\Bundle\FrontendBundle\Controller\CurrencyController
-        language: CoreShop\Bundle\FrontendBundle\Controller\LanguageController
-        search: CoreShop\Bundle\FrontendBundle\Controller\SearchController
-        cart: CoreShop\Bundle\FrontendBundle\Controller\CartController
-        checkout: CoreShop\Bundle\FrontendBundle\Controller\CheckoutController
-        category: CoreShop\Bundle\FrontendBundle\Controller\CategoryController
-        product: CoreShop\Bundle\FrontendBundle\Controller\ProductController
-        quote: CoreShop\Bundle\FrontendBundle\Controller\QuoteController
-        security: CoreShop\Bundle\FrontendBundle\Controller\SecurityController
-        payment: CoreShop\Bundle\PayumBundle\Controller\PaymentController
-
-

Example of using a Custom ProductController

-

1: Add a new Controller and inherit from the FrontendController

-
<?php
-
-namespace AppBundle\Controller;
-
-use CoreShop\Component\Core\Model\ProductInterface;
-use Symfony\Component\HttpFoundation\Request;
-
-class ProductController extends \CoreShop\Bundle\FrontendBundle\Controller\ProductController
-{
-    public function detailAction(Request $request)
-    {
-        //Do whatever you want in here
-
-        return parent::detailAction($request);
-    }
-}
-
-

2: Change Configuration of the Controller:

-
core_shop_frontend:
-    controllers:
-        product: AppBundle\Controller\ProductController
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Store_Front/index.html b/docs/generated-docs/generated_docs/Development/Store_Front/index.html deleted file mode 100644 index ab87672f7f..0000000000 --- a/docs/generated-docs/generated_docs/Development/Store_Front/index.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - Store Front - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Stores/CRUD.html b/docs/generated-docs/generated_docs/Development/Stores/CRUD.html deleted file mode 100644 index b0b2b34585..0000000000 --- a/docs/generated-docs/generated_docs/Development/Stores/CRUD.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - CRUD - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Stores

-

Create

-

If you want to create a Store via API, you can do following:

-
$newStore = $container->get('coreshop.factory.store')->createNew();
-
-

Now you have a new Store, if you want to persist it, you need to do following:

-
$container->get('coreshop.manager.store')->persist($newStore);
-$container->get('coreshop.manager.store')->flush();
-
-

You now have a new persisted Store.

-

Read

-

If you want to query for Stores, you can do following:

-
$storeRepository = $container->get('coreshop.repository.store');
-
-$queryBuilder = $storeRepository->createQueryBuilder('c');
-
-// You can now create your query
-
-// And get the result
-
-$stores = $queryBuilder->getQuery()->getResult();
-
-
-

Update

-

If you want to update and existing Store, you need to do following:

-
// Fetch Store
-
-$store = $storeRepository->findById(1);
-$store->setName('Euro');
-
-// And Persist it
-$container->get('coreshop.manager.store')->persist($store);
-$container->get('coreshop.manager.store')->flush();
-
-

Delete

-

If you want to update and existing Store, you need to do following:

-
// Fetch Store
-
-$store = $storeRepository->findById(1);
-
-// And Persist it
-$container->get('coreshop.manager.store')->remove($store);
-$container->get('coreshop.manager.store')->flush();
-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Stores/Context.html b/docs/generated-docs/generated_docs/Development/Stores/Context.html deleted file mode 100644 index 642072514d..0000000000 --- a/docs/generated-docs/generated_docs/Development/Stores/Context.html +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - Context - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Store Context

-

For CoreShop to determine the current store the visitor or customer comes from -it uses a concept called context and context resolver.

-

Context

- - - - - - - - - - - - - - - - - - - - - - - -
NamePriorityTagDescription
FixedStoreContext2coreshop.context.storeUsed for testing purposes
StoreContext1coreshop.context.storeLoad a store from given request resolver
-

Resolver

- - - - - - - - - - - - - - - - - - - - - - - -
NamePriorityTagDescription
SiteBasedRequestResolver100coreshop.context.store.request_based.resolverDetermines a store by a given pimcore frontend site
PimcoreAdminSiteBasedRequestResolver200coreshop.context.store.request_based.resolverDetermines a store by a given document in backend
-

These resolver take care about finding the correct store for the current request.

-

Create a Custom Resolver

-

A Store Context needs to implement the interface CoreShop\Component\Store\Context\StoreContextInterface. -This interface consists of one method called getStore which returns a CoreShop\Component\Store\Model\StoreInterface or throws an CoreShop\Component\Store\Context\StoreNotFoundException.

-

To register your context, you need to use the tag coreshop.context.store with an optional priority attribute.

-

Create a Request based Resolver

-

CoreShop already implements Request based store context resolver. So if your context depends on the current request, you can -create a custom RequestBased resolver. To do that, implement the interface CoreShop\Component\Store\Context\RequestBased\RequestResolverInterface -with the method findStore. This method either returns a store or null.

-

To register this resolver, use the tag: coreshop.context.store.request_based.resolver with an optional priority attribute.

-

Example

-

We want to a StoreContext to be based on the Pimcore Document. So if we are on site /de, we want to resolve to Store DE, if we -are on page /en we want to resolve to Store Store EN:

-

1: First of all we need to create our RequestBased Store Context:

-
<?php
-
-namespace AppBundle\CoreShop\Store\Context;
-
-use CoreShop\Component\Store\Context\RequestBased\RequestResolverInterface;
-use CoreShop\Component\Store\Repository\StoreRepositoryInterface;
-use Pimcore\Http\Request\Resolver\DocumentResolver;
-use Symfony\Component\HttpFoundation\Request;
-
-final class DocumentBasedRequestRequestResolver implements RequestResolverInterface
-{
-    private StoreRepositoryInterface $storeRepository;
-
-    public function __construct(StoreRepositoryInterface $storeRepository)
-    {
-        $this->storeRepository = $storeRepository;
-    }
-
-    public function findStore(Request $request): ?StoreInterface
-    {
-        if (substr($request->getPathInfo(), 0, 3) === '/en') {
-            return $this->storeRepository->find(1);
-        }
-
-        if (substr($request->getPathInfo(), 0, 3) === '/de') {
-            return $this->storeRepository->find(2);
-        }
-
-        return null;
-    }
-}
-
-

Now we need to configure the service in src/AppBundle/Resources/config/services.yml

-
services:
-  app.coreshop.store.context.request.document_based:
-    class: AppBundle\CoreShop\Store\Context\DocumentBasedRequestRequestResolver
-    arguments:
-      - '@coreshop.repository.store'
-    tags:
-      - { name: coreshop.context.store.request_based.resolver, priority: 300 }
-
-
-

CoreShop now tries to resolve the current Store based on the Pimcore Site we are on.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Stores/Theme.html b/docs/generated-docs/generated_docs/Development/Stores/Theme.html deleted file mode 100644 index de14a96284..0000000000 --- a/docs/generated-docs/generated_docs/Development/Stores/Theme.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - Theme - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/Stores/index.html b/docs/generated-docs/generated_docs/Development/Stores/index.html deleted file mode 100644 index e2bfed7dbc..0000000000 --- a/docs/generated-docs/generated_docs/Development/Stores/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Stores - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Development/index.html b/docs/generated-docs/generated_docs/Development/index.html deleted file mode 100644 index e344bf0508..0000000000 --- a/docs/generated-docs/generated_docs/Development/index.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - Development - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop

-

The Developer’s guide to leveraging the flexibility of CoreShop. Here you will find all the concepts used in CoreShop.

-

Introduction

-

CoreShop Resources

-

CoreShop uses Doctrine ORM for Custom Resources. ORM enables us great flexibility and extendability for simple models like Currencies and Countries. -CoreShop currently implements these Resources as ORM Model:

-
    -
  • Currency
  • -
  • Country and State
  • -
  • Tax Rate and Tax Rules
  • -
  • Price Rules
  • -
  • Carrier
  • -
  • Shipping Rules
  • -
  • Index and Filter Configuration
  • -
  • Notification Rule Configuration
  • -
  • Stores
  • -
  • Payments
  • -
-

Everytime something is called a Resource, we talk about ORM Models.

-

CoreShop Pimcore Models

-

CoreShop also takes advantage of Pimcores flexible data-model. -Objects that are heavily used and changed are implemented using Data Objects:

-
    -
  • Product
  • -
  • Product Category
  • -
  • Manufacturer
  • -
  • Cart
  • -
  • Order
  • -
  • Order Invoice
  • -
  • Order Shipment
  • -
  • Quote
  • -
  • Customer
  • -
  • Customer Group
  • -
  • Addresses
  • -
-

Everytime we talk about Objects, we talk about Pimcore Data Objects.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Getting_Started/Architecture_Overview.html b/docs/generated-docs/generated_docs/Getting_Started/Architecture_Overview.html deleted file mode 100644 index 0987c614f0..0000000000 --- a/docs/generated-docs/generated_docs/Getting_Started/Architecture_Overview.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - Architecture Overview - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Architecture

-

CoreShop is completely open source (GPl license) and free, maintained by diverse and creative community of developers and companies.

-

What are our core values and what makes us different from other solutions?

-
    -
  • Components based approach
  • -
  • Unlimited flexibility and simple customization
  • -
  • Developer-friendly, using latest technologies
  • -
  • Highest quality of code
  • -
-

The Three Natures of CoreShop

-

CoreShop is constructed from fully decoupled and flexible e-commerce components for PHP. -It is also a set of Symfony bundles, which integrate the components into the full-stack framework. -On top of that, CoreShop is also a complete eCommerce suite crafted from all these building blocks.

-

It is your choice how to use CoreShop, you can benefit from the components with any framework, -integrate selected bundles into existing or new Pimcore app or built your application on top of CoreShop Suite.

-

CoreShop Suite

-

This book is about our full-stack eCommerce suite, which is a standard Pimcore Bundle providing the most common webshop and a foundation for custom systems.

-

Leveraging Symfony Bundles

-

If you prefer to build your very custom system step by step and from scratch, -you can integrate the standalone Symfony bundles. -For the installation instructions, please refer to the appropriate bundle documentation.

-

Difference to the official Pimcore eCommerce Framework

-

The eCommerce Framework provides you with a basic Toolset for eCommerce Development. -CoreShop gives you a feature-rich Toolset of common needed Tools for rich and complex eCommerce Solutions.

-
-

Example I: the Framework does'nt give you the full opportunity for calculating complex Shipping Prices. -You need to code it by yourself. CoreShop provides you with Carriers and Shipping Rules to do that.

-
-

CoreShops Bundles are build to be used individually. The CoreBundle combines all the Features.

-

Architecture Overview

-

CoreShop Suite is build on CoreShop Components and Bundles. -The CoreBundle and CoreComponent glues all different Bundles and Components into one eCommerce Suite for B2B and B2C Solutions.

-

Architecture

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Getting_Started/Difference_to_ecommerce_Framework.html b/docs/generated-docs/generated_docs/Getting_Started/Difference_to_ecommerce_Framework.html deleted file mode 100644 index 02da2a7e26..0000000000 --- a/docs/generated-docs/generated_docs/Getting_Started/Difference_to_ecommerce_Framework.html +++ /dev/null @@ -1,501 +0,0 @@ - - - - - - - Difference to ecommerce Framework - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop vs. eCommerce Framework

-

The idea behind CoreShop is totally different to the eCommerce framework. The eCommerce framework gives you skeleton for building -eCommerce applications and heavily depends on you doing all the things.

-

CoreShop, on the other hand, comes full-featured with a rich toolset of optional Components which you can use, or not use, for your -ecommerce Application. In other words: CoreShop is the framework on steroids :)

-

Feature Comparison

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureeCommerce FrameworkCoreShop
Product Management
Product RestrictionsX
Product Variants
Category Management
Customer ManagementX
Customer Address ManagementX
LocalizationX
Currency ManagementX
Country ManagementX
Taxation
Payment Management
Supported Payment Providers
- Wirecard Qpay
- Wirecard Seamless
- Datatrans
- Klarna
- Recurring Payments
- PayPal ExpressX
- PayPal Pro CheckoutX
- PayPal Pro HostedX
- PayPal MasspayX
- PayPal RestX
- Stripe.jsX
- Stripe CheckoutX
- Authorize.NET AIMX
- Be2Bill Credit CardX
- Be2Bill OffsiteX
- PayexX
- OfflineX
- Payum and OmnipayX
Voucher Codes
Catalog Price Rules
Product Specific Price RulesX
Product Facet Index
Multi Theme SupportedX
Carrier ManagementX
Shipping CalculationX
Order Management
Order WorkflowX
Order Invoice GenerationX
Order Shipment GenerationX
Quotes ManagementX
ReportingX
Multi Store/Tenant
eCommerce Tracking
Configurable Mail RulesX
Backend Functionality
- Country ManagementX
- Currency ManagementX
- Taxation ManagementX
- Taxation ManagementX
- Index ManagementX
- Filter ManagementX
- Order ManagementX (partial)
- Voucher Rules
- Price Rules
- Order OverviewX (partial)
- Quote OverviewX
- Order DetailX (partial)
- Quote DetailX
- Order CreationX
- Quote CreationX
Checkout Manager
Modular/ComponentizedX (partial)
Extendable
-

To be fair, both Systems have their purpose and you can do the same with both systems. The ecommerce Framework is designed -to be very good extendable but you still need to implement a lot of stuff yourself. CoreShop gives you a lot of out-of-the-box -features to quickly create rich ecommerce systems.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Getting_Started/Installation.html b/docs/generated-docs/generated_docs/Getting_Started/Installation.html deleted file mode 100644 index 60b4ccc966..0000000000 --- a/docs/generated-docs/generated_docs/Getting_Started/Installation.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - Installation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Installation

-

You need a running instance of Pimcore on your system before you can install CoreShop.

-

You can setup your own example:

-
    -
  • Install with composer composer require coreshop/core-shop ^3.0 -
  • -
  • Run enable Bundle command -php bin/console pimcore:bundle:enable CoreShopCoreBundle -
  • -
  • Run Install Command -php bin/console coreshop:install -
  • -
  • Optional: Install Demo Data php bin/console coreshop:install:demo -
  • -
-

Messenger

-

CoreShop also uses Symfony Messenger for async tasks like sending E-Mails or Processing DataObjects for the Index. Please run these 2 transports to process the data

-
bin/console messenger:consume coreshop_notification coreshop_index --time-limit=300
-
-

Payment

-

CoreShop uses Payum for Payment. Checkout Payums Documentation on how to add payment providers.

-

Payment providers are implemented as Pimcore Plugin. They can be installed using composer. Here you can find all available payment modules via composer

-

Payum Documentation

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Getting_Started/Upgrade_Notes.html b/docs/generated-docs/generated_docs/Getting_Started/Upgrade_Notes.html deleted file mode 100644 index 2c40daa1ce..0000000000 --- a/docs/generated-docs/generated_docs/Getting_Started/Upgrade_Notes.html +++ /dev/null @@ -1,444 +0,0 @@ - - - - - - - Upgrade Notes - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Upgrade Notes

-

Always check this page for some important upgrade notes before updating to the latest coreshop build.

-

2.0.0-beta.3 to 2.0.0-beta.4

-
    -
  • -BC break: All occurrences of parameters coreshop.all.stack.pimcore_class_ids, "application".model."class".pimcore_class_id, coreshop.all.pimcore_classes.ids have been removed. Inject the corresponding Repository and use classId function instead
  • -
  • -Pimcore: CoreShop now requires at least Pimcore 5.4.0. You need to update Pimcore to the at least 5.4.0 in order to use/update CoreShop.
  • -
-

Product Price Calculation

-

In order to allow custom price calculation on API Level, we changed the way CoreShop calculates product prices by introducing a new parameter to every PriceCalculation Interface. Price Calculator Conditions are not anymore using a Live context, instead it gets passed via API.

-

Following interfaces have changed:

-
    -
  • -CoreShop\Component\Core\Product\TaxedProductPriceCalculatorInterface -
  • -
  • -CoreShop\Component\Order\Calculator\PurchasableDiscountCalculatorInterface -
  • -
  • -CoreShop\Component\Order\Calculator\PurchasableDiscountPriceCalculatorInterface -
  • -
  • -CoreShop\Component\Order\Calculator\PurchasablePriceCalculatorInterface -
  • -
  • -CoreShop\Component\Order\Calculator\PurchasableRetailPriceCalculatorInterface -
  • -
  • -CoreShop\Component\Product\Calculator\ProductDiscountCalculatorInterface -
  • -
  • -CoreShop\Component\Product\Calculator\ProductDiscountPriceCalculatorInterface -
  • -
  • -CoreShop\Component\Product\Calculator\ProductPriceCalculatorInterface -
  • -
  • -CoreShop\Component\Product\Calculator\ProductRetailPriceCalculatorInterface -
  • -
  • -CoreShop\Component\Product\Rule\Action\ProductDiscountActionProcessorInterface -
  • -
  • -CoreShop\Component\Product\Rule\Action\ProductDiscountPriceActionProcessorInterface -
  • -
  • -CoreShop\Component\Product\Rule\Action\ProductDiscountPriceActionProcessorInterface -
  • -
  • -CoreShop\Component\Product\Rule\Action\ProductPriceActionProcessorInterface -
  • -
  • -CoreShop\Component\Product\Rule\Fetcher\ValidRulesFetcherInterface -
  • -
-

If you have anything customized with those classes, please change them accordingly.

-

If you use the PriceCalculator Service directly, you also need to change the call from

-
$this->priceCalculator->getPrice($object, true)
-
-

to

-
$this->priceCalculator->getPrice($object, [
-    'store' => $store,
-    'country' => $country,
-    'customer' => $customer,
-    'currency' $currency,
-    'cart' => $cart
-], true)
-
-

The new second argument, is the Context for which you want to get the Price. This is highly depends on your -need. On a default CoreShop setup, the context can be fetched form the ShopperContext Service like this:

-
return  [
-    'store' => $this->shopperContext->getStore(),
-    'customer' => $this->shopperContext->hasCustomer() ? $this->shopperContext->getCustomer() : null,
-    'currency' => $this->shopperContext->getCurrency(),
-    'country' => $this->shopperContext->getCountry(),
-    'cart' => $this->shopperContext->getCart()
-];
-
-

CoreShop makes that easier for you, you can just use $this->shoppperContext->getContext(). But be aware, the Shopper Context is only in a Web Request available. -When you work on a CLI Level, you have to define the context yourself.

-

If you already have a cart and want to calculate the price for the cart, the context is a bit different, cause it resolves from the cart

-
$context = [
-    'store' => $cart->getStore(),
-    'customer' => $cart->getCustomer() ?: null,
-    'currency' => $cart->getCurrency(),
-    'country' => $cart->getStore()->getBaseCountry(),
-    'cart' => $cart
-];
-
-

Taxation

-

Tax Rule Store relation has been removed as it makes currently no sense.

-

Tracking

-

Tracking bundle has completely been refactored in order to support more use-cases than just ecommerce. If you have any customizations made, please check the current implementation to adapt your changes.

-

Order Invoice

-

Due to changes in adjustments, we also need to change OrderInvoice/OrderInvoiceItem.

-

After you have migrated to the latest version you also have to remove some fields:

-

CoreShopOrderInvoice

-
    -
  • totalTax
  • -
  • baseTotalTax
  • -
  • subtotalTax
  • -
  • baseSubtotalTax
  • -
  • shippingTax
  • -
  • baseShippingTax
  • -
  • taxes
  • -
  • baseTaxes
  • -
  • discountTax
  • -
  • baseDiscountTax
  • -
  • discountNet
  • -
  • discountGross
  • -
  • baseDiscountNet
  • -
  • baseDiscountGross
  • -
  • shippingNet
  • -
  • shippingGross
  • -
  • baseShippingNet
  • -
  • baseShippingGross
  • -
  • shippingTaxRate
  • -
-

CoreShopOrderInvoiceItem

-
    -
  • totalTax
  • -
  • baseTotalTax
  • -
  • taxes
  • -
  • baseTaxes
  • -
-

Adjustments

-
-

BC break / New Feature

-
-

There are several deprecated class fields. -After you have migrated to the latest version you also have to remove them:

-

CoreShopOrder / CoreShopQuote

-
    -
  • shippingGross
  • -
  • shippingNet
  • -
  • shippingTax
  • -
  • discountGross
  • -
  • discountNet
  • -
  • discountTax
  • -
  • baseShippingNet
  • -
  • baseShippingGross
  • -
  • baseShippingTax
  • -
  • baseDiscountNet
  • -
  • baseDiscountGross
  • -
  • totalTax
  • -
  • baseTotalTax
  • -
  • subTotalTax
  • -
  • baseSubtotalTax
  • -
-

CoreShopOrderItem / CoreShopQuoteItem

-
    -
  • totalTax
  • -
  • baseTotalTax
  • -
-

CoreShopCart

-
    -
  • shippingGross
  • -
  • shippingNet
  • -
  • discountGross
  • -
  • discountNet
  • -
-

2.0.0-beta.2 to 2.0.0-beta.3

-
    -
  • -

    BC break Signature of following interfaces changed:

    -
      -
    • -CoreShop\Component\Index\Interpreter\InterpreterInterface: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []);
    • -
    • -CoreShop\Component\Index\Interpreter\LocalizedInterpreterInterface: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []);
    • -
    • -CoreShop\Component\Index\Interpreter\RelationInterpreterInterface: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config, $interpreterConfig = []);
    • -
    • -CoreShop\Component\Customer\Model\UserInterface::ROLE_DEFAULT renamed CoreShop\Component\Customer\Model\UserInterface::CORESHOP_ROLE_DEFAULT -
    • -
    • -CoreShop\Component\Customer\Model\UserInterface::ROLE_SUPER_ADMIN renamed CoreShop\Component\Customer\Model\UserInterface::CORESHOP_ROLE_SUPER_ADMIN -
    • -
    -
  • -
  • -

    BC break Shipment / Invoice Creation via API changed

    -
      -
    • Before adding a new Shipment / Invoice you need to dispatch a request state to your order. Read more about it here and here.
    • -
    -
  • -
  • -

    BC break getName in CoreShop\Component\Index\Model\IndexableInterface has been changed to getIndexableName as getName could eventually conflict with a non localized Pimcore Field

    -
  • -
  • -

    BC break getEnabled in CoreShop\Component\Index\Model\IndexableInterface has been changed to getIndexableEnabled as getEnabled could eventually conflict with a localized Pimcore Field

    -
  • -
-

2.0.0-beta.1 to 2.0.0-beta.2

-
    -
  • Link Generator implemented. If you want to use nice urls, you need to add the link generator service: -
      -
    • CoreShopProduct: add @coreshop.object.link_generator.product as Link Provider
    • -
    • CoreShopCategory: add @coreshop.object.link_generator.category as Link Provider
    • -
    • Change {{ path('') }} to {{ coreshop_path('') }}. You may want to checkout the FrontendBundle to get a deeper insight.
    • -
    -
  • -
  • Deprecated Field Names in - CoreShop\Component\Payment\Model\PaymentInterface`: -
      -
    • getName is now getTitle
    • -
    • getOrderId is now getOrder and directly returns a OrderInterface
    • -
    -
  • -
  • Deprecated Field Names in - CoreShop\Component\Shipping\Model\CarrierInterface: -
      -
    • getLabel is not getTitle
    • -
    • getName is now getIdentifier
    • -
    -
  • -
-

2.0.0-alpha.4 to 2.0.0-beta.1

-
    -
  • -

    BC break Signature of following interfaces changed:

    -
      -
    • -CoreShop\Component\Index\Interpreter\InterpreterInterface: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config);
    • -
    • -CoreShop\Component\Index\Interpreter\LocalizedInterpreterInterface: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config);
    • -
    • -CoreShop\Component\Index\Interpreter\RelationInterpreterInterface: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config);
    • -
    -
  • -
  • -

    BC break CoreShop now takes advantage of the dependent bundle feature introduced in Pimcore 5.1.2. Therefore, -all bundles are now automatically loaded. This is a BC break, as when updating, you might run into issues. -To solve the issues, check following things:

    -
      -
    • remove RegisterBundles entry from app/AppKernel.php -
    • -
    • remove loading CoreShopCoreBundle Configuration in app/config.yml -
    • -
    • enable CoreShopCoreBundle via CLI or manually in var/config/extensions.php: "CoreShop\\Bundle\\CoreBundle\\CoreShopCoreBundle" => TRUE -
    • -
    -
  • -
  • -

    BC break Upgraded Default Layout to Bootstrap 4. This will most certainly cause issues when you just override certain templates. Best would be to copy all templates from before the Bootstrap 4 Upgrade.

    -
  • -
-

2.0.0-alpha.4 to 2.0.0-alpha.5

-
    -
  • -BC break added Component\Core\Model\OrderItem and Component\Core\Model\QuoteItem. If you already customized them, inherit them from the Core Models.
  • -
  • -BC break changed the way CoreShop processes Cart-Rules. If you implemented a custom-condition, inherit from CoreShop\Component\Order\Cart\Rule\Condition\AbstractConditionChecker and implement isCartRuleValid instead of isValid -
  • -
  • Deprecated: remove cart/add-price-rule/ static route.
  • -
-

2.0.0-alpha.3 to 2.0.0-alpha.4

-
    -
  • -BC break decoupled MoneyBundle from CurrencyBundle, therefore the Twig Extension for Money Conversion went to the CurrencyBundle. Therefore the name of that extension was renamed from -coreshop_convert_money to coreshop_convert_currency. If you use it directly in your code, please rename all of them.
  • -
  • Deprecated CoreShopAdminBundle which responsability was only handling installation and deliviering pimcore resources like JS and CSS files. -
      -
    • Installation has been moved to CoreShopCoreBundle
    • -
    • Delivering of resources is now handled by CoreShopResourceBundle, this also makes it easier to use CoreShop Bundles without handling resources yourself.
    • -
    -
  • -
-

2.0.0-alpha.2 to 2.0.0-alpha.3

-
    -
  • -

    BC break getPrice in PurchasableInterface and ProductInterface has been removed. In favor of this a new coreShopStorePrice editable has been introduced, which stores prices for each store. This makes handling of multiple currencies way more elegant.

    -

    If you still want to use the old getPrice, create a new Subclass of \CoreShop\Component\Core\Model\Product, implement \CoreShop\Component\Order\Model\PriceAwarePurchasableInterface and set your class to CoreShopProduct parents.

    -
  • -
-

V1 to V2

-
    -
  • CoreShop 2 is not backward compatible. Due to the framework change, we decided to re-make CoreShop from scratch. If you still have instances running and want to migrate, there is a basic migration way which gets you data from V1 to V2.
  • -
  • -Export from CoreShop1 -
  • -
  • -Import into CoreShop2 -
  • -
-

Within V1

-
    -
  • Nothing available
  • -
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/Getting_Started/index.html b/docs/generated-docs/generated_docs/Getting_Started/index.html deleted file mode 100644 index b28796fba4..0000000000 --- a/docs/generated-docs/generated_docs/Getting_Started/index.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - Getting Started - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Automation/index.html b/docs/generated-docs/generated_docs/User_Documentation/Automation/index.html deleted file mode 100644 index d555c223d6..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Automation/index.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - Automation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Automation

-

In CoreShop there are several automation mechanism implemented.

-

Order Cancellation

-
-

Execution Time: Once per day via maintenance job

-
-

CoreShop will automatically cancel orders older than 20 days.

-

Change Orders Expiration Date

-
core_shop_order:
-    expiration:
-        order:
-            days: 30
-
-

Expired Carts

-
-

Execution Time: Once per day via maintenance job

-
-
-

Note: By default, this feature is disabled.

-
-

By default, this feature is disabled (days = 0) so no carts will be removed by default. -If you want to remove older carts, just enable it via configuration:

-

Change Cart Expiration Date

-
core_shop_order:
-    expiration:
-        cart:
-            days: 20
-            anonymous: true
-            customer: true
-
-

Expired Rules

-
-

Execution Time: Once per day via maintenance job

-
-

If you're having a lot of active rules in your system, you may want to disable them via automation. -CoreShop already comes with a time-span check, which means all rules with time-span elements will be disabled if they're outdated. -If you want do implement some further availability logic, you could use the coreshop.rule.availability_check Event to define -the availability of the rule. Just use the setAvailability() method to override the system availability suggestion.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Cart/index.html b/docs/generated-docs/generated_docs/User_Documentation/Cart/index.html deleted file mode 100644 index 60f140ad50..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Cart/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - Cart - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart

-

Inventory Change

-

If a customer adds a item to the cart CoreShop will check if product stock is sufficient. If not, a form error will show up.

-

Disable / Delete Products

-

If a product gets disabled or deleted in backend CoreShop will automatically remove this product from all active carts. -A form error will notify every customer in frontend if the cart has been modified.

-

Abandoned Carts

-

No cart gets deleted by default. This allows you to:

-
    -
  • check abandoned cart statistics
  • -
  • build your own business logic in case you want to inform customers within a follow-up email for example
  • -
-

There is a expire cart command to remove abandoned carts, please checkout the development section.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Catalog/Categories.html b/docs/generated-docs/generated_docs/User_Documentation/Catalog/Categories.html deleted file mode 100644 index fe02f8c542..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Catalog/Categories.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Categories - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Categories Documentation

-

Categories in CoreShop provide a way to organize and structure the products in your e-commerce store built on the Pimcore platform. Using categories, you can create a hierarchical navigation system that allows customers to browse and find products easily.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Catalog/Product_Variants.html b/docs/generated-docs/generated_docs/User_Documentation/Catalog/Product_Variants.html deleted file mode 100644 index 5cacffb455..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Catalog/Product_Variants.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Product Variants - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Catalog/Products.html b/docs/generated-docs/generated_docs/User_Documentation/Catalog/Products.html deleted file mode 100644 index 4a7dc0047b..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Catalog/Products.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Products - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Products Documentation

-

Products are the core of any e-commerce store built on the Pimcore platform. CoreShop provides a flexible and feature-rich system for managing products, including product variants, attributes, images, and more.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Catalog/index.html b/docs/generated-docs/generated_docs/User_Documentation/Catalog/index.html deleted file mode 100644 index c9e6825d60..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Catalog/index.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - Catalog - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Geo_IP.html b/docs/generated-docs/generated_docs/User_Documentation/Geo_IP.html deleted file mode 100644 index e069779e85..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Geo_IP.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - Geo IP - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop can use GeoIP to locate visitors countries using IP-Addresses.

-

CoreShop uses the already existing Pimcore GeoIP Database located in: /var/config/GeoLite2-City.mmdb

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Inventory/index.html b/docs/generated-docs/generated_docs/User_Documentation/Inventory/index.html deleted file mode 100644 index c070e8e34e..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Inventory/index.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - Inventory - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Inventory

-

The Inventory is a complex topic since there is a lot of business logic you need to know about.

-

Product Inventory

-

Every Product object comes with a "Stock" Tab. Let's have a look about the configuration:

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
Is TrackedDefine if a product should get tracked
On HandAmount of available products.
On HoldDefines how many elements are currently locked. Do not change that value unless you know what you're doing.
-

Is Tracked

-

If you want to enable the inventory feature for a product, you need to check this setting. -After that this product is not orderable in frontend if stock is insufficient.

-
-

Note: Only if you enable "Is Tracked" the inventory stock is active! -Otherwise the product is always available regardless of it's stock amount.

-
-

On Hand

-

Define a available amount for each product. -With every successfully order, an arbitrary amount will be subtracted.

-

On Hold

-

This one needs some further explanation: -After the checkout is complete, all ordered items will be removed from "On Hand" and get moved to "On Hold" until the payment is complete:

-
    -
  • If the unpaid order gets cancelled, the reserved "On Hold" amount gets back to "On Hand".
  • -
  • If the order payment status switches to paid, the reserved "On Hold" amount gets subtracted.
  • -
-

Cart / Checkout

-

If a product stock gets insufficient during a customers checkout, the product gets removed from customers cart following by a form error.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/Countries.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/Countries.html deleted file mode 100644 index 63c8633f15..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Localization/Countries.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - Countries - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Country

-

A Country consists of following values:

-
    -
  • Name
  • -
  • ISO-Code
  • -
  • Active: Determines if customers from this country are able to purchase from your store
  • -
  • Use Store default Currency: If checked, your stores default currency will be applied to the country
  • -
  • Currency
  • -
  • Zone
  • -
  • Stores: Determines for which Stores this Country is available.
  • -
-

Countries

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/Currencies.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/Currencies.html deleted file mode 100644 index 7fe32d283c..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Localization/Currencies.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - Currencies - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Currencies

-

A Currency consists of following values:

-
    -
  • Name
  • -
  • ISO Code
  • -
  • Numeric ISO Code
  • -
  • Symbol
  • -
  • Exchange Rate: Is used to convert between different currencies
  • -
-

If you are going to use Currency conversion, you need to update exchange ranges regularly.

-

Currencies

-

Automated Exchange Rates

-

CoreShop supports mulitple providers to get exchange ranges from. Currently supported:

-
    -
  • CentralBankOfRepulicTurkey
  • -
  • EuropeanCentralBank
  • -
  • GoogleFinance
  • -
  • NationalBankOfRomania
  • -
  • YahooFinance
  • -
  • WebserviceX
  • -
-

To activate this feature, enable it within CoreShop Settings and choose your provider.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/States.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/States.html deleted file mode 100644 index 575100765c..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Localization/States.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - States - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/TaxRules.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/TaxRules.html deleted file mode 100644 index 5fc3943955..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Localization/TaxRules.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - TaxRules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Tax Rules

-

Tax Rules determine which Tax Rate should be used for the customers country/state. This Tax Rule is then applied to a product.

-

A Tax Rule consists of following values:

-
    -
  • Name
  • -
  • Active
  • -
  • Stores: In which Stores this Tax-Rule can be used.
  • -
  • Rules: Which Country and/or State should use which Tax Rate and what should happen when multiple Tax Rates apply.
  • -
-

Tax Rules

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/Taxes.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/Taxes.html deleted file mode 100644 index 62000b9206..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Localization/Taxes.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - Taxes - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Taxes

-

A Tax Rate consists of following values:

-
    -
  • Localized Name: This name can also be seen in the cart or on invoices
  • -
  • Rate: Tax Rate, for example 20%
  • -
  • Active
  • -
-

Taxes are going to be used in Tax Rules.

-

Taxes

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/Zones.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/Zones.html deleted file mode 100644 index 9581b838b2..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Localization/Zones.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - Zones - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Localization/index.html b/docs/generated-docs/generated_docs/User_Documentation/Localization/index.html deleted file mode 100644 index 08a1446be2..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Localization/index.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - Localization - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Comments.html b/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Comments.html deleted file mode 100644 index aa91f52a1a..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Comments.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - Order Comments - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Order Comments

-

Comment -Comment

-

CoreShop provides a simple comment interface which allows you to add simple notes to every order. -It's also possible to send the order comment to the customer. Just check "Submit Comment to Customer".

-
-

Note: You need a valid Notification Rule to send comments to user.

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Detail.html b/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Detail.html deleted file mode 100644 index 3450953825..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Detail.html +++ /dev/null @@ -1,310 +0,0 @@ - - - - - - - Order Detail - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Order Detail

-

State / Price Overview

-

Please read more about the order workflow process here

-

Besides some useful information about the order store and the total order amount, -there're also several order states:

-

State

-

This is the main state and represents the summary of all order states.

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newNew order has been placed.
confirmedNew order has been successfully created (after a offline order or a customer returns from payment gateway regardless of its state).
cancelledOrder has been cancelled.
completeOrder is complete.
-

Payment State

-

Global payment states per order and represents the summary of all order payments:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newNew payment has been created.
awaiting_paymentWaiting for payment: User is on payment offsite or payment is offline.
partially_paidSome order payments have been paid.
paidAll payments have been paid.
cancelledOrder is complete.
partially_refundedSome order payments have been refunded.
refundedAll payments have been refunded.
-

Shipment State

-

Global shipment states per order and represents the summary of all order shipments:

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newNew shipment has been placed.
cancelledShipment has been cancelled
partially_shippedSome order items have been shipped.
shippedAll items have been shipped.
-

Invoice State

-

Global invoice states per order and represents the summary of all order invoices:

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
newNew invoice has been created.
cancelledInvoice has been cancelled
partially_invoicedSome invoices have been invoiced.
invoicedAll invoices have been invoiced.
-

Carrier/Payment Provider Info

-
    -
  • Currency of Order
  • -
  • Overall weight of Order Items
  • -
  • Carrier
  • -
  • Total Amount
  • -
-

Order History

-

The Order History shows you when specific states have been changed.

-

Payments

-

--

-

Shipments

-

--

-

Invoices

-

--

-

Mail Correspondence

-

--

-

Customer

-

--

-

Comments

-

--

-

Additional Data

-

--

-

Products

-

--

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Workflow.html b/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Workflow.html deleted file mode 100644 index 6bb9bc07a9..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Order/Order_Workflow.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - - Order Workflow - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

Order Workflow

-
-

Technical Overview of CoreShop Workflows.

-
-

Change States

-

States can be changed for: Order, Payment, Shipment and Invoice. -If any transition is available, you'll find a colored state button. -Click on that button to change the state.

-

Order Completion

-

In CoreShop a order is complete after the order payment reaches the paid state -and order shipment reaches the shipped state. If you also want to include the order invoice state invoiced -before a order gets completed, you need to enable a configuration flag:

-
## app/config/config.yml
-parameters:
-    coreshop.workflow.include_invoice_state_to_complete_order: true
-
-

Order Cancellation

-

In CoreShop a order rarely gets cancelled. Some reasons are:

-

Front-End Revise -After a customer has cancelled his payment he will reach a so called revise page. -From there he's able to reselect a payment gateway to start over. In revise mode, however, it's possible to cancel the order and restore the cart. -Only than the order gets cancelled.

-

Back-End Revise -In CoreShop it's possible to create orders in Back-End. Instead of adding sensitive payment information, -you're able to provide a revise link to your customer which then works the same as the Front-End revise process -(except that your customer is not able to restore a cart since there never was one).

-

Please read more about the canceling process here

-

Payment Workflow

-

Create a Payment

-

Just use the green bottom on the right top corner to add a new shipment. -A payment creation normally gets created by a frontend payment gateway. -This gateway also handles all the payment state changes.

-

Workflow Rules

-
    -
  • A payment reaches the new state after its creation.
  • -
  • A payment can be canceled as long it's in the new or processing state.
  • -
  • After a payment reaches completed state it only can get refunded.
  • -
-
-

Attention: The Refund process is not implemented yet in Coreshop!

-
-

Shipment Workflow

-

Create a Shipment

-

Just use the green bottom on the right top corner to add a new shipment. -If there are enough shippable items you can create a shipment.

-

Workflow Rules

-
    -
  • A shipment reaches the ready state (triggered by a create transition) after its creation.
  • -
  • A shipment can be canceled as long it's in the ready state
  • -
  • After you provoked the ship state a shipment can't be cancelled anymore.
  • -
-

Invoice Workflow

-

Create Invoice

-

Just use the green bottom on the right top corner to add a new invoice. -If there are enough invoiceable items you can create a invoice.

-

Workflow Rules

-
    -
  • A invoice reaches the ready state (triggered by a create transition) after its creation.
  • -
  • A invoice can be canceled as long it's in the ready state. Please note: Cancelling an invoice is not a refund action. You're allowed to create another invoice after cancelling the previous one.
  • -
  • After you provoked the complete state a invoice can't be cancelled anymore which means the invoice has been finally captured. After that you need to go on with a refund process
  • -
-
-

Attention: The Refund process is not implemented yet in Coreshop!

-
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Order/Orders.html b/docs/generated-docs/generated_docs/User_Documentation/Order/Orders.html deleted file mode 100644 index f47e951007..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Order/Orders.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - Orders - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Orders

-

Grid View

-

The default order list is based on the pimcore grid view. -CoreShop comes with a default column configuration:

-
    -
  • On the right side, click "Column configuration" and select "Order Overview".
  • -
  • Now click that button again and select "Set as favorite".
  • -
-

Filters in Grid View

-

It's possible to add custom filter definitions based on your project. -This has to be done via a php service. Read more about it here.

-

Apply Actions in Grid View

-

It's possible to apply custom bulk actions for selected orders. -This has to be done via a php service. Read more about it here.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Order/index.html b/docs/generated-docs/generated_docs/User_Documentation/Order/index.html deleted file mode 100644 index b63c6a937e..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Order/index.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - Order - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Actions.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Actions.html deleted file mode 100644 index 83863a9273..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Actions.html +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - Actions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Price Rule Actions

-

Get a brief overview of all the available Price Rule Actions in CoreShop.

-

Free Shipping

-
-

Available for: Cart Price Rules

-
-

Add this action to allow free shipping.

-

Gift Product

-
-

Available for: Cart Price Rules

-
-

Add this action to place a gift in customers cart.

-

Options

- - - - - - - - - - - - - -
NameDescription
Gift ProductNeeds to be a coreshop registered product object
-

Discount Amount

-
-

Available for: Cart Price Rules, Specific Product Price, Product Price

-
-

Set a arbitrary amount of discount.

-

Options

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
AmountDefine Amount
GrossIf given Amount has included VAT, check it
CurrencySet Currency of given amount
Apply OnSelect Between total and subtotal. Note: This option is only available in the cart rule context
-

Discount Percent

-
-

Available for: Cart Price Rules, Specific Product Price, Product Price

-
-

Set a arbitrary percentage amount of discount.

-

Options

- - - - - - - - - - - - - - - - - -
NameDescription
PercentDefine Amount
Apply OnSelect Between total and subtotal. Note: This option is only available in the cart rule context
-

New Price

-
-

Available for: Specific Product Price, Product Price

-
-

Define a new Price.

-
-

Note: This will be used as a new price in frontend so there is no "special discount price" labelling. -If you need a highlighted discount price, use the Discount Price Action.

-
-

Options

- - - - - - - - - - - - - - - - - -
NameDescription
PriceSet new Price
CurrencySet Currency of given amount
-

Discount Price

-
-

Available for: Specific Product Price, Product Price

-
-

Define a discount Price.

-

Options

- - - - - - - - - - - - - - - - - -
NameDescription
PriceSet discount Price
CurrencySet Currency of given amount
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Cart_Price_Rules.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Cart_Price_Rules.html deleted file mode 100644 index 5154896094..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Cart_Price_Rules.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - Cart Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart Price Rules Documentation

-

Cart price rules in CoreShop provide a flexible way to offer discounts and promotions in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions, such as cart subtotal, specific products, customer groups, or other criteria. This documentation will guide you through creating and managing cart price rules in CoreShop.

-

Cart Price Rules

-

Available Actions

- -

Available Conditions

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Conditions.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Conditions.html deleted file mode 100644 index d79cbaa632..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Conditions.html +++ /dev/null @@ -1,435 +0,0 @@ - - - - - - - Conditions - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Price Rules Conditions

-

Get a brief overview of all the available Price Rule Conditions in CoreShop.

-

Customers

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Define one ore more customers to whom the price rule should get applied.

-

Options

- - - - - - - - - - - - - -
NameDescription
CustomersOne ore multiple CoreShop Customer Objects
-

Customer Groups

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Define one ore more customer groups to whom the price rule should get applied.

-

Options

- - - - - - - - - - - - - -
NameDescription
GroupsOne ore multiple CoreShop Customer Group Objects
-

Time Span

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Define a time span in which range the price rule is valid

-

Options

- - - - - - - - - - - - - - - - - -
NameDescription
Date FromDate/Time Start
Date ToDate/Time End
-

Voucher

-
-

Available for: Cart Price Rules

-
-

Define some Voucher Conditions. Check out the Voucher Section to learn more about Voucher Configuration.

-

Options

- - - - - - - - - - - - - - - - - -
NameDescription
Max. Usage per CodeDefine how often a voucher code can be used.
Allow only one Voucher per CodeIf checked, only one Voucher per Cart is allowed.
-

Amount

-
-

Available for: Cart Price Rules

-
-

Define a Price range within the price rule should get applied.

-

Options

- - - - - - - - - - - - - - - - - -
NameDescription
Min AmountThe min amount of cart
Max AmountThe max amount of cart
-

Countries

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Bind a specific country to the price rule. -Important: This Condition is connected with the Country Context Resolver. -This Condition does not implies to use the Users current location since the Resolver could be also store related.

-

Options

- - - - - - - - - - - - - -
NameDescription
CountriesSelect one or multiple Countries
-

Zones

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Bind a specific zone to the price rule. -Important: This Condition is connected with the Country Context Resolver. -This Condition does not implies to use the Users current location since the Resolver could be also store related.

-

Options

- - - - - - - - - - - - - -
NameDescription
ZonesSelect one or multiple Zones
-

Stores

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Bind a specific store to the price rule.

-

Options

- - - - - - - - - - - - - -
NameDescription
StoresSelect one or multiple Stores
-

Currencies

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Define which currencies are valid to apply the price rule

-

Options

- - - - - - - - - - - - - -
NameDescription
CurrenciesSelect one or multiple Currencies
-

Carriers

-
-

Available for: Cart Price Rules

-
-

Define which carriers are valid to apply the price rule

-

Options

- - - - - - - - - - - - - -
NameDescription
CarriersSelect one or multiple Carriers
-

Nested Rules

-
-

Available for: Cart Price Rules, Specific Product Prices, Product Price

-
-

Build complex AND, OR and NOT nested conditions. -Within a nested rules it's possible to add any other condition again.

-

Options

- - - - - - - - - - - - - -
NameDescription
OperatorAND, OR and NOT
-

Products

-
-

Available for: Cart Price Rules, Product Price

-
-

Apply rule only if given products are available.

-

Options

- - - - - - - - - - - - - -
NameDescription
ProductsOne ore multiple CoreShop Product Objects
-

Categories

-
-

Available for: Cart Price Rules, Product Price

-
-

Apply rule only if products linked with given categories are available.

-

Options

- - - - - - - - - - - - - -
NameDescription
CategoriesOne ore multiple CoreShop Category Objects
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Product_Price_Rules.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Product_Price_Rules.html deleted file mode 100644 index d78bc382d4..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Product_Price_Rules.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - Product Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Product Price Rules Documentation

-

Product price rules in CoreShop offer a flexible way to provide discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions and can apply to specific products, categories, or customer groups. This documentation will guide you through creating and managing product price rules in CoreShop.

-

Cart Price Rules

-

Available Actions

- -

Available Conditions

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html deleted file mode 100644 index e0f16147e1..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Quantity_Price_Rules.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - Quantity Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Quantity Price Rules Documentation

-

CoreShop Quantity Price Rules provide a flexible way to offer volume-based discounts for products in your e-commerce store built on the Pimcore platform. These rules apply to specific products and offer tiered pricing depending on the quantity purchased. This documentation will guide you through creating and managing quantity price rules in CoreShop.

-

Specific Price Rules

-

Available Conditions

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Specific_Price_Rules.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Specific_Price_Rules.html deleted file mode 100644 index 10561c6043..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Specific_Price_Rules.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - Specific Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Specific Price Rules Documentation

-

Specific price rules in CoreShop provide a flexible way to create targeted discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules apply directly to individual products or variants and can be based on customer groups, currencies, or countries. This documentation will guide you through creating and managing specific price rules in CoreShop.

-

Specific Price Rules

-

Available Actions

- -

Available Conditions

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Vouchers.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Vouchers.html deleted file mode 100644 index 26cf16cb7c..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/Vouchers.html +++ /dev/null @@ -1,264 +0,0 @@ - - - - - - - Vouchers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Vouchers

-
-

Info: In CoreShop Vouchers are Price Rules too. -To use or generate Vouchers you need to add a Cart Price Rule.

-
-

How to create Vouchers

-

Simple create a new cart price rule and activate "Is Voucher Rule". -With that, the "Voucher Codes" tab gets enabled.

-

Voucher

-

Voucher Condition

-

Voucher

-

If you need more control about handling Vouchers you need to add the "Voucher" Condition:

- - - - - - - - - - - - - - - - - -
NameDescription
Max. Usage per CodeDefine how often a voucher code can be used.
Allow only one Voucher per CodeIf checked, only one Voucher per Cart is allowed.
-

Voucher Codes

-

Voucher

-

Within the "Voucher Codes" tab you're able to manage codes for the current price rule. -It's also possible to export generated codes to csv file.

-
-

If you need more globally statistics about vouchers please use the voucher report.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
CodeGenerated voucher code
Creation DateVoucher creation date
UsedIf the Voucher has been used you'll see a true statement
UsesAmount of uses per code
ActionIt's possible to delete voucher codes as long they're not in use
-

Create Voucher Code

-

There are two ways to generate Codes:

-

Single Voucher Code

-

Create a single voucher code. -The input field allows any string input, however if you already have added a code with the same string, you'll get a unique error message.

-

Voucher Codes Generator

-

This is the more advanced option to generate voucher codes:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
AmountDefine how many voucher codes should be generated
LengthDefine the Voucher Code Length
FormatVoucher Format. Possible Values: Alphanumeric, Alphabetic, Numeric
PrefixDefine a prefix for each code. For example SHOP-
SuffixDefine a suffix for each code. For example -SHOP
Hyphens all X charactersAdd a Dash (-) after every X character
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/index.html b/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/index.html deleted file mode 100644 index 85dfec0600..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Price_Rules/index.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - Price Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Price Rules

-

CoreShop Price Rules are very powerful tools for price calculation. -This section will help you to get a detailed overview about how price calculation works in CoreShop:

-

Types of Price Rules

-

There are three Price Rule Types.

-

1. Cart Price Rules

-

Apply Price Rule to the customers cart.

-

2. Product Price Rules

-

Apply Price Rule globally.

-

3. Specific Product Prices

-

Apply Price Rules to specific products.

-

Global Priority

-
    -
  • Product Price Rules first
  • -
  • Specific Price Rules second
  • -
-

Example 1:

-
    -
  • Given: Product A with price 100,-
  • -
  • Product Price Rule for Product A: New Price 50,-
  • -
  • Specific Price Rule for Product A: New Price: 20,-
  • -
  • Given Price: 20,-
  • -
-

Example 2:

-
    -
  • Given: Product A with price 100,-
  • -
  • Product Price Rule for Product A: Discount Percentage 50%
  • -
  • Specific Price Rule for Product A: New Price: 50,-
  • -
  • Given Price: 25,-
  • -
-

Specific Price Priority

-

Since it's possible to add multiple Specific Price Rules per Product you can adjust the -priority via the priority number field.

-

Automatic Rule Availability Checker

-

Rules with time-span elements included on root level will be disabled automatically if they're outdated. -Read more about automation here.

-

More Information

- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Abandoned_Carts.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Abandoned_Carts.html deleted file mode 100644 index 585506d389..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Reports/Abandoned_Carts.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - Abandoned Carts - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Abandoned Carts Report

- - - - - - - - - - - - - -
TypeHas Pagination
ListYes
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Grid Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
Customer NameCustomer name (if available)
EmailCustomer Email (if available)
Selected PaymentName of selected Payment
Creation DateCreation Date
Modification DateModification Date
Items in CartAmount of Items in Cart
ActionOpen Cart Object
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Carrier_Distribution.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Carrier_Distribution.html deleted file mode 100644 index b1ffa22f8f..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Reports/Carrier_Distribution.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - Carrier Distribution - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Carrier Distribution Report

-

Carrier Distribution

- - - - - - - - - - - - - -
TypeHas Pagination
Pie ChartNo
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Chart Fields

-

Carrier Distribution

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Carts.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Carts.html deleted file mode 100644 index 7153bc7d5c..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Reports/Carts.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - Carts - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Cart/Order Conversion Report

-

Carts Report

- - - - - - - - - - - - - -
TypeHas Pagination
Cartesian ChartNo
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Chart Fields

- - - - - - - - - - - - - - - - - -
NameDescription
YAmount (Cart, Order)
XDate
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Categories.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Categories.html deleted file mode 100644 index 697421e94e..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Reports/Categories.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - Categories - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Categories Report

-

Categories Report

- - - - - - - - - - - - - -
TypeHas Pagination
ListNo
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Grid Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
NameProduct Name
Order CountAmount of Orders
QuantityQuantity
SalesSales
ProfitProfit
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Customers.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Customers.html deleted file mode 100644 index af8cfa820e..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Reports/Customers.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - - Customers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Customers Report

-

Customers Report

- - - - - - - - - - - - - -
TypeHas Pagination
ListNo
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Grid Fields

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
NameCustomer Name
Order CountAmount of Orders
SalesSales
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Payment_Distribution.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Payment_Distribution.html deleted file mode 100644 index 1c247846e8..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Reports/Payment_Distribution.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - Payment Distribution - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Payment Distribution Report

-

Payment Distribution

- - - - - - - - - - - - - -
TypeHas Pagination
Pie ChartNo
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Chart Fields

-

Payment Provider Distribution

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Products.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Products.html deleted file mode 100644 index 751dfb981e..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Reports/Products.html +++ /dev/null @@ -1,281 +0,0 @@ - - - - - - - Products - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Products Report

-

Products Report

- - - - - - - - - - - - - -
TypeHas Pagination
ListYes
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
Product TypesGroup Filter by Main Products, Variants, Container Products
-

Product Types

- - - - - - - - - - - - - - - - - - - - - -
NameDescription
Main ProductsOnly show Products without Variant inclusion
VariantsOnly show Variant Product Types
Container ProductsShow Sum of Products and Child-Products. Note: Container Products are bounded to the original pimcore objects. The products will be ignored in this report, if those main-objects have been deleted!
-

Available Grid Fields

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
NameProduct Name
Order CountAmount of Order
QuantityQuantity
Sale PriceSale Price
SalesAmount of Sales
ProfitAmount of Profit
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Sales.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Sales.html deleted file mode 100644 index f519956915..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Reports/Sales.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - - Sales - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Sales Report

-

Sales Report

- - - - - - - - - - - - - -
TypeHas Pagination
Cartesian ChartNo
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
Group ByGroup Filter by Day, Month, Year
-

Available Chart Fields

- - - - - - - - - - - - - - - - - -
NameDescription
YAmount (Sales)
XDate
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/Vouchers.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/Vouchers.html deleted file mode 100644 index 6fb7c3fe9a..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Reports/Vouchers.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - Vouchers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Voucher Report

- - - - - - - - - - - - - -
TypeHas Pagination
ListYes
-

Available Filters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
StoreFilter by Store
DayShortcut Filter by current Day
MonthShortcut Filter by current Month
YearShortcut Filter by current Year
Day -1Shortcut Filter by last Day
Month -1Shortcut Filter by last Month
Year -1Shortcut Filter by last Year
FromDate to Start Filter
ToDate to End Filter
-

Available Grid Fields

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescription
CodeApplied Code
DiscountAmount of Discount
Price RuleName of applied Price Rule
Applied DateApplied Date
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Reports/index.html b/docs/generated-docs/generated_docs/User_Documentation/Reports/index.html deleted file mode 100644 index f0e0aa9ba6..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Reports/index.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - Reports - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Settings.html b/docs/generated-docs/generated_docs/User_Documentation/Settings.html deleted file mode 100644 index 42b2a20812..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Settings.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - Settings - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop's Settings are divided into each "sub"-shop and some system settings.

-

Shop-Settings

-

Settings can be different for each Store.

-

Settings

-

Base

-
    -
  • Catalog-Mode: With catalog-mode enabled, the cart and checkout are disabled. Products can only be viewed.
  • -
  • Guest-Checkout: Enables or disables guest-checkout feature
  • -
-

Customer Service

-
    -
  • Customer Email Document: Email document used to send customer messages
  • -
  • Customer Re Email Document: Email document used to send customer reply messages
  • -
  • Contact Email Document: Email document used to send contact messages
  • -
  • Contact Sales: Default contact used for sales messages
  • -
  • Contact Technology: Default contact used for technology messages
  • -
-

Stock

-
    -
  • Default Stock Behaviour: Describes the default stock behaviour for products
  • -
-

Tax

-
    -
  • Validate VAT: Describes if the VAT-Number for European Countries should be validated
  • -
  • Disable VAT for Base Country: Disable VAT-Free Shopping for Customers, with valid Vat-Number, in Base Country
  • -
  • Taxation Address: Describes witch address is responsibly for taxation
  • -
-

Prices

-
    -
  • Prices are gross prices: Determines if entered prices in CoreShop are with or without tax included.
  • -
-

Shipping

-
    -
  • Free Shipping starts at weight: Describes free shipping at weight. It's also much faster using this than price-rules
  • -
  • Free Shipping starts at Currency: Describes free shipping at cart value. It's also much faster using this than price-rules
  • -
  • Carrier Sort: Describes how the Carriers should be sorted
  • -
-

Product

-
    -
  • Default Image: Defines an default image for products if no image is available.
  • -
  • Number of days as new: Defines the time of days a product is marked as new.
  • -
-

Category

-
    -
  • Default Image: Defines an default image for categories if no image is available.
  • -
-

Invoice

-
    -
  • Create Invoice for Orders: Defines if invoices are going to be created on an paid order.
  • -
  • Prefix: Prefix string for Order and Invoice numbers
  • -
  • Suffix: Suffix string for Orders and Invoice numbers.
  • -
  • WKHTMLTOPDF Parameters: Parameters which will be passed to WKHTMLTOPDF
  • -
-

Mail Settings

-
    -
  • admin email-addresses to send order notification (CSV): Email addresses which will be notified on new orders
  • -
  • Send OrderStates as BCC to admin email-addresses: Determines if order-state emails should also be sent to admin-emails
  • -
-

Cart

-
    -
  • Activate automatic cart cleanup: Activate automatic cart cleanup -> cleans inactive and empty carts
  • -
-

System - Settings

-

System Settings are defined one time for all shops.

-

System Settings

-

System Settings

-
    -
  • Send Usagelog to CoreShop: Sends an anonymous usagelog to CoreShop Developer
  • -
-

Currency

-
    -
  • Automatic Exchange Rates: Describes if exchange rates should be fetched automatically
  • -
  • Exchange Rate Provider: Describes which exchange rate provider should be used.
  • -
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Shipping/Carriers.html b/docs/generated-docs/generated_docs/User_Documentation/Shipping/Carriers.html deleted file mode 100644 index a874852f23..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Shipping/Carriers.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - Carriers - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Carriers Documentation

-

CoreShop Carriers are an essential part of the shipping process in the CoreShop e-commerce framework, built on the Pimcore platform. Carriers represent shipping providers (e.g., UPS, FedEx, or DHL) and are responsible for delivering orders to customers. This documentation will guide you through the process of creating and managing carriers in CoreShop.

-

Creating a Carrier

-

To create a carrier, follow these steps:

-
    -
  • Log in to the CoreShop admin interface.
  • -
  • Navigate to the "Shipping" tab and click on "Carriers."
  • -
  • Click the "Add new" button to create a new carrier.
  • -
  • Enter a name for the carrier and configure the other available options as needed.
  • -
-

Carrier Options

-

When creating a carrier, you can configure various options to customize its behavior:

-
    -
  • Name: A descriptive name for the carrier (e.g., UPS, FedEx, or DHL).
  • -
  • Tracking Url: A string value that indicates the tracking url
  • -
  • Tax Rule Group: The tax rule group applied to shipping costs for this carrier. If you want to apply taxes to shipping costs, you'll need to create a tax rule group and assign it to the carrier.
  • -
  • Shipping Rules: The shipping rules associated with this carrier. Shipping rules define shipping costs based on various conditions such as weight, price, dimensions, and destination. You can assign multiple shipping rules to a carrier, and the system will evaluate them in order of priority to determine the final shipping cost.
  • -
-

Summary

-

CoreShop Carriers provide a robust way to manage shipping providers and their associated services. By creating carriers and configuring their options, you can offer customers a range of shipping choices based on factors such as delivery time and cost. Combined with shipping rules, carriers give you the flexibility to create a tailored shipping experience for your e-commerce store.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Shipping/Shipping_Rules.html b/docs/generated-docs/generated_docs/User_Documentation/Shipping/Shipping_Rules.html deleted file mode 100644 index c4d6d2f293..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Shipping/Shipping_Rules.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - Shipping Rules - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Shipping Rules Documentation

-

CoreShop Shipping Rules is a powerful feature within the CoreShop e-commerce framework built on the Pimcore platform. It allows you to create flexible and customizable shipping rules that define shipping costs based on various conditions such as weight, price, dimensions, and shipping destination.

-

Overview

-

Shipping rules in CoreShop can be composed of conditions and actions. Conditions determine whether a rule should be applied, while actions define the changes to the shipping costs.

-

CoreShop provides a user-friendly interface for creating and managing shipping rules. You can create multiple rules, each with different conditions and actions, to cover various scenarios.

-

Creating Shipping Rules

-
    -
  • Navigate to the "Shipping" tab and click on "Shipping Rules."
  • -
  • Click the "Add new" button to create a new shipping rule.
  • -
  • Enter a name for the rule and configure the other available options as needed.
  • -
-

Configuring Conditions

-

Conditions determine whether the shipping rule should be applied to an order. You can create multiple conditions for a single rule, and all conditions must be met for the rule to be applied. CoreShop offers several types of conditions, including:

-
    -
  • Weight: Based on the total weight of the order.
  • -
  • Price: Based on the total price of the order.
  • -
  • Dimension: Based on the dimensions (length, width, and height) of the order.
  • -
  • Quantity: Based on the total quantity of items in the order.
  • -
  • Countries: Based on the shipping destination country.
  • -
  • Zones: Based on the shipping destination zone (a group of countries).
  • -
-

To add a condition to your shipping rule:

-
    -
  • Click the "Add Condition" button in the "Conditions" section of the shipping rule.
  • -
  • Choose the desired condition type from the dropdown menu.
  • -
  • Configure the condition parameters as needed.
  • -
-

For example, if you want to apply a shipping rule only to orders with a total weight of over 10kg, you would add a weight condition and set the minimum weight to 10kg.

-

Configuring Actions

-

Actions define the changes to the shipping costs when a rule is applied. You can create multiple actions for a single rule. CoreShop offers several types of actions, including:

-
    -
  • Discount Amount: Apply a fixed discount amount to the shipping cost.
  • -
  • Discount Percentage: Apply a percentage discount to the shipping cost.
  • -
  • Add Amount: Add a fixed amount to the shipping cost.
  • -
  • Add Percentage: Add a percentage amount to the shipping cost.
  • -
-

To add an action to your shipping rule:

-
    -
  • Click the "Add Action" button in the "Actions" section of the shipping rule.
  • -
  • Choose the desired action type from the dropdown menu.
  • -
  • Configure the action parameters as needed.
  • -
-

For example, if you want to apply a 20% discount to the shipping cost when the rule is applied, you would add a discount percentage action and set the percentage value to 20.

-

Summary

-

CoreShop Shipping Rules offer a powerful and flexible way to define and manage shipping costs for your e-commerce store. By creating various conditions and actions, you can customize shipping costs based on factors such as weight, price, dimensions, and destination. This allows you to cater to different customer needs and provide more accurate shipping estimates.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Shipping/index.html b/docs/generated-docs/generated_docs/User_Documentation/Shipping/index.html deleted file mode 100644 index d268ef2d7c..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Shipping/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - Shipping - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/Stores.html b/docs/generated-docs/generated_docs/User_Documentation/Stores.html deleted file mode 100644 index ff735bc941..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/Stores.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - Stores - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Stores

-

Every CoreShop Installation is bounded to a default Store. -By default a store is connected with a pimcore Site.

-

Stores

-

Domain based Store

-

This is CoreShops default behaviour. One store for your default page, which is also your default store. -If you have multiple Domains it's possible to add a store to each domain.

-
-

Tip: Learn more about pimcore multi sites: Pimcore Sites

-
-

Custom Store Locator

-

Sometimes you have just one site installation but you want do use different Stores. -Example: /de-at should use a austrian store and /de-de a german one. -For that you need to build a custom store locator to do so, checkout the dev section to find out how this can be achieved.

-

Configure CoreShop Stores

-

Open CoreShop Menu -> "Stores". There should be already a default store, connected to your default (main-domain) site. -To create a new store, click on the "Add" button. Proceed wih configuring your new store.

-

Examples

-

Stores can be used in many ways, checkout the examples to find out which solution suits you most.

-

Example 1: Global Store

-

Use a Store to handle multiple currencies, countries and tax calculations. -Depending on your product and price strategy, it's possible to use it within one store.

-

Example 2: Country Store

-

Use a Store for each Country. This allows you to restrict your shop within a country context.

-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/User_Documentation/index.html b/docs/generated-docs/generated_docs/User_Documentation/index.html deleted file mode 100644 index ff7968564f..0000000000 --- a/docs/generated-docs/generated_docs/User_Documentation/index.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - User Documentation - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
-
- - - -
- - Edit on GitHub - -
- -
-

User Documentation

-

This section provides a quick getting started tutorial for CoreShop and covers the following topics:

-
    -
  1. -Stores -
  2. -
  3. -Settings -
  4. -
  5. -Price Rules -
      -
    1. -Cart Price Rules -
    2. -
    3. -Product Price Rules -
    4. -
    5. -Specific Product Price -
    6. -
    7. -Vouchers -
    8. -
    9. -Available Actions -
    10. -
    11. -Available Conditions -
    12. -
    -
  6. -
  7. -Localization -
      -
    1. -Countries -
    2. -
    3. -States -
    4. -
    5. -Zones -
    6. -
    7. -Taxes -
    8. -
    9. -Taxes -
    10. -
    11. -TaxRules -
    12. -
    -
  8. -
  9. -Shipping -
      -
    1. -Carriers -
    2. -
    3. -Shipping Rules -
    4. -
    -
  10. -
  11. -Cart -
  12. -
  13. -Order -
      -
    1. -Orders -
    2. -
    3. -Order Detail -
    4. -
    5. -Order Workflow -
    6. -
    7. -Order Comments -
    8. -
    -
  14. -
  15. -Catalog -
      -
    1. -Products -
    2. -
    3. -Product Variants -
    4. -
    5. -Categories -
    6. -
    -
  16. -
  17. -Inventory -
  18. -
  19. -GEO IP -
  20. -
  21. -Reports -
      -
    1. -Sales -
    2. -
    3. -Cart/Order Conversion -
    4. -
    5. -Abandoned Carts -
    6. -
    7. -Products -
    8. -
    9. -Categories -
    10. -
    11. -Customers -
    12. -
    13. -Carrier Distribution -
    14. -
    15. -Payment Distribution -
    16. -
    17. -Vouchers -
    18. -
    -
  22. -
  23. -Automation -
  24. -
-
- - - - -
- -
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/generated_docs/index.html b/docs/generated-docs/generated_docs/index.html deleted file mode 100644 index b8f33f5bec..0000000000 --- a/docs/generated-docs/generated_docs/index.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - CoreShop - Pimcore eCommerce Framework - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Documentation

-
-

This documentation section provides all information you need to use the CoreShop - Pimcore eCommerce Framework

-

We've aimed this part of the documentation at a developer's audience.

-
-

CoreShop provides a fully flexible and extendable eCommerce Solution for Pimcore. If you want to know more about Pimcore, please visit pimcore.com.

-

Documentation Overview

-

The Core Framework documentation is divided into three sections that aim to guide the reader through its first use of the platform:

-
    -
  • See the Getting Started section for an overview and information about the installation process.
  • -
  • See the Bundles section for details about the different Bundles CoreShop provides.
  • -
  • See the User Documentation section for documentation configuration of CoreShop.
  • -
  • See the Development section for documentation about developing with CoreShop.
  • -
-

Additional resources for getting started with CoreShop

-
    -
  • -CoreShop Demo: See CoreShop in action and also use it as a blueprint application for your own implementations.
  • -
- - -

- -

Also check out our Pimcore Extensions

- -
- - -
- -
-
Pimcore
- -

Pimcore

-

Picmore Docs

- - More Information -
-
- - -
- -
- - -
-
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/index.html b/docs/generated-docs/index.html deleted file mode 100644 index b8f33f5bec..0000000000 --- a/docs/generated-docs/index.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - CoreShop - Pimcore eCommerce Framework - CoreShop 3.0.x - Pimcore eCommerce - Documentation - - - - - - - - - - - - - - - - - - -
- -
-
-
- - -
- - - -
- - Edit on GitHub - -
- -
-

CoreShop Documentation

-
-

This documentation section provides all information you need to use the CoreShop - Pimcore eCommerce Framework

-

We've aimed this part of the documentation at a developer's audience.

-
-

CoreShop provides a fully flexible and extendable eCommerce Solution for Pimcore. If you want to know more about Pimcore, please visit pimcore.com.

-

Documentation Overview

-

The Core Framework documentation is divided into three sections that aim to guide the reader through its first use of the platform:

-
    -
  • See the Getting Started section for an overview and information about the installation process.
  • -
  • See the Bundles section for details about the different Bundles CoreShop provides.
  • -
  • See the User Documentation section for documentation configuration of CoreShop.
  • -
  • See the Development section for documentation about developing with CoreShop.
  • -
-

Additional resources for getting started with CoreShop

-
    -
  • -CoreShop Demo: See CoreShop in action and also use it as a blueprint application for your own implementations.
  • -
- - -

- -

Also check out our Pimcore Extensions

- -
- - -
- -
-
Pimcore
- -

Pimcore

-

Picmore Docs

- - More Information -
-
- - -
- -
- - -
-
-
-
-
- - - - - - - - - - - - - - - - - diff --git a/docs/generated-docs/themes/pimcore/config.json b/docs/generated-docs/themes/pimcore/config.json deleted file mode 100644 index 5640881e93..0000000000 --- a/docs/generated-docs/themes/pimcore/config.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "favicon": "img/favicon.png", - "css": [], - "js": [ - "js/build/pimcore.min.js" - ], - "fonts": [ - "//fonts.googleapis.com/css?family=Open+Sans:100,200,300,400,500,600,700,800,900" - ], - "variants": { - "core": { - "css": [ - "css/pimcore-core.min.css" - ] - }, - "generic": { - "css": [ - "css/pimcore-generic.min.css" - ] - } - } -} diff --git a/docs/generated-docs/themes/pimcore/css/pimcore-core.min.css b/docs/generated-docs/themes/pimcore/css/pimcore-core.min.css deleted file mode 100644 index 04cf4e0e15..0000000000 --- a/docs/generated-docs/themes/pimcore/css/pimcore-core.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Pimcore Documentation - * License: GPLv3 - */ -/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hidden{display:none!important}*,:after,:before{box-sizing:border-box}body{margin:0;padding:0}body,html{height:100%;background-color:#fff;color:#2d2d2d}.Columns__left{background-color:#f7f7f7}.Columns__right__content{padding:10px;background-color:#fff}.Collapsible__content{display:none}.Collapsible__trigger{margin:12px;padding:7px 10px;background-color:transparent;border:none;float:right;background-image:none;filter:none;box-shadow:none}.Collapsible__trigger--bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#0078be;box-shadow:none}.Collapsible__trigger:hover{background-color:#c5c5cb;box-shadow:none}.Collapsible__trigger:hover .Collapsible__trigger--bar{background-color:#3f4657;box-shadow:none}@media screen and (min-width:768px){body{background-color:#0078be}.Navbar{position:fixed;z-index:1030;width:100%}.Collapsible__trigger{display:none!important}.Collapsible__content{display:block!important}.Columns{height:100%}.Columns:after,.Columns:before{content:" ";display:table}.Columns:after{clear:both}.Columns__left,.Columns__right{position:relative;min-height:1px;float:left;overflow:auto;height:100%}.Columns__left{width:25%;border-right:1px solid #e7e7e9;overflow-x:hidden}.Columns__right{width:75%}.Columns__right__content{padding:0 20px 20px;min-height:100%}}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;line-height:1.5}h1,h2,h3,h4,h5,h6{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300}.s-content body{font-size:15px}.s-content h1,.s-content h2,.s-content h3,.s-content h4,.s-content h5,.s-content h6{font-weight:300;-webkit-font-smoothing:antialiased;cursor:text;line-height:1.4em;margin-top:.3em;margin-bottom:.3em}.s-content h1 code,.s-content h1 tt,.s-content h2 code,.s-content h2 tt,.s-content h3 code,.s-content h3 tt,.s-content h4 code,.s-content h4 tt,.s-content h5 code,.s-content h5 tt,.s-content h6 code,.s-content h6 tt{font-size:inherit}.s-content h1 i,.s-content h2 i,.s-content h3 i,.s-content h4 i,.s-content h5 i,.s-content h6 i{font-size:.7em}.s-content h1 p,.s-content h2 p,.s-content h3 p,.s-content h4 p,.s-content h5 p,.s-content h6 p{margin-top:0}.s-content h1{font-size:2.66666667em;color:#000}.s-content h2{font-size:2em;border-bottom:1px solid #eee;color:#000}.s-content h3{font-size:1.73333333em}.s-content h4{font-size:1.46666667em}.s-content h5{font-size:1.2em}.s-content h6{font-size:1.06666667em;color:#555}.s-content a{text-decoration:underline}.s-content p{line-height:1.8em;margin-bottom:20px}.s-content ol,.s-content ul{padding-left:30px}.s-content ul p,.s-content ul ul{margin:0}.s-content dl{padding:0}.s-content dl dt{font-weight:700;font-style:italic;padding:0;margin:15px 0 5px}.s-content dl dt:first-child{padding:0}.s-content dl dd{margin:0 0 15px;padding:0 15px}.s-content blockquote{font-size:1.2em;border-left:4px solid #ddd;padding:7px 15px}.s-content blockquote p{font-size:inherit}.s-content table{width:100%;padding:0;border-collapse:collapse}.s-content table tr{border-top:1px solid #eee;background-color:#fff;margin:0;padding:0}.s-content table tr:nth-child(2n){background-color:#f8f8f8}.s-content table th{font-weight:700;background:#eee}.s-content table td,.s-content table th{border:1px solid #eee;margin:0;padding:6px 13px}.s-content blockquote>:first-child,.s-content dl dd>:first-child,.s-content dl dt>:first-child,.s-content ol>:first-child,.s-content table td>:first-child,.s-content table th>:first-child,.s-content ul>:first-child{margin-top:0}.s-content blockquote>:last-child,.s-content dl dd>:last-child,.s-content dl dt>:last-child,.s-content ol>:last-child,.s-content table td>:last-child,.s-content table th>:last-child,.s-content ul>:last-child{margin-bottom:0}.s-content img{max-width:100%;display:block;margin:0 auto}.s-content code{font-family:Monaco,Menlo,Consolas,Courier New,monospace}.s-content code,.s-content tt{margin:0 2px;padding:0 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px}.s-content pre{background:#fdf6e3;color:#657b83;line-height:1.5em;overflow:auto;padding:20px;margin:0 -20px 20px}.s-content pre code{margin:0;padding:0;white-space:pre}.s-content pre code,.s-content pre tt{background-color:transparent;border:none}.s-content pre{border:none;border-radius:0;padding:10px 30px;margin-left:-20px;margin-right:-20px}@media (min-width:1150px){.Columns__right--float .Columns__right__content{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.Columns__right--float .Columns__right__content article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.Columns__right--float .Columns__right__content article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.Columns__right--float .Page__header,.Columns__right--float .Pager,.Columns__right--float .s-content blockquote,.Columns__right--float .s-content dl,.Columns__right--float .s-content h2,.Columns__right--float .s-content h3,.Columns__right--float .s-content h4,.Columns__right--float .s-content h5,.Columns__right--float .s-content h6,.Columns__right--float .s-content hr,.Columns__right--float .s-content ol,.Columns__right--float .s-content p,.Columns__right--float .s-content table,.Columns__right--float .s-content ul{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%}.Columns__right--float .s-content table{background-color:#fff;white-space:normal}.Columns__right--float .s-content table code,.Columns__right--float .s-content table pre{white-space:normal}.Columns__right--float .s-content blockquote:before,.Columns__right--float .s-content dl:before,.Columns__right--float .s-content h2:before,.Columns__right--float .s-content h3:before,.Columns__right--float .s-content h4:before,.Columns__right--float .s-content h5:before,.Columns__right--float .s-content h6:before,.Columns__right--float .s-content hr:before,.Columns__right--float .s-content ol:before,.Columns__right--float .s-content p:before,.Columns__right--float .s-content ul:before{width:100%;height:10px;display:block;clear:both}.Columns__right--float .s-content blockquote dl,.Columns__right--float .s-content blockquote h2,.Columns__right--float .s-content blockquote h3,.Columns__right--float .s-content blockquote h4,.Columns__right--float .s-content blockquote h5,.Columns__right--float .s-content blockquote h6,.Columns__right--float .s-content blockquote hr,.Columns__right--float .s-content blockquote ol,.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content blockquote ul,.Columns__right--float .s-content dl dl,.Columns__right--float .s-content dl h2,.Columns__right--float .s-content dl h3,.Columns__right--float .s-content dl h4,.Columns__right--float .s-content dl h5,.Columns__right--float .s-content dl h6,.Columns__right--float .s-content dl hr,.Columns__right--float .s-content dl ol,.Columns__right--float .s-content dl p,.Columns__right--float .s-content dl pre,.Columns__right--float .s-content dl ul,.Columns__right--float .s-content h2 dl,.Columns__right--float .s-content h2 h2,.Columns__right--float .s-content h2 h3,.Columns__right--float .s-content h2 h4,.Columns__right--float .s-content h2 h5,.Columns__right--float .s-content h2 h6,.Columns__right--float .s-content h2 hr,.Columns__right--float .s-content h2 ol,.Columns__right--float .s-content h2 p,.Columns__right--float .s-content h2 pre,.Columns__right--float .s-content h2 ul,.Columns__right--float .s-content h3 dl,.Columns__right--float .s-content h3 h2,.Columns__right--float .s-content h3 h3,.Columns__right--float .s-content h3 h4,.Columns__right--float .s-content h3 h5,.Columns__right--float .s-content h3 h6,.Columns__right--float .s-content h3 hr,.Columns__right--float .s-content h3 ol,.Columns__right--float .s-content h3 p,.Columns__right--float .s-content h3 pre,.Columns__right--float .s-content h3 ul,.Columns__right--float .s-content h4 dl,.Columns__right--float .s-content h4 h2,.Columns__right--float .s-content h4 h3,.Columns__right--float .s-content h4 h4,.Columns__right--float .s-content h4 h5,.Columns__right--float .s-content h4 h6,.Columns__right--float .s-content h4 hr,.Columns__right--float .s-content h4 ol,.Columns__right--float .s-content h4 p,.Columns__right--float .s-content h4 pre,.Columns__right--float .s-content h4 ul,.Columns__right--float .s-content h5 dl,.Columns__right--float .s-content h5 h2,.Columns__right--float .s-content h5 h3,.Columns__right--float .s-content h5 h4,.Columns__right--float .s-content h5 h5,.Columns__right--float .s-content h5 h6,.Columns__right--float .s-content h5 hr,.Columns__right--float .s-content h5 ol,.Columns__right--float .s-content h5 p,.Columns__right--float .s-content h5 pre,.Columns__right--float .s-content h5 ul,.Columns__right--float .s-content h6 dl,.Columns__right--float .s-content h6 h2,.Columns__right--float .s-content h6 h3,.Columns__right--float .s-content h6 h4,.Columns__right--float .s-content h6 h5,.Columns__right--float .s-content h6 h6,.Columns__right--float .s-content h6 hr,.Columns__right--float .s-content h6 ol,.Columns__right--float .s-content h6 p,.Columns__right--float .s-content h6 pre,.Columns__right--float .s-content h6 ul,.Columns__right--float .s-content hr dl,.Columns__right--float .s-content hr h2,.Columns__right--float .s-content hr h3,.Columns__right--float .s-content hr h4,.Columns__right--float .s-content hr h5,.Columns__right--float .s-content hr h6,.Columns__right--float .s-content hr hr,.Columns__right--float .s-content hr ol,.Columns__right--float .s-content hr p,.Columns__right--float .s-content hr pre,.Columns__right--float .s-content hr ul,.Columns__right--float .s-content ol dl,.Columns__right--float .s-content ol h2,.Columns__right--float .s-content ol h3,.Columns__right--float .s-content ol h4,.Columns__right--float .s-content ol h5,.Columns__right--float .s-content ol h6,.Columns__right--float .s-content ol hr,.Columns__right--float .s-content ol ol,.Columns__right--float .s-content ol p,.Columns__right--float .s-content ol pre,.Columns__right--float .s-content ol ul,.Columns__right--float .s-content p dl,.Columns__right--float .s-content p h2,.Columns__right--float .s-content p h3,.Columns__right--float .s-content p h4,.Columns__right--float .s-content p h5,.Columns__right--float .s-content p h6,.Columns__right--float .s-content p hr,.Columns__right--float .s-content p ol,.Columns__right--float .s-content p p,.Columns__right--float .s-content p pre,.Columns__right--float .s-content p ul,.Columns__right--float .s-content ul dl,.Columns__right--float .s-content ul h2,.Columns__right--float .s-content ul h3,.Columns__right--float .s-content ul h4,.Columns__right--float .s-content ul h5,.Columns__right--float .s-content ul h6,.Columns__right--float .s-content ul hr,.Columns__right--float .s-content ul ol,.Columns__right--float .s-content ul p,.Columns__right--float .s-content ul pre,.Columns__right--float .s-content ul ul{width:auto;float:none;display:block}.Columns__right--float .s-content hr{border-color:#ddd}.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content li p,.Columns__right--float .s-content li pre{width:100%}.Columns__right--float .s-content pre{float:left;clear:right;width:50%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0}.Columns__right--float .s-content pre code{padding:0 .5em}}a{text-decoration:none;color:#cd1017}a.external:after{content:" " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=)}a.broken{color:red}p{margin:0 0 1em}hr{clear:both;margin:1em 0;border:0;border-top:1px solid #ddd}code{color:#3f4657}.Button{display:inline-block;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;border-radius:4px}.Button--small{font-size:12px;line-height:1.5;border-radius:3px}.Button--default{color:#333;background-color:#fff;border-color:#ccc}.Button--default.Button--active{color:#333;background-color:#e6e6e6;border-color:#adadad}.ButtonGroup{position:relative;display:inline-block;vertical-align:middle}.ButtonGroup .Button+.Button{margin-left:-1px}.ButtonGroup>.Button{position:relative;float:left}.ButtonGroup>.Button:focus,.ButtonGroup>.Button:hover{z-index:2}.ButtonGroup>.Button.Button--active,.ButtonGroup>.Button:active{z-index:3}.ButtonGroup>.Button:not(:first-child):not(:last-child){border-radius:0}.ButtonGroup>.Button:first-child{margin-left:0}.ButtonGroup>.Button:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.ButtonGroup>.Button:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.Brand{display:block;padding:15px 20px;font-size:18px;text-shadow:none;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;color:#0078be}.Brand,.Navbar{background-color:#3f4657}.Navbar{height:50px;box-shadow:0 1px 5px rgba(0,0,0,.25);margin-bottom:0}.Navbar .Brand{float:left;line-height:20px;height:50px}.CodeToggler__text{font-size:12px;line-height:1.5;padding:6px 10px 6px 0;display:inline-block;vertical-align:middle}.Nav{margin:0;padding:0}.Nav__arrow{display:inline-block;position:relative;width:16px;margin-left:-16px}.Nav__arrow:before{position:absolute;display:block;content:"";margin:-.25em 0 0 -.4em;left:50%;top:50%;width:.5em;height:.5em;border-right:.15em solid #3f4657;border-top:.15em solid #3f4657;transform:rotate(45deg);transition-duration:.3s}.Nav__item{display:block}.Nav__item a{display:block;margin:0;padding:6px 15px 6px 20px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#3f4657;font-size:15px;text-shadow:none;border-color:#e7e7e9}.Nav__item a:hover{color:#3f4657;text-shadow:none;background-color:#c5c5cb}.Nav .Nav{display:none;margin-left:15px}.Nav .Nav .Nav__item a{margin:0 0 0 -15px;padding:3px 30px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;color:#2d2d2d;opacity:.7}.Nav .Nav .Nav__item a:hover{opacity:1}.Nav .Nav .Nav__item--active a{color:#3f4657}.Nav__item--active>a,.Nav__item--open>a{background-color:#c5c5cb}.Nav__item--open>.Nav{display:block}.Nav__item--open>a>.Nav__arrow:before{margin-left:-.25em;transform:rotate(135deg)}.Page__header{margin:0 0 10px;padding:0;border-bottom:1px solid #eee}.Page__header:after,.Page__header:before{content:" ";display:table}.Page__header:after{clear:both}.Page__header h1{margin:0;padding:0;line-height:57px}.Page__header--separator{height:.6em}.Page__header a{text-decoration:none}.Links{padding:0 20px}.Links a{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#0078be;line-height:2em}.Search{position:relative}.Search__field{display:block;width:100%;height:34px;padding:6px 30px 6px 20px;color:#555;border-width:0 0 1px;border-bottom:1px solid #ccc;background:#fff;transition:border-color .15s ease-in-out}.Search__field:focus{border-color:#0078be;outline:0}.Search__icon{position:absolute;right:9px;top:9px;width:16px;height:16px}.Navbar .Search{float:right;margin:8px 20px}.Navbar .Search__field{box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-width:0;border-radius:4px;padding-left:10px}.TableOfContents{font-size:16px;padding-left:0;border-left:6px solid #efefef}.TableOfContents p{margin-bottom:0}.TableOfContents a{text-decoration:none}.TableOfContents .TableOfContents{border-left-width:0}.Pager{padding-left:0;margin:1em 0;list-style:none;text-align:center;clear:both}.Pager:after,.Pager:before{content:" ";display:table}.Pager:after{clear:both}.Pager li{display:inline}.Pager li>a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.Pager li>a:focus,.Pager li>a:hover{text-decoration:none;background-color:#eee}.Pager--next>a{float:right}.Pager--prev>a{float:left}.container{margin-right:auto;margin-left:auto}@media (min-width:992px){.container{width:970px}}@media (min-width:768px){.container{width:750px}}@media (min-width:1200px){.container{width:1170px}}.container--inner{width:80%;margin:0 auto}.Homepage{padding-top:60px!important;background-color:#0078be;border-radius:0;border:none;color:#3f4657;overflow:hidden;padding-bottom:0;margin-bottom:0;box-shadow:none}.HomepageTitle h2{width:80%;font-size:30px;margin:20px auto;text-align:center}.HomepageImage img{display:block;max-width:80%;margin:0 auto;height:auto}.HomepageButtons{padding:20px 0;background-color:#c5c5cb;text-align:center}.HomepageButtons .Button--hero{padding:20px 30px;border-radius:0;text-shadow:none;opacity:.8;margin:0 10px;text-transform:uppercase;border:5px solid #3f4657;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;background-image:none;filter:none;box-shadow:none}@media (max-width:768px){.HomepageButtons .Button--hero{display:block;margin-bottom:10px}}.HomepageButtons .Button--hero:hover{opacity:1}.HomepageButtons .Button--hero.Button--secondary{background-color:#c5c5cb;color:#3f4657}.HomepageButtons .Button--hero.Button--primary{background-color:#3f4657;color:#f7f7f7}.HomepageContent{background-color:#fff;padding:40px 0}@media (min-width:769px){.HomepageContent .row{margin:0 -15px}.HomepageContent .col-third{width:33.333333%;float:left;position:relative;min-height:1px;padding-left:15px;padding-right:15px}}.HomepageContent ol li,.HomepageContent ul li{list-style:none;padding-bottom:.5em}.HomepageContent ol li:before,.HomepageContent ul li:before{content:"";width:0;height:0;border:3px solid transparent;border-left-color:#0078be;float:left;display:block;margin:6px 6px 6px -12px}.HomepageContent .lead{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300;font-size:16px;margin-bottom:20px;line-height:1.4}@media (min-width:768px){.HomepageContent{padding:40px 20px}.HomepageContent .lead{font-size:21px}}.HomepageFooter{background-color:#3f4657;border-radius:0;color:#0078be;border:none;box-shadow:none}@media (max-width:768px){.HomepageFooter{padding:0 20px;text-align:center}.HomepageFooter .HomepageFooter__links{padding-left:0;list-style-type:none}}@media (min-width:769px){.HomepageFooter .HomepageFooter__links{float:left}.HomepageFooter .HomepageFooter__twitter{float:right}}.HomepageFooter__links{margin:40px 0}.HomepageFooter__links li a{line-height:32px;font-size:16px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700}.HomepageFooter__links li a:hover{color:#0078be;text-decoration:underline}.HomepageFooter__twitter{margin:40px 0}.HomepageFooter .Twitter{margin-bottom:20px}.s-content code{text-rendering:auto;-webkit-font-smoothing:initial;font-size:13px}.s-content pre{margin:20px -20px;background:#002b36}.s-content pre code{font-size:13px}.code-section pre{margin-top:0}.code-section .tab-pane{display:none}.code-section .tab-pane.active{display:block}.code-section .nav-tabs{list-style:none;border-bottom:none;padding-left:0;clear:left;margin-bottom:0}.code-section .nav-tabs:after,.code-section .nav-tabs:before{content:" ";display:table}.code-section .nav-tabs:after{clear:both}.code-section .nav-tabs li{float:left}.code-section .nav-tabs li a{display:block;background-color:#ddd;border-radius:4px 4px 0 0;border-color:#eee #eee #ddd;color:#333;padding:7px 12px;margin-right:4px}.code-section .nav-tabs li.active>a,.code-section .nav-tabs li.active>a:focus,.code-section .nav-tabs li.active>a:hover{background-color:#002b36;border-color:#222;color:#fff}.hljs{display:block;overflow-x:auto;padding:.5em;background:#002b36;color:#839496}.hljs-comment,.hljs-quote{color:#586e75}.hljs-addition,.hljs-keyword,.hljs-selector-tag{color:#859900}.hljs-doctag,.hljs-literal,.hljs-meta .hljs-meta-string,.hljs-number,.hljs-regexp,.hljs-string{color:#2aa198}.hljs-name,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-title{color:#268bd2}.hljs-attr,.hljs-attribute,.hljs-class .hljs-title,.hljs-template-variable,.hljs-type,.hljs-variable{color:#b58900}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-meta .hljs-keyword,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-subst,.hljs-symbol{color:#cb4b16}.hljs-built_in,.hljs-deletion{color:#dc322f}.hljs-formula{background:#073642}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.alert{color:#464a4e;background:#e7e8ea;border-left:5px solid #dddfe2;min-height:20px;margin:15px 0;padding:15px;position:relative}.alert.alert-note{color:#004085;background:#cce5ff;border-color:#b8daff}.alert.alert-success{color:#155724;background:#d4edda;border-color:#c3e6cb}.alert.alert-warning{color:#856404;background:#fff3cd;border-color:#ffeeba}.alert.alert-danger,.alert.alert-error{color:#721c24;background:#f8d7da;border-color:#f5c6cb}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-before:auto}blockquote,pre{border:1px solid #999;font-style:italic}blockquote,img,pre{page-break-inside:avoid}img{border:0}a,a:visited{text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}q{quotes:none}q:before{content:""}q:after{content:" (" attr(cite) ")"}.page-break{display:block;page-break-before:always}.hidden-print,.Pager,aside{display:none}.Columns__right{width:100%!important}.s-content a:after{content:" (" attr(href) ")";font-size:80%;word-wrap:break-word}.s-content a[href^="#"]:after{content:""}h1 a[href]:after{font-size:50%}}body{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif}.Brand{background:#222;color:#fff}.Brand .Brand__logo{color:transparent;display:block;max-width:170px;height:50px;background:transparent url(../img/logo-white.svg) no-repeat 0}.Brand .subtitle{margin-top:5px;margin-bottom:0}.Pager{margin:30px 0 10px}.breadcrumbs,.s-content h2{margin-top:25px}.s-content a{text-decoration:none}.s-content img{margin:0}@media screen and (min-width:768px){.s-content img.img-narrow{max-width:50%}}.s-content table{margin-top:15px;margin-bottom:15px}.s-content blockquote{font-size:16px;border-color:#ffeaae;background:#fffdf6;color:#666;margin-left:0;margin-right:0}.s-content h1 .headerlink,.s-content h2 .headerlink,.s-content h3 .headerlink,.s-content h4 .headerlink,.s-content h5 .headerlink,.s-content h6 .headerlink{color:transparent;font-size:75%;font-weight:400;line-height:1;margin:0;padding:0 0 0 6px}.s-content h1:hover .headerlink,.s-content h2:hover .headerlink,.s-content h3:hover .headerlink,.s-content h4:hover .headerlink,.s-content h5:hover .headerlink,.s-content h6:hover .headerlink{color:#c5c5cb}.s-content h1:hover .headerlink:hover,.s-content h2:hover .headerlink:hover,.s-content h3:hover .headerlink:hover,.s-content h4:hover .headerlink:hover,.s-content h5:hover .headerlink:hover,.s-content h6:hover .headerlink:hover{color:#0078be}.disqus-separator{margin:15px 0 20px}.Columns__landing .Nav{padding-left:15px}.ribbon-box{position:relative}.ribbon-box .ribbon{position:absolute;right:-5px;top:-5px;z-index:1;overflow:hidden;width:86px;height:86px;text-align:right}.ribbon-box.navigation .ribbon{right:-26px;top:-78px}.ribbon-box .ribbon span{font-size:10px;font-weight:700;color:#fff;text-transform:uppercase;text-align:center;line-height:20px;transform:rotate(45deg);-webkit-transform:rotate(45deg);width:115px;display:block;background:linear-gradient(#2989d8,#1e5799);box-shadow:0 3px 10px -5px #000;position:absolute;top:24px;right:-23px}.ribbon-box .ribbon span:before{left:0;border-color:#1e5799 transparent transparent #1e5799}.ribbon-box .ribbon span:after,.ribbon-box .ribbon span:before{content:"";position:absolute;top:100%;z-index:-1;border-style:solid;border-width:3px}.ribbon-box .ribbon span:after{right:0;border-color:#1e5799 #1e5799 transparent transparent}@media screen and (max-width:768px){.ribbon-box.navigation .ribbon{top:44px;pointer-events:none}}.extension-card{border:1px solid #e7e7e9;border-radius:4px;padding:20px;height:100%;position:relative}.extension-card .button{display:inline-block;padding:5px 14px;border:1px solid #e7e7e9;border-radius:15px}.extension-card .button:hover{background-color:#e7e7e9}.action-box{font-size:12px;float:right}.action-box .edit_on{color:grey;margin-left:3px;display:block;text-align:right}.action-box .version-switcher{font-size:16px;display:block;margin-bottom:5px}.action-box .version-switcher select{margin-left:3px}.column{margin:20px 0}@media screen and (min-width:768px){.Columns__landing{display:flex;flex-wrap:wrap}.Columns__landing .column{width:48%}.Columns__landing .column:nth-child(2n){margin-left:4%}}aside.Collapsible .version-info{font-size:11px;margin-bottom:25px}.SearchResults .SearchResults__highlight{font-weight:400;background:#bee7ff}.SearchResults .SearchResults__text,.SearchResults .SearchResults__title,.SearchResults .SearchResults__url,.SearchResults .SearchResults__warning{font-weight:400}.SearchResults .SearchResults__text a,.SearchResults .SearchResults__title a,.SearchResults .SearchResults__url a,.SearchResults .SearchResults__warning a{color:#0078be}.landingpage .Nav__item--open>a{background:transparent!important}.landingpage .Columns__landing div>.Nav li a{background:none;line-height:1.5}.landingpage .Columns__landing div>.Nav>li>a{display:block;color:#0078be;padding-left:0;font-size:16px;margin-top:15px}.landingpage .Columns__landing div>.Nav>li ul>li>a{padding-left:16px}.Banner{margin:40px 0 10px}.Banner .img{width:100%}.lightbox{display:none;position:fixed;z-index:999;top:0;left:0;right:0;bottom:0;padding:1em;background:rgba(0,0,0,.8)}.lightbox:target{display:block}.lightbox img{width:100%;height:100%;object-fit:scale-down}.image-as-lightbox+p>img,img.lightbox-thumbnail{max-width:50%;max-height:350px} \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/css/pimcore-generic.min.css b/docs/generated-docs/themes/pimcore/css/pimcore-generic.min.css deleted file mode 100644 index c16cdddad7..0000000000 --- a/docs/generated-docs/themes/pimcore/css/pimcore-generic.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Pimcore Documentation - * License: GPLv3 - */ -/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hidden{display:none!important}*,:after,:before{box-sizing:border-box}body{margin:0;padding:0}body,html{height:100%;background-color:#fff;color:#2d2d2d}.Columns__left{background-color:#f7f7f7}.Columns__right__content{padding:10px;background-color:#fff}.Collapsible__content{display:none}.Collapsible__trigger{margin:12px;padding:7px 10px;background-color:transparent;border:none;float:right;background-image:none;filter:none;box-shadow:none}.Collapsible__trigger--bar{display:block;width:18px;height:2px;margin-top:2px;margin-bottom:3px;background-color:#0078be;box-shadow:none}.Collapsible__trigger:hover{background-color:#c5c5cb;box-shadow:none}.Collapsible__trigger:hover .Collapsible__trigger--bar{background-color:#3f4657;box-shadow:none}@media screen and (min-width:768px){body{background-color:#0078be}.Navbar{position:fixed;z-index:1030;width:100%}.Collapsible__trigger{display:none!important}.Collapsible__content{display:block!important}.Columns{height:100%}.Columns:after,.Columns:before{content:" ";display:table}.Columns:after{clear:both}.Columns__left,.Columns__right{position:relative;min-height:1px;float:left;overflow:auto;height:100%}.Columns__left{width:25%;border-right:1px solid #e7e7e9;overflow-x:hidden}.Columns__right{width:75%}.Columns__right__content{padding:0 20px 20px;min-height:100%}}body{text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;line-height:1.5}h1,h2,h3,h4,h5,h6{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300}.s-content body{font-size:15px}.s-content h1,.s-content h2,.s-content h3,.s-content h4,.s-content h5,.s-content h6{font-weight:300;-webkit-font-smoothing:antialiased;cursor:text;line-height:1.4em;margin-top:.3em;margin-bottom:.3em}.s-content h1 code,.s-content h1 tt,.s-content h2 code,.s-content h2 tt,.s-content h3 code,.s-content h3 tt,.s-content h4 code,.s-content h4 tt,.s-content h5 code,.s-content h5 tt,.s-content h6 code,.s-content h6 tt{font-size:inherit}.s-content h1 i,.s-content h2 i,.s-content h3 i,.s-content h4 i,.s-content h5 i,.s-content h6 i{font-size:.7em}.s-content h1 p,.s-content h2 p,.s-content h3 p,.s-content h4 p,.s-content h5 p,.s-content h6 p{margin-top:0}.s-content h1{font-size:2.66666667em;color:#000}.s-content h2{font-size:2em;border-bottom:1px solid #eee;color:#000}.s-content h3{font-size:1.73333333em}.s-content h4{font-size:1.46666667em}.s-content h5{font-size:1.2em}.s-content h6{font-size:1.06666667em;color:#555}.s-content a{text-decoration:underline}.s-content p{line-height:1.8em;margin-bottom:20px}.s-content ol,.s-content ul{padding-left:30px}.s-content ul p,.s-content ul ul{margin:0}.s-content dl{padding:0}.s-content dl dt{font-weight:700;font-style:italic;padding:0;margin:15px 0 5px}.s-content dl dt:first-child{padding:0}.s-content dl dd{margin:0 0 15px;padding:0 15px}.s-content blockquote{font-size:1.2em;border-left:4px solid #ddd;padding:7px 15px}.s-content blockquote p{font-size:inherit}.s-content table{width:100%;padding:0;border-collapse:collapse}.s-content table tr{border-top:1px solid #eee;background-color:#fff;margin:0;padding:0}.s-content table tr:nth-child(2n){background-color:#f8f8f8}.s-content table th{font-weight:700;background:#eee}.s-content table td,.s-content table th{border:1px solid #eee;margin:0;padding:6px 13px}.s-content blockquote>:first-child,.s-content dl dd>:first-child,.s-content dl dt>:first-child,.s-content ol>:first-child,.s-content table td>:first-child,.s-content table th>:first-child,.s-content ul>:first-child{margin-top:0}.s-content blockquote>:last-child,.s-content dl dd>:last-child,.s-content dl dt>:last-child,.s-content ol>:last-child,.s-content table td>:last-child,.s-content table th>:last-child,.s-content ul>:last-child{margin-bottom:0}.s-content img{max-width:100%;display:block;margin:0 auto}.s-content code{font-family:Monaco,Menlo,Consolas,Courier New,monospace}.s-content code,.s-content tt{margin:0 2px;padding:0 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px}.s-content pre{background:#fdf6e3;color:#657b83;line-height:1.5em;overflow:auto;padding:20px;margin:0 -20px 20px}.s-content pre code{margin:0;padding:0;white-space:pre}.s-content pre code,.s-content pre tt{background-color:transparent;border:none}.s-content pre{border:none;border-radius:0;padding:10px 30px;margin-left:-20px;margin-right:-20px}@media (min-width:1150px){.Columns__right--float .Columns__right__content{height:100%;overflow:auto;padding:0!important;background-color:transparent!important;position:relative}.Columns__right--float .Columns__right__content article{width:100%;min-height:100%;overflow:auto;position:relative;z-index:1}.Columns__right--float .Columns__right__content article:before{content:"";width:50%;min-height:100%;overflow:auto;background-color:#fff;display:block;margin:0;position:absolute;z-index:-1}.Columns__right--float .Page__header,.Columns__right--float .Pager,.Columns__right--float .s-content blockquote,.Columns__right--float .s-content dl,.Columns__right--float .s-content h2,.Columns__right--float .s-content h3,.Columns__right--float .s-content h4,.Columns__right--float .s-content h5,.Columns__right--float .s-content h6,.Columns__right--float .s-content hr,.Columns__right--float .s-content ol,.Columns__right--float .s-content p,.Columns__right--float .s-content table,.Columns__right--float .s-content ul{float:left;clear:left;width:47%;margin-left:1.5%;margin-right:1.5%}.Columns__right--float .s-content table{background-color:#fff;white-space:normal}.Columns__right--float .s-content table code,.Columns__right--float .s-content table pre{white-space:normal}.Columns__right--float .s-content blockquote:before,.Columns__right--float .s-content dl:before,.Columns__right--float .s-content h2:before,.Columns__right--float .s-content h3:before,.Columns__right--float .s-content h4:before,.Columns__right--float .s-content h5:before,.Columns__right--float .s-content h6:before,.Columns__right--float .s-content hr:before,.Columns__right--float .s-content ol:before,.Columns__right--float .s-content p:before,.Columns__right--float .s-content ul:before{width:100%;height:10px;display:block;clear:both}.Columns__right--float .s-content blockquote dl,.Columns__right--float .s-content blockquote h2,.Columns__right--float .s-content blockquote h3,.Columns__right--float .s-content blockquote h4,.Columns__right--float .s-content blockquote h5,.Columns__right--float .s-content blockquote h6,.Columns__right--float .s-content blockquote hr,.Columns__right--float .s-content blockquote ol,.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content blockquote ul,.Columns__right--float .s-content dl dl,.Columns__right--float .s-content dl h2,.Columns__right--float .s-content dl h3,.Columns__right--float .s-content dl h4,.Columns__right--float .s-content dl h5,.Columns__right--float .s-content dl h6,.Columns__right--float .s-content dl hr,.Columns__right--float .s-content dl ol,.Columns__right--float .s-content dl p,.Columns__right--float .s-content dl pre,.Columns__right--float .s-content dl ul,.Columns__right--float .s-content h2 dl,.Columns__right--float .s-content h2 h2,.Columns__right--float .s-content h2 h3,.Columns__right--float .s-content h2 h4,.Columns__right--float .s-content h2 h5,.Columns__right--float .s-content h2 h6,.Columns__right--float .s-content h2 hr,.Columns__right--float .s-content h2 ol,.Columns__right--float .s-content h2 p,.Columns__right--float .s-content h2 pre,.Columns__right--float .s-content h2 ul,.Columns__right--float .s-content h3 dl,.Columns__right--float .s-content h3 h2,.Columns__right--float .s-content h3 h3,.Columns__right--float .s-content h3 h4,.Columns__right--float .s-content h3 h5,.Columns__right--float .s-content h3 h6,.Columns__right--float .s-content h3 hr,.Columns__right--float .s-content h3 ol,.Columns__right--float .s-content h3 p,.Columns__right--float .s-content h3 pre,.Columns__right--float .s-content h3 ul,.Columns__right--float .s-content h4 dl,.Columns__right--float .s-content h4 h2,.Columns__right--float .s-content h4 h3,.Columns__right--float .s-content h4 h4,.Columns__right--float .s-content h4 h5,.Columns__right--float .s-content h4 h6,.Columns__right--float .s-content h4 hr,.Columns__right--float .s-content h4 ol,.Columns__right--float .s-content h4 p,.Columns__right--float .s-content h4 pre,.Columns__right--float .s-content h4 ul,.Columns__right--float .s-content h5 dl,.Columns__right--float .s-content h5 h2,.Columns__right--float .s-content h5 h3,.Columns__right--float .s-content h5 h4,.Columns__right--float .s-content h5 h5,.Columns__right--float .s-content h5 h6,.Columns__right--float .s-content h5 hr,.Columns__right--float .s-content h5 ol,.Columns__right--float .s-content h5 p,.Columns__right--float .s-content h5 pre,.Columns__right--float .s-content h5 ul,.Columns__right--float .s-content h6 dl,.Columns__right--float .s-content h6 h2,.Columns__right--float .s-content h6 h3,.Columns__right--float .s-content h6 h4,.Columns__right--float .s-content h6 h5,.Columns__right--float .s-content h6 h6,.Columns__right--float .s-content h6 hr,.Columns__right--float .s-content h6 ol,.Columns__right--float .s-content h6 p,.Columns__right--float .s-content h6 pre,.Columns__right--float .s-content h6 ul,.Columns__right--float .s-content hr dl,.Columns__right--float .s-content hr h2,.Columns__right--float .s-content hr h3,.Columns__right--float .s-content hr h4,.Columns__right--float .s-content hr h5,.Columns__right--float .s-content hr h6,.Columns__right--float .s-content hr hr,.Columns__right--float .s-content hr ol,.Columns__right--float .s-content hr p,.Columns__right--float .s-content hr pre,.Columns__right--float .s-content hr ul,.Columns__right--float .s-content ol dl,.Columns__right--float .s-content ol h2,.Columns__right--float .s-content ol h3,.Columns__right--float .s-content ol h4,.Columns__right--float .s-content ol h5,.Columns__right--float .s-content ol h6,.Columns__right--float .s-content ol hr,.Columns__right--float .s-content ol ol,.Columns__right--float .s-content ol p,.Columns__right--float .s-content ol pre,.Columns__right--float .s-content ol ul,.Columns__right--float .s-content p dl,.Columns__right--float .s-content p h2,.Columns__right--float .s-content p h3,.Columns__right--float .s-content p h4,.Columns__right--float .s-content p h5,.Columns__right--float .s-content p h6,.Columns__right--float .s-content p hr,.Columns__right--float .s-content p ol,.Columns__right--float .s-content p p,.Columns__right--float .s-content p pre,.Columns__right--float .s-content p ul,.Columns__right--float .s-content ul dl,.Columns__right--float .s-content ul h2,.Columns__right--float .s-content ul h3,.Columns__right--float .s-content ul h4,.Columns__right--float .s-content ul h5,.Columns__right--float .s-content ul h6,.Columns__right--float .s-content ul hr,.Columns__right--float .s-content ul ol,.Columns__right--float .s-content ul p,.Columns__right--float .s-content ul pre,.Columns__right--float .s-content ul ul{width:auto;float:none;display:block}.Columns__right--float .s-content hr{border-color:#ddd}.Columns__right--float .s-content blockquote p,.Columns__right--float .s-content blockquote pre,.Columns__right--float .s-content li p,.Columns__right--float .s-content li pre{width:100%}.Columns__right--float .s-content pre{float:left;clear:right;width:50%;border:none;border-left:10px solid #fff;margin:0 0 10px;padding:0}.Columns__right--float .s-content pre code{padding:0 .5em}}a{text-decoration:none;color:#0078be}a.external:after{content:" " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=)}a.broken{color:red}p{margin:0 0 1em}hr{clear:both;margin:1em 0;border:0;border-top:1px solid #ddd}code{color:#3f4657}.Button{display:inline-block;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;border-radius:4px}.Button--small{font-size:12px;line-height:1.5;border-radius:3px}.Button--default{color:#333;background-color:#fff;border-color:#ccc}.Button--default.Button--active{color:#333;background-color:#e6e6e6;border-color:#adadad}.ButtonGroup{position:relative;display:inline-block;vertical-align:middle}.ButtonGroup .Button+.Button{margin-left:-1px}.ButtonGroup>.Button{position:relative;float:left}.ButtonGroup>.Button:focus,.ButtonGroup>.Button:hover{z-index:2}.ButtonGroup>.Button.Button--active,.ButtonGroup>.Button:active{z-index:3}.ButtonGroup>.Button:not(:first-child):not(:last-child){border-radius:0}.ButtonGroup>.Button:first-child{margin-left:0}.ButtonGroup>.Button:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.ButtonGroup>.Button:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.Brand{display:block;padding:15px 20px;font-size:18px;text-shadow:none;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;color:#0078be}.Brand,.Navbar{background-color:#3f4657}.Navbar{height:50px;box-shadow:0 1px 5px rgba(0,0,0,.25);margin-bottom:0}.Navbar .Brand{float:left;line-height:20px;height:50px}.CodeToggler__text{font-size:12px;line-height:1.5;padding:6px 10px 6px 0;display:inline-block;vertical-align:middle}.Nav{margin:0;padding:0}.Nav__arrow{display:inline-block;position:relative;width:16px;margin-left:-16px}.Nav__arrow:before{position:absolute;display:block;content:"";margin:-.25em 0 0 -.4em;left:50%;top:50%;width:.5em;height:.5em;border-right:.15em solid #3f4657;border-top:.15em solid #3f4657;transform:rotate(45deg);transition-duration:.3s}.Nav__item{display:block}.Nav__item a{display:block;margin:0;padding:6px 15px 6px 20px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#3f4657;font-size:15px;text-shadow:none;border-color:#e7e7e9}.Nav__item a:hover{color:#3f4657;text-shadow:none;background-color:#c5c5cb}.Nav .Nav{display:none;margin-left:15px}.Nav .Nav .Nav__item a{margin:0 0 0 -15px;padding:3px 30px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;color:#2d2d2d;opacity:.7}.Nav .Nav .Nav__item a:hover{opacity:1}.Nav .Nav .Nav__item--active a{color:#3f4657}.Nav__item--active>a,.Nav__item--open>a{background-color:#c5c5cb}.Nav__item--open>.Nav{display:block}.Nav__item--open>a>.Nav__arrow:before{margin-left:-.25em;transform:rotate(135deg)}.Page__header{margin:0 0 10px;padding:0;border-bottom:1px solid #eee}.Page__header:after,.Page__header:before{content:" ";display:table}.Page__header:after{clear:both}.Page__header h1{margin:0;padding:0;line-height:57px}.Page__header--separator{height:.6em}.Page__header a{text-decoration:none}.Links{padding:0 20px}.Links a{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400;color:#0078be;line-height:2em}.Search{position:relative}.Search__field{display:block;width:100%;height:34px;padding:6px 30px 6px 20px;color:#555;border-width:0 0 1px;border-bottom:1px solid #ccc;background:#fff;transition:border-color .15s ease-in-out}.Search__field:focus{border-color:#0078be;outline:0}.Search__icon{position:absolute;right:9px;top:9px;width:16px;height:16px}.Navbar .Search{float:right;margin:8px 20px}.Navbar .Search__field{box-shadow:inset 0 1px 1px rgba(0,0,0,.075);border-width:0;border-radius:4px;padding-left:10px}.TableOfContents{font-size:16px;padding-left:0;border-left:6px solid #efefef}.TableOfContents p{margin-bottom:0}.TableOfContents a{text-decoration:none}.TableOfContents .TableOfContents{border-left-width:0}.Pager{padding-left:0;margin:1em 0;list-style:none;text-align:center;clear:both}.Pager:after,.Pager:before{content:" ";display:table}.Pager:after{clear:both}.Pager li{display:inline}.Pager li>a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.Pager li>a:focus,.Pager li>a:hover{text-decoration:none;background-color:#eee}.Pager--next>a{float:right}.Pager--prev>a{float:left}.container{margin-right:auto;margin-left:auto}@media (min-width:992px){.container{width:970px}}@media (min-width:768px){.container{width:750px}}@media (min-width:1200px){.container{width:1170px}}.container--inner{width:80%;margin:0 auto}.Homepage{padding-top:60px!important;background-color:#0078be;border-radius:0;border:none;color:#3f4657;overflow:hidden;padding-bottom:0;margin-bottom:0;box-shadow:none}.HomepageTitle h2{width:80%;font-size:30px;margin:20px auto;text-align:center}.HomepageImage img{display:block;max-width:80%;margin:0 auto;height:auto}.HomepageButtons{padding:20px 0;background-color:#c5c5cb;text-align:center}.HomepageButtons .Button--hero{padding:20px 30px;border-radius:0;text-shadow:none;opacity:.8;margin:0 10px;text-transform:uppercase;border:5px solid #3f4657;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700;background-image:none;filter:none;box-shadow:none}@media (max-width:768px){.HomepageButtons .Button--hero{display:block;margin-bottom:10px}}.HomepageButtons .Button--hero:hover{opacity:1}.HomepageButtons .Button--hero.Button--secondary{background-color:#c5c5cb;color:#3f4657}.HomepageButtons .Button--hero.Button--primary{background-color:#3f4657;color:#f7f7f7}.HomepageContent{background-color:#fff;padding:40px 0}@media (min-width:769px){.HomepageContent .row{margin:0 -15px}.HomepageContent .col-third{width:33.333333%;float:left;position:relative;min-height:1px;padding-left:15px;padding-right:15px}}.HomepageContent ol li,.HomepageContent ul li{list-style:none;padding-bottom:.5em}.HomepageContent ol li:before,.HomepageContent ul li:before{content:"";width:0;height:0;border:3px solid transparent;border-left-color:#0078be;float:left;display:block;margin:6px 6px 6px -12px}.HomepageContent .lead{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:300;font-size:16px;margin-bottom:20px;line-height:1.4}@media (min-width:768px){.HomepageContent{padding:40px 20px}.HomepageContent .lead{font-size:21px}}.HomepageFooter{background-color:#3f4657;border-radius:0;color:#0078be;border:none;box-shadow:none}@media (max-width:768px){.HomepageFooter{padding:0 20px;text-align:center}.HomepageFooter .HomepageFooter__links{padding-left:0;list-style-type:none}}@media (min-width:769px){.HomepageFooter .HomepageFooter__links{float:left}.HomepageFooter .HomepageFooter__twitter{float:right}}.HomepageFooter__links{margin:40px 0}.HomepageFooter__links li a{line-height:32px;font-size:16px;font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:700}.HomepageFooter__links li a:hover{color:#0078be;text-decoration:underline}.HomepageFooter__twitter{margin:40px 0}.HomepageFooter .Twitter{margin-bottom:20px}.s-content code{text-rendering:auto;-webkit-font-smoothing:initial;font-size:13px}.s-content pre{margin:20px -20px;background:#002b36}.s-content pre code{font-size:13px}.code-section pre{margin-top:0}.code-section .tab-pane{display:none}.code-section .tab-pane.active{display:block}.code-section .nav-tabs{list-style:none;border-bottom:none;padding-left:0;clear:left;margin-bottom:0}.code-section .nav-tabs:after,.code-section .nav-tabs:before{content:" ";display:table}.code-section .nav-tabs:after{clear:both}.code-section .nav-tabs li{float:left}.code-section .nav-tabs li a{display:block;background-color:#ddd;border-radius:4px 4px 0 0;border-color:#eee #eee #ddd;color:#333;padding:7px 12px;margin-right:4px}.code-section .nav-tabs li.active>a,.code-section .nav-tabs li.active>a:focus,.code-section .nav-tabs li.active>a:hover{background-color:#002b36;border-color:#222;color:#fff}.hljs{display:block;overflow-x:auto;padding:.5em;background:#002b36;color:#839496}.hljs-comment,.hljs-quote{color:#586e75}.hljs-addition,.hljs-keyword,.hljs-selector-tag{color:#859900}.hljs-doctag,.hljs-literal,.hljs-meta .hljs-meta-string,.hljs-number,.hljs-regexp,.hljs-string{color:#2aa198}.hljs-name,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-title{color:#268bd2}.hljs-attr,.hljs-attribute,.hljs-class .hljs-title,.hljs-template-variable,.hljs-type,.hljs-variable{color:#b58900}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-meta .hljs-keyword,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-subst,.hljs-symbol{color:#cb4b16}.hljs-built_in,.hljs-deletion{color:#dc322f}.hljs-formula{background:#073642}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.alert{color:#464a4e;background:#e7e8ea;border-left:5px solid #dddfe2;min-height:20px;margin:15px 0;padding:15px;position:relative}.alert.alert-note{color:#004085;background:#cce5ff;border-color:#b8daff}.alert.alert-success{color:#155724;background:#d4edda;border-color:#c3e6cb}.alert.alert-warning{color:#856404;background:#fff3cd;border-color:#ffeeba}.alert.alert-danger,.alert.alert-error{color:#721c24;background:#f8d7da;border-color:#f5c6cb}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}h1,h2,h3,h4,h5,h6{page-break-after:avoid;page-break-before:auto}blockquote,pre{border:1px solid #999;font-style:italic}blockquote,img,pre{page-break-inside:avoid}img{border:0}a,a:visited{text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}q{quotes:none}q:before{content:""}q:after{content:" (" attr(cite) ")"}.page-break{display:block;page-break-before:always}.hidden-print,.Pager,aside{display:none}.Columns__right{width:100%!important}.s-content a:after{content:" (" attr(href) ")";font-size:80%;word-wrap:break-word}.s-content a[href^="#"]:after{content:""}h1 a[href]:after{font-size:50%}}body{font-family:Open Sans,Helvetica Neue,Helvetica,Arial,sans-serif}.Brand{background:#222;color:#fff}.Brand .Brand__logo{color:transparent;display:block;max-width:170px;height:26.4px;background:transparent url(../img/logo-white.svg) no-repeat 0}.Brand .subtitle{margin-top:5px;margin-bottom:0}.Pager{margin:30px 0 10px}.breadcrumbs,.s-content h2{margin-top:25px}.s-content a{text-decoration:none}.s-content img{margin:0}@media screen and (min-width:768px){.s-content img.img-narrow{max-width:50%}}.s-content table{margin-top:15px;margin-bottom:15px}.s-content blockquote{font-size:16px;border-color:#ffeaae;background:#fffdf6;color:#666;margin-left:0;margin-right:0}.s-content h1 .headerlink,.s-content h2 .headerlink,.s-content h3 .headerlink,.s-content h4 .headerlink,.s-content h5 .headerlink,.s-content h6 .headerlink{color:transparent;font-size:75%;font-weight:400;line-height:1;margin:0;padding:0 0 0 6px}.s-content h1:hover .headerlink,.s-content h2:hover .headerlink,.s-content h3:hover .headerlink,.s-content h4:hover .headerlink,.s-content h5:hover .headerlink,.s-content h6:hover .headerlink{color:#c5c5cb}.s-content h1:hover .headerlink:hover,.s-content h2:hover .headerlink:hover,.s-content h3:hover .headerlink:hover,.s-content h4:hover .headerlink:hover,.s-content h5:hover .headerlink:hover,.s-content h6:hover .headerlink:hover{color:#0078be}.disqus-separator{margin:15px 0 20px}.Columns__landing .Nav{padding-left:15px}.ribbon-box{position:relative}.ribbon-box .ribbon{position:absolute;right:-5px;top:-5px;z-index:1;overflow:hidden;width:86px;height:86px;text-align:right}.ribbon-box.navigation .ribbon{right:-26px;top:-78px}.ribbon-box .ribbon span{font-size:10px;font-weight:700;color:#fff;text-transform:uppercase;text-align:center;line-height:20px;transform:rotate(45deg);-webkit-transform:rotate(45deg);width:115px;display:block;background:linear-gradient(#2989d8,#1e5799);box-shadow:0 3px 10px -5px #000;position:absolute;top:24px;right:-23px}.ribbon-box .ribbon span:before{left:0;border-color:#1e5799 transparent transparent #1e5799}.ribbon-box .ribbon span:after,.ribbon-box .ribbon span:before{content:"";position:absolute;top:100%;z-index:-1;border-style:solid;border-width:3px}.ribbon-box .ribbon span:after{right:0;border-color:#1e5799 #1e5799 transparent transparent}@media screen and (max-width:768px){.ribbon-box.navigation .ribbon{top:44px;pointer-events:none}}.extension-card{border:1px solid #e7e7e9;border-radius:4px;padding:20px;height:100%;position:relative}.extension-card .button{display:inline-block;padding:5px 14px;border:1px solid #e7e7e9;border-radius:15px}.extension-card .button:hover{background-color:#e7e7e9}.action-box{font-size:12px;float:right}.action-box .edit_on{color:grey;margin-left:3px;display:block;text-align:right}.action-box .version-switcher{font-size:16px;display:block;margin-bottom:5px}.action-box .version-switcher select{margin-left:3px}.column{margin:20px 0}@media screen and (min-width:768px){.Columns__landing{display:flex;flex-wrap:wrap}.Columns__landing .column{width:48%}.Columns__landing .column:nth-child(2n){margin-left:4%}}aside.Collapsible .version-info{font-size:11px;margin-bottom:25px}.SearchResults .SearchResults__highlight{font-weight:400;background:#bee7ff}.SearchResults .SearchResults__text,.SearchResults .SearchResults__title,.SearchResults .SearchResults__url,.SearchResults .SearchResults__warning{font-weight:400}.SearchResults .SearchResults__text a,.SearchResults .SearchResults__title a,.SearchResults .SearchResults__url a,.SearchResults .SearchResults__warning a{color:#0078be}.landingpage .Nav__item--open>a{background:transparent!important}.landingpage .Columns__landing div>.Nav li a{background:none;line-height:1.5}.landingpage .Columns__landing div>.Nav>li>a{display:block;color:#0078be;padding-left:0;font-size:16px;margin-top:15px}.landingpage .Columns__landing div>.Nav>li ul>li>a{padding-left:16px}.Banner{margin:40px 0 10px}.Banner .img{width:100%}.lightbox{display:none;position:fixed;z-index:999;top:0;left:0;right:0;bottom:0;padding:1em;background:rgba(0,0,0,.8)}.lightbox:target{display:block}.lightbox img{width:100%;height:100%;object-fit:scale-down}.image-as-lightbox+p>img,img.lightbox-thumbnail{max-width:50%;max-height:350px} \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.eot b/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.eot deleted file mode 100644 index 4e88b6cfeb0c6dcef692a784ed7a62e322634273..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39370 zcmbS!2Vhgx{{K05CEZQaG+new)3ne*_W%lnPBxS>TFNK|3bJI0h!fl>h&~XMMI zNl~0QaR6?gPX%R&TTpR66?*gke9uif0N;DRf5L6`Eh2>UPj~;fRGv*51EW_Qzn#!tbDMI=X*Y&v0s2Mq; zE@;faFK`VAMx3ds8&ke((C#}Kvs{Je^&{$X@}IfTeLb!}#&y%wxl`s3edn8K#-d6Y zlY*x%S?tL8!-TnuuEg`QmiaU0-W0NI0Iu}=aQB=8wzT0 zoygdnp);pXnI>iJK;0{6;(75*+=yJQJ%;PMaGg4H?&77|)RMKheuXjlgE<#Youa&5`4=u)yePd8^{;&j@8`~6 zIDNjE-+VV?>%T$y)fZ21ZrR$>@HAr^mf~8&0l+c#LGA8Y^!v&wOHca!*U=GQiYKAC zNWmd78P_LpoMhkQ>Ie2K&K2&Agls<`woA{;R&6;B>ujMkuNu9ARorpmPAKl2z@2b>L-35sMfl#qlPEUC_b8rzjGlcb-nkIh zSNh&U&3B>Zmr(PI>@(j#MPI%|Uut~EP}Ym<20Xzyu+*p?YENcEP;&!|#kegfF@%NT zZ!!8Eiu-9;&^=fN%f!OW!xApS!tTS$SU=XERkJ}TJ&rZ9N$eVSExV3g&u(BhvYXh= zY!zG0ZeeTL?QA{U!0upovb!-4_p$rg10XgJvX|Ii_B#87eaen7K#{KyGp&JKW$}1k zirJjWRJ0V0w$jjA4Bn5y8!@*&5ywra=XM&Y{Ib( zb>D~MejE?r*pA~t96M0=!#Ezn@hFa+IG(`qB#x(WJdNWS9M7Ts=W)D%<3$`Vp&xs3 zyo$PC!}G%!+c6x+ahO<|?<#f;j%#sThvRx2H{iGthsJsV2mAQGU}e4^SU=xkb~ldK zaj1CmHlEy%yPI%#6Yg$8`5ct%jbk&8EjYH~xC;lzvoOqZ0cO60d2sz<`;1hAG2D!q z+kY}$v%mSZbd>EVfq6xbI&R_9;>pSkdE>Pyb{rW!tZzVcE_k9n#*YSx4T|DdK`~IvO;?nnq?=oMj z?@^2pT+ui{CBb}s;L^UKR7lr-51{vt;qT-6Dc>pIBR=BZ%y*kF)Ysyh;(HFOgBb_C z#Z+Geo)%CUz1TO#cbyO1%Qst3^1bJqOm~eB@ZdZjtiARRR?c}pzI%ON`abrp>v-t< zw&UD5>wt$Z=A38O`o7lx@I9e_tH0?h@coS5-FtSKbFY0DqTDYGV>|ofdjLL<4dIy~sew0qAGMz~bc~7abuN!OXkLwv7C7nn_0@I77HYGDlKA#@l>EP)b*4<` ze={(;bDwsF%DK-8Qs=u%_qx!`t({8+pzeEBlsoC$CVu~hYU=+djuL2xumTj{;X}*5 zuSNY`XB7PP><{rS-|oO&-z9;wvwyqd2A)cgDoyw%LFNs`Ukkp;kd3YQn~pDs6x zLJxdpNW&SxoouML63f9iRH&^%kdO0NFeK{&+%LpehO}G+DX15|8taX3DB9@*Ijaoc zNY)qMaLBg(K->G{Yk@>vjW%oWwXuQtMzg{A#;{@d+M)K=;qPdCW7!ydZIHdkv3NEf z-vmhEjVz8$#5WQ0_#~W9#(4YQ+zOBVqX6x{kAfMlf^Udro^zCkZ zBOs+eh(7GVH<~@ncB1v&_}ZayJ%e_iV=tnum+*~aFXL;29KRRmuj3mb7|&3AqXjg(2`R8!Cz#3trgj)Y#-dC; zzOe$bAp)|BfNYF_tRf(5V+-(&gXVK1`byDA#30&WdvGfxo zsSqO>gpoYMhGPtSfsxeLM)dL+>8)$q5v|C|eEOzEQgLk`C~W*qV2SHhYJ z6;_2>SQjL;#PJ=%WTjf#0~jglohoEKo^1Te@39s#A9Q?`Y0Ca-TV^!16)VhTe0qyYSwq z_V<`0(h=)O^uO1u%X^$GCce{<#lD0@{14wE-w0i5`?2kZV{aUL?bzO9FCTm1*q&pL zAKP*4o?|y0D?9r7k&h4ksFGdg|MSDa-?#vT7(ey7>jyQfn#mj#91n$kR#-EiYgtJd9l*L~aW-~PaZJ05xX(VeZ{ zU61X4@`YFdVJo!Dl^zbou-Rf&^x%t-H{;_8L26p?Ft(#xj zcVH1?`!DM{TK^Syv14=)u4u7JZ^(2_=H|A4sjvD@XxYke-wAyPU9(En;$>N0M^j6- zmuESqIlM29^eSoNy-HPMz0>7PSXuAzjvQI<^m-Z+9NtnoD{W|SctfhDO!Ic9%aAIE zHm4nQl`E$>yul;un{dZL&w}Z!n9hou5}Fzs8WOxLv!TJ|Wh3jSH#B5> zr7Q>PQQT9|1+`*iy;pUWdo@>ig45aHi@|r3#cL7l*azTgCmb ztX39UF{ZvXG_(TEmwSUV8@#N-E4j;CgXm8%{&;x|fFQd^*0*v%22)YK5^zPcK^aaL zUJINj7|-by$t|8XU>G&%d`%PJ*8#Ftn6+IPdWDzu+r>E-;0{M$)T+_-%p2+|cQm2i z-CV}(8d_r*^q`e1Yg{#0IrYsLgO_71_vG9bjaG8A&^B-n|3ne5R+Tw@WlxvG zQMM9w<#jxE^fc=5Dnux%G9BI~T1TGR`o|=P>_~V_N|WOo%4ubrK_So{T69$du`7V3 zSVb(;AX8FB(=?Y?u9z|ni&v_cl7RE32CM`Wn}UWx4qeq#N)ueDry9M-kEjb(7*(MK z5CmKRCYfFpbE?w2cy9`dxJB*w3*wjHayE3-h}p}h@i@?in&uyms|>>|5VyT%tPqEz z+6A~}0tvFcg<|;VndFBK8(rViQ3f(i{qo;LWu3t1#?>G^0-{w-br}#hD4NR;RrD#_ zTjX!CA^_GV;t3c<0P@9IE=Nxqel_S*Swqj(G#(AiE@{6F;CI|EZNDu_2VU(`rdO6X zH#6|0OQpTDym^@`G37M3D}nsyGz?((^roTxJ^~_yF9860feS96YENLU(Z@2ZMo_bM z#0m`Yzhh3#{|#9PIuNNh6h^lL=IY zP9|n~^V`8Zi7vdwxII~%mEf#NU=41U;$ljcx1harGhK+%Q^gsTo+i$y==3aaVSCXQ zx)4QYh%+iWQ=C!J3$naL?L}wNg(x~(oKev^;*5&U&C2wer+ekpkxPkuXA|Xx1_4Pr z0zyh9MA~WU7>Kwg))TBZr)-x=N&G&)RZ~AL+a*glWvw#ZR_XRGlh*A_*)C4^3oK5H z+i7uDN)A1hZ_sC|WB%Gvsl0{yC3Z0y*$DZN>P_+_P@A*k49af|bE3D0<~46Yx}DlJhK z3sqxsSqh9lMhm$rxc{0!XK(D9s14H=u-l8@CuJ7JVcU1CDbRg1~b>R z(29s)Nm10=Ad{r35fx#mK8#l;Cv{6qh>wf4$6%G9DdQ6v8Jo#nvdii!a*CrsF0kUT zxx|6LR+qHm#eq)^{G79buemz-$w4m;dTQ{ee-#|}4Scfk#ex_4oq7wu^Ff}ngWsh$ z(Xm56@}S-#RqzxsM@7C2#iDJ1&RXrM2n|A4BRH4RxT?4ulB_D_j7y5dm6^~1B}IiQ z#{d|qk*Tt*j$o=P*D_g^t5R%Lum4=wLKVnpv@y=!ZG zpLy%5hj%O=w&I~3%X`%h=|8MjZEdeVhA0b%pt~~5_MK2eF9S6o|J@$v4huQ!jG$fHxcAF8Z=SJL+k z8}s;#L%PmS6wS)hKd=_K=Y?fvjx9|e)Mr37zhTLai4!)Ac;uZ|Z*IP)Z@K<_+0DaO zelz}8wV|ZsOEn>ZPYBCx?AfqLUY^-lQkpt6JAXJurhvZOB%k7=#JY|3*ofZna=K46 zfR?O9vSf0Z7VN0%<*%zD`j=97@m_=8Pr61M3d>ELCni({KGTbw&BBWoUKwY_i`Gb1 zQef94i!CzBZgQnDO9Rh+Q7gK7*RHFJv={YvrIGvw$yIw>vp!URG+uv1A2$7#S}BF! zX!NZw+PJt=8=`Y)h+;e}%xHs0GLtL4ILcBKDW#Vb#4w9=vHr@-TJiG7pSZGEdzqI> zz4hg7{~UQsGk=2D#q*K;>8Yznw!N>f5aURZD&&hmYrYzI*=<*?rVyUaN9ynQ;yt4FL~~cE{`S80J0IB~zt+%tDR0!bE`7W~ z|MxteqJJ%dQ8=uuw<&hz31~NNPYTwTqz+SHtNWxs&pMtDLMSrQ$d5{vG-foSRdcwg@1 zYZle5NzdR~ddnAshF7nfaL9n|)m)dJl#T-X?Vf1V#rQCQ7mj9}S6L!y+MPvC>B+V? zr9!TMCSbK354WMH%%VII{?Y(br6}HmgEMT?4|5k)2Jh0<(no@?P+3$u8!v=%qpaP< z3tswIiuw3*EgMv1ithyMSq8l!9wbS;4y8dy{1nB;h>oNX^N3`w6c&e{f_!Fi8^psR zNJ){>TmSd*FZADe(C5c_h<;2y$gRgsv79ur!F$Jn9(nEu@2Dso%wHs^rf|CADc zKl9VhB>B(-&8NF1k%x?f4=^PY<4I)mJi*{jcvqFB@*!jj@wiYxVZ4bcvaC!(d8rNq z7GqUMXwJ; zEQ9z*En}xPPQO6^LQ;9y7oTzI*6n(m#FvF0d4d0V(cM)OF1m4{_A0l0xA&T3kLzEm zYxFf@JcXE_?if!7tMOEZa*5kGgaxjtpo_Hdr6#7DG?S{$L~)bKzzR5*5q~5LR-n`| zMX@QBsVUYBS5&G4tbl`Ub@VgU-%sLg3MgZMv7tmJ=a+ArIc?hHQS(81G#>TFaUQnx zf=jN{4}boKei(EoVd;eF7cH8RzbwMRIYZcNJWA8V@N(xR;xuUNeB!!%y>~rkux2L zysZ2N*`6 zZ6~Ys3vzo=#))@B#2s^ zmMFk8)ny3=G}E1OKVDKCWs8;s_}s>V5Qt!MTb&lUJYHYgqsPLk_rGfUVV`~+aEqPS z(9%3}MqPtd*GJ3M%Cu(Po0QIF{meJ->)(Cyq8dJB?rn>&*wC-YB4_Hb14xKLI-v{) z9>haJ8{!!V0)|y0@eoL3QWB&c5(!M4WE?^OR)#z+~?S)WA3btK5ovV2}p7NcWDqsk)&5tg028xtzCt;@%_r z4+p=}kMNr3YZoS8K6CusdFrdlN&kwmKmW8^&|5$8(Wm-x-V5l;co84hmQ$EL<&kIZ zyXcbJjXB8!J`@XlAi4}GazFr`fxZyQWPlyMdt!sp(L{WLxomQl#Pbp-WLT$C{M`Y z_dl}i8VVhOE`=q~BC-z2y@dWFNn++BDhPwY4UOrC;*yjp z-cJP2z1(;|kwvEC&4Y3;i^eR+8Rl7nZWXs{v$6Q-K$5J(qV5dGKYU?q*46c^)?4F#cyRH}V`R0!l##mVCUd0zj{cJVuD(7Zir4V` zF}nw(RlGA*U#!{{zf<3=w{%bXM@A0+nYZ#C64w*jPG5O-QMF{2_$ib5B>AX}$mt%vyJxx{DMj+(+q9h#%Fn06BX;hL+P5!ir_==50UsIuaRyb< ziykDxhdaL=G+}xZje#SU_k{8p)<`nz z|j#n)eX2&I+Bw(E-cwQ_k^%RA|w!(sg0A-SZNZf|pi+M)(0?>_! z;4C6G!X6a~${o(bG=eOHPRDw11E{J6y%n0g^g0jW8sEu`SW98dQbkn zbd}!psJ_tXkiOti{WdX=)Snm79}7VT1QxcOaIiKg0-$)Hvb+fhOEOvmKqMFhx*~*j zE9r01VodTCVxKX(t&APd+OPkv6>uB`C&-D4w8eq=@{`?61akBoNvM?YG z%vq2H@r0}o5EEocMTEHmb5aXN9gr75x<;elP>^hdMzEx0y1U>EAkZ17N{Y}m<;NQR z)VumYeKnuU({}KLNgwyMUchhSW%-~(cg~%tf3i2FhyK+U zg-7&%Cq@4|5{5%DZ<-l!>PB$t79M6cDKay2mY5K0kG4iem}LPm^qwo@X`zQ!5Po5{ ztX5lr)q;*%i<~wS42oEm&H|hXGJ~g`KEvlz-vQ|BeRClywO+*8ly%;^+vT+ z9qLQMysScfHU@3W8U;$oC8X>`R^kiYl|+pe6F0G zL^%>fKkq;v6IpLhNq9&w*)L3-MWV0qaWS?i&P+045#iFgvk_ypc3>@fQozx;%@kyi zb?)*buvEA9N*+5_8n8vblizk*+Y96MZ|+^&=3mj6luP;gP_H*ZPicE8Zs*QWexE+q zuMg9jx)S}1V1=H%;2;I40hVH{a{u!7&y75aUK=rD-_SWpbpB1wdm zk`VH2AR;lu(qP?jag){1_5^bB0$61H_*tax*7Rks=$C1UgpcUS<$RIGmq_u1KpT}J ze)@ot&)b%NY2aj%_w+kTUI14~2|2VStl zZECan@x;jk3x$>qC#L4q%$xMXZI5gI4y8&%H9xMLPLe<1XZ{LwlZ2#p!24_;D9P4)U|8s3LW?ew+R=NXa^wr_yImw@JJx$DmFR_n2v-B9!VT2pTTyJ$^FEGIDI>V|NbxT)Q|r4djLGYFT4Em zWxsPuTsn1lZZxYYx0Dae5-_w;up3yDcmlDfsm zg#)Lt+zq*{v&`g|-Z;zb;dX&i$5SkRc>sPe{ z`ihy&%@<)Eklk;q`U+%F$V@#T8byv$>ac-ixL`|)q}6Khw|3tM z*^kmK1@My?-A&JeK`ga|q^Fgiq@~?9YU$NCZvW{|{o|h>(Z8K|JUMIq#HE*CyiRX} z-7xF(?L2ytd~{!I>hzI=Cl^(G`q;A{&zr(?-$~7B9yPipd&t|5wSFeIj6vUF1y?Bs zFM<_#as`_KB`YVRA(&kg0a~pkYo6cNsY z>A!^@1!`V)?`d7YOS+d|Lo_2D>-BrImq0Wl)*b;eFOls?&>n{*xB_`8mUUSRpTctmU&9<3; z18{rD&B!pIJY0xI8=B>y11esho;5+Uy2P*zIW3&ayl`Y|$VQ zq#&S87$C4fXF@6~f#;off?{Hj(9 ze(9xBI%uw*!jD+I-srYy{VhUMUM?Mu24py*bQ#vP7n9J}(;FhXY6gEr%aA-|r3nQX zp9J}}eQ^M5M*(Y%6%xk6$VnVUE5ydZ>t$yV$dk*eT-;W|PsbjKIsKCKnx1Dr8l!q| zJN>d(pT9vV@xlor=Hw>bE0t**p(~J;1W~cTjRxSPBzzlWCE*=b68N+roI9nmRjc$7 zyj9)%=c^x^PKbI!eOJpjV+?*j2jjDG8;&61=deP@4do80Nk>@apZ}yWhv;7ZTzk9F zXeA~?J%HXaj2H%dX%Z*z4q0bljCB?jSX?1|mp=TKTeOXT*gn?!82!(d4$9-uZV>sR z2&>WmnS{|7V0FQF0?-Hp54e@7)7(RXJS%B!Dw#%SN8?2*dU*T6W0&&IG{Vcb!|9pr-9Qz|>DpOSd7vWF`g zUXmzRRT-cRXD-&0jqnV$gM!28VoCuF466$<@R{fks0921ey!IItBa~}$J!$opDG^w z>J$2axUA^VoqKy_-Z!pq30y&v?>mfZ4E&-b13)f;iY!ZEFxe->OR55bM_zqN3Mad~ zFmu{T3-p_j$Xn&I!gNi>TS!Z3=^*h~TNYv5wm1#Dyv1Nq%9xMeoP2Yx?aW60e9qNl z-u_rWJaK;Iq=baYRSU**-_QDy5ksz32Pb*kb`Gf4_v>w2p6*qom*f|2g~G~7j+1`} z{F7LP#}frV6T~Fao)r}ac>#D@aDEfK9WHAO&d(+|iz8JnJcv}cB%TB@0MIOQ+GF6L zXJG#@%Es8Oeg;c|fz)UCBo56^f9_}fFCO;i)$dj*-{;17dR*2r>5ayr+P1?y|5VbC zyl{Ape)K_W+~cd0Zfzyp67r_91@Mf47X~&&Vb}?S8ziY4A|j$Gt6R7a2%@Sgv|B)w z#6BzoQg2DSHPl-OSSeCp9w|(4f{zg+Meo4yODv@9YBtGNa8tv+!$L;kb1Lz zu|8_@9M7brq>24!H(xVkI8QxAZh_u41Nb#b-oJJy?c~1I_ZH^yHwt?_e@AqPj(+lU+cL>~<=iP(4INSOug$fSLS)`D&c?I8?*0=p z&GkP%+p5i8nV#`@(Li~{Wz*I8i5F6T5k-aN9tw|Y0xR<5hoZM}FwtY3qQfu}lXW%* z>JCcQ!hFwR;?}eP#&B#FV6h3~rhsHO4#yY4cf_i@?|%Pz_pqLEvDryA zgFgCbRolxulcc-eTKdGRA;AX~ZTO(2Z?!c+!n#u>RkOo! z5J^@&&;+#{tsCn_EFHrbCZdk0qj8dm9C2Aw&@Zbo*HHaPOBN0S%yqzbUGJgHeLVa#Hgo+7gygreDR7^}voH$_iRGLQKyLQM8r@#8pm!1Ar zl554{n!XzI(P}h7G_dYLumDDg(*D(ti=0(Z(+bv(f9R!~+upyTp}ucp@)d3G zL#4eOt9`?ey3Y`vFSzTIS6qKbGYKu)+X&?P9) zWFs?-wdB3>_l4F9D1R~9e(~nEy}XqIxiFJkVb=Ud(oVJSCwNuz9o2{MlW4;NgwFM3 zM}(Uo$xs^tnS>1vjYyK=C?T6i9Qny??i37L6(K(4$RQz|KmbPW$t zp8;rHqn5ir|BgB6sHWA8mDeVDxq8qK_h-;{JlVqH(FlVX2hE4Tpb-~qi?&3D!Jq*G z>^Eo_b3lD*H!;OP{xeKWmVy!?*2soEL-xCIEe`&|fbEl|=&SZ}%Y}Mq+5MLT_N&yH z-ZM+ThkVry*2?MjojZeh=pRB5zZ|U?eUs)2*b8qDkxm2h0uKbdt$yp0f4&|3MXVL7 znWzlSF4aTw>?o{}0-}ZmK}7yoeqPV)EO)BYkw{|`HN{#|qKdU{pcdsmDc(XTN!4fkH!RFY>+2-h{^a_Q9U9&Jz2xrC%gW4#bB z>P8p?qy$OqyjTS07)w6l{0rrLgCHp8+`N(R2rJ&wyzMEhl*{WIdQV7R(ssze+KqJ+ z-u_hYA-eS8+{T>Dwmo8@7=Ft#^e15B@JEw?-uTsc8xO>lScL}?JdT0&6&WNY5S!MY zNBnq-N9aHO@RR-%Po24V!3DDxE}SW)|ICZ@H-EAHs=vhxeqH<6eBlu1QXC`uDkt^M4FzNb{ zSO6x3+mA9Ka^O9MOYs56``>VgHdMuaCJVXI0zYRno&P7nDy-NSIhTYbs{* zit3^IYd&T>rGMJLul_n|c1k~e`yJ00=j&-bbMId*`dxv3Z$iIq5X69)P+?iOM6l=x z(CzRr81Ez*y$*;vf=A1v(P8+`B*`MEwjud+5N(6(3AXKrY=Br-9NAxgL!P~j)<^F0 zQTq<_R50lY-MTe`NgG6Z_`nr^{Yri1#btfLv~RgDrzig`xA28K3C^5VgXdL?{vx7- za1LpNQ5MK&px5Q0oOy_R1R!jz9+#_w9QqfJoDL>TU>zecEp6!tdx0f+sb_S|&26t3 zXtrhaB$KNDF6Z}b``K^Tg#AK3qzwHZ?H2-8f(t`M|6BV7M6a|Q-pPIu2qLu0yIx67 zYAhKxe(du7FQ0zv^7m@xH@nA=&uf@C>53Qj9((7C&pgs=*T*`l3iAfUb>DcyZBGxX z{AE>)%~O(FosfRVH8;FkS!BR0%XdP0Tde?Y!X8U<0*41*W7;ed3s^0Q2tY@$5;3vD z7;9&CAtqSNkZGYgxr~@A;q62)Cjz1hEc}P(pD)Zx%1(^SYbsrT@7Aqqh5qli+79+F zR<(adMBM+l)cq|UggJ9UwmyJtv;@-S5vywkVFO`@42U@+WW$CL+;WRmv#pxRPfUXE_FMhMN&JMo(yAx6 zwD8Yi!H76>t$b+&+33NuwJNk{XT_d^uJ#Ku%FhI$CkoLbXnaJ#jsY%)03=HkdA3Zl zOMC@4gR)LvoNHBckN>(~+yBewbNP3RTC@YNys1rJ%)gUYhM&1cx~Apv>nT&D0yYX>CZ3P5*qR^NvSCsC0`l|gN8nGIOjexWnj+gL0djSpTbD~gHH}2 zSrP*mJI9s*dI($r+4q|=Fk?{FA%D0HXC&D$EKVDLnfDAmdggLOY5zOqnB05}0d@~d z58uKUJRsUj*EdL)Xnmo}rF&ALL%^gK86k1lGAOhYi-C{8J&Hr-ti}>UF`7N$+l4?` zB>b-;_y9bN;)O_Evr7Z^-Z!qXaol}-OUG7?$ERwnzMGn3dE?(tOl_iBB0a|RSmT<-B5k}iuv=c*N<5+I)q%Q5tRkNvy^3)k`3gRjS5W-r~fN&hG4r*aEs7}XX0<2P5sw*YM3Z_FY z_D}@l*n#B6+A2WAYdYAEF?a2$5_YEzl1f=AKZ+HX5S){v+`G~I(}9n^S0w%O3Dq?t zgZVUR=$PSadSMYB3%#$Q`Lhq-KXvp;t*LRz><>Q^b2!TPrCO={1W71|c|3jNW1}Lm z^qmP2Bn72FuZM?4E|0TdiMmY25(O_slnQ`Pi4fpjJ+r!}#YCql2+0=QE8UcC1n`xl zm-uCm61xcRqs#zW1%bd=C4bn{)22T)WcjM=^9o9f)~s4R*gK_Z*N|IRuPrDo$hm3t znWaDOc<9F;AKLNb?7rm#`d+i<#-WcjPk(yEKi1q@Qr5S0?XByFKRInm>yTBqN|!$6 z)1Q7)*MUzI??e7k7aQ&w;&i|<%Cz7hawou$C6yxHGBKCO0Sv=h;bQ=HBWjbpEr=bVZ4hLO8kuReIOAxMUB^}ZG>)I;gfm~t`=sBo zG{)!!%39!O0jpw*JeD+=C_E*Iyx{S}dwMGHxw{76f2Ziq{=7YK*Ps4F!XE|6wWGDj0CEevsF4i>B!cNkSvz_} zWtIN*_uuFTAWOyHI%oF9mpu5}ccVvERq=%Hf8|lCq%P|yX?)g%x{8Y0e9yBF*RRaZU)B8Zdq?(Z^^3+;3>lW| zc{VaQCM0HXZtbYT;AlFj84nn)QNECG@y|z$#|mQvScY%{b)s=aPGNAqMgI-+9ZG+d zFW!9fO|V$9A*&z44+!4Rir6^M=x{O`VYbL&<7FvLiRUWVxS$Gf@n^YNrdr< zK=Yu{EGWnpgxN35r-hf|K$YFx2(oa6z@s4Sn&j3b`xflT!Vn`k57wO9$S9x)R3;cR~aNJ-pzMC_uO5ZTNP>T`06Z!>#MINn=(nSi0!Ox~6OOKlJtd0_^5#5=k9@@;=0jOg~xCiKDPVA*-$@QYVGc+ZV}dX*2nk82Oz zeBI{IaQ*s%IhGp+*Y%cOw&ld<^j$XV!lecM1{CImY0WEEU#GuTP@l1)%r(Q)Gc%j` zp~4o+&GJ7e&Q@8BINL8iK8!fqFZfjK^$6((W>J`@h1U=>4SX3!_`+&|JDgQnqu`UG zfLqQM@+IGVl9-Hj1_2CasNMV8u9YkJ z60Yn3xY1949!#VQJHg`Is$stwgj{&e&55x{iRclCO*_7ZK$_2o)fJpM1)Qx1S4_fU zW0EjQv>hm7DT5jreEBBD+$BG*!~PH(+oxAiL2Q0(UN&WOtQtmkp-AMIV*yT}y0F-WNxy5)wN=HXLT zNC&&(A}>1&S0B-L%A;<$qW8Guq`8AjdknBe+G;b3YbviRD;?My^K_dUD$iA0v6{R3 zj@na+wxD3LyAA~+h(wiF@IzMj^LF94sw}^1&dKb`zz_h zA!pq+f8LhO7cSWPk3ofn)ini$gOtbS-*eCWg`2l5D5|M0E*=bLB(()Yq5Pqmgtj7B zh9@0rC6Eog4Y^kcDpaKgP!X-xu!e)1(Z`4-BnP2iHUsiVx9}SMY3#B27#{{S%{cSC zTrNNMjlP^;`3;}_*XLglzD|}lN(a@~VY`Gq0(1;AJjIL+0A9j2+(dLs!RAHqjEdFE zD=Bp+5;jv9W!>$`JFawNc~at_-63&ITUAt!U?91j#e7v-AANw-KR;LFQkqdX(9MGB8b&Q7FS{4r|hGs)W3d?s9_F$3?*QgJ_!!o)JXRB7y9kj*c2a45kQStAR<%L}2@^{rZ%a z7L@LjH1BomTWk8(40-I1TlZ+vzW!yUmDT0*l|^|y(+aYZwdt2$Jg=lNE_QO|{L3z1 zpk?IbX5|-OE5-u9sS*4ZcSaLum+W{@}z8V}ppt>e}N%?+zgM>Ypm{JHH84mga%)qi> zJTwFbY@tzNlywllI>II*A|j$9qO7SY2>WuESiqDhM?y5uZKfiAa8up4dK;I&9+Ok>9@%sg5Pb9`GDCJZo+n=LHZ=wjJhTp&)u_S%X51+Z+&iO{g_ep z4Rxc(DNEKq`|R3_);<07x-m0mjJc?8=1dac!5=(qz5Jm3gy0W22PgaTPs$kilHY;? zu;pM~!0aeE8KQzoapA+nNjo<)n>ja!o5L~PCT@z>5;9TmMUcZ0`$YWlBFZB<#WJN0 z`27ldl9^HeFVc0Wf23zv5WoTkg7wQx@o|V-G{XyRf;gnX_hgby2rf5s8RjDqlN^8{ ztzxwnaw@V3EhM5NywMWm0s}+aEol2;qwN-I`z!3(W)^)&ls2I4pQMk__At+2B9q|K zSY05L+@ykPnbh(y^kx7i&cuj%fSRfr1hLL73o#sy3ZiY)wiyBm+8qR$ZM^zAjd_r0 zmp>-j{Y4%Ceb~f)_WdPoWGg&Z%G?y>R3x)01L5WcTnP#1!Ai6hsT)`#)DkzBGek_9 z%uOsLOi@CbuydOdJQ8a;K-o>EpgKr{;3r{WT3tAz4eS-6aHa%IH1?SOeS0CtC@;tD zawK<4i1FAx2B0DwnZT-SeTjSo^dlbD7?JaWX5o#2@(oWE#WNUgb>RpzY(HeXhXMSY zoR@Hak~cVX34H71!K5@U(0UollJt~Rd-1?AQyK@gz_lnzdfVH_^|cGi(j{2a4oRC< zT|J@q^`pkm96LsP;f>>aFaLN*_T({q%V~lq>2m8$83fNBEQn=H~?tMIp z4`S7xiiB93teMH#AbKxhsx|X0!$RFYkn;^73PYd~1n}H|Ps3U59AH22Ceku&Jjk4k zSd}C=Pup8l%DZ#3r@a|7phcn^qRrrhB(>ulxTU4Koi3x{U@Wk9*oB?d?i}_!pU4Jy z`n9*!F)u-682Q_oNld`hbhIGWuraoEXSK1Puj4PU8c*eU+Mp4bHIhd$Pc)|Uj3u)N z5}rD>M6wez-4DJM2UQArRf$-9c0`OJ;g_^C@CFIM)Pl{b)&w4-1XE%}Ff*&c=B^16 zrcoH9Da=$!TXYaXqE8g^swjhqq9LtV3|7OWQ_`MGlwN*=bie%P(GdOiNdAi+W8s&F z9y$HRZJLh#_u39h8+g85-5ITXuivtYQr2d!(%0-vTz_BqPN`bTpuJNHq2GU|zDjT^ zq&0%LO{|g2_@_RdZTEyb5T|M7K~f4gD*L1;M$vtfcL{C62N@kmiLl4vY`95&h$>%UWb zOZin;|Npr?GYeA8LH~d437XKUy?yLy(1h`xafxv;vN^b8lrVh;n}cT|eOfWkI%~lH zX`o5n65@%_QN9pCR;(pstYW=(YI_cwj`cdmGpeK2vtbL1STK6<-=J&kOG7P+W<#l2 z&TK#2G|I+YBw4 zXb$DQ++%W5T_qiLEoGx%^FF68)C9xI-_=F?iA(!T#b@PM+@j-yc(D@ zJ`%x79Spie`yRti0zZi+^4LI?kSmDSA?{PQn4!u5Wd5i!#KXWA4m5~?<547DAa|Er zNU3pjB(;${Grb5l12Ap!QIOA5`m$4Q+upq!rF9>Q?6#La?2_Nc-`vO_h1mbCUL$hc z^yvW{10xZ<*_NA$QUd3l1avJgER@AO1}X+0nPH+SOms?MVKB6JV6bZ z<^)f&@l=*Y^rbMrbScsBWJZ=X-3VxfZAt{RmXOZ~7YIEnDKN!E*{~T)4(H@Mi=r?O zpONP8>BrB!>PkiW(6k4k@n+d6p$G#3j*1)! zgGZ(luJ`ui`V8<$WSGRoQY5@AiL8kL;zM^kD|-U+2o@6deTsM6(oBJMWYjJAVW+y6 z!b3gb+`9dX;r~{*;C-Fy-p2=k_W^&6HPNZ}ptl{%14QDS0l>8hqm6$E=5Dk`jQ$HA z*Qt#;?0fJyMA>z!oq|CE$P6lTPUUdLIUS&&{_2U+p#D_Q;}IqSpHzZ9f~X;9E#c*R&WoEi9oBiG{spW%ZQJ;ZhcCq^kY(ukW8eNiMkno*U(yF$IeGF5EE|HW zrn#YufeP3Wf271n#Ja!|jnLp2gQAjC1c@mb?hH3s`$XzAxpv5!i|tMf>t-NgvJlpu zfQ5~Jr4QK1rK7vQpT#r3Iyh{dyEt`r+0e222lGZ$51oXqhpsyQ`wQMVdn-%zFK>Qs zPg4BR80XLdH9Tzf_>8oE6jT}t#Q*Epbwvjp5zdRAK;5*%+3%OvA z(uimTA-6Rj;~?u#NBBPe*8VSD+Sk~=i&S=jr=_?c7gBAPJ}9&$P_Png#>NY0Lq9mUGvGr7 z;6wa?r+$>eo{^t-79_%i{AJ9)W;?4N2Wk`9rJkj^*u$qcHwX3Nin&W~wDJlb>^Y|+ zK|#TFO!UTV4yj`yAy{th@Cg(B!j^D?xlq3b^zT9JurGEnt@O1niaN2gnG}3=cSoLo>))?;d7tv4f}CEt zy?Uglx*SRI2&s;W3=4sIzbEe*Nr?*neNH;%-Pqh>yA~tPxN8DKC;uT2Jlf}hofPYMAhG`B0|?6HP)8S8)*|Au@x;`FkamL(NynZ3Vea z>Dsd>n^ma$z#(|~ne?gpMwdEGY>saj{5H_{+v_9O5)BhNzp>q#h>#OmD;8+z?fQNh zVumkMzlXGvO?7KnfyS}eE@1Of%Yk};rL!jUfa z8-w10$OsXSMRJ$D#4a0AfQI){zJ1VU3 zJM71l<@J|bd*i~3Zd9d<^jDu7ibUc^c-*_kxg{%I8M312ss$HVlfw?#s`C~vXe;Pm zxMlf;cYgE$tuF`U+20Lb?4Wsr9tK(Y0J{p_%6iY3WNtR~fC%0lo)zSmU?kYr*cwGC zb1?9!<@wwMbAYi?6(*p4BP%gx_(u@DO)y2^GE`U>r6Sp25l6eUk6W36cld90(rBj= z@)tk`Od-EG=2N(gP^TYyT{0!wtpS2Y7r@xXRq>)O|0ZBU4i}2%f2~X4Uwd67 zBbg}fHeeBeF#sXz3eZl|{;r4ZMgc?i6MfX|goB;xJy4rOdrWm$1xQO4RsmHNR$SDs zC}JD1zv+D^%Rnbs2wd;f&Kzd~d3s?M09c_?(N+NGgKKBo0PTgfO(|2JfD~YYeE_l9 zI3vd^@|dAv(XMaUXHgx7Str+%s!(3B5o^p5qTt3s0Sijm=`)I=-%4Ix;o0r``6J(+ z{^47|1@#T}Em8(4FZgW+(Eea5K$4;rn-Y>XMH}qG)TAlca0ueXYydnkgJeH|WFrz7 zV#y*v*?DkG8%6*T$BO_e%6FwGM_2^XUBV(zY*+-0UC?Ypkx-L8x<|!5&C};1tEQ+a zbMQTLCN)ckqOF?#S5$WVf(!J)Vc}|9WQxU~XA>53R|V$^ zN66{fc?VIH@er^v8TAT$?^N$nXwUKItrt6Bll#@!F%2{gN?{7{K$GdbJ&(d-Mc4g)SEKI&Kik{T*qrhN^5k``o2;h< z5@VnBb74ZrCaMnj*hJjE`W~&Zc!D=}v=w^)P+%{zP>}{3VBHcB2 zFv^0ces?>)PeC5iYUJ5b{uJ!HaQ%~S7gEt#DO8YwMdn=xD+Z4KT^f}?0sB9tQKj$~ za#oD_n=C5i@U^vis?JWM(h|=c=#oYSJT&04rwd#F^Sn^97M%r^&LrX-xDdn%GBlT1 zo5b^PgI`+gvQN8BbmSifIOkdUht(p_lk)i}zthOolh_R33DX+HQP2+Wh!ApcvziRA z7p4gRNft$COK>tsO=yQrzWdvxnT(ZEse6!bPS z4AH4B96u(HufYtq44t|*rX#*8<92I9%FO1Gh-(#uh4(ick&TDylV9bdAqSs z+nM0ri%R<}>b3U%?fxy>f4JWn)k0(7X~ zphKmwTxe17D#QA~Y#^kGG1y2@F2}$mIY?>{1GsD&c^q zP)nN&44}weAeSB7c;^Q^{z2um{kGfUPXU$KLS+yQEg&iq6*Ve}8zQ(IK*fz1MvYSPH1L*3~}@3ua53^0KeysbF>|9l5|ZjdUKlX7=~J^F)G8C*&izobE# z?q9{HBHUc5Qhi4Y_eXEIHB?*s>*0`x(en4~b)5@UL(?aZ5G3@;^V1BVsvv^dMo;Ls zA|dg*vZeY|FQ}6r@jk*8$e*xgu_rp%ZNiKM*o!t9dJwqce1KJjCi+a)Jh2>_=&z}j zV^5d%@A>S=JzP%3p7+=i7IiyK9`_L*$42zkA@`gAE*VSgHVtdYN$Zt7fuH*f=& zbrO1M^mLL9K?D}JImm>L61jQBuIk*`i`_-IKJq8hSGq6}4sL`yW#ZvZu`vkO(T#34 z4+m6&$buFUbI_jmq?3Y9ocrlEn*yQ5&g-iR!|CAL8uv4?`Q4XejczvJ7xbUsuQKKk&f;u*|Z*g3=e<-x&U z1(})YYs1>#uMND+BFsVO%$5yHg4S~7s@H=$31uKC58x~6r_9^^#r<*>BC*q&_nrtf`S!Jb!cBGSBK|H@B{r>kpLeKOGfuJ~V82WtrB=d5P;H zL1*VB!7a5YP^Tb@0$<6&mT|H3DOhgFt$Scf1oM{wh*uO7mHcLq=@vZ?oJ=ANMD{lTFD9(GelJB9#WK-h!#-l;qKloC!6aW6jVq> z(2x%*F!9XEFzQtl9aa$lY!#;>D9}sA1E9c_%ctYhQtWYpwI~D{4UiY+H`((tKTTP; z6&i38a6B46af3ZCkiZ-V%m6qg=?MIU!;hK!!HU{_@$*OSgP*@AdLBDg+pkF%5O)&d z?i`4?{};Ub^54L_v*W*kcbE9OwcJ^bMjy$Hx*ueO!gA2SPoO|ux8oQgD2BG{rEN7e zhds4{?DfN*5r=f3^M$2L=SZQFhwt1I`&S?(q0PdnskXu zxQkuKtCX)) z(_@OB#>>YkN^c^kx`z_gGIFWul%+layDPb{uhXUWp>$mja!DUjuCkFL)g5@=N-q6k za_Q3Wej^pDsj%OGJrD0rP?cIm3AzBXtC&&HZ=(ox14XMdK+{K5CKcg4r6FXL@+d%_ z26{_rxYR&yrH0Cs7uqi>xuA77OfeOsMin4$6>2D1rPXAYhPHpMd;#||vg)TG-VS6{ zX43=8F-k<9i{+72szg$i^fRS^chSnz6s4O8e!dQWyD3~rqhZo=va=SNFD<12HJQe8 zIRHZRIQTU{Sxb598XBlRN{JXtFHla>L*UU0T_lys)ihFm7qebv)W~@+o?W3;(l<0w zF;kJ8OQYl-*i$ke;fukmag-w^(n@v}x@p3w7P70C50G1ZlBTPhsa98we%5A66@2Hs z|Ao=FQ<0Db?5BxIBD@%i;{m zGHf1~em{*vH)A-bOP)m!Lq?7AcB+#B;6V)|pDis!y*USiZxJ^HbRbv#iLn)NnfMG~ z4jZ5_a4tJbquEg$$>u@X=z;!lZ}7YT8{=2S?~T7~x7r8T=h*irSQFMKoJzDN zHYBztUQb$;1 zd3sa&u?!_6A!Cgr#8KoJ>saGBbf5nj$0f%NXQ(R`!hSMcLc4ujhp4#ETaF8s?Z(>dlweXaJ3%29$ssbOhiU zd;utg&JgQ zPVBTb-jSbX4bd*Rt6+yNnsJ11tC z9N0fT5YNWIOoOpv2v>*jW2gvsb%^iIF!}fKoBtbeS#QNQ1SvPtRM5mJwj%vBm<;@# zlml7{?x2gir{P}yPTxgm|Jr(g(15KQTc|pF`R)?!gxEgVF zzz=`g3s;`+3~|>a-ed{)Ok88|=e~yCl}{f>Qg7wr-W;=nx~T}yxjzlLtOECHs2+AB z+CnRGT#M_S{7k#+?(R2Se)T|*jTaJ}iWny#CeAZ&>YR_$kRIn_Io?$xtp?oJAXO{) z)gV&md7p+jxV(FyJXFD-_wMd6DR}=&**L-33{i5XA!I&uNu=Y{RsK&yJh$UY0}YKR zRq5dQopemalXC2xD#nPpAIeovaMl~=z4_-Warb_Ey9^CQZpMI@zB13tPzGe?&G{hM zlaU)UcYPjj$safqhnFq0FA_`9~)3GPg;vsM^eI~2@$@bIix%S$!U?DW^(Y?=^b+JY1rp+|0I$_E zP@XPQ6U{i-bQXBH;J1MSQS@ zKiI+_>@4klwr1yOcCKc-G}{+n5AVH0i`U`subnV%dSlJls;T3>ubib`JG)frIlXa` zxXCUp=5}e3mk!v14%mVY*jWaVZKv~=Bir{R$LGlPIb3~P+XfEX%-HhEcMYfo)z(&K zD`}N&lUqCWv|9VNnkxFX>IOYLtTn4kYeMDdTI-UBa2~yOaQm26$yTxj(8;7NMjb94 zaH-s)B>43lShB^4{gRt?tYmX6TU0Tu)xBt#xQpj^I~4NXR^qpVwLjUaEZeM#(Hg6K J_r)5b{{l>b;dlT5 diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.svg b/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.svg deleted file mode 100644 index 0c830531b5..0000000000 --- a/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.svg +++ /dev/null @@ -1,688 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.ttf b/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.ttf deleted file mode 100644 index b5120e7f3caa028717c7440eaaf6edd7846ce08c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39120 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%0A0+ao8+W(Tg8N8ykwxbQ$0a#nur&_ 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 diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.woff b/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.woff deleted file mode 100644 index 9e98b2d356be062c31c97ec55f36eabafe514c44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23812 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 diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.woff2 b/docs/generated-docs/themes/pimcore/fonts/robotoslab-bold.woff2 deleted file mode 100644 index a0e46d686e5410b7bdf6a084d7a33b31957fb5d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18720 zcmV)9K*hgzPew8T0RR9107)PK6951J0GQAK07$a{0RR9100000000000000000000 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

_eRa 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 z ze@_f2s@-_=vb)j*06=cZ{9*Xy|w}lskL9{X$dBC5@O$@;c6+v=TaP9pMxTarz|3m$c znr9!|^XzkvJo2oR_anvm{OJ0J{swRT59}qt*$LNE#F(D~@9nOaD}B*+JUmU~Juywv z;-f)rsuJfwAge447}CLxke?tPiAI0AUPnEF=Yh$ zuo5zqogf8^KGdl>-MJ~MaPQm~KmPdSoW1R6(nvo(v~$5dS=eRO=wEs76)uk8Fw+i%a0{Z5Fo><|DPECo@5OWY20aGY(*ig?% z5etfyP}m}2-bNAyUI>yXL0t_a(x?P_mYHcNZ}pi(nOq{cO@njgG>B$R|X#*fl*qCo-eQ7oN@W0uN1kyt)=%3n*C~g*jTx~NF8j3upGBR(C_qN++KYH@{ zj}F(IzM;a_YV*Kb@4mVAC$~I+s^LSw=y&5u4SwC6nFV>Ypa|&gZjyEsf8IaX~T2oEIoc)E!DrP^mnWFs+u<<@{aA& z$x7}33@xA+--7H$VH-+Jz}T8i3?t5q$P|U9;aQ;eLz*y@H6c2MB8P}-CDEhk3-`oU;IUiz$#+hOOMx7OS=pqF6gf%cxyReu(3b4 z3kf8^SoY_3p>3;pq+844)>V93wSH^4eoHltNI zq0Lm*&XXUs3#numqP2@EmcFnMDOD!$c%XsA6?s@-7>dOK@nl$r?D=FL3R#9|T`U_` zs@l~DnrZo8SAE@9%X@4!pEgDRyy~ZxTFdXN^e?9Hsq*Jx{xv60N+0<%UwTQJPe!3D z+0uolpZ2H7AHXOi@B*2wOcP`C-|RvJU;}mHf3yqrUciUz#~1RMvp{?DOg?jgew+_m zsNXqL|6c!LrhaEx7(c}i060zG%}1+VZ+qNa7EivH zXs`)##$g2j{7G1hldfs7f}jp&kB!UBfcS%jkGPtMND|KYps_Drc&?P0GxWaASKi|2 z92ps25LP^?cu`qJ+yx88i>8y?QdY{*55~tr@~DHrmH{Rh;@}V$%P6$Tzr7 zG4GQw8o@+DOGLww&4b1xlhn^L^~yeJz5iR7kDL=>Fe;N5y~gutkU8t7Pm{K2U9fh} z_GDoB1`>>plDLO}#6qRGAC}|N@N5IpXh@j1Pq+^{2;FFimA2)vdxEq%y9o;@_{`^_np43k? ze`&)PvmVTFKREls9WOU4E&Orsg@vmouUYuTW8Wj929+=1dz80iJ2ZOOwc%LgQbah+ zU(ozvcL&`eLjt2;Dzq}PM)g9hkqB@$)P7p5YmRJV%^5U>y!BvB*`_kjjP|8d%6Bdt zv8BvY-LcB221dX*NmTQDK&wxfOfcF4b_g5unQe=%^`<5XfB^tC(%v_|n`hJUS5 zl$(u~9#`iBMT>kOeXaZ!&pL)aEe?dq7u76SDF%B=9WjzBCj<>DVF-I;$~9IM8Sw(L zItt1>9+%>Wk+G3UJveKUnv@u8Cnqh-;28}pE0n^LC5$UZj?2~dl|J*2PL-55HrJed z^Uaer)%!bKWno$MV$6jL4&LjUzqVzKZe}CVeh{$)q%=S z&qCuR>>1GUxT$E_T)OMSUsSOH+KMtct$`PzLEpnS?#l@y8 zNGmWnqAA-5LM_ZL46cL<2Po*te@hCMvs zg{jpqmOeUSZ`Tq}$J!B>f9FYOU*gI7moJ^wzgp3!w6yom;SUTtHDlImgZGYjthjfd z;>XJl41Rg$w9};zjgS_-r@zHpy!Q^z)Bg`N*$MuMmf#KPtcRz_NqJ(4pl}P>6`;CG zh_z-IOU${E7$LY&pb2}e++u+tUP#S!S8@{Q9x>lwk`(4=BGZoe2yL$b)?oTHaA2q{ zm+Lq3x%z1SkUp9;TfKts!ZBOF@iu;AHJ{06RP&q2aWHShx#6FaCiwaAb0ehnBmY;|yiTu0g&!4aV zEX!B?@>xl2Hzl!Qx=rZ^+RkS^XpFN!-k!o#tauUfjmA{$K1xAjjEwg1J=+T+{a`}x}&t4Ee`_U@;@E7GhJyZ0U1^7+5N@c-JhSCiSZcm9&z zHFfT-d-;LN+g)vLpZf5#uYasb`*z+wv%02B7vCe58`4|fKIMT^pS_~peqzInIX89d zzGsES5gvKd@Od|tSYs>^Hx8Y;1l_tPU*TtU7{lP-DR zK0Rmue$~EX#}4Adh|^ZThOIvp+Ij&S;Tal9Dgv-6fpg1n@2HclupA?DA5LCUATUi7 z=xYk1eoQ72QVRdOrdftEi^XBV2)1oQlPBGYDpNBNk>d`7Vj)b(aIW-`l-*nIIePS-Ee|WwsF~F>7A=}Fb^4VT5HCt9`3!xtuIpFy&BORk z-V|{oJM{|vL;ZcdQW~n=z4M*@^B;e2=Uv+D8GCN2S-yMPycPO4`ci%iVz?cAseX(8 z9q$CY%s~CLeu{F9F!K>_ARU%I0$n*_t1R+#i;IOM%K#QMnpzY`3i&dED3;a$qUVO~ zS1U<(F_xX_%1O_`%g!t~EiCYv3NnF81#@c1Y2j$ejR0Wi>hTRc7Sc3Jn3TC_$oyM( z-2LQ`($N#3MeSa>cyoB9zOCo-*rVg743J((EKDirv9Nl|ye`AW^zCKQDsSDmLVu}E zS4i!z2VPr)_hhvxhH$vOO1odp>?VYk&5^L9h~j2d*qus%TjR<#uI=plb3O>*dWA%7&LugUHG zmC{bNv;rswEiabemMC_E@JKpP(C!4Pg@m9OgD74?C?R*Gn3xD02B{W?7$8)##dl1s z+_+(U)kg2gqV6L`bT1mIyjrzoOV#9!8z&cg%SuW{!6{5_^<}N(-<5x&ttg7q!FmlO z1u=wNKg6jb0t?(iB>O~Y#FOaHh&6>@A(-|@J&?-yDt*CBy^`;o$sf4#j9e^tnW*>X zPfp}VFL$9}d*ETVv`yNpoD_P7%9?$uG_h*P z$f_}87AfO;dOG#()lnN;bK|s5V-n*kdQD$=;|#6az<%BP_6V+V$0;ZHi|CKx_XRH? z-zVtH@cUA_JI~uJ|2|cHNz<>O|3$FB9fOXYLS8)hnGn%|L{bYnS)?HwmMj)9GSLc7 zj04gQ6val#5qKln?zTJJB80|pf|13a3{FPIK{kkj>`tRLELd}Q3Jm|X`oF?jZJ%DY zHt!}fJ^5F?@!&PD!ztMkbIL_3x-`B}`9Nbs5#o*cOAkpmM33j*}M zBBCHNj!}pSfhUzjMMcF##n>~_VF1f4v_Xf1CI?FjfI%o}fy8U8zeP@#{LSa&_jslj z5fQaqe)A2k{&57Z4+Q!J>2jAei+7MSAXTr&-wfwD`qW|TR%sRzwAduQKi>s-q8M^y ziH_k_gvW$Slt3&ZTj3uO&!cQ{iY+HU7}cLG2qU}jkFe5;otsVGMS~}&cr2wuMok~k zrBjDI^HS73O1ckL0@~Bg;faB+&po)wi78hY*{*JzsUVY&p1uXs^gii1)0lWXLoS^3 zghaV;WUCelVidG6qKa!owCPhP&73uP@(kssEl)qa z<;J_7dg`vJ%U4w2ICg1K#%(*$z9El+|aZ{|8OnFPYp(h_!PlI|qO54~1&rME6GMkzq zfuRjo!eY2JJOV-zu}%z;uO>5s-NPc3h%hu9j{P&kt)pOj3vqCh$ub1m9ppwtgf=7+ z5gUfhHV9Chqig5(?b_zIYLSuNBrPS$(JiiXuz35hPTj`~e<8>JKYbuf=ga0u9c z5I)o}Btf9ou=or`UtyrXCXXtT8@mQT93!os;u6G`0^sSi4TfZqaz;(jeL}>Q87?e~pyJ2RE)CDIV2W z&!LgOTz^iZ`p@$5SX=e<6elM*WX)XH3$Q@5X0A3Y+yAi{>~$jgVR1L?N2^Bdyu#C< z0%PTXjA=9CTP#J)`DQe2ip1Nkt%mfiJic;~IMWdwzWVUowu2oh>rps+KY(>L$ z_){9SJB{glD8r5wb#0Nw*ccTHK!JX1(!AGeAtjmA579Mhp}`o_A`a)PhZ z2KB(Kk^YGRqdr}yFFDPSP}iU(3F}p6S`FEhh`Df&Co%=xH$D#8b1HNsc&unsm9}8H zkWb}IGb2K(91MUm`Mj8xX3YwFwA3I`#xxjRHAR?UqG@NmhIARcXV$PM%m4JE*AqoM z&5%8S{>UbPBsVB!+1O3Sfdlp!qyovobT>KMlz*$-PA;En@jn}nRD>s!q`sEwE4e$v z{d*s;)|W$k!So+hW>p6u`qlqgmH$C9vxak*{*k$i|4Z)0b1|lq^gfh3M);mYbFQhF zbBm?KfS+i|31MXi8d|19*T-reHbn5Fx|A}>Y?ct^%Y%t!7H&2xL!n(j#ekYQ1l%%F zD{;A8tz4~ai3kOOZ_;Y;X^L}SZfZvD_M j{xNC$epx7z7L`7PLiqVVV_#6U@HC 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 diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.svg b/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.svg deleted file mode 100644 index bf7f6a7372..0000000000 --- a/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.svg +++ /dev/null @@ -1,687 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.ttf b/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.ttf deleted file mode 100644 index 067e1e58b0729e758f737c5c1cc70cace6f4c734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40392 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 Chiqg3 diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.woff b/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.woff deleted file mode 100644 index 1cbe7902b7c7722c5f984d2933a76f962248ed21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24224 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 OD;59%0a>}9VE_OV(@IGI diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.woff2 b/docs/generated-docs/themes/pimcore/fonts/robotoslab-light.woff2 deleted file mode 100644 index b954cfdc867b95a2755e7cd6601cab227c4091f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19112 zcmV)7K*zs#Pew8T0RR9107|F;6951J0G+%507^Ol0RR9100000000000000000000 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 diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.eot b/docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.eot deleted file mode 100644 index 10a7a2b6d2d836dcd1501f7d8fec3dcaba773e9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39066 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.ttf b/docs/generated-docs/themes/pimcore/fonts/robotoslab-regular.ttf deleted file mode 100644 index 9c36f36071729ae3ea3e8d5f1875a09729b44301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38804 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 T{)-s=)*i$Cru4ietXLB-{nSbtg zzk9!X?>{MBwKB%fJJ6fOV)@0z;z{7lW)4pe@M|t8cmhsd#@MxH7RzTAbGWc7tLCv- z9;>ygR7KExv-2xg1Kd=f$+G!s!%SB?oV#EXjtJTW43i-52BY?$XG2;V4c))^ZUT?4vHlD$}$ms#6%%n+c zv}kDqoAF3w(s>pM2Sn>gLvK_nCmkEi6Ji0`1UAAbfccO>uV-=_w>Ddns8?Z3X>C@m zH&TKm%1q~(ND7!QdIeVG1LlbwegRmKPZ=zea3KHBgPlBTa?;M2XVQ(!q$UNFj?x2v zW{?v+nUFD?w$SEm`X^jZJ{}i>ApmM&I8Ej;uHtYB2dwbbS~Z3%@NlUN4}(Rh42Bh9 zQV5mHQ6Y}Q;X*Ma4Rd1S3}y>qASowS3$T<>NM(tsa9)^@M0qGlAv{7Pqd97!>-NDHt3zVIlsf zv6{rPXp^1*{iD?r8cJX^XgKW2@?dgWN1FgKh)&3K{zRcDlQy4HN1JFpd%Sfq?G*Ck zXebVWa*1&<0!oL9oKq+iv_*}76N28<-;2_a;JW>S(!=UjzF z%R@ytgyOJ}nJck4G)yR0h-7kHAwy9)68&7*O?=lA4BzOmszuA%RStAEZ&{pPn$ z_*pOX&TT$?wXVqLguj4LwMTMw!&}T3-J3G!-|2YjVjC*{Y zH$O7yWz0FXu3hH)<^9zJ8e9frx)fipf#Wld5iZ~0jUs6Afxhjf_PKqz*0OJj1M{l5 zU*L5qGfuzfvLpjO1&0hhUs!wlR_e}6C+1IY?_JP*qjmqR$drWby*q~1{mw07$4L6Z zgKdpQog(0lBCVunZZp4XUO!=Ld9xwtO1ayDiWvi~?sg>?nLe~6f#-Id;BNH&Ze2f@ z_v}=e$o_VQ_1;)~dg(4WC@N#);MT;Bi*Quo;UQuA=HbWsu3sh3T%}NUy?Lf+#;vi% z>5F-q4OMhk_@eXHKQ--sH$0`F_Uw&WMtngU^6W>udjKhKZ*lqXLVtIcW_jcVZ{Lb_ z51R_6jka+t{?I^aa!uDo*fok=ccZtuNRr$C;jQTn4Oh?F1C|Vat}{Tv?f)p4_QB4f z>ZHy8;?}=)_eev!zu#T-am7D-9{;i2>zMKIlh0pXD=Hea`&7qQjH!({ld>B)|PeV06m4;neN#+T%J0rXw$6L#l6f6#9{E z&9W73+=8K}i4vC%a_{v4^=IR^>WhU)~i3bU2o~?sd@fP z|8V$GdA_~G{iV1wz6C1W8~>YomD^Il5N=(~+uoJV&x3+CQ)dhop24d-pfg zj+(w|`D$BH;QhG7N^3&R)^b&pY3$d>yU5x@mp$2`0X{WN@4J1p`@tE}gGGm~Zp`?z z>&}a#F1F#~ - - - - coreshopWon rgb - - - \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/js/build/pimcore.js b/docs/generated-docs/themes/pimcore/js/build/pimcore.js deleted file mode 100644 index a3e8f4950d..0000000000 --- a/docs/generated-docs/themes/pimcore/js/build/pimcore.js +++ /dev/null @@ -1,340 +0,0 @@ -/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; - -return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"

","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m(" - - - - - -
- insert('theme::partials/version_info', ['params' => $params]); ?> - - - - -
-
-
- section('content'); ?> -
-
-
- diff --git a/docs/generated-docs/themes/pimcore/templates/partials/change_version.php b/docs/generated-docs/themes/pimcore/templates/partials/change_version.php deleted file mode 100644 index 297a804114..0000000000 --- a/docs/generated-docs/themes/pimcore/templates/partials/change_version.php +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - Version: - - - - - - - \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/templates/partials/disqus.php b/docs/generated-docs/themes/pimcore/templates/partials/disqus.php deleted file mode 100644 index e4f295a8ed..0000000000 --- a/docs/generated-docs/themes/pimcore/templates/partials/disqus.php +++ /dev/null @@ -1,26 +0,0 @@ - - -
- -
- - - - diff --git a/docs/generated-docs/themes/pimcore/templates/partials/edit_on.php b/docs/generated-docs/themes/pimcore/templates/partials/edit_on.php deleted file mode 100644 index 8e311200ac..0000000000 --- a/docs/generated-docs/themes/pimcore/templates/partials/edit_on.php +++ /dev/null @@ -1,7 +0,0 @@ -getHTML()->getEditOn(); -if ($edit_on) { ?> - - Edit on - - diff --git a/docs/generated-docs/themes/pimcore/templates/partials/navbar_content.php b/docs/generated-docs/themes/pimcore/templates/partials/navbar_content.php deleted file mode 100644 index da94f86183..0000000000 --- a/docs/generated-docs/themes/pimcore/templates/partials/navbar_content.php +++ /dev/null @@ -1,23 +0,0 @@ - - - - -

- - - - - -
- - - - \ No newline at end of file diff --git a/docs/generated-docs/themes/pimcore/templates/partials/version_info.php b/docs/generated-docs/themes/pimcore/templates/partials/version_info.php deleted file mode 100644 index f73137e621..0000000000 --- a/docs/generated-docs/themes/pimcore/templates/partials/version_info.php +++ /dev/null @@ -1,34 +0,0 @@ - - -
- Built - - $params['build_versions']['source'], - '{short_commit_hash}' => substr($params['build_versions']['source'], 0, 6) - ]; - - $from = 'from '; - $from .= sprintf( - '%s', - str_replace(array_keys($replacements), array_values($replacements), $versionInfo['source_url']), - str_replace(array_keys($replacements), array_values($replacements), $versionInfo['source_name']) - ); - - echo $from; - } - ?> - - with - - - pimcore-docs@ - - . -
- - diff --git a/docs/generated-docs/tipuesearch/tipuesearch.css b/docs/generated-docs/tipuesearch/tipuesearch.css deleted file mode 100644 index 56106049f1..0000000000 --- a/docs/generated-docs/tipuesearch/tipuesearch.css +++ /dev/null @@ -1,177 +0,0 @@ -/* -Tipue Search 5.0 -Copyright (c) 2015 Tipue -Tipue Search is released under the MIT License -http://www.tipue.com/search -*/ - -body.with-search { - overflow: hidden; -} - -.SearchResults { - background: #fff; - max-width: 650px; - padding: 15px; - margin: 0; - - z-index: 100; - position:absolute; - top: 0; - left: 0; - bottom: 0; - - overflow: auto; -} - -.SearchResultsBackdrop { - z-index: 90; - - width:100%; - - position:absolute; - top: 0; - left: 0; - bottom: 0; - - background: #000; - opacity: .6; -} - - -.homepage .SearchResults, -.homepage .SearchResultsBackdrop { - top: 50px; -} - -.homepage .SearchResults .Search__field { - display: none; -} - -.SearchResults .Search__field { - width: 40%; - float: left; -} - -.SearchResults__warning { - font-weight:300; - font-size:15px; - line-height: 1.6; - color: #555; - margin: 7px 0; -} - -.SearchResults__warning a { - color: #396; - text-decoration: none; -} - -.SearchResults__warning a:hover { - color: #555; -} - -.SearchResults__count { - font-weight:300; - font-size:15px; - line-height: 1.7; - color: #555; -} - -.SearchResults__close { - border: 0 transparent solid; - background: none; - - float: right; - font-size: 2em; - cursor: pointer; - padding: 0; - margin: 0; - line-height: .8em; -} - -.SearchResults__title { - font-weight:300; - font-size:21px; - line-height: 1.7; - margin-top: 23px; -} - -.SearchResults__title a { - color: #333; - text-decoration: none; -} - -.SearchResults__title a:hover { - color: #555; -} - -.SearchResults__url { - font-weight:300; - font-size:14px; - line-height: 1.9; - word-wrap: break-word; - hyphens: auto; -} - -.SearchResults__url a { - color: #396; - text-decoration: none; -} - -.SearchResults__url a:hover { - color: #555; -} - -.SearchResults__text { - font-weight:300; - font-size:15px; - line-height: 1.6; - color: #555; - word-wrap: break-word; - hyphens: auto; - margin-top: 3px; -} - -.SearchResults__debug { - font-weight:300; - font-size:13px; - line-height: 1.6; - color: #555; - margin: 5px 0; -} - -.SearchResults__highlight { - color: #333; - font-weight: 400; -} - -.SearchResults__footer { - margin: 51px 0 21px 0; - padding: 0 10px; -} - -.SearchResults__footer__links li { - margin: 0 4px; -} - -.SearchResults__footer__links li.current { - display: inline-block; - padding: 5px 14px; - border-radius: 15px; - - color: #333; - background: #f6f6f6; - border: 1px solid #e2e2e2; -} - - -/* spinner */ - -@media (min-width: 650px) { - .SearchResults { - width: 650px; - - left: 50%; - margin-left: -325px; - } -} diff --git a/docs/generated-docs/tipuesearch/tipuesearch.js b/docs/generated-docs/tipuesearch/tipuesearch.js deleted file mode 100644 index 45342acf09..0000000000 --- a/docs/generated-docs/tipuesearch/tipuesearch.js +++ /dev/null @@ -1,374 +0,0 @@ -/* - Tipue Search 5.0 - Copyright (c) 2015 Tipue - Tipue Search is released under the MIT License - http://www.tipue.com/search - */ - - -(function ($) { - - var originalTitle = document.title; - - // Stop words (list from http://www.ranks.nl/stopwords) - var tipuesearch_stop_words = ["a", "about", "above", "after", "again", "against", "all", "am", "an", "and", "any", "are", "aren't", "as", "at", "be", "because", "been", "before", "being", "below", "between", "both", "but", "by", "can't", "cannot", "could", "couldn't", "did", "didn't", "do", "does", "doesn't", "doing", "don't", "down", "during", "each", "few", "for", "from", "further", "had", "hadn't", "has", "hasn't", "have", "haven't", "having", "he", "he'd", "he'll", "he's", "her", "here", "here's", "hers", "herself", "him", "himself", "his", "how", "how's", "i", "i'd", "i'll", "i'm", "i've", "if", "in", "into", "is", "isn't", "it", "it's", "its", "itself", "let's", "me", "more", "most", "mustn't", "my", "myself", "no", "nor", "not", "of", "off", "on", "once", "only", "or", "other", "ought", "our", "ours", "ourselves", "out", "over", "own", "same", "shan't", "she", "she'd", "she'll", "she's", "should", "shouldn't", "so", "some", "such", "than", "that", "that's", "the", "their", "theirs", "them", "themselves", "then", "there", "there's", "these", "they", "they'd", "they'll", "they're", "they've", "this", "those", "through", "to", "too", "under", "until", "up", "very", "was", "wasn't", "we", "we'd", "we'll", "we're", "we've", "were", "weren't", "what", "what's", "when", "when's", "where", "where's", "which", "while", "who", "who's", "whom", "why", "why's", "with", "won't", "would", "wouldn't", "you", "you'd", "you'll", "you're", "you've", "your", "yours", "yourself", "yourselves"]; - - // Internal strings - var tipuesearch_string_one_result = window.searchTranslation.Search_one_result; - var tipuesearch_string_results = window.searchTranslation.Search_results; - var tipuesearch_string_prev = window.searchTranslation.Link_previous; - var tipuesearch_string_next = window.searchTranslation.Link_next; - var tipuesearch_string_no_results = window.searchTranslation.Search_no_results; - var tipuesearch_string_common_words_ignored = window.searchTranslation.Search_common_words_ignored; - var tipuesearch_string_too_short = window.searchTranslation.Search_too_short; - var tipuesearch_string_one_character_or_more = window.searchTranslation.Search_one_character_or_more; - var tipuesearch_string_should_be_x_or_more = window.searchTranslation.Search_should_be_x_or_more; - - // Main containers - var tipue_container, tipue_backdrop; - - function getURLP(name) { - return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search) || [, ""])[1].replace(/\+/g, '%20')) || null; - } - - function closeSearch() { - document.title = originalTitle; - - $(document).off("keyup", keyUpHandler); - - $("body").removeClass("with-search"); - tipue_container.hide(); - tipue_backdrop.hide(); - } - - function keyUpHandler(e) { - if (e.which == 27) { //escape - closeSearch(); - } - } - - function getSearchString(searchFor) { - var standard = true; - var hasStopWords = false; - if ((searchFor.match("^\"") && searchFor.match("\"$")) || (searchFor.match("^'") && searchFor.match("'$"))) { - standard = false; - } - - if (standard) { - var d_w = searchFor.split(' '); - searchFor = ''; - for (var i = 0; i < d_w.length; i++) { - var isStopWord = false; - for (var f = 0; f < tipuesearch_stop_words.length; f++) { - if (d_w[i] == tipuesearch_stop_words[f]) { - isStopWord = true; - hasStopWords = true; - } - } - if (!isStopWord) { - searchFor = searchFor + ' ' + d_w[i]; - } - } - searchFor = $.trim(searchFor); - } else { - searchFor = searchFor.substring(1, searchFor.length - 1); - } - - return { - hasStopWords: hasStopWords, - isStandard: standard, - searchFor: searchFor - }; - } - - function getScore(searchFor, page) { - var score = 0; - var pat = new RegExp(searchFor, 'gi'); - - if (page.title.search(pat) != -1) { - score += (20 * page.title.match(pat).length); - } - - if (page.text.search(pat) != -1) { - score += (20 * page.text.match(pat).length); - } - - if (page.tags.search(pat) != -1) { - score += (10 * page.tags.match(pat).length); - } - - if (page.url.search(pat) != -1) { - score += 20; - } - - return score; - } - - function makeResult(score, page, text) { - return { - "score": score, - "title": page.title, - "desc": text, - "url": page.url - } - } - - window.tipuesearch = function (options) { - var settings = $.extend( - { - 'field': $('#tipue_search_input'), - 'show': 10, - 'showURL': true, - 'showTitleCount': true, - 'minimumLength': 3, - 'descriptiveWords': 25, - 'highlightTerms': true, - 'highlightEveryTerm': false, - 'contentLocation': 'tipuesearch/tipuesearch_content.json', - 'debug': false - }, options); - - var tipuesearch_in = { - pages: [] - }; - - $.ajax( - { - dataType: "json", - url: settings.base_url + settings.contentLocation, - async: false - }) - .done( - function (json) { - tipuesearch_in = $.extend({}, json); - }); - - - if (getURLP('q')) { - settings.field.val(getURLP('q')); - getTipueSearch(0, true); - } - - settings.field.keyup( - function (event) { - if (event.keyCode == '13') { - getTipueSearch(0, true); - } - }); - - - function highlightText(search, text) { - if (settings.highlightTerms) { - var pattern = new RegExp('(' + search + ')', settings.highlightEveryTerm ? 'gi' : 'i'); - text = text.replace(pattern, "$1"); - } - - return text; - } - - function getResults(searchFor, standard) { - var found = []; - - var pages = tipuesearch_in.pages; - - // If a searchLanguage is set, filter out all other pages - if (window.searchLanguage) { - pages = pages.filter(function(item) { - return item.url.indexOf(window.searchLanguage + "/") === 0; - }) - } - - if (standard) { - var d_w = searchFor.split(' '); - for (var i = 0; i < pages.length; i++) { - var score = 0; - var text = pages[i].text; - for (var f = 0; f < d_w.length; f++) { - if (d_w[f].match('^-')) { - var pat = new RegExp(d_w[f].substring(1), 'i'); - if (pages[i].title.search(pat) != -1 || pages[i].text.search(pat) != -1 || pages[i].tags.search(pat) != -1) { - score = 0; - } - } else { - score += getScore(d_w[f], pages[i]); - text = highlightText(d_w[f], text); - } - } - - if (score != 0) { - found.push(makeResult(score, pages[i], text)); - } - } - } else { - for (var i = 0; i < pages.length; i++) { - var score = getScore(searchFor, pages[i]); - if (score != 0) { - found.push(makeResult(score, pages[i], highlightText(searchFor, pages[i].text))); - } - } - } - - found.sort(function (a, b) { - return b.score - a.score - }); - - return found - } - - function getTipueSearch(start, replace) { - - if (!tipue_container) { - tipue_container = $(document.createElement("div")); - tipue_container.addClass('SearchResults'); - document.body.appendChild(tipue_container.get(0)); - - tipue_backdrop = $(document.createElement("div")); - tipue_backdrop.addClass("SearchResultsBackdrop"); - document.body.appendChild(tipue_backdrop.get(0)); - - tipue_container.on('click', '.SearchResults__close', closeSearch); - tipue_container.on('click', '.SearchResults__footer__link', function () { - var id_v = $(this).attr('id'); - var id_a = id_v.split('_'); - - getTipueSearch(parseInt(id_a[0]), id_a[1]); - - tipue_container.scrollTop(0); - }); - - tipue_container.on('keyup paste', '.Search__field', function(event) { - settings.field.val($(this).val()); - - if (event.keyCode == '13') { - getTipueSearch(0, true); - } - }) - } - - $(document).keyup(keyUpHandler); - - var output = ''; - - var search = getSearchString($.trim(settings.field.val().toLowerCase())); - var searchFor = search.searchFor; - - if (searchFor.length >= settings.minimumLength) { - var found = getResults(search.searchFor, search.isStandard); - var counter = found.length; - - - if (counter == 0) { - output += '
' + tipuesearch_string_no_results + '
'; - } else { - if (settings.showTitleCount) { - document.title = '(' + counter + ') ' + originalTitle; - } - - if (counter == 1) { - output += '
' + tipuesearch_string_one_result + '
'; - } else { - output += '
' + tipuesearch_string_results.replace('!count', counter) + '
'; - } - - var l_o = 0; - for (var i = 0; i < found.length; i++) { - if (l_o >= start && l_o < settings.show + start) { - output += ''; - - if (settings.debug) { - output += '
Score: ' + found[i].score + '
'; - } - - if (settings.showURL) { - var s_u = found[i].url.toLowerCase(); - if (s_u.indexOf('http://') == 0) { - s_u = s_u.slice(7); - } - output += ''; - } - - if (found[i].desc) { - var t = found[i].desc; - var t_d = ''; - var t_w = t.split(' '); - if (t_w.length < settings.descriptiveWords) { - t_d = t; - } else { - for (var f = 0; f < settings.descriptiveWords; f++) { - t_d += t_w[f] + ' '; - } - } - t_d = $.trim(t_d); - if (t_d.charAt(t_d.length - 1) != '.') { - t_d += ' ...'; - } - output += '
' + t_d + '
'; - } - } - l_o++; - } - - if (counter > settings.show) { - var pages = Math.ceil(counter / settings.show); - var page = (start / settings.show); - output += ''; - } - } - } else { - if (search.hasStopWords) { - output += '
' + tipuesearch_string_no_results + '. ' + tipuesearch_string_common_words_ignored + '
'; - } else { - output += '
' + tipuesearch_string_too_short + '
'; - if (settings.minimumLength == 1) { - output += '
' + tipuesearch_string_one_character_or_more + '
'; - } else { - output += '
' + tipuesearch_string_should_be_x_or_more.replace("!min", settings.minimumLength) + '
'; - } - } - } - - $("body").addClass("with-search").scrollTop(0); - tipue_backdrop.show(); - tipue_container.scrollTop(0); - tipue_container.show().html(output); - } - - }; - -})(jQuery); diff --git a/docs/generated-docs/tipuesearch/tipuesearch_content.json b/docs/generated-docs/tipuesearch/tipuesearch_content.json deleted file mode 100644 index 173f5b8213..0000000000 --- a/docs/generated-docs/tipuesearch/tipuesearch_content.json +++ /dev/null @@ -1 +0,0 @@ -{"pages":[{"title":"CoreShop - Pimcore eCommerce Framework","text":"CoreShop Documentation This documentation section provides all information you need to use the CoreShop - Pimcore eCommerce Framework We've aimed this part of the documentation at a developer's audience. CoreShop provides a fully flexible and extendable eCommerce Solution for Pimcore. If you want to know more about Pimcore, please visit pimcore.com. Documentation Overview The Core Framework documentation is divided into three sections that aim to guide the reader through its first use of the platform: See the Getting Started section for an overview and information about the installation process. See the Bundles section for details about the different Bundles CoreShop provides. See the User Documentation section for documentation configuration of CoreShop. See the Development section for documentation about developing with CoreShop. Additional resources for getting started with CoreShop CoreShop Demo: See CoreShop in action and also use it as a blueprint application for your own implementations.","tags":"","url":"index.html"},{"title":"Getting Started","text":"Getting Started with CoreShop This section provides a quick getting started tutorial for CoreShop and covers the following topics: Installation of Pimcore Architecture Overview Upgrade Notes Difference to the eCommerce Framework UI Documentation Developer Documentation","tags":"","url":"Getting_Started\/index.html"},{"title":"Installation","text":"CoreShop Installation You need a running instance of Pimcore on your system before you can install CoreShop. You can setup your own example: Install with composer composer require coreshop\/core-shop ^3.0 Run enable Bundle command php bin\/console pimcore:bundle:enable CoreShopCoreBundle Run Install Command php bin\/console coreshop:install Optional: Install Demo Data php bin\/console coreshop:install:demo Messenger CoreShop also uses Symfony Messenger for async tasks like sending E-Mails or Processing DataObjects for the Index. Please run these 2 transports to process the data bin\/console messenger:consume coreshop_notification coreshop_index --time-limit=300 Payment CoreShop uses Payum for Payment. Checkout Payums Documentation on how to add payment providers. Payment providers are implemented as Pimcore Plugin. They can be installed using composer. Here you can find all available payment modules via composer Payum Documentation","tags":"","url":"Getting_Started\/Installation.html"},{"title":"Architecture Overview","text":"CoreShop Architecture CoreShop is completely open source (GPl license) and free, maintained by diverse and creative community of developers and companies. What are our core values and what makes us different from other solutions? Components based approach Unlimited flexibility and simple customization Developer-friendly, using latest technologies Highest quality of code The Three Natures of CoreShop CoreShop is constructed from fully decoupled and flexible e-commerce components for PHP. It is also a set of Symfony bundles, which integrate the components into the full-stack framework. On top of that, CoreShop is also a complete eCommerce suite crafted from all these building blocks. It is your choice how to use CoreShop, you can benefit from the components with any framework, integrate selected bundles into existing or new Pimcore app or built your application on top of CoreShop Suite. CoreShop Suite This book is about our full-stack eCommerce suite, which is a standard Pimcore Bundle providing the most common webshop and a foundation for custom systems. Leveraging Symfony Bundles If you prefer to build your very custom system step by step and from scratch, you can integrate the standalone Symfony bundles. For the installation instructions, please refer to the appropriate bundle documentation. Difference to the official Pimcore eCommerce Framework The eCommerce Framework provides you with a basic Toolset for eCommerce Development. CoreShop gives you a feature-rich Toolset of common needed Tools for rich and complex eCommerce Solutions. Example I: the Framework does'nt give you the full opportunity for calculating complex Shipping Prices. You need to code it by yourself. CoreShop provides you with Carriers and Shipping Rules to do that. CoreShops Bundles are build to be used individually. The CoreBundle combines all the Features. Architecture Overview CoreShop Suite is build on CoreShop Components and Bundles. The CoreBundle and CoreComponent glues all different Bundles and Components into one eCommerce Suite for B2B and B2C Solutions.","tags":"","url":"Getting_Started\/Architecture_Overview.html"},{"title":"Upgrade Notes","text":"CoreShop Upgrade Notes Always check this page for some important upgrade notes before updating to the latest coreshop build. 2.0.0-beta.3 to 2.0.0-beta.4 BC break: All occurrences of parameters coreshop.all.stack.pimcore_class_ids, "application".model."class".pimcore_class_id, coreshop.all.pimcore_classes.ids have been removed. Inject the corresponding Repository and use classId function instead Pimcore: CoreShop now requires at least Pimcore 5.4.0. You need to update Pimcore to the at least 5.4.0 in order to use\/update CoreShop. Product Price Calculation In order to allow custom price calculation on API Level, we changed the way CoreShop calculates product prices by introducing a new parameter to every PriceCalculation Interface. Price Calculator Conditions are not anymore using a Live context, instead it gets passed via API. Following interfaces have changed: CoreShop\\Component\\Core\\Product\\TaxedProductPriceCalculatorInterface CoreShop\\Component\\Order\\Calculator\\PurchasableDiscountCalculatorInterface CoreShop\\Component\\Order\\Calculator\\PurchasableDiscountPriceCalculatorInterface CoreShop\\Component\\Order\\Calculator\\PurchasablePriceCalculatorInterface CoreShop\\Component\\Order\\Calculator\\PurchasableRetailPriceCalculatorInterface CoreShop\\Component\\Product\\Calculator\\ProductDiscountCalculatorInterface CoreShop\\Component\\Product\\Calculator\\ProductDiscountPriceCalculatorInterface CoreShop\\Component\\Product\\Calculator\\ProductPriceCalculatorInterface CoreShop\\Component\\Product\\Calculator\\ProductRetailPriceCalculatorInterface CoreShop\\Component\\Product\\Rule\\Action\\ProductDiscountActionProcessorInterface CoreShop\\Component\\Product\\Rule\\Action\\ProductDiscountPriceActionProcessorInterface CoreShop\\Component\\Product\\Rule\\Action\\ProductDiscountPriceActionProcessorInterface CoreShop\\Component\\Product\\Rule\\Action\\ProductPriceActionProcessorInterface CoreShop\\Component\\Product\\Rule\\Fetcher\\ValidRulesFetcherInterface If you have anything customized with those classes, please change them accordingly. If you use the PriceCalculator Service directly, you also need to change the call from $this->priceCalculator->getPrice($object, true) to $this->priceCalculator->getPrice($object, [ 'store' => $store, 'country' => $country, 'customer' => $customer, 'currency' $currency, 'cart' => $cart ], true) The new second argument, is the Context for which you want to get the Price. This is highly depends on your need. On a default CoreShop setup, the context can be fetched form the ShopperContext Service like this: return [ 'store' => $this->shopperContext->getStore(), 'customer' => $this->shopperContext->hasCustomer() ? $this->shopperContext->getCustomer() : null, 'currency' => $this->shopperContext->getCurrency(), 'country' => $this->shopperContext->getCountry(), 'cart' => $this->shopperContext->getCart() ]; CoreShop makes that easier for you, you can just use $this->shoppperContext->getContext(). But be aware, the Shopper Context is only in a Web Request available. When you work on a CLI Level, you have to define the context yourself. If you already have a cart and want to calculate the price for the cart, the context is a bit different, cause it resolves from the cart $context = [ 'store' => $cart->getStore(), 'customer' => $cart->getCustomer() ?: null, 'currency' => $cart->getCurrency(), 'country' => $cart->getStore()->getBaseCountry(), 'cart' => $cart ]; Taxation Tax Rule Store relation has been removed as it makes currently no sense. Tracking Tracking bundle has completely been refactored in order to support more use-cases than just ecommerce. If you have any customizations made, please check the current implementation to adapt your changes. Order Invoice Due to changes in adjustments, we also need to change OrderInvoice\/OrderInvoiceItem. After you have migrated to the latest version you also have to remove some fields: CoreShopOrderInvoice totalTax baseTotalTax subtotalTax baseSubtotalTax shippingTax baseShippingTax taxes baseTaxes discountTax baseDiscountTax discountNet discountGross baseDiscountNet baseDiscountGross shippingNet shippingGross baseShippingNet baseShippingGross shippingTaxRate CoreShopOrderInvoiceItem totalTax baseTotalTax taxes baseTaxes Adjustments BC break \/ New Feature There are several deprecated class fields. After you have migrated to the latest version you also have to remove them: CoreShopOrder \/ CoreShopQuote shippingGross shippingNet shippingTax discountGross discountNet discountTax baseShippingNet baseShippingGross baseShippingTax baseDiscountNet baseDiscountGross totalTax baseTotalTax subTotalTax baseSubtotalTax CoreShopOrderItem \/ CoreShopQuoteItem totalTax baseTotalTax CoreShopCart shippingGross shippingNet discountGross discountNet 2.0.0-beta.2 to 2.0.0-beta.3 BC break Signature of following interfaces changed: CoreShop\\Component\\Index\\Interpreter\\InterpreterInterface: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []); CoreShop\\Component\\Index\\Interpreter\\LocalizedInterpreterInterface: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config, $interpreterConfig = []); CoreShop\\Component\\Index\\Interpreter\\RelationInterpreterInterface: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config, $interpreterConfig = []); CoreShop\\Component\\Customer\\Model\\UserInterface::ROLE_DEFAULT renamed CoreShop\\Component\\Customer\\Model\\UserInterface::CORESHOP_ROLE_DEFAULT CoreShop\\Component\\Customer\\Model\\UserInterface::ROLE_SUPER_ADMIN renamed CoreShop\\Component\\Customer\\Model\\UserInterface::CORESHOP_ROLE_SUPER_ADMIN BC break Shipment \/ Invoice Creation via API changed Before adding a new Shipment \/ Invoice you need to dispatch a request state to your order. Read more about it here and here. BC break getName in CoreShop\\Component\\Index\\Model\\IndexableInterface has been changed to getIndexableName as getName could eventually conflict with a non localized Pimcore Field BC break getEnabled in CoreShop\\Component\\Index\\Model\\IndexableInterface has been changed to getIndexableEnabled as getEnabled could eventually conflict with a localized Pimcore Field 2.0.0-beta.1 to 2.0.0-beta.2 Link Generator implemented. If you want to use nice urls, you need to add the link generator service: CoreShopProduct: add @coreshop.object.link_generator.product as Link Provider CoreShopCategory: add @coreshop.object.link_generator.category as Link Provider Change {{ path('') }} to {{ coreshop_path('') }}. You may want to checkout the FrontendBundle to get a deeper insight. Deprecated Field Names in - CoreShop\\Component\\Payment\\Model\\PaymentInterface`: getName is now getTitle getOrderId is now getOrder and directly returns a OrderInterface Deprecated Field Names in - CoreShop\\Component\\Shipping\\Model\\CarrierInterface: getLabel is not getTitle getName is now getIdentifier 2.0.0-alpha.4 to 2.0.0-beta.1 BC break Signature of following interfaces changed: CoreShop\\Component\\Index\\Interpreter\\InterpreterInterface: public function interpret($value, IndexableInterface $object, IndexColumnInterface $config); CoreShop\\Component\\Index\\Interpreter\\LocalizedInterpreterInterface: public function interpretForLanguage($language, $value, IndexableInterface $object, IndexColumnInterface $config); CoreShop\\Component\\Index\\Interpreter\\RelationInterpreterInterface: public function interpretRelational($value, IndexableInterface $indexable, IndexColumnInterface $config); BC break CoreShop now takes advantage of the dependent bundle feature introduced in Pimcore 5.1.2. Therefore, all bundles are now automatically loaded. This is a BC break, as when updating, you might run into issues. To solve the issues, check following things: remove RegisterBundles entry from app\/AppKernel.php remove loading CoreShopCoreBundle Configuration in app\/config.yml enable CoreShopCoreBundle via CLI or manually in var\/config\/extensions.php: "CoreShop\\\\Bundle\\\\CoreBundle\\\\CoreShopCoreBundle" => TRUE BC break Upgraded Default Layout to Bootstrap 4. This will most certainly cause issues when you just override certain templates. Best would be to copy all templates from before the Bootstrap 4 Upgrade. 2.0.0-alpha.4 to 2.0.0-alpha.5 BC break added Component\\Core\\Model\\OrderItem and Component\\Core\\Model\\QuoteItem. If you already customized them, inherit them from the Core Models. BC break changed the way CoreShop processes Cart-Rules. If you implemented a custom-condition, inherit from CoreShop\\Component\\Order\\Cart\\Rule\\Condition\\AbstractConditionChecker and implement isCartRuleValid instead of isValid Deprecated: remove cart\/add-price-rule\/ static route. 2.0.0-alpha.3 to 2.0.0-alpha.4 BC break decoupled MoneyBundle from CurrencyBundle, therefore the Twig Extension for Money Conversion went to the CurrencyBundle. Therefore the name of that extension was renamed from coreshop_convert_money to coreshop_convert_currency. If you use it directly in your code, please rename all of them. Deprecated CoreShopAdminBundle which responsability was only handling installation and deliviering pimcore resources like JS and CSS files. Installation has been moved to CoreShopCoreBundle Delivering of resources is now handled by CoreShopResourceBundle, this also makes it easier to use CoreShop Bundles without handling resources yourself. 2.0.0-alpha.2 to 2.0.0-alpha.3 BC break getPrice in PurchasableInterface and ProductInterface has been removed. In favor of this a new coreShopStorePrice editable has been introduced, which stores prices for each store. This makes handling of multiple currencies way more elegant. If you still want to use the old getPrice, create a new Subclass of \\CoreShop\\Component\\Core\\Model\\Product, implement \\CoreShop\\Component\\Order\\Model\\PriceAwarePurchasableInterface and set your class to CoreShopProduct parents. V1 to V2 CoreShop 2 is not backward compatible. Due to the framework change, we decided to re-make CoreShop from scratch. If you still have instances running and want to migrate, there is a basic migration way which gets you data from V1 to V2. Export from CoreShop1 Import into CoreShop2 Within V1 Nothing available","tags":"","url":"Getting_Started\/Upgrade_Notes.html"},{"title":"Difference to ecommerce Framework","text":"CoreShop vs. eCommerce Framework The idea behind CoreShop is totally different to the eCommerce framework. The eCommerce framework gives you skeleton for building eCommerce applications and heavily depends on you doing all the things. CoreShop, on the other hand, comes full-featured with a rich toolset of optional Components which you can use, or not use, for your ecommerce Application. In other words: CoreShop is the framework on steroids :) Feature Comparison Feature eCommerce Framework CoreShop Product Management \u221a \u221a Product Restrictions X \u221a Product Variants \u221a \u221a Category Management \u221a \u221a Customer Management X \u221a Customer Address Management X \u221a Localization X \u221a Currency Management X \u221a Country Management X \u221a Taxation \u221a \u221a Payment Management \u221a \u221a Supported Payment Providers - Wirecard Qpay \u221a \u221a - Wirecard Seamless \u221a \u221a - Datatrans \u221a \u221a - Klarna \u221a \u221a - Recurring Payments \u221a \u221a - PayPal Express X \u221a - PayPal Pro Checkout X \u221a - PayPal Pro Hosted X \u221a - PayPal Masspay X \u221a - PayPal Rest X \u221a - Stripe.js X \u221a - Stripe Checkout X \u221a - Authorize.NET AIM X \u221a - Be2Bill Credit Card X \u221a - Be2Bill Offsite X \u221a - Payex X \u221a - Offline X \u221a - Payum and Omnipay X \u221a Voucher Codes \u221a \u221a Catalog Price Rules \u221a \u221a Product Specific Price Rules X \u221a Product Facet Index \u221a \u221a Multi Theme Supported X \u221a Carrier Management X \u221a Shipping Calculation X \u221a Order Management \u221a \u221a Order Workflow X \u221a Order Invoice Generation X \u221a Order Shipment Generation X \u221a Quotes Management X \u221a Reporting X \u221a Multi Store\/Tenant \u221a \u221a eCommerce Tracking \u221a \u221a Configurable Mail Rules X \u221a Backend Functionality - Country Management X \u221a - Currency Management X \u221a - Taxation Management X \u221a - Taxation Management X \u221a - Index Management X \u221a - Filter Management X \u221a - Order Management X (partial) \u221a - Voucher Rules \u221a \u221a - Price Rules \u221a \u221a - Order Overview X (partial) \u221a - Quote Overview X \u221a - Order Detail X (partial) \u221a - Quote Detail X \u221a - Order Creation X \u221a - Quote Creation X \u221a Checkout Manager \u221a \u221a Modular\/Componentized X (partial) \u221a Extendable \u221a \u221a To be fair, both Systems have their purpose and you can do the same with both systems. The ecommerce Framework is designed to be very good extendable but you still need to implement a lot of stuff yourself. CoreShop gives you a lot of out-of-the-box features to quickly create rich ecommerce systems.","tags":"","url":"Getting_Started\/Difference_to_ecommerce_Framework.html"},{"title":"Bundles","text":"CoreShop Bundles CoreShop is a set of Bundles that provide different functionality. Each Bundle is supposed to be independent and can be used without the other Bundles. Glued together, they provide a full e-commerce solution. Address Bundle Configuration Bundle Core Bundle Currency Bundle Customer Bundle Fixture Bundle Frontend Bundle Index Bundle Inventory Bundle Locale Bundle Money Bundle Messenger Bundle ! Money Bundle ! Notification Bundle ! Optimistic Entity Lock Bundle ! Order Bundle Payment Bundle Payum Payment Bundle ! Product Bundle Product Quantity Price Rules Bundle Resource Bundle Rule Bundle SEO Bundle Sequence Bundle Shipping Bundle Storage List Bundle Store Bundle Taxation Bundle Theme Bundle Tracking Bundle User Bundle Variant Bundle Wishlist Bundle Workflow Bundle","tags":"","url":"Bundles\/index.html"},{"title":"Address Bundle","text":"CoreShop Address Bundle CoreShop Address Bundle provides a basic set of data for Addressing Information like: Country State Address This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Address_Bundle.html"},{"title":"Configuration Bundle","text":"CoreShop Configuration Bundle Installation $ composer require coreshop\/configuration-bundle:^3.0 Usage Configuration Component helps you store your configurations in database. $service = new CoreShop\\Component\\Configuration\\Service\\ConfigurationService($doctrineEntityManager, $configRepo, $configFactory); $service->set('key', 'value'); $service->get('key');","tags":"","url":"Bundles\/Configuration_Bundle.html"},{"title":"Core Bundle","text":"CoreShop Core Bundle Core Bundle glues all independent CoreShop Bundles into one e-commerce suite and extends certain parts accordingly. This Bundle is not advised to be installed seperately!","tags":"","url":"Bundles\/Core_Bundle.html"},{"title":"Currency Bundle","text":"CoreShop Currency Bundle Currency Bundle provides you with Models for persisting Currencies and resolving Currency Contexts. Symfony Profiler Pimcore Core Extensions Doctrine Mappings Symfony Forms Money Formatter Twig Extensions Currency Formatting Currency Conversion Currency Code to Symbol Installation $ composer require coreshop\/currency-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\CurrencyBundle\\CoreShopCurrencyBundle(), ]); } Updating database schema Run the following command. $ php bin\/console doctrine:schema:update --force Usage This Bundle integrates Currency Component into Symfony and Doctrine The Currency Bundle provides you with basic information needed for Currencies: Currency, Exchange Rates, Conversion and Formatting Doctrine Entities Currency Pimcore UI Currency Exchange Rate How to use? coreshop.global.resource.open('coreshop.currency', 'currency'); coreshop.global.resource.open('coreshop.currency', 'exchange_rate');","tags":"","url":"Bundles\/Currency_Bundle.html"},{"title":"Customer Bundle","text":"CoreShop Customer Bundle Installation $ composer require coreshop\/customer-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\CustomerBundle\\CoreShopCustomerBundle(), ]); } Updating database schema Run the following command. $ php bin\/console doctrine:schema:update --force Install Pimcore Entities $ php bin\/console coreshop:resources:install Learn more about overriding Pimcore Classes here) Usage This Bundle integrates Customer Component into Symfony and Doctrine The Customer Bundle provides you with basic information needed for a Customer: Customer and CustomerGroup The Bundle also introduces an Customer Context, which helps you determine the current Customer. Pimcore Entities Customer (CoreShopCustomer) CustomerGroup (CoreShopCustomerGroup)","tags":"","url":"Bundles\/Customer_Bundle.html"},{"title":"Fixture Bundle","text":"CoreShop Fixture Bundle Fixture Bundle allows us to Install certain data needed for runtime of CoreShop or for the Demo. Installation $ composer require coreshop\/fixture-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\FixtureBundle\\CoreShopFixtureBundle(), ]); } Updating database schema Run the following command. $ php bin\/console doctrine:schema:update --force Creating a new Fixture Create a new File in your Bundle within the Namespace Fixtures\\Data\\Application for app fixtures and Fixtures\\Data\\Demo for Demo fixtures. The FixtureBundle will automatically recognize your fixtures. <?php namespace CoreShop\\Bundle\\CoreBundle\\Fixtures\\Application; use CoreShop\\Bundle\\FixtureBundle\\Fixture\\VersionedFixtureInterface; use Doctrine\\Common\\DataFixtures\\AbstractFixture; use Doctrine\\Common\\Persistence\\ObjectManager; use Symfony\\Component\\DependencyInjection\\ContainerAwareInterface; use Symfony\\Component\\DependencyInjection\\ContainerInterface; class ConfigurationFixture extends AbstractFixture implements ContainerAwareInterface, VersionedFixtureInterface { \/** * @var ContainerInterface *\/ private $container; \/** * {@inheritdoc} *\/ public function getVersion() { return '2.0'; } \/** * {@inheritdoc} *\/ public function setContainer(ContainerInterface $container = null) { $this->container = $container; } \/** * {@inheritdoc} *\/ public function load(ObjectManager $manager) { $configurations = [ 'system.guest.checkout' => true, 'system.category.list.mode' => 'list', 'system.category.list.per_page' => [12, 24, 36], 'system.category.list.per_page.default' => 12, 'system.category.grid.per_page' => [5, 10, 15, 20, 25], 'system.category.grid.per_page.default' => 10, 'system.category.variant_mode' => 'hide', 'system.order.prefix' => 'O', 'system.order.suffix' => '', 'system.quote.prefix' => 'Q', 'system.quote.suffix' => '', 'system.invoice.prefix' => 'IN', 'system.invoice.suffix' => '', 'system.invoice.wkhtml' => '-T 40mm -B 15mm -L 10mm -R 10mm --header-spacing 5 --footer-spacing 5', 'system.shipment.prefix' => 'SH', 'system.shipment.suffix' => '', 'system.shipment.wkhtml' => '-T 40mm -B 15mm -L 10mm -R 10mm --header-spacing 5 --footer-spacing 5', ]; foreach ($configurations as $key => $value) { $this->container->get('coreshop.configuration.service')->set($key, $value); } } }","tags":"","url":"Bundles\/Fixture_Bundle.html"},{"title":"Frontend Bundle","text":"CoreShop Frontend Bundle CoreShop FrontendBundle provides some FrontendControllers as well as a default Implementation for the Frontend. This Bundle is not advised to be installed seperately!","tags":"","url":"Bundles\/Frontend_Bundle.html"},{"title":"Index Bundle","text":"CoreShop Index Bundle Installation $ composer require coreshop\/index-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\IndexBundle\\CoreShopIndexBundle(), ]); } Updating database schema Run the following command. $ php bin\/console doctrine:schema:update --force Usage This Bundle integrates Index Component into Symfony and Doctrine The Index Bundle provides you with basic information needed for a Indexing Pimcore Models: Index, Filters and Conditions It also provides you with ListingServices and FilterServices Get Listing from Index How to get a Listing from an Index? $filter = $this->get('coreshop.repository.filter')->find(1); \/\/Get Filter by ID 1 $filteredList = $this->get('coreshop.factory.filter.list')->createList($filter, $request->request); $filteredList->setVariantMode(ListingInterface::VARIANT_MODE_HIDE); $filteredList->setCategory($category); $this->get('coreshop.filter.processor')->processConditions($filter, $filteredList, $request->query); $filteredList->load(); Pimcore UI Index Configuration Filter Configuration How to use? coreshop.global.resource.open('coreshop.index', 'index'); coreshop.global.resource.open('coreshop.index', 'filter');","tags":"","url":"Bundles\/Index_Bundle.html"},{"title":"Inventory Bundle","text":"CoreShop Inventory Bundle CoreShop Inventory Bundle provides a Basic implementation to handle Inventory for a Product. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Inventory_Bundle.html"},{"title":"Locale Bundle","text":"CoreShop Locale Bundle CoreShop Locale Bundle provides a basic set of data for Locale Information. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Locale_Bundle.html"},{"title":"Menu Bundle","text":"CoreShop Menu Bundle Menu Bundle makes it easy creating Pimcore Menus based on permissions. Installation $ composer require coreshop\/menu-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\MenuBundle\\CoreShopMenuBundle(), ]); } Usage Create a new Menu by creating a new Class, let's call it MyMenuBuilder namespace AppBundle\\Menu; use CoreShop\\Bundle\\MenuBundle\\Builder\\MenuBuilderInterface; use Knp\\Menu\\FactoryInterface; use Knp\\Menu\\ItemInterface; class MyMenuBuilder implements MenuBuilderInterface { public function buildMenu(ItemInterface $menuItem, FactoryInterface $factory, string $type) { \/\/Create a new direct sub-menu item $menuItem ->addChild('my-menu-item') ->setLabel('my-menu-item') ->setAttribute('permission', 'my_menu_item') ->setAttribute('iconCls', 'pimcore_icon_delete') ; } } You then need to register your class to the symfony container: app.my_menu: class: AppBundle\\Menu\\MyMenuBuilder tags: - { name: coreshop.menu, type: my_menu, menu: my_menu } Where the menu attribute defines your unique identifier for your menu. You can also register multiple Builders for your Menu with the same menu attribute, this will load them one after another. Now, lets do the ExtJs Javascript part. In your Bundle. I assume you already have a working Bundle for that. In your Bundle.php file, add this file to the jsPaths array: '\/admin\/coreshop\/coreshop.my_menu\/menu.js' Where my_menu here again is your defined identifier. This will load a basic helper file that will build your menu. Now, let's actually build the menu. You should already have a startup.js somehwere in your Bundle. In there, you can instantiate the menu by calling: new coreshop.menu.coreshop.my_menu(); That will build the menu automatically for you. In order now to do something when a menu-item is clicked, you can attach to the event that is fired: pimcore.eventDispatcher.registerTarget('coreshopMenuOpen', new (Class.create({ coreshopMenuOpen: function(type, item) { if (item.id === 'my-menu-item') { alert('My Menu Item has been clicked'); } } })));","tags":"","url":"Bundles\/Menu_Bundle.html"},{"title":"Messenger Bundle","text":"CoreShop Messenger Bundle CoreShop Messenger Bundle provides you with a nice UI to see what Messenger Tasks are queued in which queues: Installation $ composer require coreshop\/messenger-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\MessengerBundle\\CoreShopMessengerBundle(), ]); }","tags":"","url":"Bundles\/Messenger_Bundle.html"},{"title":"Money Bundle","text":"CoreShop Money Bundle Installation $ composer require coreshop\/money-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\MoneyBundle\\CoreShopMoneyBundle(), ]); } Usage Money Bundle adds a new core-extension to pimcore which allows you to store currency values as integer. You also get a Twig Extension to format money values. {{ value|coreshop_format_money('\u20ac', 'de'); }}","tags":"","url":"Bundles\/Money_Bundle.html"},{"title":"Notification Bundle","text":"CoreShop Notification Bundle CoreShop Notification Bundle handles all communication between CoreShop and the outside world. It provides a basic set of data for Notifications like: Notification Rules Notification Rule Conditions Notification Rule Actions This Bundle can be used separately, but doesn't provide any detail information how to use it. Usage Notifications run async in a Symfony messenger queue: bin\/console messenger:consume coreshop_notification coreshop_index --time-limit=300","tags":"","url":"Bundles\/Notification_Bundle.html"},{"title":"OptimisticEntityLock Bundle","text":"CoreShop Optimistic Entity Lock Bundle The CoreShop Optimistic Entity Lock Bundle is a package for the CoreShop e-commerce framework, based on the Pimcore platform, designed to handle optimistic entity locking. This bundle helps prevent conflicts when multiple users try to edit the same entity concurrently by implementing an optimistic locking strategy. Installation $ composer require optimistic-entity-lock-bundle Adding required bundles to kernel You need to enable the bundle inside the kernel. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\OptimisticEntityLockBundle\\CoreShopOptimisticEntityLockBundle(), ]); } Usage Your Pimcore DataObject Class needs to implement the Interface CoreShop\\Bundle\\OptimisticEntityLockBundle\\Model\\OptimisticLockedInterface. You can therefore add the field optimisticLockVersion to your Pimcore Class Definition. From now on, everytime the DataObject gets saved, CoreShop compares the Versions and increases it before saving. If the version is different, someone else saved the entity before you and you get a exception.","tags":"","url":"Bundles\/OptimisticEntityLock_Bundle.html"},{"title":"Order Bundle","text":"CoreShop Order Bundle CoreShop Order Bundle provides a basic set of data for Orders. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Order_Bundle.html"},{"title":"Payment Bundle","text":"CoreShop Payment Bundle Installation $ composer require coreshop\/payment-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\PaymentBundle\\CoreShopPaymentBundle(), ]); } Updating database schema Run the following command. $ php bin\/console doctrine:schema:update --force Usage This Bundle integrates Payment Component into Symfony and Doctrine The Payment Bundle provides you with basic information needed for payment: Payment The Bundle also introduces an Address Formatter, which formats addresses in country based formats. Doctrine Entities Payment Pimcore UI Payment Provider How to use? coreshop.global.resource.open('coreshop.payment', 'payment_provider');","tags":"","url":"Bundles\/Payment_Bundle.html"},{"title":"Payum Bundle","text":"CoreShop Payum Bundle Handles the Payum Integration with CoreShop. This Bundle requires the Core and can only be used in the full installation. This Bundle is not advised to be installed seperately!","tags":"","url":"Bundles\/Payum_Bundle.html"},{"title":"PayumPayment Bundle","text":"CoreShop Payum Payment Bundle Integrates CoreShop Payment Bundle with Payum.","tags":"","url":"Bundles\/PayumPayment_Bundle.html"},{"title":"Pimcore Bundle","text":"CoreShop Pimcore Bundle Installation $ composer require coreshop\/pimcore-bundle:^3.0 Activating Bundle You need to enable the bundle inside the kernel or with the Pimcore Extension Manager. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\PimcoreBundle\\CoreShopPimcoreBundle() ]); } Usage The CoreShopPimcoreBundle integrates the CoreShop Pimcore Component into Symfony automatically registers a lot of services for you. JS\/CSS Resource Loading With Pimcore, every bundle needs to take care about loading static assets themselve. PimcoreBundle helps you out here, follow these steps to use it: Create a DependencyInjection Extension class like: <?php namespace AppBundle\\DependencyInjection; use CoreShop\\Bundle\\ResourceBundle\\DependencyInjection\\Extension\\AbstractModelExtension; use Symfony\\Component\\Config\\FileLocator; use Symfony\\Component\\DependencyInjection\\ContainerBuilder; use Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader; class AppExtension extends AbstractModelExtension { public function load(array $config, ContainerBuilder $container) { $config = $this->processConfiguration($this->getConfiguration([], $container), $config); $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'\/..\/Resources\/config')); $loader->load('services.yml'); $this->registerPimcoreResources('coreshop', $config['pimcore_admin'], $container); } } Create a DependencyInjection Configuration class like: <?php namespace AppBundle\\DependencyInjection; use Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition; use Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder; use Symfony\\Component\\Config\\Definition\\ConfigurationInterface; final class Configuration implements ConfigurationInterface { \/** * {@inheritdoc} *\/ public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('app'); $this->addPimcoreResourcesSection($rootNode); return $treeBuilder; } \/** * @param ArrayNodeDefinition $node *\/ private function addPimcoreResourcesSection(ArrayNodeDefinition $node) { $node->children() ->arrayNode('pimcore_admin') ->addDefaultsIfNotSet() ->children() ->arrayNode('js') ->addDefaultsIfNotSet() ->ignoreExtraKeys(false) ->children() ->scalarNode('test')->defaultValue('\/bundles\/app\/pimcore\/js\/test.js')->end() ->end() ->end() ->arrayNode('css') ->addDefaultsIfNotSet() ->ignoreExtraKeys(false) ->children() ->scalarNode('test')->defaultValue('\/bundles\/app\/pimcore\/css\/pimcore.css')->end() ->end() ->end() ->end() ->end() ->end(); } } That's it, PimcoreBundle now takes care about loading your resources and also bundles them in non DEV-Mode. DataObject Extensions Serialized Data This extension allows you to store SerializedData inside a Pimcore DataObject. Slug Pimcore comes with quite useful objects slugs. But it doesn't come with a Slug Generator. CoreShop for the rescue. In Order to use it, your class needs to implement CoreShop\\Component\\Pimcore\\Slug\\SluggableInterface and CoreShop automatically generates slugs for you. Extensions \/ Influence the slug generation If you want to change the generated slug or prefix it, you can use the CoreShop\\Component\\Pimcore\\Event\\SlugGenerationEvent Event. <?php declare(strict_types=1); namespace App\\EventListener; use CoreShop\\Component\\Pimcore\\Event\\SlugGenerationEvent; use Pimcore\\Model\\DataObject\\PressRelease; use Pimcore\\Model\\Document; use Symfony\\Component\\EventDispatcher\\EventSubscriberInterface; final class SlugEventListener implements EventSubscriberInterface { public static function getSubscribedEvents() { return [ SlugGenerationEvent::class => 'onGenerate', ]; } public function onGenerate(SlugGenerationEvent $event): void { $event->setSlug($event->getSlug() . '-bar'); } } Data Object Features Class Converter and Data Migrate Class converter is a small utility, which lets you migrate all Data from one class to another. Usage: <?php use CoreShop\\Component\\Pimcore\\Migrate; $currentClassName = 'Product'; $newClassName = 'NewProduct'; $options = [ 'delete_existing_class' => true, 'parentClass' => 'AppBundle\\Model\\MyProduct' ]; \/\/Copies $currentClassName Definition to $newClassName \/\/$options can overwrite some properties like parentClass Migrate::migrateClass($currentClassName, $newClassName, $options); \/\/This function migrates all data from $currentClassName to $newClassName \/\/It uses SQL Commands to increase performance of migration Migrate::migrateData($currentClassName, $newClassName); Class Installer Class Installer helps you importing Classes\/FieldCollections\/ObjectBricks into Pimcore based of a JSON Definition: use CoreShop\\Component\\Pimcore\\ClassInstaller; $installer = new ClassInstaller(); \/\/ For Bricks use $installer->createBrick($pathToJson, $brickName); \/\/ For Classes use $installer->createClass($pathToJson, $className, $updateExistingClass); \/\/ For FieldCollections use $installer->createFieldCollection($pathToJson, $fcName); Class\/Brick\/Field Collection Updater Definition Updaters help you in migrating your Pimcore Class\/Bricks or Field Collection Definitions to be properly migrated from Release to Release. To update a Pimcore class use it like this: use CoreShop\\Component\\Pimcore\\DataObject\\ClassUpdate; $classUpdater = new ClassUpdate('Product'); \/\/Your JSON Definition from Pimcore $payment = [ 'fieldtype' => 'coreShopSerializedData', 'phpdocType' => 'array', 'allowedTypes' => [ ], 'maxItems' => 1, 'name' => 'paymentSettings', 'title' => 'Payment Settings', 'tooltip' => '', 'mandatory' => false, 'noteditable' => true, 'index' => false, 'locked' => null, 'style' => '', 'permissions' => null, 'datatype' => 'data', 'columnType' => null, 'queryColumnType' => null, 'relationType' => false, 'invisible' => false, 'visibleGridView' => false, 'visibleSearch' => false, ]; \/\/Check if field exists if (!$classUpdater->hasField('paymentSettings')) { \/\/If not insert field after a specific field and save the definition $classUpdater->insertFieldAfter('paymentProvider', $payment); $classUpdater->save(); } Thats it, the same works for FieldCollections with the class CoreShop\\Component\\Pimcore\\DataObject\\FieldCollectionDefinitionUpdate and for Bricks with the class CoreShop\\Component\\Pimcore\\DataObject\\BrickDefinitionUpdate Inheritance Helper Inhertiance Helper is a small little but very useful helper class to enable Pimcore inheritance only with a closure function like this: use CoreShop\\Component\\Pimcore\\DataObject\\InheritanceHelper; $inheritedValue = InheritanceHelper::useInheritedValues(function() use($object) { return $object->getValueInherited(); }, true); Version Helper Version Helper is a small little but very useful helper class to disabling or enablind Pimcore Versioning. use CoreShop\\Component\\Pimcore\\DataObject\\VersionHelper; VersionHelper::useVersioning(function() use($object) { \/\/Object will be saved without creating a new Version $object->save(); }, false); Unpublished Helper Unpublsihed Helper is a small little but very useful helper class to get unpublished objects in Pimcore Frontend. use CoreShop\\Component\\Pimcore\\DataObject\\UnpublishedHelper; $allProducts = UnpublishedHelper::hideUnpublished(function() use($object) { \/\/Will return all products, even the unpbulished ones return $object->getProducts(); }, false); Expression Language Features CoreShop adds some features to the Symfony Expression language like: PimcoreLanguageProvider: to get Pimcore Objects, Assets or Documents inside a Expression Language Query Migration Features Pimcore Shared Translations Helps you to install new Shared Translations during Migration: use CoreShop\\Component\\Pimcore\\Migration\\SharedTranslation; SharedTranslation::add('key', 'en', 'value');","tags":"","url":"Bundles\/Pimcore_Bundle.html"},{"title":"Product Bundle","text":"CoreShop Product Bundle CoreShop Product Bundle is responsible for the Product Management. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Product_Bundle.html"},{"title":"ProductQuantityPriceRules Bundle","text":"CoreShop Product Quantity Price Rules Bundle This Bundle implements the Quantity Price Rules for CoreShop. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/ProductQuantityPriceRules_Bundle.html"},{"title":"Resource Bundle","text":"CoreShop Resource Bundle Resource Bundle is the Heart of CoreShops Model. It handles saving\/deleting\/updating\/creating of CoreShop Models. It handles Doctrine ORM Mappings and Translations. As well as Routing, Event Dispatching, Serialization and CRUD. Resource Bundle also takes care about installation of Pimcore Class Definitions, Object Brick Definitions, Field Collection Definitions, Static Routes and SQL. You can use Resource Bundle as base for all your Custom Pimcore Entities. Installation $ composer require coreshop\/resource-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\JMS\\SerializerBundle\\JMSSerializerBundle(), new \\CoreShop\\Bundle\\ResourceBundle\\CoreShopResourceBundle(), new \\Doctrine\\Bundle\\DoctrineCacheBundle\\DoctrineCacheBundle(), new \\Stof\\DoctrineExtensionsBundle\\StofDoctrineExtensionsBundle() ]); }","tags":"","url":"Bundles\/Resource_Bundle\/index.html"},{"title":"CustomEntities","text":"Adding a new custom entity Create Translatable Entity First of all, we need to create our Entity Class. In this case, we create a Translatable Entity. <?php \/\/AppBundle\/Model\/CustomEntityInterface.php interface CustomEntityInterface extends ResourceInterface, TranslatableInterface { public function getName($language = null); public function setName($name, $language = null); } <?php \/\/AppBundle\/Model\/CustomEntity.php class CustomEntity implements CustomEntityInterface { use TranslatableTrait { __construct as private initializeTranslationsCollection; } protected $id; protected $name; public function __construct() { $this->initializeTranslationsCollection(); } public function getId() { return $this->id; } public function getName($language = null) { return $this->getTranslation($language)->getName(); } public function setName($name, $language = null) { $this->getTranslation($language, false)->setName($name); return $this; } protected function createTranslation() { return new CustomEntityTranslation(); } } Since our Entity is Translatable, we need to add our Translation Entity as well. <?php \/\/AppBundle\/Model\/CustomEntityTranslationInterface.php interface CustomEntityTranslationInterface extends ResourceInterface, TimestampableInterface { \/** * @return string *\/ public function getName(); \/** * @param string $name *\/ public function setName($name); } <?php \/\/AppBundle\/Model\/CustomEntityTranslation.php class CustomEntityTranslation extends AbstractTranslation implements CustomEntityTranslationInterface { protected $id; protected $name; public function getId() { return $this->id; } public function getName() { return $this->name; } public function setName($name) { $this->name = $name; } } Create Doctrine Configuration # AppBundle\/Resources\/config\/doctrine\/model\/CustomEntity.orm.yml AppBundle\\Model\\CustomEntity: type: mappedSuperclass table: app_custom_entity fields: id: type: integer column: id id: true generator: strategy: AUTO Our Translation Doctrine definition: # AppBundle\/Resources\/config\/doctrine\/model\/CustomEntityTranslation.orm.yml AppBundle\\Model\\CustomEntityTranslation: type: mappedSuperclass table: app_custom_entity_translation fields: id: type: integer column: id id: true generator: strategy: AUTO name: type: string column: name Create DI Configuration <?php \/\/AppBundle\/DependencyInjection\/Configuration.php namespace CoreShop\\Bundle\\AddressBundle\\DependencyInjection; final class Configuration implements ConfigurationInterface { \/** * {@inheritdoc} *\/ public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('app'); $rootNode ->children() ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end() ->end() ; $this->addModelsSection($rootNode); return $treeBuilder; } \/** * @param ArrayNodeDefinition $node *\/ private function addModelsSection(ArrayNodeDefinition $node) { $node ->children() ->arrayNode('resources') ->addDefaultsIfNotSet() ->children() ->arrayNode('custom_entity') ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() ->scalarNode('permission')->defaultValue('custom_entity')->cannotBeOverwritten()->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() ->scalarNode('model')->defaultValue(CustomEntity::class)->cannotBeEmpty()->end() ->scalarNode('interface')->defaultValue(CustomEntityInterface::class)->cannotBeEmpty()->end() ->scalarNode('admin_controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end() ->scalarNode('factory')->defaultValue(TranslatableFactory::class)->cannotBeEmpty()->end() ->scalarNode('repository')->defaultValue(CustomEntityRepository::class)->cannotBeEmpty()->end() ->scalarNode('form')->defaultValue(CustomEntityType::class)->cannotBeEmpty()->end() ->end() ->end() ->arrayNode('translation') ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() ->scalarNode('model')->defaultValue(CustomEntityTranslation::class)->cannotBeEmpty()->end() ->scalarNode('interface')->defaultValue(CustomEntityTranslationInterface::class)->cannotBeEmpty()->end() ->scalarNode('controller')->defaultValue(ResourceController::class)->cannotBeEmpty()->end() ->scalarNode('repository')->cannotBeEmpty()->end() ->scalarNode('factory')->defaultValue(Factory::class)->end() ->scalarNode('form')->defaultValue(CustomEntityTranslationType::class)->cannotBeEmpty()->end() ->end() ->end() ->end() ->end() ->end() ->end() ->end() ->end() ->end() ; } } <?php \/\/AppBundle\/DependencyInjection\/AppExtension.php final class AppExtension extends AbstractModelExtension { \/** * {@inheritdoc} *\/ public function load(array $config, ContainerBuilder $container) { $config = $this->processConfiguration($this->getConfiguration([], $container), $config); \/\/'app' is the application name $this->registerResources('app', $config['driver'], $config['resources'], $container); } } <?php \/\/AppBundle\/DependencyInjection\/AppExtension.php final class AppBundle extends AbstractResourceBundle { public function getSupportedDrivers() { return [ CoreShopResourceBundle::DRIVER_DOCTRINE_ORM, ]; } protected function getModelNamespace() { return 'AppBundle\\Model'; } } Create Serialization Definition if you want to serialize your Entity # AppBundle\/Resources\/config\/serializer\/Model.CustomEntity.yml AppBundle\\Model\\CustomEntity: exclusion_policy: ALL xml_root_name: custom_entity properties: id: expose: true type: integer groups: [List, Detailed] translations: expose: true type: array groups: [Detailed] virtual_properties: getName: serialized_name: name groups: [List, Detailed] # AppBundle\/Resources\/config\/serializer\/Model.CustomEntityTranslation.yml AppBundle\\Model\\CustomEntityTranslation: exclusion_policy: ALL xml_root_name: custom_entity_translation properties: name: expose: true type: string groups: [Detailed] Create Routes to ResourceController # AppBundle\/Resources\/config\/pimcore\/routing.yml app_custom_entity: type: coreshop.resources resource: | alias: app.custom_entity This will create all CRUD routes: (app is the application name specified in AppExtension.php) GET: \/admin\/app\/custom_entity\/list GET: \/admin\/app\/custom_entity\/get POST: \/admin\/app\/custom_entity\/add POST: \/admin\/app\/custom_entity\/save DELETE: \/admin\/app\/custom_entity\/delete","tags":"","url":"Bundles\/Resource_Bundle\/CustomEntities.html"},{"title":"PimcoreEntities","text":"Adding a new Pimcore Entity with automated installation Add a new Pimcore Class in Pimcore. Add a Parent Class to your Pimcore Entity Export Class Definition to AppBundle\/Resources\/install\/pimcore\/classes\/PimcoreEntity.json Create Parent Class <?php \/\/AppBundle\/Model\/PimcoreEntityInterface.php interface PimcoreEntityInterface extends ResourceInterface public function getName($language = null); public function setName($name, $language = null); } <?php \/\/AppBundle\/Model\/PimcoreEntity.php class PimcoreEntity extends AbstractPimcoreModel implements PimcoreEntityInterface, PimcoreModelInterface { public function getName($language = null) { throw new ImplementedByPimcoreException(__CLASS__, __METHOD__); } public function setName($name, $language = null) { throw new ImplementedByPimcoreException(__CLASS__, __METHOD__); } } Create Dependency Injection Configuration <?php \/\/AppBundle\/DependencyInjection\/Configuration.php namespace AppBundle\\DependencyInjection; final class Configuration implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('app_custom'); $this->addModelsSection($rootNode); return $treeBuilder; } private function addModelsSection(ArrayNodeDefinition $node) { $node ->children() ->arrayNode('pimcore') ->addDefaultsIfNotSet() ->children() ->arrayNode('pimcore_entity') ->addDefaultsIfNotSet() ->children() ->variableNode('PimcoreEntity')->end() ->arrayNode('options') ->scalarNode('path')->defaultValue('path\/within\/pimcore')->end() ->scalarNode('permission')->defaultValue('pimcore_entity')->cannotBeOverwritten()->end() ->addDefaultsIfNotSet() ->children() ->scalarNode('model')->defaultValue('Pimcore\\Model\\Object\\PimcoreEntity')->cannotBeEmpty()->end() ->scalarNode('interface')->defaultValue(PimcoreEntity::class)->cannotBeEmpty()->end() ->scalarNode('factory')->defaultValue(PimcoreFactory::class)->cannotBeEmpty()->end() ->scalarNode('repository')->cannotBeEmpty()->end() ->scalarNode('admin_controller')->cannotBeEmpty()->end() ->scalarNode('install_file')->defaultValue('@AppBundle\/Resources\/install\/pimcore\/classes\/PimcoreEntity.json')->end() ->scalarNode('type')->defaultValue(CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT)->cannotBeOverwritten(true)->end() ->end() ->end() ->end() ->end() ->end() ->end() ->end() ; } } <?php \/\/AppBundle\/DependencyInjection\/AppBundleExtension.php namespace AppBundle\\DependencyInjection; final class AppBundleExtension extends AbstractModelExtension { public function load(array $config, ContainerBuilder $container) { $this->registerPimcoreModels('app', $config['pimcore'], $container); } } Use your Pimcore Entity You can either use Pimcore Listing Classes like: $list = new Pimcore\\Model\\Object\\PimcoreEntity\\Listing(); or use automated generated Factory\/Repository Classes $pimcoreEntityObject = $container->get('app.repository.pimcore_entity')->findBy($id); $list = $container->get('app.repository.pimcore_entity')->getList();","tags":"","url":"Bundles\/Resource_Bundle\/PimcoreEntities.html"},{"title":"Installation","text":"Adding new files that needs to be installed Resource Bundles takes care about installing your resources. It can handle following types: - Object Classes - Field Collection Classes - Objectbrick Classes - Routes - Permissions - SQL Files Object Classes, Field Collections and Objectbrick Classes To install object classes, you need to configure your classes inside your Bundle and register them to Resource Bundle. (as described here) Routes, SQL and Permissions To install routes, permissions or execute sql files, configure them in your Bundle likes this: <?php namespace AppBundle\\DependencyInjection; final class Configuration implements ConfigurationInterface { \/** * {@inheritdoc} *\/ public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('AppBundle'); $this->addPimcoreResourcesSection($rootNode); return $treeBuilder; } private function addPimcoreResourcesSection(ArrayNodeDefinition $node) { $node->children() ->arrayNode('pimcore_admin') ->addDefaultsIfNotSet() ->children() ->arrayNode('install') ->addDefaultsIfNotSet() ->children() ->scalarNode('routes')->defaultValue(['@AppBundle\/Resources\/install\/pimcore\/routes.yml'])->end() ->scalarNode('sql')->defaultValue(['@AppBundle\/Resources\/install\/pimcore\/data.sql'])->end() ->end() ->end() ->scalarNode('permissions') ->cannotBeOverwritten() ->defaultValue(['name_of_permission']) ->end() ->end() ->end() ->end(); } } Routes Example File yeah_route: pattern: "\/(\\\\w+)\\\\\/yeah-route\/" reverse: "\/%_locale\/yeah\\-route" module: AppBundle controller: "@app.frontend.controller.controller" action: doSomething variables: _locale priority: 2","tags":"","url":"Bundles\/Resource_Bundle\/Installation.html"},{"title":"Rule Bundle","text":"CoreShop Rule Bundle CoreShop Rule Bundle is the base Bundle for all Rule Based Systems in CoreShop. It provides a basic set of data for Rules like: Rule Conditions Rule Actions This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Rule_Bundle.html"},{"title":"SEO Bundle","text":"CoreShop SEO Bundle Installation $ composer require coreshop\/seo-bundle:^3.0 Activating Bundle You need to enable the bundle inside the kernel or with the Pimcore Extension Manager. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\SEOBundle\\CoreShopSEOBundle() ]); } Usage The SEO Bundle provides you with services to make SEO more manageable. It depends on Pimcore's HeadLink and HeadMeta Helper. There are multiple ways of making use of this bundle: Implement SEO interfaces provided with this bundle Implement Custom Extractors and add them to the SEOMetadata Model To update the SEO Information, you need to use the service coreshop.seo.presentation: \/\/From a Controller $this->get('coreshop.seo.presentation')->updateSeoMetadata($object); Implement SEO Interfaces SEO Bundle comes with 3 SEO Aware interfaces you can take advantage of: CoreShop\\Component\\SEO\\Model\\SEOAwareInterface for meta-title and meta-description CoreShop\\Component\\SEO\\Model\\SEOImageAwareInterface for og-image attribute CoreShop\\Component\\SEO\\Model\\SEOImageAwareInterface for og-title, og-type and pg-description attribute Implement SEO Extractors To add a new Extractor, you need to implement the interface CoreShop\\Component\\SEO\\Extractor\\ExtractorInterface and register your class with the tag coreshop.seo.extractor: Example Let's implement a custom extractor for our Product class with a Video. <?php \/\/src\/AppBundle\/SEO\/Extractor\/ProductVideoExtractor.php namespace AppBundle\\SEO\\Extractor; use Pimcore\\Model\\DataObject\\Product; use Pimcore\\Tool; final class ProductVideoExtractor implements ExtractorInterface { \/** * {@inheritdoc} *\/ public function supports($object) { return $object instanceof Product && $object->getVideoUrl(); } \/** * {@inheritdoc} *\/ public function updateMetadata($object, SEOMetadataInterface $seoMetadata) { \/** * @var $object Product *\/ $seoMetadata->addExtraProperty('og:video', Tool::getHostUrl() . $object->getVideoUrl()); } } Now we need to register the service # src\/AppBundle\/Resources\/config\/services.yml services: AppBundle\\SEO\\Extractor: tags: - { name: coreshop.seo.extractor, type: product_video }","tags":"","url":"Bundles\/SEO_Bundle.html"},{"title":"Sequence Bundle","text":"CoreShop Sequence Bundle Installation $ composer require coreshop\/sequence-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\SequenceBundle\\CoreShopSequenceBundle(), ]); } Updating database schema Run the following command. $ php bin\/console doctrine:schema:update --force Usage This Bundle integrates Sequence Component into Symfony and Doctrine The sequence Bundle provides you with basic information needed for sequence generation. Doctrine Entities Sequence Get a new Sequence $container->get('coreshop.sequence.generator')->getNextSequenceForType('my_sequence');","tags":"","url":"Bundles\/Sequence_Bundle.html"},{"title":"Shipping Bundle","text":"CoreShop Shipping Bundle CoreShop Shipping Bundle is responsible for Shipping Calculations. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Shipping_Bundle.html"},{"title":"StorageList Bundle","text":"CoreShop Storage List Bundle Storage List Component helps you with Lists\/Collections of Objects like a Cart, Wishlist or Compare List. Usage To use it you need to have 3 models: a Storage List: the collection (CoreShop\\Component\\StorageList\\Model\\StorageListInterface) a Storage Item: the item within the collection which could store additional information (eg. prices for a cart) (CoreShop\\Component\\StorageList\\Model\\StorageListItemInterface) a Storage Product: the actual product (eg. object) being stored inside the Item. (CoreShop\\Component\\StorageList\\Model\\StorageListProductInterface) The component already provides you with a basic implementation of Storage List and Storage Item. You need to implement the StorageListProduct yourself. To now mutate lists, the component gives you a Storage List Modifier, which takes care about creating and persisting the List. Basic usage, Wishist example For now, lets create a very basic Session based Wishlist: We need to have following things: A Factory class for the Wishlist A Factory class for the Wishlist Item A StorageListManager to get the current list (more like a repository actually) A StoreListModifier CoreShop gives you Basic classes for these 4 things, we just need to instantiate them: use Symfony\\Component\\HttpFoundation\\Session\\Session; use CoreShop\\Component\\StorageList\\Model\\StorageList; use CoreShop\\Component\\StorageList\\Model\\StorageListItem; use CoreShop\\Component\\Resource\\Factory\\Factory; use CoreShop\\Component\\StorageList\\SessionStorageManager; use CoreShop\\Component\\StorageList\\SessionStorageListModifier; $session = new Session(); $session->start(); $wishlistFactory = new Factory(StorageList::class); $wishlistItemFactory = new Factory(StorageListItem::class); $wishlistManager = new SessionStorageManager($session, 'wishlist', $wishlistFactory); $wishlistModifier = new SessionStorageListModifier($wishlistItemFactory, $wishlistManager); \/\/Now we can start putting data into our List $list = $wishlistManager->getStorageList(); \/\/Fetch our Product which implements CoreShop\\Component\\StorageList\\Model\\StorageListProductInterface $product = $productRepository->find(1); $listItem = $wishlistItemFactory->createNew(); $listItem->setProduct($product); $listItem->setQuantity($quantity); \/\/Lets add our Product $wishlistModifier->addToList($list, $listItem); \/\/If we now want to remove it, we can either use the $listItem, or the Product \/\/To do that with our item, we simply call $wishlistModifier->removeFromList($list, $listItem);","tags":"","url":"Bundles\/StorageList_Bundle.html"},{"title":"Store Bundle","text":"CoreShop Store Bundle CoreShop Store Bundle provides the abstraction of a Pimcore Website and a CoreShop Store. It handles the configuration for base-currencies and themes. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Store_Bundle.html"},{"title":"Taxation Bundle","text":"CoreShop Taxation Bundle CoreShop Taxation Bundle is responsible for Tax Calculations. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Taxation_Bundle.html"},{"title":"Theme Bundle","text":"CoreShop Theme Bundle CoreShop Theme Bundle provides you with a flexible and extensible way of having multiple themes in a Pimcore installation. Installation $ composer require coreshop\/theme-bundle:^3.0 Adding required bundles to kernel You need to enable the bundle inside the kernel. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\ThemeBundle\\CoreShopThemeBundle(), ]); } Configuration Per Default, no Theme Resolver is enabled, you can enable on or multiples like: core_shop_theme: default_resolvers: pimcore_site: true pimcore_document_property: true Pimcore Site Resolves the Theme based on the Key of the Root Document of a Pimcore Site. So if the Site's Root Document is called "demo" it tries to find a theme called the same. Pimcore Document Property Resolves the Theme based on a Document Property of the Site. The Property is called "theme". Custom Resolvers You can also add custom resolvers like: <?php declare(strict_types=1); namespace App\\Theme; use CoreShop\\Bundle\\ThemeBundle\\Service\\ThemeNotResolvedException; use CoreShop\\Bundle\\ThemeBundle\\Service\\ThemeResolverInterface; use CoreShop\\Component\\Store\\Context\\StoreNotFoundException; final class CustomThemeResolver implements ThemeResolverInterface { public function resolveTheme(): string { if(rand() === 1) { \/\/ if you cannot resolve the theme, throw an exception throw new ThemeNotResolvedException(); } return "custom\/custom"; } } You also need to Register the Theme Resolver: services: App\\Theme\\CustomThemeResolver: tags: - { name: coreshop.theme.resolver, type: custom, priority: 20 }","tags":"","url":"Bundles\/Theme_Bundle.html"},{"title":"Tracking Bundle","text":"CoreShop Tracking Bundle Installation $ composer require coreshop\/tracking-bundle:^3.0 Usage See here for more.","tags":"","url":"Bundles\/Tracking_Bundle.html"},{"title":"User Bundle","text":"CoreShop User Bundle CoreShop User Bundle is responsible for the User Management. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/User_Bundle.html"},{"title":"Variant Bundle","text":"CoreShop Variant Bundle CoreShop Variant Bundle allows you to manage different Variants of a Product. Installation composer require coreshop\/variant-bundle Adding required bundles to kernel You need to enable the bundle inside the kernel. <?php \/\/ app\/AppKernel.php public function registerBundlesToCollection(BundleCollection $collection) { $collection->addBundles([ new \\CoreShop\\Bundle\\VariantBundle\\CoreShopVariantBundle(), ]); } Abstract Pimcore already supports variants. But it doesn't define what a Variant is, or how a variant differs from the Parent Product or other Variants. In classical e-commerce scenarios, you usually have different Variation Types like Size and Color with different Values like XL or Red. CoreShop describes these two types of entities as Group (CoreShop\\Component\\Variant\\Model\\AttributeGroupInterface) and Value (CoreShop\\Component\\Variant\\Model\\AttributeValueInterface The "Product" itself than is a sort-of abstract entity that is used to define what Attribute Groups are allowed. The Pimcore Variants then, need to have the values of thse Groups filled. Example: AttributeGroup Color -AttributeValue Red -AttributeValue Blue product (defines allowed groups for color) variant-red (defines the AttributeValue Red in attributes) variant-blue (defines the AttributeValue Blue in attributes) Usage CoreShop Variant Bundle does NOT come with a Installer for certain Resources it requires. That is on purpose and you need to manually install what you need. Per Default, it comes with 3 different Classes: CoreShopAttributeGroup CoreShopAttributeColor CoreShopAttributeValue Whereas Color and Value are two Value types and Group is a Group type. You can manually import the classes from this dir vendor\/coreshop\/variant-bundle\/Resources\/install\/pimcore\/classes To create a "Product" Class, you need to implement the interface CoreShop\\Component\\Variant\\Model\\ProductVariantAwareInterface. The Class requires you to have these fields: attributes - ManyToManyObjectRelation for CoreShopAttributeColor\/CoreShopAttributeValue allowedAttributeGroups - ManyToManyObjectRelation for CoreShopAttributeGroup mainVariant - ManyToOneRelation for Product (eg. your Class where you implemented the interface)","tags":"","url":"Bundles\/Variant_Bundle.html"},{"title":"Wishlist Bundle","text":"CoreShop Order Bundle CoreShop Order Wishlist provides a basic set of data for Wishlists. It is based on StorageList Bundle and shows how that can be integrated into a Pimcore Project. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Wishlist_Bundle.html"},{"title":"Workflow Bundle","text":"CoreShop Workflow Bundle CoreShop Workflow Bundle is a extension of Symfony Workflow and adds some configuration features to it. This Bundle can be used separately, but doesn't provide any detail information how to use it.","tags":"","url":"Bundles\/Workflow_Bundle.html"},{"title":"User Documentation","text":"User Documentation This section provides a quick getting started tutorial for CoreShop and covers the following topics: Stores Settings Price Rules Cart Price Rules Product Price Rules Specific Product Price Vouchers Available Actions Available Conditions Localization Countries States Zones Taxes Taxes TaxRules Shipping Carriers Shipping Rules Cart Order Orders Order Detail Order Workflow Order Comments Catalog Products Product Variants Categories Inventory GEO IP Reports Sales Cart\/Order Conversion Abandoned Carts Products Categories Customers Carrier Distribution Payment Distribution Vouchers Automation","tags":"","url":"User_Documentation\/index.html"},{"title":"Stores","text":"CoreShop Stores Every CoreShop Installation is bounded to a default Store. By default a store is connected with a pimcore Site. Domain based Store This is CoreShops default behaviour. One store for your default page, which is also your default store. If you have multiple Domains it's possible to add a store to each domain. Tip: Learn more about pimcore multi sites: Pimcore Sites Custom Store Locator Sometimes you have just one site installation but you want do use different Stores. Example: \/de-at should use a austrian store and \/de-de a german one. For that you need to build a custom store locator to do so, checkout the dev section to find out how this can be achieved. Configure CoreShop Stores Open CoreShop Menu -> "Stores". There should be already a default store, connected to your default (main-domain) site. To create a new store, click on the "Add" button. Proceed wih configuring your new store. Examples Stores can be used in many ways, checkout the examples to find out which solution suits you most. Example 1: Global Store Use a Store to handle multiple currencies, countries and tax calculations. Depending on your product and price strategy, it's possible to use it within one store. Example 2: Country Store Use a Store for each Country. This allows you to restrict your shop within a country context.","tags":"","url":"User_Documentation\/Stores.html"},{"title":"Settings","text":"CoreShop's Settings are divided into each "sub"-shop and some system settings. Shop-Settings Settings can be different for each Store. Base Catalog-Mode: With catalog-mode enabled, the cart and checkout are disabled. Products can only be viewed. Guest-Checkout: Enables or disables guest-checkout feature Customer Service Customer Email Document: Email document used to send customer messages Customer Re Email Document: Email document used to send customer reply messages Contact Email Document: Email document used to send contact messages Contact Sales: Default contact used for sales messages Contact Technology: Default contact used for technology messages Stock Default Stock Behaviour: Describes the default stock behaviour for products Tax Validate VAT: Describes if the VAT-Number for European Countries should be validated Disable VAT for Base Country: Disable VAT-Free Shopping for Customers, with valid Vat-Number, in Base Country Taxation Address: Describes witch address is responsibly for taxation Prices Prices are gross prices: Determines if entered prices in CoreShop are with or without tax included. Shipping Free Shipping starts at weight: Describes free shipping at weight. It's also much faster using this than price-rules Free Shipping starts at Currency: Describes free shipping at cart value. It's also much faster using this than price-rules Carrier Sort: Describes how the Carriers should be sorted Product Default Image: Defines an default image for products if no image is available. Number of days as new: Defines the time of days a product is marked as new. Category Default Image: Defines an default image for categories if no image is available. Invoice Create Invoice for Orders: Defines if invoices are going to be created on an paid order. Prefix: Prefix string for Order and Invoice numbers Suffix: Suffix string for Orders and Invoice numbers. WKHTMLTOPDF Parameters: Parameters which will be passed to WKHTMLTOPDF Mail Settings admin email-addresses to send order notification (CSV): Email addresses which will be notified on new orders Send OrderStates as BCC to admin email-addresses: Determines if order-state emails should also be sent to admin-emails Cart Activate automatic cart cleanup: Activate automatic cart cleanup -> cleans inactive and empty carts System - Settings System Settings are defined one time for all shops. System Settings Send Usagelog to CoreShop: Sends an anonymous usagelog to CoreShop Developer Currency Automatic Exchange Rates: Describes if exchange rates should be fetched automatically Exchange Rate Provider: Describes which exchange rate provider should be used.","tags":"","url":"User_Documentation\/Settings.html"},{"title":"Price Rules","text":"CoreShop Price Rules CoreShop Price Rules are very powerful tools for price calculation. This section will help you to get a detailed overview about how price calculation works in CoreShop: Types of Price Rules There are three Price Rule Types. 1. Cart Price Rules Apply Price Rule to the customers cart. 2. Product Price Rules Apply Price Rule globally. 3. Specific Product Prices Apply Price Rules to specific products. Global Priority Product Price Rules first Specific Price Rules second Example 1: Given: Product A with price 100,- Product Price Rule for Product A: New Price 50,- Specific Price Rule for Product A: New Price: 20,- Given Price: 20,- Example 2: Given: Product A with price 100,- Product Price Rule for Product A: Discount Percentage 50% Specific Price Rule for Product A: New Price: 50,- Given Price: 25,- Specific Price Priority Since it's possible to add multiple Specific Price Rules per Product you can adjust the priority via the priority number field. Automatic Rule Availability Checker Rules with time-span elements included on root level will be disabled automatically if they're outdated. Read more about automation here. More Information Cart Price Rules Product Price Rules Specific Product Prices Vouchers Available Actions Available Conditions","tags":"","url":"User_Documentation\/Price_Rules\/index.html"},{"title":"Cart Price Rules","text":"CoreShop Cart Price Rules Documentation Cart price rules in CoreShop provide a flexible way to offer discounts and promotions in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions, such as cart subtotal, specific products, customer groups, or other criteria. This documentation will guide you through creating and managing cart price rules in CoreShop. Available Actions Free Shipping Gift Product Discount Amount Discount Percent Available Conditions Customers Customer Groups Time Span Voucher Amount Countries Zones Stores Currencies Carriers Nested Rules Products Categories","tags":"","url":"User_Documentation\/Price_Rules\/Cart_Price_Rules.html"},{"title":"Product Price Rules","text":"CoreShop Product Price Rules Documentation Product price rules in CoreShop offer a flexible way to provide discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules can be based on various conditions and can apply to specific products, categories, or customer groups. This documentation will guide you through creating and managing product price rules in CoreShop. Available Actions Price Discount Price Discount Amount Discount Percent Available Conditions Customers Customer Groups Time Span Voucher Countries Zones Stores Currencies Nested Rules Products Categories","tags":"","url":"User_Documentation\/Price_Rules\/Product_Price_Rules.html"},{"title":"Specific Price Rules","text":"CoreShop Specific Price Rules Documentation Specific price rules in CoreShop provide a flexible way to create targeted discounts and special pricing for products in your e-commerce store built on the Pimcore platform. These rules apply directly to individual products or variants and can be based on customer groups, currencies, or countries. This documentation will guide you through creating and managing specific price rules in CoreShop. Available Actions Price Discount Price Discount Amount Discount Percent Available Conditions Customers Customer Groups Time Span Countries Zones Stores Currencies Nested Rules","tags":"","url":"User_Documentation\/Price_Rules\/Specific_Price_Rules.html"},{"title":"Quantity Price Rules","text":"CoreShop Quantity Price Rules Documentation CoreShop Quantity Price Rules provide a flexible way to offer volume-based discounts for products in your e-commerce store built on the Pimcore platform. These rules apply to specific products and offer tiered pricing depending on the quantity purchased. This documentation will guide you through creating and managing quantity price rules in CoreShop. Available Conditions Customers Customer Groups Time Span Countries Zones Stores Currencies Nested Rules","tags":"","url":"User_Documentation\/Price_Rules\/Quantity_Price_Rules.html"},{"title":"Vouchers","text":"CoreShop Vouchers Info: In CoreShop Vouchers are Price Rules too. To use or generate Vouchers you need to add a Cart Price Rule. How to create Vouchers Simple create a new cart price rule and activate "Is Voucher Rule". With that, the "Voucher Codes" tab gets enabled. Voucher Condition If you need more control about handling Vouchers you need to add the "Voucher" Condition: Name Description Max. Usage per Code Define how often a voucher code can be used. Allow only one Voucher per Code If checked, only one Voucher per Cart is allowed. Voucher Codes Within the "Voucher Codes" tab you're able to manage codes for the current price rule. It's also possible to export generated codes to csv file. If you need more globally statistics about vouchers please use the voucher report. Name Description Code Generated voucher code Creation Date Voucher creation date Used If the Voucher has been used you'll see a true statement Uses Amount of uses per code Action It's possible to delete voucher codes as long they're not in use Create Voucher Code There are two ways to generate Codes: Single Voucher Code Create a single voucher code. The input field allows any string input, however if you already have added a code with the same string, you'll get a unique error message. Voucher Codes Generator This is the more advanced option to generate voucher codes: Name Description Amount Define how many voucher codes should be generated Length Define the Voucher Code Length Format Voucher Format. Possible Values: Alphanumeric, Alphabetic, Numeric Prefix Define a prefix for each code. For example SHOP- Suffix Define a suffix for each code. For example -SHOP Hyphens all X characters Add a Dash (-) after every X character","tags":"","url":"User_Documentation\/Price_Rules\/Vouchers.html"},{"title":"Actions","text":"CoreShop Price Rule Actions Get a brief overview of all the available Price Rule Actions in CoreShop. Free Shipping Available for: Cart Price Rules Add this action to allow free shipping. Gift Product Available for: Cart Price Rules Add this action to place a gift in customers cart. Options Name Description Gift Product Needs to be a coreshop registered product object Discount Amount Available for: Cart Price Rules, Specific Product Price, Product Price Set a arbitrary amount of discount. Options Name Description Amount Define Amount Gross If given Amount has included VAT, check it Currency Set Currency of given amount Apply On Select Between total and subtotal. Note: This option is only available in the cart rule context Discount Percent Available for: Cart Price Rules, Specific Product Price, Product Price Set a arbitrary percentage amount of discount. Options Name Description Percent Define Amount Apply On Select Between total and subtotal. Note: This option is only available in the cart rule context New Price Available for: Specific Product Price, Product Price Define a new Price. Note: This will be used as a new price in frontend so there is no "special discount price" labelling. If you need a highlighted discount price, use the Discount Price Action. Options Name Description Price Set new Price Currency Set Currency of given amount Discount Price Available for: Specific Product Price, Product Price Define a discount Price. Options Name Description Price Set discount Price Currency Set Currency of given amount","tags":"","url":"User_Documentation\/Price_Rules\/Actions.html"},{"title":"Conditions","text":"CoreShop Price Rules Conditions Get a brief overview of all the available Price Rule Conditions in CoreShop. Customers Available for: Cart Price Rules, Specific Product Prices, Product Price Define one ore more customers to whom the price rule should get applied. Options Name Description Customers One ore multiple CoreShop Customer Objects Customer Groups Available for: Cart Price Rules, Specific Product Prices, Product Price Define one ore more customer groups to whom the price rule should get applied. Options Name Description Groups One ore multiple CoreShop Customer Group Objects Time Span Available for: Cart Price Rules, Specific Product Prices, Product Price Define a time span in which range the price rule is valid Options Name Description Date From Date\/Time Start Date To Date\/Time End Voucher Available for: Cart Price Rules Define some Voucher Conditions. Check out the Voucher Section to learn more about Voucher Configuration. Options Name Description Max. Usage per Code Define how often a voucher code can be used. Allow only one Voucher per Code If checked, only one Voucher per Cart is allowed. Amount Available for: Cart Price Rules Define a Price range within the price rule should get applied. Options Name Description Min Amount The min amount of cart Max Amount The max amount of cart Countries Available for: Cart Price Rules, Specific Product Prices, Product Price Bind a specific country to the price rule. Important: This Condition is connected with the Country Context Resolver. This Condition does not implies to use the Users current location since the Resolver could be also store related. Options Name Description Countries Select one or multiple Countries Zones Available for: Cart Price Rules, Specific Product Prices, Product Price Bind a specific zone to the price rule. Important: This Condition is connected with the Country Context Resolver. This Condition does not implies to use the Users current location since the Resolver could be also store related. Options Name Description Zones Select one or multiple Zones Stores Available for: Cart Price Rules, Specific Product Prices, Product Price Bind a specific store to the price rule. Options Name Description Stores Select one or multiple Stores Currencies Available for: Cart Price Rules, Specific Product Prices, Product Price Define which currencies are valid to apply the price rule Options Name Description Currencies Select one or multiple Currencies Carriers Available for: Cart Price Rules Define which carriers are valid to apply the price rule Options Name Description Carriers Select one or multiple Carriers Nested Rules Available for: Cart Price Rules, Specific Product Prices, Product Price Build complex AND, OR and NOT nested conditions. Within a nested rules it's possible to add any other condition again. Options Name Description Operator AND, OR and NOT Products Available for: Cart Price Rules, Product Price Apply rule only if given products are available. Options Name Description Products One ore multiple CoreShop Product Objects Categories Available for: Cart Price Rules, Product Price Apply rule only if products linked with given categories are available. Options Name Description Categories One ore multiple CoreShop Category Objects","tags":"","url":"User_Documentation\/Price_Rules\/Conditions.html"},{"title":"Localization","text":"CoreShop Localization Countries States Zones Currencies Taxes TaxRules","tags":"","url":"User_Documentation\/Localization\/index.html"},{"title":"Countries","text":"CoreShop Country A Country consists of following values: Name ISO-Code Active: Determines if customers from this country are able to purchase from your store Use Store default Currency: If checked, your stores default currency will be applied to the country Currency Zone Stores: Determines for which Stores this Country is available.","tags":"","url":"User_Documentation\/Localization\/Countries.html"},{"title":"States","text":"CoreShop State A State\/County consists of following values: Name Iso Code Active Country","tags":"","url":"User_Documentation\/Localization\/States.html"},{"title":"Zones","text":"CoreShop Zone A Country consists of following values: Name Active Zones are basically just a group of countries and can be used for Price Rules and Shipping Rules.","tags":"","url":"User_Documentation\/Localization\/Zones.html"},{"title":"Currencies","text":"CoreShop Currencies A Currency consists of following values: Name ISO Code Numeric ISO Code Symbol Exchange Rate: Is used to convert between different currencies If you are going to use Currency conversion, you need to update exchange ranges regularly. Automated Exchange Rates CoreShop supports mulitple providers to get exchange ranges from. Currently supported: CentralBankOfRepulicTurkey EuropeanCentralBank GoogleFinance NationalBankOfRomania YahooFinance WebserviceX To activate this feature, enable it within CoreShop Settings and choose your provider.","tags":"","url":"User_Documentation\/Localization\/Currencies.html"},{"title":"Taxes","text":"CoreShop Taxes A Tax Rate consists of following values: Localized Name: This name can also be seen in the cart or on invoices Rate: Tax Rate, for example 20% Active Taxes are going to be used in Tax Rules.","tags":"","url":"User_Documentation\/Localization\/Taxes.html"},{"title":"TaxRules","text":"CoreShop Tax Rules Tax Rules determine which Tax Rate should be used for the customers country\/state. This Tax Rule is then applied to a product. A Tax Rule consists of following values: Name Active Stores: In which Stores this Tax-Rule can be used. Rules: Which Country and\/or State should use which Tax Rate and what should happen when multiple Tax Rates apply.","tags":"","url":"User_Documentation\/Localization\/TaxRules.html"},{"title":"Shipping","text":"CoreShop Shipping CoreShop provides a comprehensive shipping management system that allows you to define and configure various aspects of shipping, such as carriers, shipping rules, and carrier services. Carriers Shipping Rules","tags":"","url":"User_Documentation\/Shipping\/index.html"},{"title":"Carriers","text":"CoreShop Carriers Documentation CoreShop Carriers are an essential part of the shipping process in the CoreShop e-commerce framework, built on the Pimcore platform. Carriers represent shipping providers (e.g., UPS, FedEx, or DHL) and are responsible for delivering orders to customers. This documentation will guide you through the process of creating and managing carriers in CoreShop. Creating a Carrier To create a carrier, follow these steps: Log in to the CoreShop admin interface. Navigate to the "Shipping" tab and click on "Carriers." Click the "Add new" button to create a new carrier. Enter a name for the carrier and configure the other available options as needed. Carrier Options When creating a carrier, you can configure various options to customize its behavior: Name: A descriptive name for the carrier (e.g., UPS, FedEx, or DHL). Tracking Url: A string value that indicates the tracking url Tax Rule Group: The tax rule group applied to shipping costs for this carrier. If you want to apply taxes to shipping costs, you'll need to create a tax rule group and assign it to the carrier. Shipping Rules: The shipping rules associated with this carrier. Shipping rules define shipping costs based on various conditions such as weight, price, dimensions, and destination. You can assign multiple shipping rules to a carrier, and the system will evaluate them in order of priority to determine the final shipping cost. Summary CoreShop Carriers provide a robust way to manage shipping providers and their associated services. By creating carriers and configuring their options, you can offer customers a range of shipping choices based on factors such as delivery time and cost. Combined with shipping rules, carriers give you the flexibility to create a tailored shipping experience for your e-commerce store.","tags":"","url":"User_Documentation\/Shipping\/Carriers.html"},{"title":"Shipping Rules","text":"CoreShop Shipping Rules Documentation CoreShop Shipping Rules is a powerful feature within the CoreShop e-commerce framework built on the Pimcore platform. It allows you to create flexible and customizable shipping rules that define shipping costs based on various conditions such as weight, price, dimensions, and shipping destination. Overview Shipping rules in CoreShop can be composed of conditions and actions. Conditions determine whether a rule should be applied, while actions define the changes to the shipping costs. CoreShop provides a user-friendly interface for creating and managing shipping rules. You can create multiple rules, each with different conditions and actions, to cover various scenarios. Creating Shipping Rules Navigate to the "Shipping" tab and click on "Shipping Rules." Click the "Add new" button to create a new shipping rule. Enter a name for the rule and configure the other available options as needed. Configuring Conditions Conditions determine whether the shipping rule should be applied to an order. You can create multiple conditions for a single rule, and all conditions must be met for the rule to be applied. CoreShop offers several types of conditions, including: Weight: Based on the total weight of the order. Price: Based on the total price of the order. Dimension: Based on the dimensions (length, width, and height) of the order. Quantity: Based on the total quantity of items in the order. Countries: Based on the shipping destination country. Zones: Based on the shipping destination zone (a group of countries). To add a condition to your shipping rule: Click the "Add Condition" button in the "Conditions" section of the shipping rule. Choose the desired condition type from the dropdown menu. Configure the condition parameters as needed. For example, if you want to apply a shipping rule only to orders with a total weight of over 10kg, you would add a weight condition and set the minimum weight to 10kg. Configuring Actions Actions define the changes to the shipping costs when a rule is applied. You can create multiple actions for a single rule. CoreShop offers several types of actions, including: Discount Amount: Apply a fixed discount amount to the shipping cost. Discount Percentage: Apply a percentage discount to the shipping cost. Add Amount: Add a fixed amount to the shipping cost. Add Percentage: Add a percentage amount to the shipping cost. To add an action to your shipping rule: Click the "Add Action" button in the "Actions" section of the shipping rule. Choose the desired action type from the dropdown menu. Configure the action parameters as needed. For example, if you want to apply a 20% discount to the shipping cost when the rule is applied, you would add a discount percentage action and set the percentage value to 20. Summary CoreShop Shipping Rules offer a powerful and flexible way to define and manage shipping costs for your e-commerce store. By creating various conditions and actions, you can customize shipping costs based on factors such as weight, price, dimensions, and destination. This allows you to cater to different customer needs and provide more accurate shipping estimates.","tags":"","url":"User_Documentation\/Shipping\/Shipping_Rules.html"},{"title":"Cart","text":"CoreShop Cart Inventory Change If a customer adds a item to the cart CoreShop will check if product stock is sufficient. If not, a form error will show up. Disable \/ Delete Products If a product gets disabled or deleted in backend CoreShop will automatically remove this product from all active carts. A form error will notify every customer in frontend if the cart has been modified. Abandoned Carts No cart gets deleted by default. This allows you to: check abandoned cart statistics build your own business logic in case you want to inform customers within a follow-up email for example There is a expire cart command to remove abandoned carts, please checkout the development section.","tags":"","url":"User_Documentation\/Cart\/index.html"},{"title":"Order","text":"CoreShop Order Orders Order Detail Order Workflow Order Comments","tags":"","url":"User_Documentation\/Order\/index.html"},{"title":"Orders","text":"CoreShop Orders Grid View The default order list is based on the pimcore grid view. CoreShop comes with a default column configuration: On the right side, click "Column configuration" and select "Order Overview". Now click that button again and select "Set as favorite". Filters in Grid View It's possible to add custom filter definitions based on your project. This has to be done via a php service. Read more about it here. Apply Actions in Grid View It's possible to apply custom bulk actions for selected orders. This has to be done via a php service. Read more about it here.","tags":"","url":"User_Documentation\/Order\/Orders.html"},{"title":"Order Detail","text":"Order Detail State \/ Price Overview Please read more about the order workflow process here Besides some useful information about the order store and the total order amount, there're also several order states: State This is the main state and represents the summary of all order states. Name Description new New order has been placed. confirmed New order has been successfully created (after a offline order or a customer returns from payment gateway regardless of its state). cancelled Order has been cancelled. complete Order is complete. Payment State Global payment states per order and represents the summary of all order payments: Name Description new New payment has been created. awaiting_payment Waiting for payment: User is on payment offsite or payment is offline. partially_paid Some order payments have been paid. paid All payments have been paid. cancelled Order is complete. partially_refunded Some order payments have been refunded. refunded All payments have been refunded. Shipment State Global shipment states per order and represents the summary of all order shipments: Name Description new New shipment has been placed. cancelled Shipment has been cancelled partially_shipped Some order items have been shipped. shipped All items have been shipped. Invoice State Global invoice states per order and represents the summary of all order invoices: Name Description new New invoice has been created. cancelled Invoice has been cancelled partially_invoiced Some invoices have been invoiced. invoiced All invoices have been invoiced. Carrier\/Payment Provider Info Currency of Order Overall weight of Order Items Carrier Total Amount Order History The Order History shows you when specific states have been changed. Payments -- Shipments -- Invoices -- Mail Correspondence -- Customer -- Comments -- Additional Data -- Products --","tags":"","url":"User_Documentation\/Order\/Order_Detail.html"},{"title":"Order Workflow","text":"Order Workflow Technical Overview of CoreShop Workflows. Change States States can be changed for: Order, Payment, Shipment and Invoice. If any transition is available, you'll find a colored state button. Click on that button to change the state. Order Completion In CoreShop a order is complete after the order payment reaches the paid state and order shipment reaches the shipped state. If you also want to include the order invoice state invoiced before a order gets completed, you need to enable a configuration flag: ## app\/config\/config.yml parameters: coreshop.workflow.include_invoice_state_to_complete_order: true Order Cancellation In CoreShop a order rarely gets cancelled. Some reasons are: Front-End Revise After a customer has cancelled his payment he will reach a so called revise page. From there he's able to reselect a payment gateway to start over. In revise mode, however, it's possible to cancel the order and restore the cart. Only than the order gets cancelled. Back-End Revise In CoreShop it's possible to create orders in Back-End. Instead of adding sensitive payment information, you're able to provide a revise link to your customer which then works the same as the Front-End revise process (except that your customer is not able to restore a cart since there never was one). Please read more about the canceling process here Payment Workflow Create a Payment Just use the green bottom on the right top corner to add a new shipment. A payment creation normally gets created by a frontend payment gateway. This gateway also handles all the payment state changes. Workflow Rules A payment reaches the new state after its creation. A payment can be canceled as long it's in the new or processing state. After a payment reaches completed state it only can get refunded. Attention: The Refund process is not implemented yet in Coreshop! Shipment Workflow Create a Shipment Just use the green bottom on the right top corner to add a new shipment. If there are enough shippable items you can create a shipment. Workflow Rules A shipment reaches the ready state (triggered by a create transition) after its creation. A shipment can be canceled as long it's in the ready state After you provoked the ship state a shipment can't be cancelled anymore. Invoice Workflow Create Invoice Just use the green bottom on the right top corner to add a new invoice. If there are enough invoiceable items you can create a invoice. Workflow Rules A invoice reaches the ready state (triggered by a create transition) after its creation. A invoice can be canceled as long it's in the ready state. Please note: Cancelling an invoice is not a refund action. You're allowed to create another invoice after cancelling the previous one. After you provoked the complete state a invoice can't be cancelled anymore which means the invoice has been finally captured. After that you need to go on with a refund process Attention: The Refund process is not implemented yet in Coreshop!","tags":"","url":"User_Documentation\/Order\/Order_Workflow.html"},{"title":"Order Comments","text":"Order Comments CoreShop provides a simple comment interface which allows you to add simple notes to every order. It's also possible to send the order comment to the customer. Just check "Submit Comment to Customer". Note: You need a valid Notification Rule to send comments to user.","tags":"","url":"User_Documentation\/Order\/Order_Comments.html"},{"title":"Catalog","text":"CoreShop Catalog Products Product Variants Categories","tags":"","url":"User_Documentation\/Catalog\/index.html"},{"title":"Products","text":"CoreShop Products Documentation Products are the core of any e-commerce store built on the Pimcore platform. CoreShop provides a flexible and feature-rich system for managing products, including product variants, attributes, images, and more.","tags":"","url":"User_Documentation\/Catalog\/Products.html"},{"title":"Product Variants","text":"Product Variants CoreShop has the Variant Bundle to handle Variants, see here.","tags":"","url":"User_Documentation\/Catalog\/Product_Variants.html"},{"title":"Categories","text":"CoreShop Categories Documentation Categories in CoreShop provide a way to organize and structure the products in your e-commerce store built on the Pimcore platform. Using categories, you can create a hierarchical navigation system that allows customers to browse and find products easily.","tags":"","url":"User_Documentation\/Catalog\/Categories.html"},{"title":"Geo IP","text":"CoreShop can use GeoIP to locate visitors countries using IP-Addresses. CoreShop uses the already existing Pimcore GeoIP Database located in: \/var\/config\/GeoLite2-City.mmdb","tags":"","url":"User_Documentation\/Geo_IP.html"},{"title":"Inventory","text":"CoreShop Inventory The Inventory is a complex topic since there is a lot of business logic you need to know about. Product Inventory Every Product object comes with a "Stock" Tab. Let's have a look about the configuration: Name Description Is Tracked Define if a product should get tracked On Hand Amount of available products. On Hold Defines how many elements are currently locked. Do not change that value unless you know what you're doing. Is Tracked If you want to enable the inventory feature for a product, you need to check this setting. After that this product is not orderable in frontend if stock is insufficient. Note: Only if you enable "Is Tracked" the inventory stock is active! Otherwise the product is always available regardless of it's stock amount. On Hand Define a available amount for each product. With every successfully order, an arbitrary amount will be subtracted. On Hold This one needs some further explanation: After the checkout is complete, all ordered items will be removed from "On Hand" and get moved to "On Hold" until the payment is complete: If the unpaid order gets cancelled, the reserved "On Hold" amount gets back to "On Hand". If the order payment status switches to paid, the reserved "On Hold" amount gets subtracted. Cart \/ Checkout If a product stock gets insufficient during a customers checkout, the product gets removed from customers cart following by a form error.","tags":"","url":"User_Documentation\/Inventory\/index.html"},{"title":"Reports","text":"CoreShop Reports Sales Cart\/Order Conversion Abandoned Carts Products Categories Customers Carrier Distribution Payment Distribution Vouchers","tags":"","url":"User_Documentation\/Reports\/index.html"},{"title":"Sales","text":"CoreShop Sales Report Type Has Pagination Cartesian Chart No Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Group By Group Filter by Day, Month, Year Available Chart Fields Name Description Y Amount (Sales) X Date","tags":"","url":"User_Documentation\/Reports\/Sales.html"},{"title":"Carts","text":"CoreShop Cart\/Order Conversion Report Type Has Pagination Cartesian Chart No Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Chart Fields Name Description Y Amount (Cart, Order) X Date","tags":"","url":"User_Documentation\/Reports\/Carts.html"},{"title":"Abandoned Carts","text":"CoreShop Abandoned Carts Report Type Has Pagination List Yes Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Grid Fields Name Description Customer Name Customer name (if available) Email Customer Email (if available) Selected Payment Name of selected Payment Creation Date Creation Date Modification Date Modification Date Items in Cart Amount of Items in Cart Action Open Cart Object","tags":"","url":"User_Documentation\/Reports\/Abandoned_Carts.html"},{"title":"Products","text":"CoreShop Products Report Type Has Pagination List Yes Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Product Types Group Filter by Main Products, Variants, Container Products Product Types Name Description Main Products Only show Products without Variant inclusion Variants Only show Variant Product Types Container Products Show Sum of Products and Child-Products. Note: Container Products are bounded to the original pimcore objects. The products will be ignored in this report, if those main-objects have been deleted! Available Grid Fields Name Description Name Product Name Order Count Amount of Order Quantity Quantity Sale Price Sale Price Sales Amount of Sales Profit Amount of Profit","tags":"","url":"User_Documentation\/Reports\/Products.html"},{"title":"Categories","text":"CoreShop Categories Report Type Has Pagination List No Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Grid Fields Name Description Name Product Name Order Count Amount of Orders Quantity Quantity Sales Sales Profit Profit","tags":"","url":"User_Documentation\/Reports\/Categories.html"},{"title":"Customers","text":"CoreShop Customers Report Type Has Pagination List No Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Grid Fields Name Description Name Customer Name Order Count Amount of Orders Sales Sales","tags":"","url":"User_Documentation\/Reports\/Customers.html"},{"title":"Carrier Distribution","text":"CoreShop Carrier Distribution Report Type Has Pagination Pie Chart No Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Chart Fields Carrier Distribution","tags":"","url":"User_Documentation\/Reports\/Carrier_Distribution.html"},{"title":"Payment Distribution","text":"CoreShop Payment Distribution Report Type Has Pagination Pie Chart No Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Chart Fields Payment Provider Distribution","tags":"","url":"User_Documentation\/Reports\/Payment_Distribution.html"},{"title":"Vouchers","text":"CoreShop Voucher Report Type Has Pagination List Yes Available Filters Name Description Store Filter by Store Day Shortcut Filter by current Day Month Shortcut Filter by current Month Year Shortcut Filter by current Year Day -1 Shortcut Filter by last Day Month -1 Shortcut Filter by last Month Year -1 Shortcut Filter by last Year From Date to Start Filter To Date to End Filter Available Grid Fields Name Description Code Applied Code Discount Amount of Discount Price Rule Name of applied Price Rule Applied Date Applied Date","tags":"","url":"User_Documentation\/Reports\/Vouchers.html"},{"title":"Automation","text":"CoreShop Automation In CoreShop there are several automation mechanism implemented. Order Cancellation Execution Time: Once per day via maintenance job CoreShop will automatically cancel orders older than 20 days. Change Orders Expiration Date core_shop_order: expiration: order: days: 30 Expired Carts Execution Time: Once per day via maintenance job Note: By default, this feature is disabled. By default, this feature is disabled (days = 0) so no carts will be removed by default. If you want to remove older carts, just enable it via configuration: Change Cart Expiration Date core_shop_order: expiration: cart: days: 20 anonymous: true customer: true Expired Rules Execution Time: Once per day via maintenance job If you're having a lot of active rules in your system, you may want to disable them via automation. CoreShop already comes with a time-span check, which means all rules with time-span elements will be disabled if they're outdated. If you want do implement some further availability logic, you could use the coreshop.rule.availability_check Event to define the availability of the rule. Just use the setAvailability() method to override the system availability suggestion.","tags":"","url":"User_Documentation\/Automation\/index.html"},{"title":"Development","text":"CoreShop The Developer\u2019s guide to leveraging the flexibility of CoreShop. Here you will find all the concepts used in CoreShop. Introduction CoreShop Resources CoreShop uses Doctrine ORM for Custom Resources. ORM enables us great flexibility and extendability for simple models like Currencies and Countries. CoreShop currently implements these Resources as ORM Model: Currency Country and State Tax Rate and Tax Rules Price Rules Carrier Shipping Rules Index and Filter Configuration Notification Rule Configuration Stores Payments Everytime something is called a Resource, we talk about ORM Models. CoreShop Pimcore Models CoreShop also takes advantage of Pimcores flexible data-model. Objects that are heavily used and changed are implemented using Data Objects: Product Product Category Manufacturer Cart Order Order Invoice Order Shipment Quote Customer Customer Group Addresses Everytime we talk about Objects, we talk about Pimcore Data Objects.","tags":"","url":"Development\/index.html"},{"title":"Extend CoreShop Resources","text":"Extend CoreShop Resources All models in Coreshop are placed in the Coreshop\\Component\\*ComponentName*\\Model namespaces alongside with their interfaces. Many models in CoreShop are extended in the Core component. If the model you are willing to override exists in the Core you should be extending the Core one, not the base model from the component. How to Customize a Model First things first: If you want to extend coreshop models your Bundle must extend the AbstractResourceBundle. Next you have set your supported drivers. Just add the following lines of code to your bundle class: public function getSupportedDrivers(); array { return [ CoreShopResourceBundle::DRIVER_DOCTRINE_ORM ]; } After that have to tell the bundle where your models are. For that, add the override the following method in your bundle class and return the model namespace. Here is an example for the AppBundle protected function getModelNamespace(): string { return "AppBundle\\Model"; } Here a quick overview for you which dictories are important for you, when customizing CoreShop models. Folder Description AcmeBundle\/Model or AcmeBundle\/Entity Where your models are living AcmeBundle\/config\/doctrine\/model Put your doctrine .yml config files in here AcmeBundle\/config\/serializer The serializer configs for the models Let\u2019s take the CoreShop\\Component\\Currency\\Model\\Currency as an example. This one is extended in Core. How can you check that? First of all, you need to find the current used class by doing following: $ php bin\/console debug:container --parameter=coreshop.model.currency.class As a result you will get the CoreShop\\Component\\Core\\Model\\Currency - this is the class that you need to be extending. Assuming you want to add a field called flag 1. The first thing to do is to write your own class which will extend the base Currency class <?php namespace AppBundle\\Entity; use CoreShop\\Component\\Core\\Model\\Currency as BaseCurrency; class Currency extends BaseCurrency { \/** * @var bool *\/ private $flag; \/** * @return bool *\/ public function getFlag() { return $this->flag; } \/** * @param bool $flag *\/ public function setFlag($flag) { $this->flag = $flag; } } 2. Next define your entity\u2019s mapping. The file should be placed in AppBundle\/Resources\/config\/doctrine\/Currency.orm.yml AppBundle\\Entity\\Currency: type: mappedSuperclass table: coreshop_currency fields: flag: type: boolean nullable: true 3. Finally you\u2019ll need to override the model\u2019s class in the app\/config\/config.yml. Under the core_shop_* where * is the name of the bundle of the model you are customizing, in our case it will be the CoreShopCurrencyBundle -> core_shop_currency. core_shop_currency: resources: currency: classes: model: AppBundle\\Entity\\Currency 4. Update the database. There are two ways to do it. via direct database schema update: $ php bin\/console doctrine:schema:update --force via migrations: Which we strongly recommend over updating the schema. $ php bin\/console doctrine:migrations:diff $ php bin\/console doctrine:migrations:migrate","tags":"","url":"Development\/Extending_Guide\/Extend_CoreShop_Resources.html"},{"title":"Extend CoreShop Forms","text":"Customizing Forms The forms in CoreShop are placed in the CoreShop\\Bundle\\*BundleName*\\Form\\Type namespaces and the extensions will be placed in AppBundle\\Form\\Extension. Why would you customize a Form? There are plenty of reasons to modify forms that have already been defined in CoreShop. Your business needs may sometimes slightly differ from our internal assumptions. You can: add completely new fields, modify existing fields, make them required, change their HTML class, change labels etc., remove fields that are not used. How to customize a CoreShop Resource Form? If you want to modify the form for the Store in your system there are a few steps that you should take. Assuming that you would like to (for example): Add a contactHours field, These will be the steps that you will have to take to achieve that: 1. If your are planning to add new fields remember that beforehand they need to be added on the model that the form type is based on. In case of our example if you need to have the contactHours on the model and the entity mapping for the Store resource. To get to know how to prepare that go there 2. Create a Form Extension. Your form has to extend a proper base class. How can you check that? For the StoreType run: $ php bin\/console debug:container coreshop.form.type.store As a result you will get the CoreShop\\Bundle\\StoreBundle\\Form\\Type\\StoreType - this is the class that you need to be extending. <?php namespace AppBundle\\Form\\Extension; use CoreShop\\Bundle\\StoreBundle\\Form\\Type\\StoreType; use Symfony\\Component\\Form\\AbstractTypeExtension; use Symfony\\Component\\Form\\Extension\\Core\\Type\\TextType; use Symfony\\Component\\Form\\FormBuilderInterface; final class StoreTypeExtension extends AbstractTypeExtension { public function buildForm(FormBuilderInterface $builder, array $options): void { \/\/ Adding new fields works just like in the parent form type. $builder->add('contactHours', TextType::class, [ 'required' => false ]); } public static function getExtendedTypes(): array { return [StoreType::class]; } } 3. After creating your class, register this extension as a service in the AppBundle\/Resources\/config\/services.yml: services: app.form.extension.type.customer_profile: class: AppBundle\\Form\\Extension\\StoreTypeExtension tags: - { name: form.type_extension, extended_type: CoreShop\\Bundle\\StoreBundle\\Form\\Type\\StoreType } In our case you will need to extend the ExtJs Form as well: src\/AppBundle\/Resources\/public\/pimcore\/js\/store.js. In ExtJs your new store file need to like like this: coreshop.store.item = Class.create(coreshop.store.item, { getFormPanel: function ($super) { var panel = $super(); panel.down("fieldset").add( [ { xtype: 'textfield', fieldLabel: 'Contact Hours', name: 'contactHours' } ] ); return this.formPanel; } }); And you need to configure it to be loaded as well: core_shop_store: pimcore_admin: js: custom_store: '\/bundles\/app\/pimcore\/js\/store.js'","tags":"","url":"Development\/Extending_Guide\/Extend_CoreShop_Forms.html"},{"title":"Extend CoreShop DataObjects","text":"Extending CoreShop CoreShop Data Objects (like CoreShopProduct or CoreShopOrder) can be changed directly within Pimcore. Replace CoreShop Object Classes with your own Classes CoreShop uses Pimcore Parameters to determine the Pimcore Object Class. To change it, simply add this to your config.yml core_shop_order: pimcore: order: classes: model: 'Pimcore\\Model\\DataObject\\MyOrderClass' install_file: '@AppBundle\/Resources\/install\/pimcore\/classes\/MyOrderClass.json' repository: AppBundle\\Repository\\OrderRepository factory: AppBundle\\Factory\\OrderFactory","tags":"","url":"Development\/Extending_Guide\/Extend_CoreShop_DataObjects.html"},{"title":"Extending Rule Actions","text":"Custom Price-Rule\/Shipping-Rule\/Notification-Rule Actions Adding Price-, Shipping- or Notification-Rule Actions is the same for all of these types. Their only difference is the tag you use and Interface you need to implement for them. Action Type Tag Interface Cart Price Rule coreshop.cart_price_rule.action CoreShop\\Component\\Order\\Cart\\Rule\\Action\\CartPriceRuleActionProcessorInterface Product Price Rule coreshop.product_price_rule.action CoreShop\\Component\\Product\\Rule\\Action\\ProductPriceActionProcessorInterface Product Specific Price coreshop.product_specific_price_rule.action CoreShop\\Component\\Product\\Rule\\Action\\ProductPriceActionProcessorInterface Shipping Rule coreshop.shipping_rule.action CoreShop\\Component\\Shipping\\Rule\\Action\\CarrierPriceActionProcessorInterface Notification Rule coreshop.notification_rule.action CoreShop\\Component\\Notification\\Rule\\Action\\NotificationRuleProcessorInterface Example Adding a new Action Now, lets add a new Action for Product Price Rules. To do so, we first need to create a new class and implement the interface listed in the table above. For Product Price Rules, we need to use CoreShop\\Component\\Product\\Rule\\Action\\ProductPriceActionProcessorInterface \/\/AppBundle\/CoreShop\/CustomAction.php namespace AppBundle\\CoreShop; final class CustomAction implements \\CoreShop\\Component\\Product\\Rule\\Action\\ProductPriceActionProcessorInterface { public function getPrice($subject, array $context, array $configuration): int { \/\/If your action gives the product a new Price, put your calculation here return $configuration['some_value']; } } We also need a FormType for the actions configurations: \/\/AppBundle\/Form\/Type\/CustomActionType.php namespace AppBundle\\Form\\Type; use Symfony\\Component\\Form\\AbstractType; use Symfony\\Component\\Form\\FormBuilderInterface; use Symfony\\Component\\Form\\Extension\\Core\\Type\\TextType; final class CustomActionType extends AbstractType { \/** * {@inheritdoc} *\/ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('some_value', TextType::class) ; } } With configuration, comes a Javascript file as well: \/\/AppBundle\/Resources\/public\/pimcore\/js\/custom_action.js pimcore.registerNS('coreshop.product.pricerule.actions.custom'); coreshop.product.pricerule.actions.custom = Class.create(coreshop.rules.actions.abstract, { type: 'custom', getForm: function () { var some_value = 0; var me = this; if (this.data) { some_value = this.data.some_value \/ 100; } var some_valueField = new Ext.form.NumberField({ fieldLabel: t('custom'), name: 'some_value', value: some_value, decimalPrecision: 2 }); this.form = new Ext.form.Panel({ items: [ some_valueField ] }); return this.form; } }); Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony structure, omit the web. bin\/console assets:install web Registering the Custom Action to the Container and load the Javascript File We now need to create our Service Definition for our Custom Action: app.product_price_rule.custom: class: AppBundle\\CoreShop\\CustomAction tags: - { name: coreshop.product_price_rule.action, type: custom, form-type: AppBundle\\Form\\Type\\CustomActionType } and add this to your config.yml: core_shop_product: pimcore_admin: js: custom_action: '\/bundles\/app\/pimcore\/js\/custom_action.js'","tags":"","url":"Development\/Extending_Guide\/Extending_Rule_Actions.html"},{"title":"Extending Rule Conditions","text":"Custom Price-Rule\/Shipping-Rule\/Notification-Rule Conditions Adding Price-, Shipping- or Notification-Rule Conditions is the same for all of these types. They're only difference is the tag you use and Interface you need to implement for them. Action Type Tag Interface\/AbstractClass Cart Price Rule coreshop.cart_price_rule.condition CoreShop\\Component\\Order\\Cart\\Rule\\Condition\\AbstractConditionChecker Product Price Rule coreshop.product_price_rule.condition CoreShop\\Component\\Rule\\Condition\\ConditionCheckerInterface Product Specific Price coreshop.product_specific_price_rule.condition CoreShop\\Component\\Rule\\Condition\\ConditionCheckerInterface Shipping Rule coreshop.shipping_rule.condition CoreShop\\Component\\Shipping\\Rule\\Condition\\CategoriesConditionChecker Notification Rule coreshop.notification_rule.condition CoreShop\\Component\\Notification\\Rule\\Condition\\AbstractConditionChecker Example Adding a new Condition Now, lets add a new Condition for Product Price Rules. To do so, we first need to create a new class and implement the interface listed in the table above. For Product Price Rules, we need to use CoreShop\\Component\\Rule\\Condition\\ConditionCheckerInterface \/\/AppBundle\/CoreShop\/CustomCondition.php namespace AppBundle\\CoreShop; use CoreShop\\Component\\Resource\\Model\\ResourceInterface; use CoreShop\\Component\\Rule\\Model\\RuleInterface; final class CustomCondition implements \\CoreShop\\Component\\Rule\\Condition\\ConditionCheckerInterface { public function isValid(ResourceInterface $subject, RuleInterface $rule, array $configuration, array $params = []): bool { \/\/return true if valid, false if not return true; } } We also need a FormType for the conditions configurations: \/\/AppBundle\/Form\/Type\/CustomConditionType.php namespace AppBundle\\Form\\Type; final class CustomConditionType extends AbstractType { \/** * {@inheritdoc} *\/ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('some_value', TextType::class) ; } } With configuration, comes a Javascript file as well: \/\/AppBundle\/Resources\/public\/pimcore\/js\/custom_condition.js pimcore.registerNS('coreshop.product.pricerule.conditions.custom'); coreshop.product.pricerule.conditions.custom = Class.create(coreshop.rules.conditions.abstract, { type: 'custom', getForm: function () { var some_value = 0; var me = this; if (this.data) { some_value = this.data.some_value \/ 100; } var some_valueField = new Ext.form.NumberField({ fieldLabel: t('custom'), name: 'some_value', value: some_value, decimalPrecision: 2 }); this.form = new Ext.form.Panel({ items: [ some_valueField ] }); return this.form; } }); Don't forget to run the following command afterwards to deploy it if needed. If you're using the latest symfony structure, omit the web. bin\/console assets:install web Registering the Custom Condition to the Container and load the Javascript File We now need to create our Service Definition for our Custom Condition: app.product_price_rule.custom_condition: class: AppBundle\\CoreShop\\CustomCondition tags: - { name: coreshop.product_price_rule.condition, type: custom, form-type: AppBundle\\Form\\Type\\CustomConditionType } and add this to your config.yml: core_shop_product: pimcore_admin: js: custom_condition: '\/bundles\/app\/pimcore\/js\/custom_condition.js'","tags":"","url":"Development\/Extending_Guide\/Extending_Rule_Conditions.html"},{"title":"Localization","text":"CoreShop Localization CoreShop provides you with a set of tools for better localization of your eCommerce. These tools exist of following parts: Currencies Countries States Zones Taxes","tags":"","url":"Development\/Localization\/index.html"},{"title":"Currencies","text":"CoreShop Currencies CoreShop is a multi-currency able eCommerce Framework. Therefore it is possible to create and use different currencies. Create, Update, Read, Delete Currency Context","tags":"","url":"Development\/Localization\/Currencies\/index.html"},{"title":"CRUD","text":"CoreShop Currencies Create If you want to create a Currency via API, you can do following: $newCurrency = $container->get('coreshop.factory.currency')->createNew(); Now you have a new Currency, if you want to persist it, you need to do following: $container->get('coreshop.manager.currency')->persist($newCurrency); $container->get('coreshop.manager.currency')->flush(); You now have a new persisted Currency. Read If you want to query for Currencies, you can do following: $currencyRepository = $container->get('coreshop.repository.currency'); $queryBuilder = $currencyRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $currencies = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Currency, you need to do following: \/\/ Fetch Currency $currency = $currencyRepository->findById(1); $currency->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.currency')->persist($currency); $container->get('coreshop.manager.currency')->flush(); Delete If you want to update and existing Currency, you need to do following: \/\/ Fetch Currency $currency = $currencyRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.currency')->remove($currency); $container->get('coreshop.manager.currency')->flush();","tags":"","url":"Development\/Localization\/Currencies\/CRUD.html"},{"title":"Context","text":"CoreShop Currency Context For CoreShop to determine the current currency it uses a concept called context and context resolver. Context Name Priority Tag Description FixedCurrencyContext default coreshop.context.currency Used for testing purposes StorageBasedCurrencyContext default coreshop.context.currency check if a currency has been changed during a frontend request CountryAwareCurrencyContext default coreshop.context.currency Mostly this context will apply since it will get the currency based on the current country context These Contexts take care about finding the correct currency for the current request. Create a Custom Resolver A Currency Context needs to implement the interface CoreShop\\Component\\Currency\\Context\\CurrencyContextInterface. This interface consists of one method called getCurrency which returns a CoreShop\\Component\\Currency\\Model\\CurrencyInterface or throws an CoreShop\\Component\\Currency\\Context\\CurrencyNotFoundException To register your context, you need to use the tag: coreshop.context.currency with an optional priority attribute.","tags":"","url":"Development\/Localization\/Currencies\/Context.html"},{"title":"Countries","text":"CoreShop Countries CoreShop is a multi-country able eCommerce Framework. Therefore it is possible to create and use different Countries. Create, Update, Read, Delete Country Context","tags":"","url":"Development\/Localization\/Countries\/index.html"},{"title":"CRUD","text":"CoreShop Countries Create If you want to create a Country via API, you can do following: $newCountry = $container->get('coreshop.factory.country')->createNew(); Now you have a new Country, if you want to persist it, you need to do following: $container->get('coreshop.manager.country')->persist($newCountry); $container->get('coreshop.manager.country')->flush(); You now have a new persisted Country. Read If you want to query for Countries, you can do following: $countryRepository = $container->get('coreshop.repository.country'); $queryBuilder = $countryRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $countries = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Country, you need to do following: \/\/ Fetch Country $country = $countryRepository->findById(1); $country->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.country')->persist($country); $container->get('coreshop.manager.country')->flush(); Delete If you want to update and existing Country, you need to do following: \/\/ Fetch Country $country = $countryRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.country')->remove($country); $container->get('coreshop.manager.country')->flush();","tags":"","url":"Development\/Localization\/Countries\/CRUD.html"},{"title":"Context","text":"CoreShop Country Context For CoreShop to determine the current country the visitor or customer comes from, it uses a concept called context and context resolver. Context Name Priority Tag Description FixedCountryContext default coreshop.context.country Used for testing purposes CountryContext default coreshop.context.country Check for a country within the country request resolver StoreAwareCountryContext default coreshop.context.country Check if current country is available in current store context Resolver Name Priority Tag Description GeoLiteBasedRequestResolver 10 coreshop.context.country.request_based.resolver This Resolver tries to determinate the users location by using the Geo Lite Database. These resolver takes care about finding the correct country for the current request. Create a Custom Resolver A Country Context needs to implement the interface CoreShop\\Component\\Address\\Context\\CountryContextInterface. This interface consists of one method called getCountry which returns a CoreShop\\Component\\Address\\Model\\CountryInterface or throws an CoreShop\\Component\\Address\\Context\\CountryNotFoundException. To register your context, you need to use the tag: coreshop.context.country with an optional priority attribute. Create a Request based Resolver CoreShop already implements Request based country context resolver. So if your Context depends on the current request, you can create a custom RequestBased Resolver. To do that, implement the interface CoreShop\\Component\\Address\\Context\\RequestBased\\RequestResolverInterface with the method findCountry. This method either returns a country or null. To register this resolver, use the tag: coreshop.context.country.request_based.resolver with an optional priority attribute. Example We want to a CountryContext to be based on the Pimcore Document. So if we are on site \/de, we want to resolve to Austria, if we are on page \/en we want to resolve to Country Great Britain: 1: First of all we need to create our RequestBased Country Context: <?php namespace AppBundle\\CoreShop\\Address\\Context; use CoreShop\\Component\\Address\\Context\\RequestBased\\RequestResolverInterface; use CoreShop\\Component\\Address\\Repository\\CountryRepositoryInterface; use Pimcore\\Http\\Request\\Resolver\\DocumentResolver; use Symfony\\Component\\HttpFoundation\\Request; final class DocumentBasedRequestRequestResolver implements RequestResolverInterface { \/** * @var DocumentResolver *\/ private $pimcoreDocumentResolver; \/** * @var CountryRepositoryInterface *\/ private $countryRepository; \/** * @param DocumentResolver $pimcoreDocumentResolver * @param CountryRepositoryInterface $countryRepository *\/ public function __construct(DocumentResolver $pimcoreDocumentResolver, CountryRepositoryInterface $countryRepository) { $this->pimcoreDocumentResolver = $pimcoreDocumentResolver; $this->countryRepository = $countryRepository; } public function findCountry(Request $request) { $doc = $this->pimcoreDocumentResolver->getDocument($request); if (substr($doc->getFullPath(), 0, 3) === '\/en') { return $this->countryRepository->findByCode('GB'); } if (substr($doc->getFullPath(), 0, 3) === '\/de') { return $this->countryRepository->findByCode('AT'); } return null; } } Now we need to configure the service in src\/AppBundle\/Resources\/config\/services.yml services: app.coreshop.country.context.request.document_based: class: AppBundle\\CoreShop\\Address\\Context\\DocumentBasedRequestRequestResolver arguments: - '@Pimcore\\Http\\Request\\Resolver\\DocumentResolver' - '@coreshop.repository.country' tags: - { name: coreshop.context.country.request_based.resolver } CoreShop now tries to resolve the current country based on the Pimcore Site we are on.","tags":"","url":"Development\/Localization\/Countries\/Context.html"},{"title":"States","text":"CoreShop States Create, Update, Read, Delete","tags":"","url":"Development\/Localization\/States\/index.html"},{"title":"CRUD","text":"States Create If you want to create a State via API, you can do following: $newState = $container->get('coreshop.factory.state')->createNew(); Now you have a new State, if you want to persist it, you need to do following: $container->get('coreshop.manager.state')->persist($newState); $container->get('coreshop.manager.state')->flush(); You now have a new persisted State. Read If you want to query for States, you can do following: $stateRepository = $container->get('coreshop.repository.state'); $queryBuilder = $stateRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $states = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing State, you need to do following: \/\/ Fetch State $state = $stateRepository->findById(1); $state->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.state')->persist($state); $container->get('coreshop.manager.state')->flush(); Delete If you want to update and existing State, you need to do following: \/\/ Fetch State $state = $stateRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.state')->remove($state); $container->get('coreshop.manager.state')->flush();","tags":"","url":"Development\/Localization\/States\/CRUD.html"},{"title":"Zones","text":"CoreShop Zones Create, Update, Read, Delete","tags":"","url":"Development\/Localization\/Zones\/index.html"},{"title":"CRUD","text":"Zones Create If you want to create a Zone via API, you can do following: $newZone = $container->get('coreshop.factory.zone')->createNew(); Now you have a new Zone, if you want to persist it, you need to do following: $container->get('coreshop.manager.zone')->persist($newZone); $container->get('coreshop.manager.zone')->flush(); You now have a new persisted Zone. Read If you want to query for Zones, you can do following: $zoneRepository = $container->get('coreshop.repository.zone'); $queryBuilder = $zoneRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $zones = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Zone, you need to do following: \/\/ Fetch Zone $zone = $zoneRepository->findById(1); $zone->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.zone')->persist($zone); $container->get('coreshop.manager.zone')->flush(); Delete If you want to update and existing Zone, you need to do following: \/\/ Fetch Zone $zone = $zoneRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.zone')->remove($zone); $container->get('coreshop.manager.zone')->flush();","tags":"","url":"Development\/Localization\/Zones\/CRUD.html"},{"title":"Taxes","text":"CoreShop Taxes Taxes are divided into Tax Rates and Tax Rules. Tax Rules are responsible for the real Tax Rate determination based on Country and State. Tax Rates Tax Rules","tags":"","url":"Development\/Localization\/Taxes\/index.html"},{"title":"Tax Rate","text":"CoreShop Tax Rate The Tax Rate only represents a single Tax Rate Number. For example: 20%. Create, Update, Read, Delete","tags":"","url":"Development\/Localization\/Taxes\/Tax_Rate\/index.html"},{"title":"CRUD","text":"Tax Rates Create If you want to create a Zone via API, you can do following: $newZone = $container->get('coreshop.factory.tax_rate')->createNew(); Now you have a new Zone, if you want to persist it, you need to do following: $container->get('coreshop.manager.tax_rate')->persist($newZone); $container->get('coreshop.manager.tax_rate')->flush(); You now have a new persisted Zone. Read If you want to query for Tax Rates, you can do following: $rateRepository = $container->get('coreshop.repository.tax_rate'); $queryBuilder = $rateRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $rates = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Zone, you need to do following: \/\/ Fetch Zone $rate = $rateRepository->findById(1); $rate->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.tax_rate')->persist($rate); $container->get('coreshop.manager.tax_rate')->flush(); Delete If you want to update and existing Zone, you need to do following: \/\/ Fetch Zone $rate = $rateRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.tax_rate')->remove($rate); $container->get('coreshop.manager.tax_rate')->flush();","tags":"","url":"Development\/Localization\/Taxes\/Tax_Rate\/CRUD.html"},{"title":"Tax Rule","text":"CoreShop Tax Rule The Tax Rule handles different Taxes based on Country and State. Create, Update, Read, Delete","tags":"","url":"Development\/Localization\/Taxes\/Tax_Rule\/index.html"},{"title":"CRUD","text":"Tax Rules Create If you want to create a Tax Rule via API, you can do following: $newTaxRule = $container->get('coreshop.factory.tax_rule')->createNew(); Now you have a new Tax Rule, if you want to persist it, you need to do following: $container->get('coreshop.manager.tax_rule')->persist($newTaxRule); $container->get('coreshop.manager.tax_rule')->flush(); You now have a new persisted Tax Rule. Read If you want to query for Tax Rules, you can do following: $ruleRepository = $container->get('coreshop.repository.tax_rule'); $queryBuilder = $ruleRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $rules = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Tax Rule, you need to do following: \/\/ Fetch Tax Rule $rule = $ruleRepository->findById(1); $rule->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.tax_rule')->persist($rule); $container->get('coreshop.manager.tax_rule')->flush(); Delete If you want to update and existing Tax Rule, you need to do following: \/\/ Fetch Tax Rule $rule = $ruleRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.tax_rule')->remove($rule); $container->get('coreshop.manager.tax_rule')->flush();","tags":"","url":"Development\/Localization\/Taxes\/Tax_Rule\/CRUD.html"},{"title":"Tax Factory","text":"","tags":"","url":"Development\/Localization\/Taxes\/Tax_Rule\/Tax_Factory.html"},{"title":"Products","text":"CoreShop Products This guide should lead you through how CoreShop handles Product information and how it does price calculations. Create, Read, Update, Delete Price Calculation Price Rules Configuration Multiple Product DataObjects Product Units Product Unit Definitions","tags":"","url":"Development\/Products\/index.html"},{"title":"CRUD","text":"CoreShop Product CoreShop uses Pimcore Data Objects to persist Product Information. But, it adds a little wrapper around it to be more dynamic and configurable. It uses a Factory and Repository Pattern to do that. Create If you want to create a new Product, we need to get our Factory Service for that: $productFactory = $container->get('coreshop.factory.product'); $product = $productFactory->createNew(); No we have our product and we can set all needed values. If you now want to save it, just call the save function $product->save(); Read To get products, you need to use the Repository Service CoreShop provides you. $repository = $container->get('coreshop.repository.product'); \/\/ Query by ID $productWithIdOne = $repository->findById(1); \/\/ Get a Listing how you know it from Pimcore $list = $repository->getList(); $list->setCondition("active = 1"); $products = $list->getObjects(); Update Update works the same as you are used to in Pimcore $repository = $container->get('coreshop.repository.product'); \/\/ Query by ID $productWithIdOne = $repository->findById(1); \/\/ Change values $productWithIdOne->setName('test'); $productWithIdOne->save(); Delete Delete works the same as you are used to in Pimcore $repository = $container->get('coreshop.repository.product'); \/\/ Query by ID $productWithIdOne = $repository->findById(1); $productWithIdOne->delete();","tags":"","url":"Development\/Products\/CRUD.html"},{"title":"Price Calculation","text":"CoreShop Product Price Calculation CoreShop uses multiple Price Calculators to determine the correct price for a product. Per default following Calculators are used Price Rule Calculator which uses Prices from Catalog Price Rules and Specific Price Rules Store Product Price Calculator These two are only the default implementations, if you need a custom Calculator, you need to implement the Interface CoreShop\\Component\\Product\\Calculator\\ProductPriceCalculatorInterface and register your service with the tag coreshop.product.price_calculator, a type attribute and a priority What prices does CoreShop calculate? CoreShop Price Calculation consists of 3 different prices: Retail Price: Base Price without any discounts Discount Price: Special Price for promotions. Needs to return a price smaller than retail price, otherwise retail price is valid Discount: Discount from promotions Price: Retail Price or Discount Price (if available) minus discount rules The default is always to use store values prices. Calculator Service If you want to calculate the Price for a Product, you need to use a special service to do that. There are two options: 1: coreshop.product.price_calculator which calculates prices without any tax regards. 2: coreshop.product.taxed_price_calculator which calculates prices with tax or without. (recommended one to use) Templating If you want to calculate the price within a Template, you can do so by using the filter coreshop_product_price {{ (product|coreshop_product_price(true)) }} Custom Price Calculator Example Our Example Service will take the Property "price" - 1 as Product Price and -1 as Discount, therefore the price stays the same. This example is only a show-case of how to add a new calculator. CoreShop Price calculation always depends on a context. The context per default consists of following values: Store Country Currency Customer (if logged in) Cart <?php namespace AppBundle\\CoreShop\\Product; use CoreShop\\Component\\Product\\Calculator\\ProductPriceCalculatorInterface; use CoreShop\\Component\\Product\\Model\\ProductInterface; final class CustomPriceCalculator implements ProductPriceCalculatorInterface { \/** * Used to determine a retail price *\/ public function getPrice(ProductInterface $subject, array $context, bool $withDiscount = true): int { $price = $this->getRetailPrice($subject, $context); return $withDiscount ? $this->getDiscount($subject, $price) : $price; } \/** * Used to determine a retail price *\/ public function getRetailPrice(ProductInterface $subject, array $context): int { return $subject->getStorePrice($context['store']); } \/** * Used to determine a discount *\/ public function getDiscount(ProductInterface $subject, array $context, int $price): int { return 0; } \/** * Used to determine a discounted price *\/ public function getDiscountPrice(ProductInterface $subject, array $context): int { return 0; } } Now we need to register our service to the container and add the calculator tag: app.coreshop.product.price_calculator.custom: class: AppBundle\\CoreShop\\Product\\CustomPriceCalculator tags: - { name: coreshop.product.price_calculator, type: custom, priority: 1 } CoreShop now uses our service for all Product Price Calculations.","tags":"","url":"Development\/Products\/Price_Calculation.html"},{"title":"Price Rules","text":"CoreShop Product Price Rules CoreShop gives you the ability of very complex price calculation methods. Price Rules always consist of Conditions and Actions. Price Rule Types Product Price Rules Checkout all available product price rules here Product price rules are applied to multiple products based on conditions like category or manufacturer. Specific Price Rules Checkout all available specific price rules here Specific price rules are applied to a single product based on conditions like customer or customer group. Quantity Price Rules Checkout all available quantity price rules here Quantity price rules are applied to a single product based on conditions like the quantity of a cart item. These rules apply only in the calculation of cart item prices. If you have only quantity rules configured, the default price calculation of CoreShop will return zero outside of cart context. Extending Conditions and Actions Click here to see how you can add custom Actions Click here to see how you can add custom Conditions Template Helper Get Formatted Price with all applied Rules {% import '@CoreShopFrontend\/Common\/Macro\/currency.html.twig' as currency %} {% import '@CoreShopFrontend\/Common\/Macro\/product_price.html.twig' as product_price %} <div class="price"> <span class="price-head">{{ 'coreshop.ui.price'|trans }}:<\/span> {{ product_price.display_product_price(product) }} <\/div> <div class="tax"> {{ 'coreshop_product_tax_inc'|trans|format(product|coreshop_product_tax_rate) }} ({{ currency.convertAndFormat(product|coreshop_product_tax_amount) }}) <\/div> Get Active Price Rules {{ dump(product|coreshop_product_price_rules) }}","tags":"","url":"Development\/Products\/Price_Rules\/index.html"},{"title":"Configuration","text":"CoreShop Product Configuration core_shop_product: pimcore: product: path: coreshop\/products classes: repository: CoreShop\\Bundle\\CoreBundle\\Pimcore\\Repository\\ProductRepository install_file: '@CoreShopCoreBundle\/Resources\/install\/pimcore\/classes\/CoreShopProductBundle\/CoreShopProduct.json' model: Pimcore\\Model\\DataObject\\CoreShopProduct interface: CoreShop\\Component\\Product\\Model\\ProductInterface factory: CoreShop\\Component\\Resource\\Factory\\PimcoreFactory type: object","tags":"","url":"Development\/Products\/Configuration.html"},{"title":"Multiple Product DataObjects","text":"CoreShop Multiple Product DataObjects CoreShop comes with one pre-installed Product Class (CoreShopProduct), which in most cases is enough. In some cases, you might want to use separated classes with different purposes. For example a ProductSet, which consists of multiple Products but also needs to be available for complex price calculations like Price Rules. First of all, we need to create a new DataObject Class in Pimcore. A basic Purchasable Product only needs to implement \\CoreShop\\Component\\Order\\Model\\PurchasableInterface but since we want to allow complex price calculation, we need to implement CoreShop\\Component\\Core\\Model\\ProductInterface. Note If your Product is very simple and you do not need complex price calculations you then only need to implement \\CoreShop\\Component\\Order\\Model\\PurchasableInterface Easiest way to create the new class is: 1: Open Pimcore DataObject Editor 2: Add a new Class called ProductSet 3: Import CoreShop Default Product Class (CoreShopProduct.json) 4: Adapt to your needs 5: Register your ProductSet Class to CoreShop: <?php \/\/src\/AppBundle\/DependencyInjection\/Configuration.php namespace AppBundle\\DependencyInjection; use CoreShop\\Bundle\\ProductBundle\\Pimcore\\Repository\\ProductRepository; use CoreShop\\Bundle\\ResourceBundle\\CoreShopResourceBundle; use CoreShop\\Component\\Product\\Model\\ProductInterface; use CoreShop\\Component\\Resource\\Factory\\PimcoreFactory; use Symfony\\Component\\Config\\Definition\\Builder\\ArrayNodeDefinition; use Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder; use Symfony\\Component\\Config\\Definition\\ConfigurationInterface; final class Configuration implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('app'); $rootNode ->children() ->scalarNode('driver')->defaultValue(CoreShopResourceBundle::DRIVER_DOCTRINE_ORM)->end() ->end() ; $this->addModelsSection($rootNode); return $treeBuilder; } \/\/Add your configuration here private function addModelsSection(ArrayNodeDefinition $node) { $node ->children() ->arrayNode('pimcore') ->addDefaultsIfNotSet() ->children() ->arrayNode('product_set') ->addDefaultsIfNotSet() ->children() ->variableNode('options')->end() ->scalarNode('path')->defaultValue('products')->end() ->arrayNode('classes') ->addDefaultsIfNotSet() ->children() ->scalarNode('model')->defaultValue('Pimcore\\Model\\DataObject\\ProductSet')->cannotBeEmpty()->end() ->scalarNode('interface')->defaultValue(ProductInterface::class)->cannotBeEmpty()->end() ->scalarNode('factory')->defaultValue(PimcoreFactory::class)->cannotBeEmpty()->end() ->scalarNode('repository')->defaultValue(ProductRepository::class)->cannotBeEmpty()->end() ->scalarNode('install_file')->defaultValue('@CoreShopProductBundle\/Resources\/install\/pimcore\/classes\/CoreShopProduct.json')->end() ->scalarNode('type')->defaultValue(CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT)->cannotBeOverwritten(true)->end() ->end() ->end() ->end() ->end() ->end() ->end() ->end() ; } } <?php \/\/src\/AppBundle\/DependencyInjection\/AppExtension.php namespace AppBundle\\DependencyInjection; use CoreShop\\Bundle\\ResourceBundle\\DependencyInjection\\Extension\\AbstractModelExtension; use Symfony\\Component\\Config\\FileLocator; use Symfony\\Component\\DependencyInjection\\ContainerBuilder; use Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader; class AppExtension extends AbstractModelExtension { public function load(array $config, ContainerBuilder $container) { $config = $this->processConfiguration($this->getConfiguration([], $container), $config); $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'\/..\/Resources\/config')); \/\/Register the model to the container $this->registerPimcoreModels('app', $config['pimcore'], $container); \/\/Alternative you can do it manually like: $this->registerPimcoreModels('app', [ 'product_set' => [ 'path' => '\/product-sets', 'classes' => [ 'model' => 'Pimcore\\Model\\DataObject\\ProductSet', 'interface' => ProductInterface::class, 'factory' => PimcoreFactory::class, 'type' => CoreShopResourceBundle::PIMCORE_MODEL_TYPE_OBJECT ] ] ], $container); $loader->load('services.yml'); } } 6: You can now use the new ObjectClass as you wish, CoreShop automatically recognises it as ProductClass and your are allowed to use it in PriceRules. Note: For the Class to be allowed as href\/multihref in Pimcore, you need to adapt following classes as well: CoreShopCartItem CoreShopOrderItem CoreShopQuoteItem Check for the product field and add your new ProductSet there as allowed references.","tags":"","url":"Development\/Products\/Multiple_Product_DataObjects.html"},{"title":"Units","text":"CoreShop Product Units Units for Products can be defined globally in the Pimcore Backend on CoreShopMenu > Product > Product Units. Each Product can have different units. Also each product\/unit relation can have an own precision that differs to other relations. To archive that, the relation between products and units consists of three objects: ProductUnit ProductUnitDefinition ProductUnitDefinitions As already said, the ProductUnit can be created in Pimcore Backend and consists mainly of the key for unit like PCS, CNT etc. and some localized fields for rendering in frontend. To connect a ProductUnit to a CoreShopProduct in Backend you need to get the ProductUnit via repository and create a ProductUnitDefinition. use CoreShop\\Component\\Product\\Model\\Product; use CoreShop\\Component\\Product\\Model\\ProductUnitInterface; use CoreShop\\Component\\Product\\Model\\ProductUnitDefinition; $product = Product::getById(1); \/** @var ProductUnitInterface $unit *\/ $unit = $this->unitRepository->findOneBy(['name' => '']); $unitDefinition = new ProductUnitDefinition(); $unitDefinition->setConversionRate(1.0); \/\/ optional $unitDefinition->setPrecision(0); \/\/ optional $unitDefinition->setUnit($unit); $product->getUnitDefinitions()->setDefaultUnitDefinition($unitDefinition); $product->save(); To add multiple units for a product use $product->addUnitDefinition($unitDefinition). To change a unit override the default one $product->getUnitDefinitions()->getDefaultUnitDefinition()->setUnit($otherUnit).","tags":"","url":"Development\/Products\/Units.html"},{"title":"Unit Definitions","text":"CoreShop Product Unit Definitions CoreShop has a great new feature for product units. E.g. you can sell items "per meter" etc. First, add some product units in Pimcore > CoreShop > Product > Product Units. Click "Add" and fill all the fields. Then you can add product-units directly in the product-objects inside Pimcore (take a look at the "Price"-tab). There, you can also add multiple product units (eg: 1 box contains of 12 items - CoreShop will show you different order-possibilities in the add-to-cart section in the webshop) Using the API for product units: Create Default UnitDefinition If you want to create a new Product, we need to get our Factory Service for that: \/** @var DataObject\\CoreShopProduct $product *\/ $product = DataObject::getById(1); $unitRepository = $container->get('coreshop.repository.product_unit'); \/** @var ProductUnitDefinitionInterface $defaultUnitDefinition *\/ $defaultUnitDefinition = $container->get('coreshop.factory.product_unit_definition')->createNew(); $defaultUnitDefinition->setUnit($unitRepository->findByName('Kubikmeter')); \/** @var ProductUnitDefinitionsInterface $unitDefinitions *\/ $unitDefinitions = $container->get('coreshop.factory.product_unit_definitions')->createNew(); $unitDefinitions->setDefaultUnitDefinition($defaultUnitDefinition); $unitDefinitions->setProduct($product); $product->setUnitDefinitions($unitDefinitions); $product->save(); Update Default UnitDefinition \/** @var DataObject\\CoreShopProduct $product *\/ $product = DataObject::getById(1); $unitRepository = $container->get('coreshop.repository.product_unit'); $defaultUnitDefinition = $product->getUnitDefinitions()->getDefaultUnitDefinition(); $defaultUnitDefinition->setUnit($unitRepository->findByName('Liter')); $unitDefinitionsRepository = $container->get('coreshop.repository.product_unit_definitions'); \/** @var ProductUnitDefinitions $unitDefinitions *\/ $unitDefinitions = $unitDefinitionsRepository->findOneForProduct($product); $unitDefinitions->setDefaultUnitDefinition($defaultUnitDefinition); $product->setUnitDefinitions($unitDefinitions); $product->save(); Delete UnitDefinition Deleting a UnitDefiniton from a product is done by finding the UnitDefinitions for the product in the product_unit_definitions repository and then deleting it. \/** @var DataObject\\CoreShopProduct $product *\/ $product = DataObject::getById(1); $unitDefinitionsRepository = $container->get('coreshop.repository.product_unit_definitions'); $item = $unitDefinitionsRepository->findOneForProduct($product); $unitDefinitionsRepository->remove($item);","tags":"","url":"Development\/Products\/Unit_Definitions.html"},{"title":"Cart","text":"CoreShop Cart This guide should lead you through how CoreShop handles the Cart. Create, Read, Update, Delete Cart Manager Cart Modifier Cart Processor Commands Cart Context Introduction The CoreShop Cart is stateless. Which means that every change on the cart triggers the Cart Processor which then calculates all necessary prices.","tags":"","url":"Development\/Cart\/index.html"},{"title":"CRUD","text":"CoreShop Cart CoreShop uses Pimcore Data Objects to persist Cart Information. But, it adds a little wrapper around it to be mire dynamic and configurable. It uses a Factory and Repository Pattern to do that. Create If you want to create a new Cart, we need to get our Factory Service for that: $factory = $container->get('coreshop.factory.cart'); $cart = $factory->createNew(); No we have a new Cart and we can set all needed values. If you now want to save it, just call the save function $cart->save(); Read To get carts, you need to use the Repository Service CoreShop provides you. $repository = $container->get('coreshop.repository.cart'); \/\/ Query by ID $cartWithIdOne = $repository->findById(1); \/\/ Get a Listing how you know it from Pimcore $list = $repository->getList(); $list->setCondition("total > 100"); $carts = $list->getObjects(); Update Update works the same as you are used to in Pimcore $repository = $container->get('coreshop.repository.cart'); \/\/ Query by ID $cartWithIdOne = $repository->findById(1); \/\/ Change values $cartWithIdOne->setCustomer($customer); $cartWithIdOne->save(); Delete Delete works the same as you are used to in Pimcore $repository = $container->get('coreshop.repository.cart'); \/\/ Query by ID $cartWithIdOne = $repository->findById(1); $cartWithIdOne->delete();","tags":"","url":"Development\/Cart\/CRUD.html"},{"title":"Cart Manager","text":"CoreShop Cart Manager The Cart Manager helps you managing Carts. It handles: Persisting a Cart The Cart Manager implements the Interface CoreShop\\Component\\Order\\Manager\\CartManagerInterface and is implemented in the Service coreshop.cart.manager:","tags":"","url":"Development\/Cart\/Cart_Manager.html"},{"title":"Cart Modifier","text":"CoreShop Cart Modifier CoreShop provides you with a helper service to modify the cart. It handles following for you: adding items removing items change quantity of items The Modifier implements the interface CoreShop\\Component\\Order\\Cart\\CartModifierInterface and is implemented by the service coreshop.cart.modifier The Cart Modifier itself, uses the Storage List Component","tags":"","url":"Development\/Cart\/Cart_Modifier.html"},{"title":"Cart Processor","text":"CoreShop Cart Processor The Cart Processor takes care about refreshing the state and prices of carts for you. Everytime the persistCart function of the Cart-Manager is called on a Cart, it gets triggered and re-calculates the cart. Following Processors are implemented by default: Cart Adjustment Clearer Item Processor Item Tax Processor Cart Price Rule Voucher Processor Cart Rule Auto Processor Cart Shipping Processor Cart Tax Processor These Processors calculate all necessary prices of the cart. If you need to extend the Cart and change calculations, you need to create a new Processor. Creating a Cart Processor A Cart Processor needs to implement the Interface CoreShop\\Component\\Order\\Processor\\CartProcessorInterface and registered into the container with the tag coreshop.cart_processor and a priority attribute. Example of a Cart Processor For example, we create a Cart Processor, which calculates a custom field in our Cart. <?php namespace AppBundle\\CoreShop\\Order\\Cart\\Processor; use CoreShop\\Component\\Order\\Model\\OrderInterface; use CoreShop\\Component\\Order\\Processor\\CartProcessorInterface; final class CustomCartProcessor implements CartProcessorInterface { public function process(OrderInterface $cart): void { $cart->setCustomField(uniqid()); } } We now only need to register the class: app.coreshop.cart.processor.custom: class: AppBundle\\CoreShop\\Order\\Cart\\Processor\\CustomCartProcessor tags: - { name: coreshop.cart_processor, priority: 200 } On every Cart Update, our service now gets called a the custom field gets a new unique id.","tags":"","url":"Development\/Cart\/Cart_Processor.html"},{"title":"Commands","text":"CoreShop Cart Commands Expire Abandoned Carts # Delete only anonymous carts $ bin\/console coreshop:cart:expire --anonymous # Delete only user carts $ bin\/console coreshop:cart:expire --user # Delete carts older than 20 days $ bin\/console coreshop:cart:expire --days=20 Expire Abandoned Carts via Maintenance Mode By default, this feature is disabled. If you want to swipe abandoned carts by default you need to define a expiration date: core_shop_order: expiration: cart: days: 20 anonymous: true customer: true Read more about automation here.","tags":"","url":"Development\/Cart\/Commands.html"},{"title":"Context","text":"CoreShop Cart Context For CoreShop to determine the current cart it uses a concept called context and context resolver. The Cart Context implements the Interface CoreShop\\Component\\Order\\Context\\CartContextInterface and is implemented in the Service coreshop.context.cart: Getting the current Cart If you want to get the current cart, you simply use the service: $cartContext = $container->get('coreshop.context.cart'); \/\/ Get current cart, if none exists, it creates a new one $cart = $cartContext->getCart(); Context Name Priority Description FixedCartContext -100 Used for testing purposes or for backend order creation SessionAndStoreBasedCartContext -555 Search for a valid session cart in given store context CustomerAndStoreBasedCartContext -777 Search for a cart based on a customer. Note: This context only triggers after a user has been successfully logged in. It searches for the last available cart a user may has left. CartContext -999 If all other context classes failed finally this context will create a fresh cart Create a Custom Resolver To register your context, you need to use the tag: coreshop.context.cart with an optional priority attribute.","tags":"","url":"Development\/Cart\/Context.html"},{"title":"Checkout","text":"CoreShop Checkout This guide should lead you through how CoreShop handles the Checkout. Checkout Manager Checkout Step","tags":"","url":"Development\/Checkout\/index.html"},{"title":"Checkout Manager","text":"CoreShop Checkout Manager CoreShop Checkout CoreShop uses a CheckoutManager to handle Checkout steps. The default installation comes with following Steps: Cart Customer Address Shipping Payment Summary Create a Custom CheckoutManager If you want to modify the Checkout Manager, you have two options: Create a total different Checkout Manager configuration Modify the default configuration Create a total different Checkout Manager # app\/config\/config.yml core_shop_core: checkout_manager: my_custom_manager checkout: my_custom_manager: steps: customer: step: coreshop.checkout.step.customer priority: 10 address: step: coreshop.checkout.step.address priority: 20 shipping: step: coreshop.checkout.step.shipping priority: 30 payment: step: coreshop.checkout.step.payment priority: 40 summary: step: coreshop.checkout.step.summary priority: 50 Modify the default configuration # app\/config\/config.yml core_shop_core: checkout: default: steps: payment: false # disables the payment step shipping: false # disables the shipping step payment_shipping: # adds a new PaymentShiping Step step: app_bundle.coreshop.checkout.payment_shipping # This is your service-id, the service needs to implement CoreShop\\Component\\Order\\Checkout\\CheckoutStepInterface priority: 40 # Priority of this step","tags":"","url":"Development\/Checkout\/Checkout_Manager.html"},{"title":"Checkout Step","text":"CoreShop Checkout Step If you want to implement a custom checkout step, you need to implement the interface CoreShop\\Component\\Order\\Checkout\\CheckoutStepInterface and register your step into your Cart Manager: # app\/config\/config.yml core_shop_core: checkout: default: steps: custom: step: app.coreshop.checkout.custom priority: 50 The Checkout Controller takes care about handling the Checkout for you then. Optional Checkout Step If you have an optional checkout step - depending on the cart, your Checkout Step can implement the interface CoreShop\\Component\\Order\\Checkout\\OptionalCheckoutStepInterface. You need to implement the function isRequired(OrderInterface $cart) Optional Checkout Step Example <?php namespace CoreShop\\Bundle\\CoreBundle\\Checkout\\Step; use CoreShop\\Bundle\\CoreBundle\\Form\\Type\\Checkout\\PaymentType; use CoreShop\\Component\\Order\\Checkout\\CheckoutException; use CoreShop\\Component\\Order\\Checkout\\CheckoutStepInterface; use CoreShop\\Component\\Order\\Checkout\\OptionalCheckoutStepInterface; use CoreShop\\Component\\Order\\Checkout\\ValidationCheckoutStepInterface; use CoreShop\\Component\\Order\\Manager\\CartManagerInterface; use CoreShop\\Component\\Order\\Model\\OrderInterface; use CoreShop\\Component\\Payment\\Model\\PaymentProviderInterface; use CoreShop\\Component\\Store\\Context\\StoreContextInterface; use Symfony\\Component\\Form\\FormFactoryInterface; use Symfony\\Component\\HttpFoundation\\Request; class PaymentCheckoutStep implements CheckoutStepInterface, OptionalCheckoutStepInterface, ValidationCheckoutStepInterface { private FormFactoryInterface $formFactory; private StoreContextInterface $storeContext; private CartManagerInterface $cartManager; public function __construct( FormFactoryInterface $formFactory, StoreContextInterface $storeContext, CartManagerInterface $cartManager ) { $this->formFactory = $formFactory; $this->storeContext = $storeContext; $this->cartManager = $cartManager; } public function getIdentifier(): string { return 'payment'; } public function doAutoForward(OrderInterface $cart): bool { return $cart->getTotal() > 0; } public function doAutoForward(OrderInterface $cart): bool { return false; } public function validate(OrderInterface $cart): bool { return $cart->hasItems() && $cart->getPaymentProvider() instanceof PaymentProviderInterface; } public function commitStep(OrderInterface $cart, Request $request): bool { $form = $this->createForm($request, $cart); if ($form->isSubmitted()) { if ($form->isValid()) { $cart = $form->getData(); $this->cartManager->persistCart($cart); return true; } else { throw new CheckoutException('Payment Form is invalid', 'coreshop.ui.error.coreshop_checkout_payment_form_invalid'); } } return false; } public function prepareStep(OrderInterface $cart, Request $request): array { return [ 'form' => $this->createForm($request, $cart)->createView(), ]; } private function createForm(Request $request, OrderInterface $cart) { $form = $this->formFactory->createNamed('', PaymentType::class, $cart, [ 'payment_subject' => $cart ]); if ($request->isMethod('post')) { $form = $form->handleRequest($request); } return $form; } }","tags":"","url":"Development\/Checkout\/Checkout_Step.html"},{"title":"Order","text":"CoreShop Order This guide should lead you through how CoreShop handles Orders. Order Creation Transformer Order Workflow Invoice Shipment Template\/Twig Helper Extend Order with additional data CoreShop Order List Order List: Add Custom Filter Order List: Add Custom Actions","tags":"","url":"Development\/Order\/index.html"},{"title":"Order Creation","text":"CoreShop Order Creation Orders are usually getting created through the Checkout Step. If you ever need to create an Order manually, there are multiple ways. Order CRUD You can always use the Pimcore API to create Orders, in CoreShop you would do it through the Factory: $factory = $container->get('coreshop.factory.order')->createNew(); You can now fill the Order with all necessary information. The more usual way to create Orders is through Carts or Quotes. Therefore CoreShop implements Transformer for that.","tags":"","url":"Development\/Order\/Order_Creation.html"},{"title":"Transformer","text":"CoreShop Transfomers Transfomers, as the name say, transform Data from different formats. A transformer converts between Object Types. For example: Cart -> Order. Following implementation do exist right now: an Order into an Invoice an Order into an Shipment The base transformer interface for all "Proposals" is CoreShop\\Component\\Order\\Transformer\\ProposalTransformerInterface Extending Transfomers If you ever have the need to adapt the transfomer, eg. hook into it and store some custom data into the order, you can do so by decorating the default service. Following Services are used by CoreShop for all different Transfomers: From To Service Order Invoice coreshop.order.transformer.order_to_invoice OrderItem InvoiceItem coreshop.order_invoice.transformer.cart_item_to_order_item Order Shipment coreshop.order.transformer.order_to_invoice OrderItem ShipmentItem coreshop.order_invoice.transformer.order_item_to_shipment_item","tags":"","url":"Development\/Order\/Transformer.html"},{"title":"Order Workflow","text":"CoreShop Order Workflow CoreShop uses Symfony Workflow to apply states. Here is the detail information about the State Machine.","tags":"","url":"Development\/Order\/Order_Workflow.html"},{"title":"Invoice","text":"CoreShop Invoice CoreShop comes with an Invoice creation feature. This means, it can create Invoices for Orders based on Workflow States.","tags":"","url":"Development\/Order\/Invoice\/index.html"},{"title":"Invoice Creation","text":"CoreShop Invoice Creation See Order Transformer for more. Add a Invoice to an Order \/** * Note: * * The TRANSITION_REQUEST_INVOICE transition can only be applied once. * Only dispatch it with the creation of the first invoice. * This transition will inform the order invoice workflow that it's ready to initiate the invoice processing. *\/ $workflow = $this->getStateMachineManager()->get($order, 'coreshop_order_invoice'); $workflow->apply($order, OrderInvoiceTransitions::TRANSITION_REQUEST_INVOICE); $order = ''; \/** @var InvoiceInterface $invoice *\/ $invoice = $this->container->get('coreshop.factory.order_invoice')->createNew(); $invoice->setState(InvoiceStates::STATE_NEW); $items = []; $invoice = $this->get('coreshop.order.transformer.order_to_invoice')->transform($order, $invoice, $items);","tags":"","url":"Development\/Order\/Invoice\/Invoice_Creation.html"},{"title":"Purchasable","text":"CoreShop Order Purchasable Items, you want to add to your Cart\/Order\/Quote, need to implement CoreShop\\Component\\Order\\Model\\PurchasableInterface. The concept of Purchasable allows us to decouple CoreShops Order Component from the Product Component and makes the Cart\/Quote\/Order more flexible in ways of which object types can be used. A Purchasable does not a have Price directly You need create a class that implements CoreShop\\Component\\Order\\Calculator\\PurchasablePriceCalculatorInterface. in order to calculate price Implementation of a new Purchasable Price Calculator To implement a new custom Purchasable Price Calculator, you need to implement the interface CoreShop\\Component\\Order\\Calculator\\PurchasablePriceCalculatorInterface. As an example, we create a ProductSetCalculator, which takes prices of each consisting Product: <?php namespace AppBundle\\CoreShop\\Order\\Calculator; use CoreShop\\Component\\Order\\Calculator\\PurchasablePriceCalculatorInterface; use CoreShop\\Component\\Order\\Exception\\NoPurchasablePriceFoundException;use CoreShop\\Component\\Order\\Model\\PurchasableInterface; use Pimcore\\Model\\Product\\ProductSet; final class ProductSetCalculator implements PurchasablePriceCalculatorInterface { private PurchasablePriceCalculatorInterface $purchasablePriceCalculator; public function __construct(PurchasablePriceCalculatorInterface $purchasablePriceCalculator) { $this->purchasablePriceCalculator = $purchasablePriceCalculator; } public function getPrice(PurchasableInterface $purchasable, array $context, bool $includingDiscounts = false): int { if ($purchasable instanceof ProductSet) { $price = 0; foreach ($purchasable->getProducts() as $product) { $price .= $this->purchasablePriceCalculator->getPrice($product); } return $price; } throw new NoPurchasablePriceFoundException($this); } } Now we need to register our Service to the Container: app.coreshop.order.purchasable.price_calculator.product_set: class: AppBundle\\CoreShop\\Order\\Calculator\\ProductSetCalculator arguments: - '@coreshop.order.purchasable.price_calculator' tags: - { name: coreshop.order.purchasable.price_calculator, type: product_set, priority: 20 }","tags":"","url":"Development\/Order\/Purchasable.html"},{"title":"Shipment","text":"CoreShop Shipment CoreShop comes with an Shipment (Delivery Slip) creation feature. This means, it can create Shipments for Orders based on Workflow States.","tags":"","url":"Development\/Order\/Shipment\/index.html"},{"title":"Shipment Creation","text":"CoreShop Shipment Creation See Order Transformer for more. Add a Shipment to an Order \/** * Note: * * The TRANSITION_REQUEST_SHIPMENT transition can only be applied once. * Only dispatch it with the creation of the first shipment. * This transition will inform the order shipment workflow that it's ready to initiate the shipment processing. *\/ $workflow = $this->getStateMachineManager()->get($order, 'coreshop_order_shipment'); $workflow->apply($order, OrderShipmentTransitions::TRANSITION_REQUEST_SHIPMENT); $order = ''; \/** @var ShipmentInterface $shipment *\/ $shipment = $this->container->get('coreshop.factory.order_shipment')->createNew(); $shipment->setState(ShipmentStates::STATE_NEW); $items = []; $shipment = $this->get('coreshop.order.transformer.order_to_shipment')->transform($order, $shipment, $items);","tags":"","url":"Development\/Order\/Shipment\/Shipment_Creation.html"},{"title":"Filter","text":"CoreShop Order List Filter This comes in handy if you need some special filtered data in your Order List. Your Customer is able to filter orders on specific conditions. Register Filter Service AppBundle\\CoreShop\\OrderList\\Filter\\DemoFilter: tags: - { name: coreshop.grid.filter, type: demo } Create PHP Class In this example we want to filter orders with available shipments in state "ready". <?php namespace AppBundle\\CoreShop\\OrderList\\Filter; use CoreShop\\Component\\Pimcore\\DataObject\\Grid\\GridFilterInterface; use Pimcore\\Db\\ZendCompatibility\\QueryBuilder; use Pimcore\\Model\\DataObject; class DemoFilter implements GridFilterInterface { public function getName(): string { return 'coreshop.order_filter.shipment_apply'; } public function filter(DataObject\\Listing $list, array $context): DataObject\\Listing { $list->onCreateQuery(function (QueryBuilder $select) use ($list) { $select->join( ['shipment' => 'object_query_4'], 'shipment.order__id = object_' . $list->getClassId() . '.o_id' ); }); $list->addConditionParam('orderState = ?', 'confirmed'); $list->addConditionParam('shipment.state = ?', 'ready'); return $list; } public function supports(string $listType): bool { return $listType === 'coreshop_order'; } }","tags":"","url":"Development\/Order\/OrderList\/Filter.html"},{"title":"Action","text":"CoreShop Order List Actions Actions allows you to process orders rapidly, right in the order grid view. Register Filter Service AppBundle\\CoreShop\\OrderList\\Action\\Demo: arguments: $stateMachineManager: '@coreshop.state_machine_manager' $shipmentRepository: '@coreshop.repository.order_shipment' tags: - { name: coreshop.grid.action, type: demo } Create PHP Class In this example we want to apply the shipment transition "ship" to selected orders. <?php namespace AppBundle\\CoreShop\\OrderList\\Action; use CoreShop\\Component\\Order\\Repository\\OrderShipmentRepositoryInterface; use CoreShop\\Bundle\\WorkflowBundle\\Manager\\StateMachineManagerInterface; use CoreShop\\Component\\Pimcore\\DataObject\\Grid\\GridActionInterface; use Pimcore\\Model\\DataObject\\CoreShopOrder; class DemoAction implements GridActionInterface { protected $stateMachineManager; protected $shipmentRepository; public function __construct( StateMachineManagerInterface $stateMachineManager, OrderShipmentRepositoryInterface $shipmentRepository ) { $this->stateMachineManager = $stateMachineManager; $this->shipmentRepository = $shipmentRepository; } public function getName(): string { return 'coreshop.order.demo'; } public function apply(array $processIds): string { $message = ''; $transition = 'ship'; $shipmentIds = []; foreach ($processIds as $id) { $m = []; $order = CoreShopOrder::getById($id); $shipments = $this->shipmentRepository->getDocuments($order); if (count($shipments) === 0) { $m[] = sprintf('- no shipments for order %s found. skipping....', $order->getId()); } else { foreach ($shipments as $shipment) { if ($shipment->getState() === 'shipped') { $m[] = sprintf('- transition "%s" for shipment %s already applied. skipping...', $transition, $shipment->getId()); continue; } $workflow = $this->stateMachineManager->get($shipment, 'coreshop_shipment'); if (!$workflow->can($shipment, $transition)) { $m[] = sprintf('- transition "%s" for shipment %s not allowed.', $transition, $shipment->getId()); } else { try { $workflow->apply($shipment, $transition); $shipmentIds[] = $shipment->getId(); $m[] = sprintf('- transition "%s" for shipment id %s successfully applied.', $transition, $shipment->getId()); } catch (\\Exception $e) { $m[] = sprintf('- error while applying transition "%s" to shipment with id %s: %s.', $transition, $shipment->getId(), $e->getMessage()); } } } } $message .= sprintf('<strong>Order %s:<\/strong><br>%s<br>', $id, join('<br>', $m)); } if (count($shipmentIds) > 0) { $packingListUrl = '\/admin\/your-packing-list-generator-url?ids=' . join(',', $shipmentIds); $message .= sprintf('<br><a href="%s" target="_blank">%s<\/a><br>', $packingListUrl, 'packing list'); } return $message; } public function supports(string $listType): bool { return $listType === 'coreshop_order'; } }","tags":"","url":"Development\/Order\/OrderList\/Action.html"},{"title":"TemplateHelper","text":"CoreShop Order Template\/Twig Helper Order State There is one Filter which returns you the current state for an order: {{ dump(order|coreshop_order_state) }}","tags":"","url":"Development\/Order\/TemplateHelper.html"},{"title":"AdditionalData","text":"Additional Data in Order Sometimes you need to implement additional information in your order (Besides the comment field, which is available by default in the shipping checkout step). Note: To add custom fields you need a custom checkout step. Create your custom brick and apply it to the classes: Cart (additionalData) Order (additionalData) Quote (additionalData) Add fields to your custom checkout step (createForm()): $form->add('af_secretField', TextType::class, [ 'required' => false, 'label' => 'coreshop.ui.your_secret_field' ]); $form->add('af_secondSecretField', TextType::class, [ 'required' => false, 'label' => 'coreshop.ui.your_second_secret_field' ]); Store data in cart (commitStep()) use Pimcore\\Model\\DataObject\\Objectbrick\\Data\\AdditionalField; if ($form->isSubmitted()) { if ($form->isValid()) { $formData = $form->getData(); if(!empty($formData['af_secretField'])) { $brick = new AdditionalField($cart); $brick->setSecretField($formData['af_secretField']); $brick->setSecondSecretField($formData['af_secondSecretField']); $cart->getAdditionalData()->setAdditionalField($brick); } $cart->save(); return true; } } That's it - your additional data is now available in backend. If you want to display those fields in the overview, you need to add some JS: core_shop_core: pimcore_admin: js: filter_condition_relational_multi_select: '\/bundles\/app\/additionalData.js' This file has to extend coreshop.order.sale.detail.abstractBlock and requires several methods: initBlock, updateSale, getPanel, getPriority and getPosition. pimcore.registerNS('coreshop.order.order.detail.blocks.yourBlockName'); coreshop.order.order.detail.blocks.yourBlockName = Class.create(coreshop.order.sale.detail.abstractBlock, { saleInfo: {}, hasItems: true, initBlock: function () { this.saleInfo = Ext.create('Ext.panel.Panel', { title: t('coreshop_order_additional_data'), margin: '0 20 20 0', border: true, flex: 8 }); }, updateSale: function () { var items = [], subItems = []; \/\/console.log(this.sale.additionalData); var items = [], subItems = []; Ext.Array.each(this.sale.additionalData, function (block, i) { var data = block.data; subItems.push({ xtype: 'label', style: 'font-weight:bold;display:block', text: 'Title for your custom field A' }, { xtype: 'label', style: 'display:block', html: data.secretField }); subItems.push({ xtype: 'label', style: 'font-weight:bold;display:block', text: 'Title for your custom field B' }, { xtype: 'label', style: 'display:block', html: data.secondSecretField }) }); if (subItems.length === 0) { this.hasItems = false; return; } items.push({ xtype: 'panel', bodyPadding: 10, margin: '0 0 10px 0', items: subItems }); \/\/ remove all before adding new ones \/\/ otherwise they will append during a refresh this.saleInfo.removeAll(); this.saleInfo.add(items); }, getPanel: function () { return this.hasItems ? this.saleInfo : null; }, getPriority: function () { return 10; }, getPosition: function () { return 'right'; } });","tags":"","url":"Development\/Order\/AdditionalData.html"},{"title":"Shipping","text":"CoreShop Shipping This guide should lead you through how CoreShop handles Shipping and Shipping Calculation. Carriers Shipping Rules","tags":"","url":"Development\/Shipping\/index.html"},{"title":"Carrier","text":"CoreShop Carrier This guide should lead you through how CoreShop handles Carriers. Create, Read, Update, Delete Carrier Discovery Price Calculation","tags":"","url":"Development\/Shipping\/Carrier\/index.html"},{"title":"CRUD","text":"CoreShop Carrier Create If you want to create a Carrier via API, you can do following: $newCarrier = $container->get('coreshop.factory.carrier')->createNew(); Now you have a new Carrier, if you want to persist it, you need to do following: $container->get('coreshop.manager.carrier')->persist($newCarrier); $container->get('coreshop.manager.carrier')->flush(); You now have a new persisted Carrier. Read If you want to query for Carriers, you can do following: $carrierRepository = $container->get('coreshop.repository.carrier'); $queryBuilder = $carrierRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $carriers = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Carrier, you need to do following: \/\/ Fetch Carrier $carrier = $carrierRepository->findById(1); $carrier->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.carrier')->persist($carrier); $container->get('coreshop.manager.carrier')->flush(); Delete If you want to update and existing Carrier, you need to do following: \/\/ Fetch Carrier $carrier = $carrierRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.carrier')->remove($carrier); $container->get('coreshop.manager.carrier')->flush();","tags":"","url":"Development\/Shipping\/Carrier\/CRUD.html"},{"title":"Carrier Discovery","text":"CoreShop Carrier Discovery CoreShop uses a Service to discover available Carriers for a given Shippable. These Service implements the Interface CoreShop\\Bundle\\ShippingBundle\\Discover\\ShippableCarriersDiscoveryInterface. The Interface is implemented by Service with ID coreshop.carrier.discovery","tags":"","url":"Development\/Shipping\/Carrier\/Carrier_Discovery.html"},{"title":"Price Calculation","text":"CoreShop Carrier Price Calculation CoreShop Shipping\/Carrier Calculation uses multiple Calculation methods to calculate the price for a given Carrier on a given Cart. A Calculator needs to implement the Interface CoreShop\\Component\\Shipping\\Calculator\\CarrierPriceCalculatorInterface and registered to the container using the tag coreshop.shipping.price_calculator, a type attribute and a priority Default Implementation The Default Implementation calculates the Price based on Shipping Rules.","tags":"","url":"Development\/Shipping\/Carrier\/Price_Calculation.html"},{"title":"Shipping Rules","text":"CoreShop Shipping Rules Default Conditions and Actions CoreShop comes with a set of default action and condition implementations: Default Conditions Currencies Customer Groups Customers Stores Zones Amount Categories Countries Dimension Post Codes Products Shipping Rule Weight Nested Default Actions Addition Amount Addition Percent Discount Amount Discount Percent Price Shipping Rule Extending Conditions and Actions Click here to see how you can add custom Actions Click here to see how you can add custom Conditions","tags":"","url":"Development\/Shipping\/Shipping_Rules\/index.html"},{"title":"Index and Filters","text":"CoreShop Index and Filter This guide should lead you through how CoreShop handles Indices and Filters. Indices Filters","tags":"","url":"Development\/Index_and_Filters\/index.html"},{"title":"Index","text":"CoreShop Index To create a rich layered navigation (faceted navigation), you need to create an index of your Products. Create a new Index CoreShop currently supports two type of indexes: Mysql ~~Elasticsearch~~ Add Fields To add a new field, simply drag'n'drop the field from the left tree to the right tree. Field Properties Every field has some properties that needs to be configured Field Description Key Pimcore Field Name Name Name in the Index Getter Class Getter Class is important for field-types like "Localized Fields", "Classification Store", "Object Brick" and "Field Collection". CoreShop needs it to get the right value for the index Interpreter Using Interpreters helps you to transform values before they get stored in the index. For example: Resolving dependencies, create a similarity Index Type Type of the field in the index, depends on which Index-Type you are using. MySql or Elasticsearch Getter Config Configuration depends on Getter, for example: Language for Localized Fields Re-Index If you make changes to the index, you need to re-index all of your products. To do that, there is a CLI command. $ php bin\/console coreshop:index If you don't want to re-index all of your indices, you can pass the corresponding IDs or names of the indices separated with a space as arguments to the CLI command. The following example will only re-index indices with IDs 1 and 2 and name "Products". If none of those indices exist, nothing will be re-indexed. $ php bin\/console coreshop:index 1 2 Products","tags":"","url":"Development\/Index_and_Filters\/Index\/index.html"},{"title":"Interpreter","text":"CoreShop Index Interpreter To prepare your index and transform data, you use one of the existing Interpreter or create one yourself. CoreShop currently has following Interpreters: Object: converts an object or and object array to relations. It saves the values to the relations inex ObjectId: converts an object to its ID ObjectIdSum: calculates the sum of all IDs. (Could be used for similar products) ObjectProperty: calls a getter method of the value Soundex: calls PHP soundex function (Could be used for similar products) Create a Custom Interpreter 1 We need to create 2 new files: FormType for processing the Input Data And a InterpreterInterface, which interprets the data namespace AppBundle\\Index\\Form\\Type; use Symfony\\Component\\Form\\AbstractType; use Symfony\\Component\\Form\\Extension\\Core\\Type\\IntegerType; use Symfony\\Component\\Form\\FormBuilderInterface; use Symfony\\Component\\Validator\\Constraints\\NotBlank; use Symfony\\Component\\Validator\\Constraints\\Type; final class MyInterpreterType extends AbstractType { \/** * {@inheritdoc} *\/ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('myInterpreterData', IntegerType::class, [ 'constraints' => [ new NotBlank(['groups' => ['coreshop']]), new Type(['type' => 'numeric', 'groups' => ['coreshop']]), ], ]) ; } } namespace AppBundle\\CoreShop\\Index\\Interpreter; use CoreShop\\Component\\Index\\Interpreter\\InterpreterInterface; class MyInterpreter implements InterpreterInterface { public function interpret($value, IndexableInterface $indexable, IndexColumnInterface $config, array $interpreterConfig = []) { \/\/Do some interpretation here return $value; } } 2:Register MyInterpreter as service with tag coreshop.index.interpreter, type and form app.index.interpreter.my_interpreter: class: AppBundle\\CoreShop\\Index\\Interpreter\\MyInterpreter tags: - { name: coreshop.index.interpreter, type: my_interpreter, form-type: AppBundle\\Index\\Form\\Type\\MyInterpreterType}","tags":"","url":"Development\/Index_and_Filters\/Index\/Interpreter.html"},{"title":"Extension","text":"CoreShop Index Extension In order to make the index more flexible, it is possible for you to write extensions. Extensions allow you to do following things: - Add more "default" columns and corresponding data - Pre Filter an mysql index To create a new extension, you need to implement either the interface CoreShop\\Component\\Index\\Extension\\IndexColumnsExtensionInterface for column extensions or the interface CoreShop\\Bundle\\IndexBundle\\Extension\\MysqlIndexQueryExtensionInterface for mysql query extensions. You then need to register your service using the tag coreshop.index.extension","tags":"","url":"Development\/Index_and_Filters\/Index\/Extension.html"},{"title":"Filter","text":"CoreShop Filter After creating the index, you can configure the Filters. Create a new Filter You can create different Filters for different Categories. A filter exists of different settings, pre-conditions, filters and similar products. You can even create Custom Filters Filter Settings Field Description Name Name of the Filter-Set Index Which Index should be used Order Order of the products Order Key Order key (index-field) to sort from Results per Page How many products should be displayed per page, you can use Shop Settings, or override it Pre-Conditions You can define pre-filters for the index. Conditions Here you can define different kind of filters. These filters will be displayed on the front-page for customers to find products. CoreShop currently supports 4 types of filters: Select Multiselect Range Boolean Select Condition A select condition is basically just a simple dropdown field where customer can select one field. Multiselect Condition A multi-select condition is basically a list of fields where customer can select multiple entries. Range Condition A Range Condition is a slider of two ranges. The ranges are calculated automatically using MIN and MAX values. Boolean Condition Boolean is a Condition where the customer can check different values.","tags":"","url":"Development\/Index_and_Filters\/Filter\/index.html"},{"title":"Custom Filter","text":"CoreShop Filter - Create Custom Filter 1. We need to create 2 new files: - FormType for processing the Input Data - And a FilterConditionProcessorInterface, which checks if a cart fulfills the condition. namespace AppBundle\\Filter\\Form\\Type\\Condition; use Symfony\\Component\\Form\\AbstractType; use Symfony\\Component\\Form\\Extension\\Core\\Type\\IntegerType; use Symfony\\Component\\Form\\FormBuilderInterface; use Symfony\\Component\\Validator\\Constraints\\NotBlank; use Symfony\\Component\\Validator\\Constraints\\Type; final class MyFilterCondition extends AbstractType { \/** * {@inheritdoc} *\/ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('myData', IntegerType::class, [ 'constraints' => [ new NotBlank(['groups' => ['coreshop']]), new Type(['type' => 'numeric', 'groups' => ['coreshop']]), ], ]) ; } } namespace AppBundle\\Filter; use CoreShop\\Component\\Address\\Model\\AddressInterface; use CoreShop\\Component\\Core\\Model\\CarrierInterface; class MyFilterCondition extends FilterConditionProcessorInterface { public function prepareValuesForRendering(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter) { \/\/Prepare values for rendering HTML } public function addCondition(FilterConditionInterface $condition, FilterInterface $filter, ListingInterface $list, $currentFilter, ParameterBag $parameterBag, $isPrecondition = false) { \/\/Add Condition to Listing return $currentFilter; } } 2. Register MyFilterCondition as service with tag coreshop.filter.condition_type, type and form app.coreshop.shipping_rule.condition.my_rule: class: AppBundle\\Shipping\\Rule\\Condition\\MyRuleConditionChecker tags: - { name: coreshop.shipping_rule.condition, type: my_rule, form-type: AppBundle\\Shipping\\Form\\Type\\Condition\\MyRuleConfigurationType } app.filter.condition_type.my_filter_condition: class: AppBundle\\Filter\\MyFilterCondition tags: - { name: coreshop.filter.condition_type, type: app-my-filter, form-type: AppBundle\\Filter\\Form\\Type\\Condition\\MyFilterCondition}","tags":"","url":"Development\/Index_and_Filters\/Filter\/Custom_Filter.html"},{"title":"Notification Rules","text":"CoreShop Notification Rules Notification Rules are responsible for all types of notification triggered by CoreShop. It handles notification for following types: order quote invoice shipment user payment Overview Let's checkout each notification type: Order Allowed Conditions Name Description Invoice State Dispatch if given Invoice State is active Invoice Transition Dispatch if given Invoice Transition has been applied Payment State Dispatch if given Payment State is active Payment Transition Dispatch if given Payment Transition has been applied Shipping State Dispatch if given Shipping State is active Shipping Transition Dispatch if given Shipping Transition has been applied Order State Dispatch if given Order State is active Order Transition Dispatch if given Order Transition has been applied Carriers Dispatch if given Carrier has been selected in Order Comment Dispatch if a Comment Action has been applied. Available Types: create comment Allowed Actions Name Description Order Email Email with Order Object Email Default Email without Order Object Available Placeholders keys for email templates Key Value object Object of type OrderInterface fromState State identifier from which it is transitioning away from toState State identifier from which it is transitioning to transition Used transition _locale Used locale recipient Customer E-Mail Address firstname Customer Firstname lastname Customer Lastname orderNumber Order Number Available Placeholders keys for email templates for comment Key Value object Object of type OrderInterface _locale Used locale recipient Customer E-Mail Address firstname Customer Firstname lastname Customer Lastname orderNumber Order Number type Type of comment submitAsEmail should comment be sent as mail comment contents of the comment Shipment Allowed Conditions Name Description Shipping State Dispatch if given Shipping State is active Shipping Transition Dispatch if given Shipping Transition has been applied Allowed Actions Name Description Order Email Email with Order Object Email Default Email without Order Object Available Placeholders keys for email templates Key Value object Object of type OrderShipmentInterface order Object of type OrderInterface fromState State identifier from which it is transitioning away from toState State identifier from which it is transitioning to transition Used transition Invoice Allowed Conditions Name Description Invoice State Dispatch if given Invoice State is active Invoice Transition Dispatch if given Invoice Transition has been applied Allowed Actions Name Description Order Email Email with Order Object Email Default Email without Order Object Available Placeholders keys for email templates Key Value object Object of type OrderInvoiceInterface order Object of type OrderInterface fromState State identifier from which it is transitioning away from toState State identifier from which it is transitioning to transition Used transition Payment Allowed Conditions Name Description Payment State Dispatch if given Payment State is active Payment Transition Dispatch if given Payment Transition has been applied Allowed Actions Name Description Order Email Email with Order Object Email Default Email without Order Object Available Placeholders keys for email templates Key Value object Object of type PaymentInterface order Object of type OrderInterface paymentState State of the Payment User Allowed Conditions Name Description User Type Dispatch if given Type has been applied. Allowed Types: new account, password reset Allowed Actions Name Description Email Default Email without Order Object Available Placeholders keys for email templates Key Value object Object of type CustomerInterface recipient Customer E-Mail Address gender Customer Gender firstname Customer Firstname lastname Customer Lastname email Customer E-Mail type type of customer notification Additional Placeholders keys for Password Reset Key Value resetLink Link where customer can reset his Password Additional Placeholders keys for Request Newsletter Key Value confirmLink Link where customer can confirm his Newsletter subscription token Confirmation Token Quote Allowed Conditions Name Description Carriers Dispatch if given Carrier has been selected in Order Allowed Actions Name Description Email Default Email without Order Object Available Placeholders keys for email templates Key Value object Object of type QuoteInterface Custom Implementation It's also easy to implement custom notification rules. Read more about this here Extend CoreShop Notification Rules Custom Actions Custom Conditions Custom Types Triggering Notifications","tags":"","url":"Development\/Notification_Rules\/index.html"},{"title":"Custom Actions","text":"CoreShop Notification Rule Custom Actions Click here to see how you can add custom Actions","tags":"","url":"Development\/Notification_Rules\/Custom_Actions.html"},{"title":"Custom Conditions","text":"CoreShop Notification Rule Custom Conditions Click here to see how you can add custom Conditions","tags":"","url":"Development\/Notification_Rules\/Custom_Conditions.html"},{"title":"Custom Types","text":"CoreShop Notification Rule Custom Type Notification Types are registered dynamically by using tag-attributes on conditions and actions. If you want to have your own type, you can do so by adding a new condition or action and specify your own type: services: app.coreshop.notification_rule.condition.order.custom_notification_condition: class: AppBundle\\CoreShop\\Notification\\CustomNotificationCondition tags: - { name: coreshop.notification_rule.condition, type: custom_condition, notification-type: custom, form-type: AppBundle\\Form\\Type\\CoreShop\\CustomConditionType }","tags":"","url":"Development\/Notification_Rules\/Custom_Types.html"},{"title":"Triggering","text":"CoreShop Notification Trigger Notifications Triggering Notification events is quite easy, you can use the CoreShop\\Component\\Notification\\Processor\\RulesProcessorInterface implemented by service @coreshop.notification_rule.processor You also need to add different kinds of parameters based on your Notification Type. In our case, we trigger an Order event. $this->rulesProcessor->applyRules('order', $event->getProposal(), [ 'fromState' => $event->getMarking()->getPlaces(), 'toState' => $event->getTransition()->getTos(), '_locale' => $order->getLocaleCode(), 'recipient' => $customer->getEmail(), 'firstname' => $customer->getFirstname(), 'lastname' => $customer->getLastname(), 'orderNumber' => $order->getOrderNumber(), 'transition' => $event->getTransition()->getName() ]); The rest is now handled by CoreShop Notifications.","tags":"","url":"Development\/Notification_Rules\/Triggering.html"},{"title":"Payment","text":"CoreShop Payment CoreShop contains a very flexible payments management system with support for many gateways (payment providers). We are using a payment abstraction library - Payum, which handles all sorts of capturing, refunding and recurring payments logic. On CoreShop side, we integrate it into our checkout and manage all the payment data. Available Payment Gateways for CoreShop Name State Link Support Offsite Supports Server-Notification Supports Refund Heidelpay stable Github PayPal, Klarna Sofort, Credit Card No Yes No SaferPay stable Github Supported Payment Methods Yes Yes Partially PostFinance stable Github PostFinance Card, PostFinance E-Finance, Visa, MasterCard, Diners Club, American Express, JCB, PayPal, TWINT Yes Yes No PowerPay dev Github invoice, automatic credit check No No (not required) No CuraBill dev Github invoice, instalments via iframe No No (not required) No Payment Every payment in CoreShop, successful or failed, is represented by the payment model, which contains basic information and a reference to appropriate order. Create a Payment programmatically As usually, use a factory to create a new PaymentMethod and give it a unique code. $payment = $this->container->get('coreshop.factory.payment')->createNew(); $payment->setOrder($order); $payment->setCurrencyCode('EUR'); $this->container->get('coreshop.repository.payment')->add($payment); More Payment Provider Ominpay Bridge Payum Providers","tags":"","url":"Development\/Payment\/index.html"},{"title":"Payment Provider","text":"CoreShop Payment Providers A Payment Provider represents a way that your customer pays during the checkout process. It holds a reference to a specific gateway with custom configuration. A gateway is configured for each payment method separately using the payment method form. Payment Gateway configuration Payment Gateways that already have a CoreShop bridge First you need to create the configuration form type for your gateway. Have a look at the configuration form types of Paypal and Sofort. Then you should register its configuration form type with coreshop.gateway_configuration_type tag. After that it will be available in the admin panel in the gateway choice dropdown. If you are not sure how your configuration form type should look like, head to Payum documentation. Other Payment Gateways Learn more about integrating payment gateways in the Payum docs. You\u2019ll probably need also this kind of configuration in your app\/config\/config.yml for the gateway\u2019s factory: payum: gateways: yourgateway: factory: yourgateway As an example, we add Sofort as a payment gateway factory. To add a new gateway configuration you need to add 2 files: A new FormType for configuration values A new Javascript File for ExtJs Form 1: Form Type for Configuration Values: namespace AppBundle\\CoreShop\\Form\\Type; use Symfony\\Component\\Form\\AbstractType; use Symfony\\Component\\Form\\Extension\\Core\\Type\\TextType; use Symfony\\Component\\Form\\FormBuilderInterface; use Symfony\\Component\\Form\\FormEvent; use Symfony\\Component\\Form\\FormEvents; use Symfony\\Component\\Validator\\Constraints\\NotBlank; final class SofortGatewayConfigurationType extends AbstractType { \/** * {@inheritdoc} *\/ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('config_key', TextType::class, [ 'constraints' => [ new NotBlank([ 'groups' => 'coreshop', ]), ], ]) ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { $data = $event->getData(); $data['payum.http_client'] = '@coreshop.payum.http_client'; }) ; } } Now we register the FormType into the container services: app.coreshop.form.type.gateway_configuration.sofort: class: AppBundle\\Form\\Type\\SofortGatewayConfigurationType tags: - { name: coreshop.gateway_configuration_type, type: sofort } - { name: form.type } 2: Create the corresponding ExtJs Form: You need to use the type attribute as identifier here pimcore.registerNS('coreshop.provider.gateways.sofort'); coreshop.provider.gateways.sofort = Class.create(coreshop.provider.gateways.abstract, { getLayout: function (config) { return [ { xtype: 'textfield', fieldLabel: t('config_key'), name: 'gatewayConfig.config.config_key', length: 255, value: config.config_key ? config.config_key : "" } ]; } }); Next we need to register our new Gateway JS file to be loaded: core_shop_payment: pimcore_admin: js: sofort_gateway: '\/bundles\/app\/pimcore\/js\/sofort.js' Thats it, now after reloading Pimcore, you'll see a new Factory.","tags":"","url":"Development\/Payment\/Payment_Provider.html"},{"title":"Omnipay Bridge","text":"CoreShop Payum Ominpay Bridge Here is a list of all available Omnipay Payment Providers. As of now, Omnipay is not compatible with Symfony 3. They are already working on it, but will need some time to be finished. But: You can use the dev-master Version Omnipay to add the Bridge To add the Omnipay Bridge, do following: $ composer require payum\/omnipay-v3-bridge:dev-master This will install the Bridge for you. Now you still need to create your Gateway Configuration as described here. Example of Omnipay Gateway Configuration As example we add omnipay-worldpay: Worldpay is currently in PR and I don't know when it is getting merged 1: add FormType for Worldpay Configuration: <?php namespace AppBundle\\Form\\Type; use Symfony\\Component\\Form\\AbstractType; use Symfony\\Component\\Form\\Extension\\Core\\Type\\PasswordType; use Symfony\\Component\\Form\\Extension\\Core\\Type\\TextType; use Symfony\\Component\\Form\\FormBuilderInterface; use Symfony\\Component\\Form\\FormEvent; use Symfony\\Component\\Form\\FormEvents; use Symfony\\Component\\Validator\\Constraints\\NotBlank; final class WorldpayType extends AbstractType { \/** * {@inheritdoc} *\/ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('serviceKey', TextType::class, [ 'constraints' => [ new NotBlank([ 'groups' => 'coreshop', ]), ], ]) ->add('clientKey', PasswordType::class, [ 'constraints' => [ new NotBlank([ 'groups' => 'coreshop', ]), ], ]) ->add('merchantId', TextType::class, [ 'constraints' => [ new NotBlank([ 'groups' => 'coreshop', ]), ], ]) ->add('factory', TextType::class, [ 'data' => 'omnipay', 'empty_data' => 'omnipay' ]) ->add('type', TextType::class, [ 'data' => 'WorldPay\\\\Json', 'empty_data' => 'WorldPay\\\\Json' ]) ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { $data = $event->getData(); $data['payum.http_client'] = '@coreshop.payum.http_client'; }) ; } } Register into the container: services: app.form.type.gateway_configuration.worldpay: class: AppBundle\\Form\\Type\\WorldpayType tags: - { name: coreshop.gateway_configuration_type, type: omnipay_worldpay } - { name: form.type } Its important that it starts with omnipay_ here 2: Add ExtJs Form: pimcore.registerNS('coreshop.provider.gateways.omnipay_worldpay'); coreshop.provider.gateways.omnipay_worldpay = Class.create(coreshop.provider.gateways.abstract, { getLayout: function (config) { return [ { xtype: 'textfield', fieldLabel: t('coreshop_worldpay_service_key'), name: 'gatewayConfig.config.serviceKey', length: 255, value: config.serviceKey ? config.serviceKey : "" }, { xtype: 'textfield', fieldLabel: t('coreshop_worldpay_client_key'), name: 'gatewayConfig.config.clientKey', length: 255, value: config.clientKey }, { xtype: 'textfield', fieldLabel: t('coreshop_worldpay_merchant_id'), name: 'gatewayConfig.config.merchantId', length: 255, value: config.merchantId } ]; } }); Register JS File for CoreShop to be loaded: core_shop_payment: pimcore_admin: js: worldpay: \/bundles\/app\/pimcore\/static\/js\/payment\/provider\/worldpay.js Thats it, now you can create a new Payment Provider in the Backend and use Omnipay WorldPay as Payment Provider.","tags":"","url":"Development\/Payment\/Omnipay_Bridge.html"},{"title":"Payum Providers","text":"CoreShop Payum Providers Here is a list of all available Payum Payment Providers.","tags":"","url":"Development\/Payment\/Payum_Providers.html"},{"title":"Stores","text":"CoreShop Stores CoreShop Stores help you create a multi-store based eCommerce System with different Themes across these Stores. Create, Read, Update, Delete Store Context Theming","tags":"","url":"Development\/Stores\/index.html"},{"title":"CRUD","text":"CoreShop Stores Create If you want to create a Store via API, you can do following: $newStore = $container->get('coreshop.factory.store')->createNew(); Now you have a new Store, if you want to persist it, you need to do following: $container->get('coreshop.manager.store')->persist($newStore); $container->get('coreshop.manager.store')->flush(); You now have a new persisted Store. Read If you want to query for Stores, you can do following: $storeRepository = $container->get('coreshop.repository.store'); $queryBuilder = $storeRepository->createQueryBuilder('c'); \/\/ You can now create your query \/\/ And get the result $stores = $queryBuilder->getQuery()->getResult(); Update If you want to update and existing Store, you need to do following: \/\/ Fetch Store $store = $storeRepository->findById(1); $store->setName('Euro'); \/\/ And Persist it $container->get('coreshop.manager.store')->persist($store); $container->get('coreshop.manager.store')->flush(); Delete If you want to update and existing Store, you need to do following: \/\/ Fetch Store $store = $storeRepository->findById(1); \/\/ And Persist it $container->get('coreshop.manager.store')->remove($store); $container->get('coreshop.manager.store')->flush();","tags":"","url":"Development\/Stores\/CRUD.html"},{"title":"Context","text":"CoreShop Store Context For CoreShop to determine the current store the visitor or customer comes from it uses a concept called context and context resolver. Context Name Priority Tag Description FixedStoreContext 2 coreshop.context.store Used for testing purposes StoreContext 1 coreshop.context.store Load a store from given request resolver Resolver Name Priority Tag Description SiteBasedRequestResolver 100 coreshop.context.store.request_based.resolver Determines a store by a given pimcore frontend site PimcoreAdminSiteBasedRequestResolver 200 coreshop.context.store.request_based.resolver Determines a store by a given document in backend These resolver take care about finding the correct store for the current request. Create a Custom Resolver A Store Context needs to implement the interface CoreShop\\Component\\Store\\Context\\StoreContextInterface. This interface consists of one method called getStore which returns a CoreShop\\Component\\Store\\Model\\StoreInterface or throws an CoreShop\\Component\\Store\\Context\\StoreNotFoundException. To register your context, you need to use the tag coreshop.context.store with an optional priority attribute. Create a Request based Resolver CoreShop already implements Request based store context resolver. So if your context depends on the current request, you can create a custom RequestBased resolver. To do that, implement the interface CoreShop\\Component\\Store\\Context\\RequestBased\\RequestResolverInterface with the method findStore. This method either returns a store or null. To register this resolver, use the tag: coreshop.context.store.request_based.resolver with an optional priority attribute. Example We want to a StoreContext to be based on the Pimcore Document. So if we are on site \/de, we want to resolve to Store DE, if we are on page \/en we want to resolve to Store Store EN: 1: First of all we need to create our RequestBased Store Context: <?php namespace AppBundle\\CoreShop\\Store\\Context; use CoreShop\\Component\\Store\\Context\\RequestBased\\RequestResolverInterface; use CoreShop\\Component\\Store\\Repository\\StoreRepositoryInterface; use Pimcore\\Http\\Request\\Resolver\\DocumentResolver; use Symfony\\Component\\HttpFoundation\\Request; final class DocumentBasedRequestRequestResolver implements RequestResolverInterface { private StoreRepositoryInterface $storeRepository; public function __construct(StoreRepositoryInterface $storeRepository) { $this->storeRepository = $storeRepository; } public function findStore(Request $request): ?StoreInterface { if (substr($request->getPathInfo(), 0, 3) === '\/en') { return $this->storeRepository->find(1); } if (substr($request->getPathInfo(), 0, 3) === '\/de') { return $this->storeRepository->find(2); } return null; } } Now we need to configure the service in src\/AppBundle\/Resources\/config\/services.yml services: app.coreshop.store.context.request.document_based: class: AppBundle\\CoreShop\\Store\\Context\\DocumentBasedRequestRequestResolver arguments: - '@coreshop.repository.store' tags: - { name: coreshop.context.store.request_based.resolver, priority: 300 } CoreShop now tries to resolve the current Store based on the Pimcore Site we are on.","tags":"","url":"Development\/Stores\/Context.html"},{"title":"Theme","text":"CoreShop Stores Theming CoreShop Stores are designed to allow different Themes. Therefore you can have a true Multi-Store Environment with different Themes. CoreShop uses Sylius Theme Bundle for templates, read more at their docs on how it works: https:\/\/docs.sylius.com\/en\/1.9\/book\/themes\/themes.html","tags":"","url":"Development\/Stores\/Theme.html"},{"title":"Customers","text":"CoreShop Customer This guide should lead you through how CoreShop handles Customer Information. Create, Read, Update, Delete Customer Context Registration Service Registration Types Company Extension","tags":"","url":"Development\/Customers\/index.html"},{"title":"CRUD","text":"CoreShop Custom CoreShop uses Pimcore Data Objects to persist Customer Information. But, it adds a little wrapper around it to be mire dynamic and configurable. It uses a Factory and Repository Pattern to do that. Create If you want to create a new Custom, we need to get our Factory Service for that: $customerFactory = $container->get('coreshop.factory.customer'); $customer = $customerFactory->createNew(); No we have our customer and we can set all needed values. If you now want to save it, just call the save function $customer->save(); Read To get customers, you need to use the Repository Service CoreShop provides you. $repository = $container->get('coreshop.repository.customer'); \/\/ Query by ID $customerWithIdOne = $repository->findById(1); \/\/ Get a Listing how you know it from Pimcore $list = $repository->getList(); $list->setCondition("active = 1"); $customers = $list->getObjects(); Update Update works the same as you are used to in Pimcore $repository = $container->get('coreshop.repository.customer'); \/\/ Query by ID $customerWithIdOne = $repository->findById(1); \/\/ Change values $customerWithIdOne->setName('test'); $customerWithIdOne->save(); Delete Delete works the same as you are used to in Pimcore $repository = $container->get('coreshop.repository.customer'); \/\/ Query by ID $customerWithIdOne = $repository->findById(1); $customerWithIdOne->delete();","tags":"","url":"Development\/Customers\/CRUD.html"},{"title":"Context","text":"CoreShop Customer Context CoreShop Customer Security uses Symfony Firewall to handle authentication. CoreShop implemented a Context based Wrapper around that to be more flexible. Currently CoreShop implements these Contexts for Customer determination: Security Token Based Create a Custom Resolver A Store Context needs to implement the interface CoreShop\\Component\\Customer\\Context\\CustomerContextInterface. This interface consists of one function called "getCustomer" which returns a CoreShop\\Component\\Customer\\Model\\CustomerInterface or throws an CoreShop\\Component\\Customer\\Context\\CustomerNotFoundException To register your context, you need to use the tag: coreshop.context.customer with an optional priority attribute. The use case of changing this is quite rare. But if you need to, you can create a Custom Resolver if you wish.","tags":"","url":"Development\/Customers\/Context.html"},{"title":"Customer Manager","text":"CoreShop Customer Manager CoreShop already implements a Customer Manager which handles creating a Customer with Addresses. The Customer Manager implements the Interface CoreShop\\Bundle\\CoreBundle\\Customer\\CustomerManagerInterface and CoreShop implements it using the service coreshop.customer.manager. Usage To use the Service, you need to pass a Customer. In our example, we gonna do that from a Controller with a FormType. $customer = $this->getCustomer(); if ($customer instanceof CustomerInterface && null === $customer->getUser()) { return $this->redirectToRoute('coreshop_customer_profile'); } $form = $this->get('form.factory')->createNamed('customer', CustomerRegistrationType::class, $this->get('coreshop.factory.customer')->createNew()); $redirect = $this->getParameterFromRequest($request, '_redirect', $this->generateUrl('coreshop_customer_profile')); if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true)) { $form = $form->handleRequest($request); if ($form->isValid()) { $customer = $form->getData(); $customer->setLocaleCode($this->get('coreshop.context.locale')->getLocaleCode()); $this->get('coreshop.customer.manager')->persistCustomer($customer); return $this->redirect($redirect); } } return $this->render($this->templateConfigurator->findTemplate('Register\/register.html'), [ 'form' => $form->createView(), ]);","tags":"","url":"Development\/Customers\/Customer_Manager.html"},{"title":"Registration Types","text":"CoreShop Customer Registration Types By default, a customer needs to provide a unique and valid email address to pass a registration. Register By Email This is the default setting! To switch to registration by a unique and valid email address, you need set the identifier: core_shop_customer: login_identifier: 'email' Register By Username First, you need to make sure your customer object provides a username field. By default, coreshop does not install this field to prevent unnecessary confusion. To implement the username field, just open your class editor and add a text field called username and you're good to go! To switch to registration by a unique username, you need change the identifier: core_shop_customer: login_identifier: 'username' Security Form (Frontend) CoreShop comes with a preinstalled constraint which will tell your customer, if an email address or username - depending on your settings - is valid or not. Backend \/ API Plus, if you're going to update a customer by API or Backend, coreshop also checks if your customer entity has unique data. Note: Both checks only apply to non-guest entities!","tags":"","url":"Development\/Customers\/Registration_Types.html"},{"title":"Company Extension","text":"CoreShop Customer Company Extension The Company Entity allows you to append customers to a given company. After a customer has been connected to a company by using the 1to1 relation company, it's possible to share addresses between company and the self-assigned addresses. Access Types Note! This is only available if a customer already is connected to a valid company! Own Only If set, the customer can create, edit and delete own addresses and choose them in checkout as well. This is the default behaviour. Company Only If set, the customer can create, edit und delete company addresses and choose them in checkout as well. He's not able to add addresses to himself. Own And Company If set, the customer can create, edit and delete company and private addresses and choose them in checkout as well. Plus, the own_and_company mode allows the customer to define and modify the allocation of the address. To do so, coreshop renders an additional choice type to the address creation\/modification form. Note: If a customer switches the allocation after it has been created, the address also physically gets moved to its desired location. In this example, the customer changes the allocation from own to company: Before: - company A - addresses - customer A - addresses - address A After: - company A - addresses - address A - customer A - addresses Read more about this feature here.","tags":"","url":"Development\/Customers\/Company_Extension.html"},{"title":"Ecommerce Tracking","text":"CoreShop eCommerce Tracking CoreShop currently implements Tracking for Analytics and Google Tag Manager. Tracking is automatically available (but not enabled), as soon as you enable Tag Manager or Analytics in Pimcore. Per default configuration, all the ecommerce trackers are disabled. You need to enable them manually. Available Trackers google-analytics-enhanced-ecommerce google-analytics-universal-ecommerce google-gtag-enhanced-ecommerce google-gtm-classic-ecommerce google-gtm-enhanced-ecommerce matomo (piwik) Enabling Trackers core_shop_tracking: trackers: google-analytics-enhanced-ecommerce: enabled: false google-analytics-universal-ecommerce: enabled: false google-gtag-enhanced-ecommerce: enabled: false google-gtm-classic-ecommerce: enabled: false google-gtm-enhanced-ecommerce: enabled: false matomo: enabled: true External Google Enhanced E-Commerce Google Enhanced E-Commerce with gtag.js Google Tag Manager Enhanced E-Commerce Google Tag Manager Classic E-Commerce Matomo (Piwik) E-Commerce Actions Product Impression $this->get('coreshop.tracking.manager')->trackProductImpression($product); Product View $this->get('coreshop.tracking.manager')->trackProduct($product); Product Action Add from Cart $this->get('coreshop.tracking.manager')->trackCartAdd($cart, $product); Product Action Remove from Cart $this->get('coreshop.tracking.manager')->trackCartRemove($cart, $product); Checkout Step $this->get('coreshop.tracking.manager')->trackCheckoutStep($cart, $stepIdentifier, $isFirstStep, $checkoutOption) Checkout Complete $this->get('coreshop.tracking.manager')->trackCheckoutComplete($order) Add a custom Tracker To add a custom tracker you need to implement the interface CoreShop\\Component\\Tracking\\Tracker\\TrackerInterface app.tracking.tracker.my_tracker: class: AppBundle\\Tracker\\CustomTracker parent: coreshop.tracking.tracker.ecommerce_tracker tags: - { name: coreshop.tracking.tracker, type: app-custom-tracker } Google Tag Manager If you have enabled the gtm in backend, CoreShop sends some data to a dataLayer object which submits the object to gtm. GTM Classic eCommerce If you enable the classic mode only the order gets submitted if user has successfully reached the "thank-you" page. GTM Enhanced eCommerce There are six Impressions\/Events for Google Tag Manager Enhanced eCommerce: Product Impression Tag Config Example: Tag type : Universal Analytics Track type : Pageview Enable Enhanced Ecommerce Features: true Use Data Layer: true Trigger: event equals gtm.dom Product Detail View Tag Config Example: Tag type : Universal Analytics Track type : Pageview Enable Enhanced Ecommerce Features: true Use Data Layer: true Trigger: event equals gtm.dom Checkout Step: Event-Name: csCheckout Tag Config Example: Tag type : Universal Analytics Track type : Event Event Category: Ecommerce Event Action: Checkout Enable Enhanced Ecommerce Features: true Use Data Layer: true Trigger: event equals csCheckout Checkout Complete (Purchase): Tag Config Example: Tag type : Universal Analytics Track type : Pageview Enable Enhanced Ecommerce Features: true Use Data Layer: true Trigger: event equals gtm.dom Remove Item from Cart Event-Name: csRemoveFromCart Tag Config Example: Tag type : Universal Analytics Track type : Event Event Category: Ecommerce Event Action: Remove from Cart Enable Enhanced Ecommerce Features: true Use Data Layer: true Trigger: event equals csRemoveFromCart Add Item to Cart Event-Name: csAddToCart Tag Config Example: Tag type : Universal Analytics Track type : Event Event Category: Ecommerce Event Action: Add to Cart Enable Enhanced Ecommerce Features: true Use Data Layer: true Trigger: event equals csAddToCart","tags":"","url":"Development\/Ecommerce_Tracking\/index.html"},{"title":"Events","text":"CoreShop Events CoreShop comes with a lot of build-in events. Frontend Controller Name EventType Description coreshop.customer.update_post ResourceControllerEvent Fires after Customer has updated the profile coreshop.customer.change_password_post ResourceControllerEvent Fires after Customer has changed the password coreshop.customer.newsletter_confirm_post ResourceControllerEvent Fires after Customer has confirmed his newsletter subscription coreshop.address.add_post ResourceControllerEvent Fires after Customer has added a new address coreshop.address.update_post ResourceControllerEvent Fires after Customer has updated a address coreshop.address.delete_pre ResourceControllerEvent Fires before Customer deletes a address Cart Name EventType Description coreshop.cart.update GenericEvent Fires after cart has been updated coreshop.cart.pre_add_item GenericEvent Fires before a item gets added to cart coreshop.cart.post_add_item GenericEvent Fires after a item gets added to cart coreshop.cart.pre_remove_item GenericEvent Fires before a item gets removed from cart coreshop.cart.post_remove_item GenericEvent Fires after a item gets removed from cart Customer Name EventType Description coreshop.customer.register CustomerRegistrationEvent Fires after a new customer has been generated coreshop.customer.request_password_reset RequestPasswordChangeEvent Fires after password reset has been requested coreshop.customer.password_reset GenericEvent Fires after new password hast been applied to customer Order Document Name EventType Description coreshop.order.shipment.wkhtml.options WkhtmlOptionsEvent Options Event: Use it to change wkhtml options. coreshop.order.invoice.wkhtml.options WkhtmlOptionsEvent Options Event: Use it to change wkhtml options. Payment Name EventType Description coreshop.payment_provider.supports PaymentProviderSupportsEvent Support Event: Use it to modify available Payment Providers Notes Name EventType Description coreshop.note.*.post_add GenericEvent Fires after a note of type * has been created coreshop.note.*.post_delete GenericEvent Fires after a note of type * has been deleted Rules Name EventType Description coreshop.rule.availability_check RuleAvailabilityCheckEvent Fires in RuleAvailabilityCheck maintenance\/command for every active rule. Replace symbol (*) with one of those note types: payment update_order update_order_item email order_comment Workflow Name EventType Description coreshop.workflow.valid_transitions WorkflowTransitionEvent Valid Event: Use it if you need to extend the workflow transitions Transformer Name EventType Description coreshop.quote_item.pre_transform GenericEvent Fires before proposal item gets transformed to a quote item coreshop.quote_item.post_transform GenericEvent Fires after proposal item has been transformed to a quote item coreshop.order_item.pre_transform GenericEvent Fires before proposal item gets transformed to a order item coreshop.order_item.post_transform GenericEvent Fires after proposal item has been transformed to a order item coreshop.quote.pre_transform GenericEvent Fires before proposal gets transformed to a quote coreshop.quote.post_transform GenericEvent Fires after proposal has been transformed to a quote coreshop.order.pre_transform GenericEvent Fires before proposal gets transformed to a order coreshop.order.post_transform GenericEvent Fires after proposal has been transformed to a order coreshop.shipment_item.pre_transform GenericEvent Fires before proposal item gets transformed to a shipment item coreshop.shipment_item.post_transform GenericEvent Fires after proposal item has been transformed to a shipment item coreshop.shipment.pre_transform GenericEvent Fires before proposal gets transformed to a shipment coreshop.shipment.post_transform GenericEvent Fires after proposal has been transformed to a shipment coreshop.invoice.pre_transform GenericEvent Fires before proposal gets transformed to a invoice coreshop.invoice.post_transform GenericEvent Fires after proposal has been transformed to a invoice Backend Controller Name EventType Description coreshop.*.pre_create ResourceControllerEvent Fires before object gets created in backend coreshop.*.post_create ResourceControllerEvent Fires after object gets created in backend coreshop.*.pre_save ResourceControllerEvent Fires before object gets saved in backend coreshop.*.post_save ResourceControllerEvent Fires after object gets saved in backend coreshop.*.pre_delete ResourceControllerEvent Fires before object gets deleted in backend coreshop.*.post_delete ResourceControllerEvent Fires after object gets deleted in backend Replace symbol (*) with one of those controller: configuration payment_provider exchange_rate filter index notification_rule notification_rule cart_price_rule product_price_rule shipping_rule store tax_rule_group Workflow Events There are events vor every state machine transition. Read more about it here. Model Events You can use Pimcore Events for CoreShops Pimcore Models: Pimcore Events","tags":"","url":"Development\/Events\/index.html"},{"title":"Store Front","text":"CoreShop Store Front The CoreShop Store Front (FrontendBundle) comes with a default implementation and is designed to show you how to work with the CoreShop Framework. Controllers","tags":"","url":"Development\/Store_Front\/index.html"},{"title":"Controllers","text":"CoreShop Store Front Controller If you use CoreShop FrontendBundle, you can change the Controllers it uses. Simply change the configuration for the controller: core_shop_frontend: controllers: index: CoreShop\\Bundle\\FrontendBundle\\Controller\\IndexController register: CoreShop\\Bundle\\FrontendBundle\\Controller\\RegisterController customer: CoreShop\\Bundle\\FrontendBundle\\Controller\\CustomerController currency: CoreShop\\Bundle\\FrontendBundle\\Controller\\CurrencyController language: CoreShop\\Bundle\\FrontendBundle\\Controller\\LanguageController search: CoreShop\\Bundle\\FrontendBundle\\Controller\\SearchController cart: CoreShop\\Bundle\\FrontendBundle\\Controller\\CartController checkout: CoreShop\\Bundle\\FrontendBundle\\Controller\\CheckoutController category: CoreShop\\Bundle\\FrontendBundle\\Controller\\CategoryController product: CoreShop\\Bundle\\FrontendBundle\\Controller\\ProductController quote: CoreShop\\Bundle\\FrontendBundle\\Controller\\QuoteController security: CoreShop\\Bundle\\FrontendBundle\\Controller\\SecurityController payment: CoreShop\\Bundle\\PayumBundle\\Controller\\PaymentController Example of using a Custom ProductController 1: Add a new Controller and inherit from the FrontendController <?php namespace AppBundle\\Controller; use CoreShop\\Component\\Core\\Model\\ProductInterface; use Symfony\\Component\\HttpFoundation\\Request; class ProductController extends \\CoreShop\\Bundle\\FrontendBundle\\Controller\\ProductController { public function detailAction(Request $request) { \/\/Do whatever you want in here return parent::detailAction($request); } } 2: Change Configuration of the Controller: core_shop_frontend: controllers: product: AppBundle\\Controller\\ProductController","tags":"","url":"Development\/Store_Front\/Controllers.html"},{"title":"State Machine","text":"CoreShop State Machine The CoreShop State Machine is a important core feature which allows to determinate complex workflows securely and in a most modern way. Unlike the most eCommerce Frameworks out there, CoreShop does not work with the messy and hard do extend "state\/status" concept. Every order-section and of course the order itself provides its own state machine which allows us to build a super strong state workflow. Places In State Machine context, the well-known "Status" Property is called "Places". Every Workflow comes with a pre-defined set of Places. Transition To change the Place of a workflow we need to apply a transition. If the transition is valid the new place gets stored. Callbacks There are several events for each transition which can be also extend by every project. Example:: If all order payments has been successfully transformed to the completed place, the coreshop_order_payment workflow will automatically change to paid. Workflows There are seven implemented Workflows: coreshop_order coreshop_order_payment coreshop_order_shipment coreshop_order_invoice coreshop_payment coreshop_shipment coreshop_invoice Workflows are connected among themselves so every transition will trigger another Workflow and so on. If a transition has been dispatched, it cannot be transformed back unless it has been defined in the available transitions. So let's start: Available Workflows Create Callbacks Things to Know (!) Extend Workflows","tags":"","url":"Development\/State_Machine\/index.html"},{"title":"Available Workflows","text":"CoreShop State Machine - Available Workflows Order Sale Workflow In CoreShop 3.x the Cart, Order and Quote are the same DataObject. To differentiate between them, we use states with workflows. State Machine: coreshop_order_sales_type Available Places Name Description cart Initial State - Cart order Once the customer finishes the checkout, pre-payment, it becomes an order quote Once the customer finishes the checkout and requests a quote Available Transition Name Allowed from Places order cart cart cart quote cart Order Workflow State Machine: coreshop_order Description: The Order Workflow is the most simplest and also the most important one. Available Places Name Description initialized Initial State. Just before a order gets saved for the very first time. new a new order has been created confirmed customer has successfully placed an order cancelled order has been cancelled complete the order is complete (all payments and shipments have been successfully processed) Available Transition Name Allowed from Places create initialized confirm new cancel new, confirmed complete confirmed Visualization Order Payment Workflow State Machine: coreshop_order_payment Description: Defines the summary payment state Available Places Name Description new order has been initial created awaiting_payment a payment has been captured partially_paid one of the order payments has been paid cancelled all payments has been cancelled paid all order payments successfully paid partially_refunded one of the order payments has been refunded refunded all payments has been refunded Available Transition Name Allowed from Places request_payment new partially_pay awaiting_payment, partially_paid cancel awaiting_payment partially_refund paid, partially_paid, partially_refunded refund paid, partially_paid, partially_refunded Visualization Order Shipment Workflow State Machine: coreshop_order_shipment Description: Defines the summary shipment state Available Places Name Description new order has been initial created cancelled all shipments has been cancelled partially_shipped one of the order shipments has been shipped shipped all order shipments has been shipped Available Transition Name Allowed from Places partially_ship new cancel new ship new, partially_shipped Visualization Order Invoice Workflow State Machine: coreshop_order_invoice Description: Defines the summary invoice state Available Places Name Description new order has been initial created cancelled all invoices has been cancelled partially_invoiced one of the order invoices has been invoiced invoiced all order invoices has been successfully invoiced Available Transition Name Allowed from Places cancel new partially_invoice new invoice new, partially_invoiced Visualization Payment Workflow State Machine: coreshop_payment Description: Defines the single payment state Available Places Name Description new new payment has been created processing payment has been captured completed payment is complete failed payment has failed cancelled payment has been canceled refunded payment has been refunded Available Transition Name Allowed from Places process new complete new, processing fail new, processing cancel new, processing refund completed Visualization Shipment Workflow State Machine: coreshop_shipment Description: Defines the single shipment state Available Places Name Description new new shipment has been created ready shipment has been assigned to order cancelled shipment has been cancelled shipped shipment has been shipped Available Transition Name Allowed from Places create new ship ready cancel ready Visualization Invoice Workflow State Machine: coreshop_invoice Description: Defines the single invoice state Available Places Name Description new new invoice has been created ready invoice has been assigned to order cancelled invoice has been cancelled complete invoice has been completed Available Transition Name Allowed from Places create new cancel ready complete ready Visualization","tags":"","url":"Development\/State_Machine\/Available_Workflows.html"},{"title":"Create Callbacks","text":"CoreShop State Machine - Callbacks It's really simple to create a custom state machine callback. After Callbacks In this example we want to register a simple listener which gets triggered after a customer successfully placed a order: core_shop_workflow: state_machine: coreshop_order: callbacks: after: do_something_special: on: ['confirm'] do: ['@AppBundle\\EventListener\\SpecialListener', 'doSomething'] args: ['object'] priority: -10 # fire action early! Name Description on transition name do service and method to dispatch args object or event. Object type depends on state machine type. priority set priority. default is 0 And your Service: <?php namespace AppBundle\\EventListener; use CoreShop\\Component\\Core\\Model\\CustomerInterface; use CoreShop\\Component\\Core\\Model\\OrderInterface; final class SpecialListener { \/** * @param OrderInterface $order *\/ public function doSomething(OrderInterface $order) { \/** @var CustomerInterface $customer *\/ $customer = $order->getCustomer(); \/** @var string $locale *\/ $locale = $order->getLocaleCode(); \/\/ your very special code. } } Before Callbacks In this example we want to register a simple listener which gets triggered before a the shipment transaction ready gets applied: core_shop_workflow: state_machine: coreshop_shipment: callbacks: before: check_something: on: ['create'] do: ['@AppBundle\\EventListener\\SpecialListener', 'checkSomething'] args: ['object'] priority: 0 Name Description on transition name do service and method to dispatch args object or event. Object type depends on state machine type. priority set priority. default is 0 As you can see in the class below, the checkSomething() method throws an exception. This prevents the state machine from switching to the ready state. Just remove the exception and the transition gets applied as expected. <?php namespace AppBundle\\EventListener; use CoreShop\\Component\\Core\\Model\\OrderShipmentInterface; final class SpecialListener { \/** * @param OrderShipmentInterface $shipment *\/ public function checkSomething(OrderShipmentInterface $shipment) { \/\/ check something and throw an exeption throw new \\Exception('something is wrong...'); } }","tags":"","url":"Development\/State_Machine\/Create_Callbacks.html"},{"title":"Things To Know","text":"CoreShop State Machine - Important Things to Know Canceling Orders Within the CoreShop workflow architecture a lot of orders may stay forever in the new or confirmed state. CoreShop will automatically cancel orders older than 20 days under following conditions: Order creationDate >= 20 days ago Order State is initialized or new or confirmed Order Payment State is not paid Read more about automation here. Expire Orders via Backend There is also a cancel button in the order detail section. Expire Orders via Command There is also a command for that: $ coreshop:order:expire Change Orders Expiration Date core_shop_order: expiration: order: days: 30","tags":"","url":"Development\/State_Machine\/Things_To_Know.html"},{"title":"Extend Workflows","text":"CoreShop State Machine - Extend Workflows It's possible to extend all available CoreShop Workflow. Example A: Extend Shipment Workflow Workflow Configuration core_shop_workflow: state_machine: coreshop_shipment: # define a new place "reviewed" places: - reviewed # define a new transition "review" transitions: review: from: [new, ready] to: reviewed # add some colors for better ux place_colors: reviewed: '#2f819e' transition_colors: review: '#2f819e' Add translations Just use the Pimcore Backend\/Frontend translation or just add it via default symfony translation context: # app\/Resources\/translations\/admin.en.yml coreshop_workflow_transition_coreshop_shipment_review: 'Review' coreshop_workflow_state_coreshop_shipment_reviewed: 'Reviewed' # app\/Resources\/translations\/messages.en.yml coreshop.ui.workflow.state.coreshop_shipment.reviewed: 'Shipment under Review' Inform CoreShop about new Transition of Shipment Workflow Not all transitions should be available in backend. To allow the transition to show up, you need to implement a simple event listener: # app\/config\/services AppBundle\\EventListener\\WorkflowListener: autowire: true tags: - { name: kernel.event_listener, event: coreshop.workflow.valid_transitions, method: parseTransitions} <?php namespace AppBundle\\EventListener; use CoreShop\\Bundle\\OrderBundle\\Event\\WorkflowTransitionEvent; class WorkflowListener { public function parseTransitions(WorkflowTransitionEvent $event) { $workflowName = $event->getWorkflowName(); if($workflowName === 'coreshop_shipment') { $event->addAllowedTransitions(['review']); } } } Example B: Change default Transition Behaviour of Shipment Workflow Note: Be careful while changing transitions. Test your application if a workflow still runs smoothly after changing it! In this example we want to change the default shipping behavior. Workflow before: ready -> shipped -> cancelled Workflow after: ready -> reviewed -> shipped -> cancelled Workflow Configuration core_shop_workflow: state_machine: coreshop_shipment: # define a new place "reviewed" places: - reviewed # define a new transition "review" transitions: review: from: [ready] to: reviewed # override the default "ship" transition # which only allows [ready] as valid "from" dispatcher ship: from: [reviewed] to: shipped # add some colors for better ux place_colors: reviewed: '#2f819e' transition_colors: review: '#2f819e' Example C: Callback Listener If you need to implement some further business logic after the coreshop_shipment state has changed to reviewed you need to define a callback: Note: Please make sure your service is public available! core_shop_workflow: state_machine: coreshop_shipment: callbacks: after: do_something_after_review: on: ['review'] do: ['@your_service', 'yourAction'] # in this context, "object" is the shipment item args: ['object'] priority: -10 # fire action early!","tags":"","url":"Development\/State_Machine\/Extend_Workflows.html"},{"title":"Inventory","text":"CoreShop Inventory Twig Helper There are some Helpers to check the product inventory. Inventory Available {% if coreshop_inventory_is_available(product) %} {# show cart button since there is at least one item available #} {% endif %} Inventory is Sufficient {% if coreshop_inventory_is_sufficient(product, 10) %} {# do something here since there are at least 10 items available #} {% endif %}","tags":"","url":"Development\/Inventory\/index.html"},{"title":"SEO","text":"CoreShop SEO Usage","tags":"","url":"Development\/SEO\/index.html"},{"title":"Currency Fractions","text":"CoreShop Fraction Digits CoreShop allows you working with more than 2 digits for Currency Values. The default configuration looks like this: core_shop_currency: money_decimal_precision: 2 money_decimal_factor: 100 money_decimal_precision: 2 Having a global precision of 2 money_decimal_factor: 100 Displaying Currency with a factor of 100 (in Pimcore Backend). WARNING If you change these settings in an existing Installation with Orders\/Products etc. you also have to create a migration to change all the values from a precision of 2 to your new setting. In order to handle payment values with a precision of for example 4, we introduced a new Order Property called paymentTotal. Within a Payment, you cannot deal with a precision > 2, since a currency only has eg. 100 Cents. Therefore, we round the total Cart\/Order value to a precision of 2 into the paymentTotal Value. For example: Your Cart\/Order is "\u20ac 1.000,5498", your payment total then is: "\u20ac 1.000,55". If you want to display the payment total in your cart, you can use this template: {% if currency.convertAndFormat(cart.total) != currency.convertAndFormat(cart.paymentTotal, 2, 100) %} <tr> <td class="text-right" colspan="3"> <strong>{{ 'coreshop.ui.payment_total'|trans }}:<\/strong> <\/td> <td colspan="2" class="text-right cart-total-payment-price"> {{ currency.convertAndFormat(cart.paymentTotal, 2, 100) }} <\/td> <\/tr> {% endif %} c","tags":"","url":"Development\/Currency_Fractions\/index.html"}]} \ No newline at end of file From c38d2550884a7eb7adeaedac23502db985b105bf Mon Sep 17 00:00:00 2001 From: Dominik Pfaffenbauer Date: Tue, 25 Apr 2023 13:21:57 +0200 Subject: [PATCH 19/19] [Docs] don't ignore images --- .gitignore | 3 ++- docs/config.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c8e7e9afeb..970efbc2a7 100644 --- a/.gitignore +++ b/.gitignore @@ -56,4 +56,5 @@ public/bundles public/var drivers vendor/ -cache/ \ No newline at end of file +cache/ +docs/generated-docs \ No newline at end of file diff --git a/docs/config.json b/docs/config.json index e47535ae64..76463f3c28 100644 --- a/docs/config.json +++ b/docs/config.json @@ -8,7 +8,7 @@ "processor": "", "ignore": { "files": ["generate-api.sh", "generate-docs.sh", "generate-docs-local.sh", "config.json", "composer.json", "composer.lock"], - "folders": ["vendor", "themes", "generated_docs", "img"] + "folders": ["vendor", "themes", "generated_docs"] }, "timezone": "Europe/Vienna", "live": {