custom/plugins/SystemIntegration/src/Subscribers/ProductImportExportSubscriber.php line 107

Open in your IDE?
  1. <?php
  2. namespace Virgin\SystemIntegration\Subscribers;
  3. use Exception;
  4. use Shopware\Core\Content\ImportExport\Event\EnrichExportCriteriaEvent;
  5. use Shopware\Core\Content\ImportExport\Event\ImportExportAfterImportRecordEvent;
  6. use Shopware\Core\Content\ImportExport\Event\ImportExportBeforeExportRecordEvent;
  7. use Shopware\Core\Content\ImportExport\Event\ImportExportBeforeImportRecordEvent;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
  11. use \Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Virgin\SystemIntegration\Services\Import\Product\ProductImporter;
  13. class ProductImportExportSubscriber implements EventSubscriberInterface
  14. {
  15. const VIRGIN_SUBSCRIPTION_PROFILE = 'virgin_subscription';
  16. /** @var ProductImporter */
  17. private $productImporter;
  18. /** @var string */
  19. private $salesChannelId;
  20. public function __construct(
  21. ProductImporter $productImporter
  22. ) {
  23. $this->productImporter = $productImporter;
  24. $this->salesChannelId = $productImporter->getSalesChannelId();
  25. }
  26. /**
  27. * @inheritDoc
  28. */
  29. public static function getSubscribedEvents(): array
  30. {
  31. return [
  32. ImportExportBeforeImportRecordEvent::class => 'beforeImportRecord',
  33. ImportExportBeforeExportRecordEvent::class => 'beforeExportRecord',
  34. ImportExportAfterImportRecordEvent::class => 'afterImportRecord',
  35. EnrichExportCriteriaEvent::class => 'enrichExportCriteria'
  36. ];
  37. }
  38. public function afterImportRecord(ImportExportAfterImportRecordEvent $event): void
  39. {
  40. if ($event->getConfig()->get('sourceEntity') !== 'product') {
  41. return;
  42. }
  43. $record = $event->getRecord();
  44. $row = $event->getRow();
  45. $context = $event->getContext();
  46. $productId = $record['id'] ?? null;
  47. if ($productId === null) {
  48. return;
  49. }
  50. $translationData = [
  51. 'meta_title_eng' => $row['Meta title eng'] ?? null,
  52. 'meta_title_ita' => $row['Meta title ita'] ?? null,
  53. 'meta_title_deu' => $row['Meta title deu'] ?? null,
  54. 'meta_description_eng' => $row['Meta description eng'] ?? null,
  55. 'meta_description_ita' => $row['Meta description ita'] ?? null,
  56. 'meta_description_deu' => $row['Meta description deu'] ?? null,
  57. ];
  58. $this->productImporter->upsertProductTranslations($productId, $record['name'], $translationData, $context);
  59. }
  60. /**
  61. * @param ImportExportBeforeImportRecordEvent $event
  62. * @throws Exception
  63. */
  64. public function beforeImportRecord(ImportExportBeforeImportRecordEvent $event): void
  65. {
  66. if ($event->getConfig()->get('sourceEntity') !== 'product') {
  67. return;
  68. }
  69. $context = $event->getContext();
  70. $row = $event->getRow();
  71. $record = [];
  72. foreach ($event->getConfig()->getMapping()->getElements() as $element){
  73. $record[$element->getKey()] = $row[$element->getMappedKey()];
  74. }
  75. try {
  76. if ($event->getConfig()->get('profileName') === self::VIRGIN_SUBSCRIPTION_PROFILE) {
  77. $record = $this->productImporter->convertSubscriptionToProduct($record, $this->salesChannelId);
  78. }
  79. } catch (\Exception $e){
  80. $record['_error'] = $e;
  81. }
  82. $event->setRecord($record);
  83. }
  84. /**
  85. * @param ImportExportBeforeExportRecordEvent $event
  86. * @return void
  87. * @throws Exception
  88. */
  89. public function beforeExportRecord(ImportExportBeforeExportRecordEvent $event): void
  90. {
  91. if ($event->getConfig()->get('sourceEntity') !== 'product') {
  92. return;
  93. }
  94. $record = $event->getRecord();
  95. if (isset($record['_error'])){
  96. return;
  97. }
  98. $originalRecord = $event->getOriginalRecord();
  99. if ($event->getConfig()->get('profileName') == self::VIRGIN_SUBSCRIPTION_PROFILE) {
  100. $record = $this->productImporter->convertProductToSubscription($originalRecord, $record);
  101. }
  102. $event->setRecord($record);
  103. }
  104. public function enrichExportCriteria(EnrichExportCriteriaEvent $event)
  105. {
  106. $criteria = $event->getCriteria();
  107. if ($event->getLogEntity()->getProfile()->getName() == self::VIRGIN_SUBSCRIPTION_PROFILE && $event->getLogEntity()->getActivity() == "export") {
  108. $criteria->addFilter(new NotFilter(MultiFilter::CONNECTION_AND, [new ContainsFilter('productNumber', 'SW')]));
  109. }
  110. $event->setCriteria($criteria);
  111. }
  112. }