src/EventSubscriber/NodeSubscriber.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use w3des\AdminBundle\Event\AdminSaveEvent;
  5. use w3des\AdminBundle\Service\Nodes;
  6. use Symfony\Component\HttpFoundation\File\UploadedFile;
  7. use PhpOffice\PhpSpreadsheet\IOFactory;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use w3des\AdminBundle\Entity\NodeVariable;
  10. class NodeSubscriber implements EventSubscriberInterface
  11. {
  12. private Nodes $nodes;
  13. private EntityManagerInterface $em;
  14. public function __construct(Nodes $nodes, EntityManagerInterface $em)
  15. {
  16. $this->nodes = $nodes;
  17. $this->em = $em;
  18. }
  19. public static function getSubscribedEvents(): array
  20. {
  21. return [
  22. AdminSaveEvent::class => 'preSave'
  23. ];
  24. }
  25. public function preSave(AdminSaveEvent $event): void
  26. {
  27. $model = $event->getModel();
  28. if (!method_exists($model, 'getType')) {
  29. return;
  30. }
  31. if ($model->getType() !== 'collection') {
  32. return;
  33. }
  34. $file = $event->getForm()->get('variables')->get('import')->get('xx')->getData();
  35. if (!($file instanceof UploadedFile)) {
  36. return;
  37. }
  38. $tmpName = \tempnam(\sys_get_temp_dir(), 'import') . '.' . $file->getClientOriginalExtension();
  39. $file->move(dirname($tmpName), basename($tmpName));
  40. try {
  41. $found = [];
  42. $workbook = IOFactory::createReaderForFile($tmpName)->load($tmpName);
  43. /** @var \PhpOffice\PhpSpreadsheet\Worksheet\Row $row */
  44. $sheet = $workbook->getActiveSheet();
  45. foreach ($sheet->getRowIterator() as $row) {
  46. $value = $sheet->getCell([1, $row->getRowIndex()])->getValue();
  47. if ($value) {
  48. $value = trim($value);
  49. }
  50. if (empty($value)) {
  51. continue;
  52. }
  53. $s = $this->nodes->getNodes('index', [
  54. 'where' => [
  55. 'index' => $value
  56. ]
  57. ]);
  58. foreach ($s['list'] as $obj) {
  59. $sub = $this->nodes->getNodes('product', [
  60. 'where' => [
  61. 'indexes' => $obj->model
  62. ]
  63. ]);
  64. foreach ($sub['list'] as $prod) {
  65. $found[$prod->id] = $prod->model;
  66. }
  67. }
  68. }
  69. if (count($found)) {
  70. /** @var \w3des\AdminBundle\Entity\Node $node */
  71. $node = $event->getModel();
  72. $vals = \array_values($found);
  73. $num = -1;
  74. foreach ($node->getVariables() as $v) {
  75. if ($v->getName() == 'indexes') {
  76. if ($v->getPos()+1 > count($vals)) {
  77. $node->getVariables()->remove($v);
  78. $this->em->remove($v);
  79. } else {
  80. $v->setNodeValue($vals[$v->getPos()]);
  81. $num = max($num, $v->getPos());
  82. }
  83. }
  84. }
  85. $num++;
  86. if (count($vals) > $num) {
  87. for ($i = $num; $i < count($vals); $i++) {
  88. $v = new NodeVariable();
  89. $v->setType('node');
  90. $v->setNode($node);
  91. $v->setName('indexes');
  92. $v->setLocale('xx');
  93. $v->setPos($num++);
  94. $v->setNodeValue($vals[$i]);
  95. $node->getVariables()->add($v);
  96. $this->em->persist($v);
  97. }
  98. }
  99. }
  100. } finally {
  101. unlink($tmpName);
  102. }
  103. //die('xd');
  104. }
  105. }