<?phpnamespace App\EventSubscriber;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use w3des\AdminBundle\Event\AdminSaveEvent;use w3des\AdminBundle\Service\Nodes;use Symfony\Component\HttpFoundation\File\UploadedFile;use PhpOffice\PhpSpreadsheet\IOFactory;use Doctrine\ORM\EntityManagerInterface;use w3des\AdminBundle\Entity\NodeVariable;class NodeSubscriber implements EventSubscriberInterface{ private Nodes $nodes; private EntityManagerInterface $em; public function __construct(Nodes $nodes, EntityManagerInterface $em) { $this->nodes = $nodes; $this->em = $em; } public static function getSubscribedEvents(): array { return [ AdminSaveEvent::class => 'preSave' ]; } public function preSave(AdminSaveEvent $event): void { $model = $event->getModel(); if (!method_exists($model, 'getType')) { return; } if ($model->getType() !== 'collection') { return; } $file = $event->getForm()->get('variables')->get('import')->get('xx')->getData(); if (!($file instanceof UploadedFile)) { return; } $tmpName = \tempnam(\sys_get_temp_dir(), 'import') . '.' . $file->getClientOriginalExtension(); $file->move(dirname($tmpName), basename($tmpName)); try { $found = []; $workbook = IOFactory::createReaderForFile($tmpName)->load($tmpName); /** @var \PhpOffice\PhpSpreadsheet\Worksheet\Row $row */ $sheet = $workbook->getActiveSheet(); foreach ($sheet->getRowIterator() as $row) { $value = $sheet->getCell([1, $row->getRowIndex()])->getValue(); if ($value) { $value = trim($value); } if (empty($value)) { continue; } $s = $this->nodes->getNodes('index', [ 'where' => [ 'index' => $value ] ]); foreach ($s['list'] as $obj) { $sub = $this->nodes->getNodes('product', [ 'where' => [ 'indexes' => $obj->model ] ]); foreach ($sub['list'] as $prod) { $found[$prod->id] = $prod->model; } } } if (count($found)) { /** @var \w3des\AdminBundle\Entity\Node $node */ $node = $event->getModel(); $vals = \array_values($found); $num = -1; foreach ($node->getVariables() as $v) { if ($v->getName() == 'indexes') { if ($v->getPos()+1 > count($vals)) { $node->getVariables()->remove($v); $this->em->remove($v); } else { $v->setNodeValue($vals[$v->getPos()]); $num = max($num, $v->getPos()); } } } $num++; if (count($vals) > $num) { for ($i = $num; $i < count($vals); $i++) { $v = new NodeVariable(); $v->setType('node'); $v->setNode($node); $v->setName('indexes'); $v->setLocale('xx'); $v->setPos($num++); $v->setNodeValue($vals[$i]); $node->getVariables()->add($v); $this->em->persist($v); } } } } finally { unlink($tmpName); } //die('xd'); }}