custom/plugins/LenzPlatformCustomerDiscount/src/LenzPlatformCustomerDiscount.php line 17

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace LenzPlatformCustomerDiscount;
  3. use Doctrine\DBAL\Connection;
  4. use Shopware\Core\Framework\Context;
  5. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  8. use Shopware\Core\Framework\Plugin;
  9. use Shopware\Core\Framework\Plugin\Context\InstallContext;
  10. use Shopware\Core\Framework\Plugin\Context\UninstallContext;
  11. use Shopware\Core\Framework\Plugin\Context\UpdateContext;
  12. use Shopware\Core\System\CustomField\Aggregate\CustomFieldSet\CustomFieldSetEntity;
  13. use Shopware\Core\System\CustomField\CustomFieldTypes;
  14. class LenzPlatformCustomerDiscount extends Plugin
  15. {
  16.     public function install(InstallContext $installContext): void
  17.     {
  18.         foreach($this->customFieldSets as $key => $val) {
  19.             $this->createOrUpdateCustomFields($key);
  20.         }
  21.     }
  22.     public function update(UpdateContext $updateContext): void
  23.     {
  24.         foreach($this->customFieldSets as $key => $val) {
  25.             $this->createOrUpdateCustomFields($key);
  26.         }
  27.     }
  28.     public function uninstall(UninstallContext $context): void
  29.     {
  30.         if (!$context->keepUserData()) {
  31.             $connection $this->container->get(Connection::class);
  32.             $tablesToDelete = [
  33.             ];
  34.             foreach ($tablesToDelete as $table) {
  35.                 try {
  36.                     $connection->executeStatement('DROP TABLE IF EXISTS `' $table '`');
  37.                 } catch(\Exception $e) {
  38.                     echo "Table \"" $table "\" not deleted.\n\r";
  39.                 }
  40.             }
  41.             $customFieldsToRemoveFromDb = [
  42.                 'product_translation' => [
  43.                     'lenz_customer_discount_product_exclude_from_discount',
  44.                 ],
  45.                 'customer' => [
  46.                     'lenz_customer_discount_customer_discount_percent',
  47.                 ],
  48.             ];
  49.             foreach ($customFieldsToRemoveFromDb as $table => $fields) {
  50.                 foreach ($fields as $field) {
  51.                     $connection->executeStatement('UPDATE `' $table '` SET custom_fields = JSON_REMOVE(`' $table '`.custom_fields, "$.' $field '");');
  52.                 }
  53.             }
  54.             foreach($this->customFieldSets as $key => $val) {
  55.                 $this->deleteCustomFieldSet($key);
  56.             }
  57.         }
  58.     }
  59.     // -- Custom fields
  60.     private array $customFieldSets = [
  61.         'lenz_customer_discount_customer' => [
  62.             'name' => 'lenz_customer_discount_customer',
  63.             'config' => [
  64.                 'label' => [
  65.                     'en-GB' => 'Customer Discount',
  66.                     'de-DE' => 'Kundenindividuelle Rabatte',
  67.                 ],
  68.             ],
  69.             'relations' => [
  70.                 ['entityName' => 'customer']
  71.             ],
  72.             'customFields' => [
  73.                 [
  74.                     'name' => 'lenz_customer_discount_customer_discount_percent',
  75.                     'type' => CustomFieldTypes::FLOAT,
  76.                     'config' => [
  77.                         'label' => [
  78.                             'en-GB' => 'Discount in %',
  79.                             'de-DE' => 'Rabatt in %'
  80.                         ],
  81.                         'customFieldPosition' => 100,
  82.                     ],
  83.                 ],
  84.             ],
  85.         ],
  86.         'lenz_customer_discount_product' => [
  87.             'name' => 'lenz_customer_discount_product',
  88.             'config' => [
  89.                 'label' => [
  90.                     'en-GB' => 'Customer Discount',
  91.                     'de-DE' => 'Kundenindividuelle Rabatte',
  92.                 ],
  93.             ],
  94.             'relations' => [
  95.                 ['entityName' => 'product']
  96.             ],
  97.             'customFields' => [
  98.                 [
  99.                     'name' => 'lenz_customer_discount_product_exclude_from_discount',
  100.                     'type' => CustomFieldTypes::BOOL,
  101.                     'config' => [
  102.                         'label' => [
  103.                             'en-GB' => 'Exclude from discount',
  104.                             'de-DE' => 'Von Rabatt ausschließen'
  105.                         ],
  106.                         'customFieldPosition' => 100,
  107.                     ],
  108.                 ],
  109.             ],
  110.         ],
  111.     ];
  112.     private function findCustomFieldSet($name): ?CustomFieldSetEntity
  113.     {
  114.         /** @var EntityRepositoryInterface $customFieldSetRepository */
  115.         $customFieldSetRepository $this->container->get('custom_field_set.repository');
  116.         $criteria = new Criteria();
  117.         $criteria->addFilter(new EqualsFilter('name'$name));
  118.         $criteria->addAssociation('customFields');
  119.         $criteria->addAssociation('relations');
  120.         /** @var CustomFieldSetEntity|null $customFieldSet */
  121.         return $customFieldSetRepository->search($criteriaContext::createDefaultContext())->first();
  122.     }
  123.     public function createOrUpdateCustomFields($name)
  124.     {
  125.         /** @var EntityRepositoryInterface $customFieldSetRepository */
  126.         $customFieldSetRepository $this->container->get('custom_field_set.repository');
  127.         $customFieldSet $this->findCustomFieldSet($name);
  128.         $customFieldSetId null;
  129.         $customFieldName2Id = [];
  130.         $relationEntity2Id = [];
  131.         if(!empty($customFieldSet)) {
  132.             $customFieldSetId $customFieldSet->getId();
  133.             foreach ($customFieldSet->getCustomFields() as $customField) {
  134.                 $customFieldName2Id[$customField->getName()] = $customField->getId();
  135.             }
  136.             foreach ($customFieldSet->getRelations() as $relation) {
  137.                 $relationEntity2Id[$relation->getEntityName()] = $relation->getId();
  138.             }
  139.         }
  140.         $customFieldSet $this->customFieldSets[$name];
  141.         $customFieldSet['id'] = $customFieldSetId;
  142.         foreach ($customFieldSet['customFields'] as $customFieldKey => $customField) {
  143.             if(!array_key_exists($customField['name'], $customFieldName2Id)) {
  144.                 continue;
  145.             }
  146.             $customFieldSet['customFields'][$customFieldKey]['id'] = $customFieldName2Id[$customField['name']];
  147.         }
  148.         foreach ($customFieldSet['relations'] as $relationKey => $relation) {
  149.             if(!array_key_exists($relation['entityName'], $relationEntity2Id)) {
  150.                 continue;
  151.             }
  152.             $customFieldSet['relations'][$relationKey]['id'] = $relationEntity2Id[$relation['entityName']];
  153.         }
  154.         $customFieldSetRepository->upsert(
  155.             [ $customFieldSet ],
  156.             Context::createDefaultContext()
  157.         );
  158.     }
  159.     private function deleteCustomFieldSet(string $name)
  160.     {
  161.         /** @var EntityRepositoryInterface $customFieldSetRepository */
  162.         $customFieldSetRepository $this->container->get('custom_field_set.repository');
  163.         $customFieldSet $this->findCustomFieldSet($name);
  164.         if ($customFieldSet === null) {
  165.             return;
  166.         }
  167.         $customFieldSetRepository->delete(
  168.             [
  169.                 ['id' => $customFieldSet->getId()],
  170.             ],
  171.             Context::createDefaultContext()
  172.         );
  173.     }
  174. }