custom/plugins/EmcgnGewerbeschein/src/Resources/Subscriber/TradelicenseData.php line 50

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace EmcgnGewerbeschein\Resources\Subscriber;
  3. use Shopware\Core\Content\Media\File\FileSaver;
  4. use Shopware\Core\Content\Media\File\MediaFile;
  5. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  9. use Shopware\Core\Framework\Uuid\Uuid;
  10. use Shopware\Core\Framework\Context;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Shopware\Core\Checkout\Customer\CustomerEvents;
  13. class TradelicenseData implements EventSubscriberInterface
  14. {
  15.     private $fileSaver;
  16.     private $mediaRepository;
  17.     private $mediaFolderRepository;
  18.     private $gewerbescheinRepository;
  19.     public function __construct(
  20.         FileSaver $fileSaver,
  21.         EntityRepositoryInterface $mediaRepository,
  22.         EntityRepositoryInterface $mediaFolderRepository,
  23.         EntityRepositoryInterface $gewerbescheinRepository
  24.     )
  25.     {
  26.         $this->fileSaver $fileSaver;
  27.         $this->mediaRepository $mediaRepository;
  28.         $this->mediaFolderRepository $mediaFolderRepository;
  29.         $this->gewerbescheinRepository $gewerbescheinRepository;
  30.     }
  31.     public static function getSubscribedEvents(): array
  32.     {
  33.         return [
  34.             CustomerEvents::CUSTOMER_WRITTEN_EVENT => 'handleTradeLicense',
  35.         ];
  36.     }
  37.     /**
  38.      * Create new database entry in relation and media table
  39.      * Upload file to server
  40.      *
  41.      * @param EntityWrittenEvent $event
  42.      * @return bool
  43.      */
  44.     public function handleTradeLicense(EntityWrittenEvent $event)
  45.     {
  46.         if(!empty($_FILES['emcgnTradeLicense']['name'][0])){
  47.             $files $this->reFilesArray($_FILES['emcgnTradeLicense']);
  48.             /* ID des Kunden ermitteln */
  49.             $customerId $event->getIds();
  50.             $customerId $customerId[0];
  51.             /* Anhand der CustomerId ermitteln, ob schon ein Eintrag exisitert */
  52.             $tradeLicenseIds $this->getEntryIds($customerId$event->getContext());
  53.             /* Wenn Eintrag existiert -> löschen & File löschen */
  54.             if(!empty($tradeLicenseIds)){
  55.                 /* FileId anhand von KundenId ermitteln */
  56.                 $criteria = new Criteria();
  57.                 $criteria->addFilter(new EqualsFilter('customerId'$customerId));
  58.                 $oldMediaEntries $this->gewerbescheinRepository->search($criteria$event->getContext());
  59.                 /* DB-Einträge löschen */
  60.                 foreach($tradeLicenseIds as $tradeLicenseId){
  61.                     $this->gewerbescheinRepository->delete(
  62.                         [
  63.                             [ 'id' => $tradeLicenseId ]
  64.                         ], $event->getContext()
  65.                     );
  66.                 }
  67.                 /* Files löschen */
  68.                 foreach($oldMediaEntries as $oldMediaEntry){
  69.                     $this->mediaRepository->delete(
  70.                         [
  71.                             [ 'id' => $oldMediaEntry->getFileId() ]
  72.                         ], $event->getContext()
  73.                     );
  74.                 }
  75.             }
  76.             foreach($files as $file){
  77.                 $filename Uuid::randomHex();
  78.                 $filetype $file['type'];
  79.                 $fileext pathinfo($file['name'], PATHINFO_EXTENSION);
  80.                 $filetmp $file['tmp_name'];
  81.                 $filesize $file['size'];
  82.                 /* Wenn Datei keine .pdf order .jpeg Datei, Prozess beenden */
  83.                 $allowedTypes = array('application/pdf''image/jpeg');
  84.                 if(in_array($filetype$allowedTypes)){
  85.                     /* Mediendatei aus Datei erstellen */
  86.                     $mediaFile = new MediaFile(
  87.                         $filetmp,
  88.                         $filetype,
  89.                         $fileext,
  90.                         $filesize
  91.                     );
  92.                     /* MedienordnerID ermitteln und Datei in Datenbank schreiben */
  93.                     $mediaId $this->createMediaInFolder('Emcgn_Trade_Licenses'$event->getContext(), false);
  94.                     /* Datei auf dem Server ablegen */
  95.                     $this->fileSaver->persistFileToMedia($mediaFile$filename$mediaId$event->getContext());
  96.                     /* ID der hochgeladenen Datei ermitteln */
  97.                     $fileId $this->getMediafileId($filename$event->getContext());
  98.                     /* Datenbankeintrag erstellen */
  99.                     $this->gewerbescheinRepository->create(
  100.                         [
  101.                             [ 'fileId' => $fileId'customerId' => $customerId ]
  102.                         ], $event->getContext()
  103.                     );
  104.                 }
  105.             }
  106.         }
  107.         return true;
  108.     }
  109.     /**
  110.      * Creates media on server
  111.      * @param string $folder
  112.      * @param Context $context
  113.      * @param bool $private
  114.      * @return string
  115.      */
  116.     private function createMediaInFolder(string $folderContext $contextbool $private true): string
  117.     {
  118.         $mediaId Uuid::randomHex();
  119.         $this->mediaRepository->create(
  120.             [
  121.                 [
  122.                     'id' => $mediaId,
  123.                     'private' => $private,
  124.                     'mediaFolderId' => $this->getMediaFolderId($folder$context),
  125.                 ],
  126.             ],
  127.             $context
  128.         );
  129.         return $mediaId;
  130.     }
  131.     /**
  132.      * Get ID of custom folder
  133.      * @param string $folder
  134.      * @param Context $context
  135.      * @return string
  136.      */
  137.     private function getMediaFolderId(string $folderContext $context): ?string
  138.     {
  139.         $criteria = new Criteria();
  140.         $criteria->addFilter(new EqualsFilter('media_folder.name'$folder));
  141.         $criteria->setLimit(1);
  142.         $customFolder $this->mediaFolderRepository->search($criteria$context);
  143.         $customFolderId null;
  144.         if ($customFolder->count() === 1) {
  145.             $customFolderId $customFolder->first()->getId();
  146.         }
  147.         return $customFolderId;
  148.     }
  149.     /**
  150.      * Get ID of media file
  151.      * @param string $filename
  152.      * @param Context $context
  153.      * @return string
  154.      */
  155.     private function getMediafileId(string $filenameContext $context)
  156.     {
  157.         $criteria = new Criteria();
  158.         $criteria->addFilter(new EqualsFilter('fileName'$filename));
  159.         $criteria->setLimit(1);
  160.         $fileId $this->mediaRepository->searchIds($criteria$context)->getIds();
  161.         return $fileId[0];
  162.     }
  163.     /**
  164.      * Get ID of trade license table-entry
  165.      * @param string $customerId
  166.      * @param Context $context
  167.      * @return array
  168.      */
  169.     private function getEntryIds(string $customerIdContext $context)
  170.     {
  171.         $criteria = new Criteria();
  172.         $criteria->addFilter(new EqualsFilter('customerId'$customerId));
  173.         $tradeLicenseId $this->gewerbescheinRepository->searchIds($criteria$context)->getIds();
  174.         return $tradeLicenseId;
  175.     }
  176.     /**
  177.      * Rearrange files array, so that we can loop through files as file
  178.      * @param $postFiles
  179.      * @return array
  180.      */
  181.     private function reFilesArray($postFiles) {
  182.         $reFileArray = [];
  183.         $countFiles count($postFiles['name']);
  184.         $fileKeys array_keys($postFiles);
  185.         for ($i=0$i<$countFiles$i++) {
  186.             foreach ($fileKeys as $key) {
  187.                 $reFileArray[$i][$key] = $postFiles[$key][$i];
  188.             }
  189.         }
  190.         return $reFileArray;
  191.     }
  192. }