bundles/DrukattBundle/EventListener/ClientEquipmentListener.php line 33

Open in your IDE?
  1. <?php
  2. namespace DrukattBundle\EventListener;
  3. use Pimcore\Bundle\AdminBundle\Security\User\UserLoader;
  4. use Pimcore\Event\Model\ElementEvent;
  5. use Pimcore\Logger;
  6. use Pimcore\Model\DataObject\Client;
  7. use Pimcore\Model\DataObject\ClientEquipment;
  8. use Pimcore\Model\DataObject\ClientPart;
  9. use Pimcore\Model\DataObject\Concrete;
  10. use Pimcore\Model\DataObject\Equipment;
  11. use Pimcore\Model\DataObject\EquipmentGroup;
  12. use Pimcore\Model\DataObject\EquipmentPart;
  13. use Symfony\Component\EventDispatcher\GenericEvent;
  14. class ClientEquipmentListener
  15. {
  16.     /**
  17.      * @var UserLoader
  18.      */
  19.     protected $userLoader;
  20.     protected $elementPaths;
  21.     public function __construct(UserLoader $userLoader)
  22.     {
  23.         // Logger::debug('checkClientPermissions ClientEquipment Init');
  24.         $this->userLoader $userLoader;
  25.     }
  26.     public function checkClientPermissions(GenericEvent $event) {
  27.         // Permitimos que los clientes puedan ver el botón de guardar para los ClientEquipment
  28.         $object $event->getArgument("object");
  29.         if ($object instanceof ClientEquipment) {
  30.             //data element that is send to Pimcore backend UI
  31.             $data $event->getArgument("data");
  32.             //get current user
  33.             //$user = $this->userLoader->getUser();
  34.             //check if allowed and if not change permission
  35.             if($data['userPermissions']['view']) {
  36.                 $data['userPermissions']['save'] = true;
  37.             }
  38.             $event->setArgument("data"$data);
  39.         }
  40.     }
  41.     public function isAllowedPermissions(ElementEvent $event) {
  42.         // Permitimos que los clientes puedan guardar los ClientEquipment
  43.         if ($this->userLoader->getUser()->isAdmin()) {
  44.             return;            
  45.         }
  46.         $object $event->getElement();
  47.         if ($object instanceof ClientEquipment) {
  48.             // Logger::debug('isAllowedPermissions is ClientEquipment ' . $event->getArgument('permissionType'));
  49.             if ($event->getArgument('permissionType') == 'save') {
  50.                 $event->setArgument("isAllowed"true);
  51.             }
  52.         } else if ($object instanceof EquipmentGroup) {
  53.             //Logger::debug('isAllowedPermissions is EquipmentGroup ' . $event->getArgument('permissionType'));
  54.             if (empty($this->elementPaths)) {
  55.                 $this->elementPaths \Pimcore\Model\Element\Service::findForbiddenPaths('object'$this->userLoader->getUser());
  56.             }
  57.             $isUserElement false;
  58.             foreach ($this->elementPaths['allowed'] as $allowedPath) {
  59.                 $listing = new ClientPart\Listing();
  60.                 $listing->setCondition("o_path LIKE ? AND part__id = ?", [$allowedPath '%'$object->getId()] );
  61.                 $count $listing->count();
  62.                 if ($count 0) {
  63.                     $isUserElement true;
  64.                     break;
  65.                 }
  66.             }
  67.             if (($event->getArgument('permissionType') == 'list' || $event->getArgument('permissionType') == 'view') && !$isUserElement) {
  68.                 //$event->setArgument("isAllowed", false);
  69.             }
  70.         } else if ($object instanceof Equipment) {
  71.             //Logger::debug('isAllowedPermissions is EquipmentGroup ' . $event->getArgument('permissionType'));
  72.             if (empty($this->elementPaths)) {
  73.                 $this->elementPaths \Pimcore\Model\Element\Service::findForbiddenPaths('object'$this->userLoader->getUser());
  74.             }
  75.             $isUserElement false;
  76.             foreach ($this->elementPaths['allowed'] as $allowedPath) {
  77.                 $listing = new ClientEquipment\Listing();
  78.                 $listing->setCondition("o_path LIKE ? AND equipment__id = ?", [$allowedPath '%'$object->getId()] );
  79.                 $count $listing->count();
  80.                 if ($count 0) {
  81.                     $isUserElement true;
  82.                     break;
  83.                 }
  84.             }
  85.             if (($event->getArgument('permissionType') == 'list' || $event->getArgument('permissionType') == 'view') && !$isUserElement) {
  86.                 //$event->setArgument("isAllowed", false);
  87.             }
  88.         } else if ($object instanceof EquipmentPart) {
  89.             if ($event->getArgument('permissionType') == 'list' || $event->getArgument('permissionType') == 'view') {
  90.                 $event->setArgument("isAllowed"false);
  91.             }
  92.         }
  93.     }
  94.     public function beforeListLoadPermissions(GenericEvent $event) {
  95.         // Cambiamos las Consultas para que los Clientes solo vean los Equipment o EquipmentGroup que pertenecen
  96.         if ($this->userLoader->getUser()->isAdmin()) {
  97.             return;            
  98.         }
  99.         $listing $event->getArgument("list");
  100.         if ($listing instanceof \Pimcore\Model\Search\Backend\Data\Listing) {
  101.             $conditionParts = [];
  102.             $conditionParts[] = $listing->getCondition();
  103.     
  104.             //Logger::debug('isAllowedPermissions is EquipmentGroup ' . $event->getArgument('permissionType'));
  105.             if (empty($this->elementPaths)) {
  106.                 $this->elementPaths \Pimcore\Model\Element\Service::findForbiddenPaths('object'$this->userLoader->getUser());
  107.             }
  108.     
  109.             //EquipmentGroup
  110.             $userPathconditionParts = [];
  111.             foreach ($this->elementPaths['allowed'] as $allowedPath) {
  112.                 $userPathconditionParts[] = '(maintype != ' $listing->quote('object') . ' OR ' $listing->quote(EquipmentGroup::classId()) . ' NOT IN (SELECT o_classId FROM `objects` WHERE o_id = id) OR id IN (SELECT part__id FROM `object_' ClientPart::classId() . '` WHERE o_path LIKE ' $listing->quote($allowedPath '%') . '))';
  113.             }
  114.     
  115.             if (!empty($userPathconditionParts)) {
  116.                 $userQueryCondition implode(' OR '$userPathconditionParts);
  117.                 $conditionParts[] = '(' $userQueryCondition ')';
  118.             }
  119.             
  120.             //Equipment
  121.             $userPathconditionParts = [];
  122.             foreach ($this->elementPaths['allowed'] as $allowedPath) {
  123.                 $userPathconditionParts[] = '(maintype != ' $listing->quote('object') . ' OR ' $listing->quote(Equipment::classId()) . ' NOT IN (SELECT o_classId FROM `objects` WHERE o_id = id) OR id IN (SELECT equipment__id FROM `object_' ClientEquipment::classId() . '` WHERE o_path LIKE ' $listing->quote($allowedPath '%') . '))';
  124.             }
  125.     
  126.             if (!empty($userPathconditionParts)) {
  127.                 $userQueryCondition implode(' OR '$userPathconditionParts);
  128.                 $conditionParts[] = '(' $userQueryCondition ')';
  129.             }
  130.             //EquipmentPart (no permitido)
  131.             $conditionParts[] = $listing->quote(EquipmentPart::classId()) . ' NOT IN (SELECT o_classId FROM `objects` WHERE o_id = id)';
  132.             $queryCondition implode(' AND '$conditionParts);
  133.     
  134.             $listing->setCondition($queryCondition);
  135.     
  136.             $event->setArgument("list"$listing);
  137.         } else if (get_class($listing) == \Pimcore\Model\DataObject\Listing::class) { //Object Tree
  138.             //Logger::debug('isAllowedPermissions listing Object Tree 2');
  139.             $conditionParts = [];
  140.             $conditionParts[] = $listing->getCondition();
  141.     
  142.             //Logger::debug('isAllowedPermissions is EquipmentGroup ' . $event->getArgument('permissionType'));
  143.             if (empty($this->elementPaths)) {
  144.                 $this->elementPaths \Pimcore\Model\Element\Service::findForbiddenPaths('object'$this->userLoader->getUser());
  145.             }
  146.     
  147.             //EquipmentGroup
  148.             $userPathconditionParts = [];
  149.             foreach ($this->elementPaths['allowed'] as $allowedPath) {
  150.                 $userPathconditionParts[] = '(objects.o_type != ' $listing->quote('object') . ' OR objects.o_classId != ' $listing->quote(EquipmentGroup::classId()) . ' OR objects.o_id IN (SELECT part__id FROM `object_' ClientPart::classId() . '` WHERE o_path LIKE ' $listing->quote($allowedPath '%') . '))';
  151.             }
  152.     
  153.             if (!empty($userPathconditionParts)) {
  154.                 $userQueryCondition implode(' OR '$userPathconditionParts);
  155.                 $conditionParts[] = '(' $userQueryCondition ')';
  156.             }
  157.             //Equipment
  158.             $userPathconditionParts = [];
  159.             foreach ($this->elementPaths['allowed'] as $allowedPath) {
  160.                 $userPathconditionParts[] = '(objects.o_type != ' $listing->quote('object') . ' OR objects.o_classId != ' $listing->quote(Equipment::classId()) . ' OR objects.o_id IN (SELECT equipment__id FROM `object_' ClientEquipment::classId() . '` WHERE o_path LIKE ' $listing->quote($allowedPath '%') . '))';
  161.             }
  162.     
  163.             if (!empty($userPathconditionParts)) {
  164.                 $userQueryCondition implode(' OR '$userPathconditionParts);
  165.                 $conditionParts[] = '(' $userQueryCondition ')';
  166.             }
  167.             //EquipmentPart (no permitido)
  168.             $conditionParts[] = '(objects.o_type != ' $listing->quote('object') . ' OR objects.o_classId != ' $listing->quote(EquipmentPart::classId()) . ')';
  169.             
  170.             $queryCondition implode(' AND '$conditionParts);
  171.     
  172.             $listing->setCondition($queryCondition);
  173.     
  174.             $event->setArgument("list"$listing);
  175.         } else if ($listing instanceof EquipmentGroup\Listing) {
  176.             $conditionParts = [];
  177.             $conditionParts[] = $listing->getCondition();
  178.     
  179.             //Logger::debug('isAllowedPermissions is EquipmentGroup ' . $event->getArgument('permissionType'));
  180.             if (empty($this->elementPaths)) {
  181.                 $this->elementPaths \Pimcore\Model\Element\Service::findForbiddenPaths('object'$this->userLoader->getUser());
  182.             }
  183.     
  184.             $userPathconditionParts = [];
  185.             foreach ($this->elementPaths['allowed'] as $allowedPath) {
  186.                 $userPathconditionParts[] = 'o_id IN (SELECT part__id FROM `object_' ClientPart::classId() . '` WHERE o_path LIKE ' $listing->quote($allowedPath '%') . ')';
  187.             }
  188.     
  189.             if (!empty($userPathconditionParts)) {
  190.                 $userQueryCondition implode(' OR '$userPathconditionParts);
  191.                 $conditionParts[] = '(' $userQueryCondition ')';
  192.             }
  193.     
  194.             $queryCondition implode(' AND '$conditionParts);
  195.     
  196.             $listing->setCondition($queryCondition);
  197.     
  198.             $event->setArgument("list"$listing);            
  199.         } else if ($listing instanceof Equipment\Listing) {
  200.             $conditionParts = [];
  201.             $conditionParts[] = $listing->getCondition();
  202.     
  203.             //Logger::debug('isAllowedPermissions is EquipmentGroup ' . $event->getArgument('permissionType'));
  204.             if (empty($this->elementPaths)) {
  205.                 $this->elementPaths \Pimcore\Model\Element\Service::findForbiddenPaths('object'$this->userLoader->getUser());
  206.             }
  207.     
  208.             $userPathconditionParts = [];
  209.             foreach ($this->elementPaths['allowed'] as $allowedPath) {
  210.                 $userPathconditionParts[] = 'o_id IN (SELECT equipment__id FROM `object_' ClientEquipment::classId() . '` WHERE o_path LIKE ' $listing->quote($allowedPath '%') . ')';
  211.             }
  212.     
  213.             if (!empty($userPathconditionParts)) {
  214.                 $userQueryCondition implode(' OR '$userPathconditionParts);
  215.                 $conditionParts[] = '(' $userQueryCondition ')';
  216.             }
  217.     
  218.             $queryCondition implode(' AND '$conditionParts);
  219.     
  220.             $listing->setCondition($queryCondition);
  221.     
  222.             $event->setArgument("list"$listing);            
  223.         }
  224.         //Logger::debug('beforeListLoadPermissions condition ' . $condition);
  225.     }
  226.     public function treeGetChildsPreSendDataPermissions(GenericEvent $event) {
  227.         // Permitimos que los clientes puedan guardar los ClientEquipment
  228.         if ($this->userLoader->getUser()->isAdmin()) {
  229.             return;            
  230.         }
  231.         $objects $event->getArgument("objects");
  232.         // Elimina los hijos del EquipmentGroup
  233.         if (!empty($objects) && is_array($objects)) {
  234.             $equipmentGroup = new EquipmentGroup();
  235.             foreach ($objects as $key => $object) {
  236.                 if (array_key_exists('id'$object) && array_key_exists('className'$object) && $object['className'] == $equipmentGroup->getClassName()) {
  237.                     //Busca si tiene hijos que no sean de EquipmentPart
  238.                     $listing = new \Pimcore\Model\DataObject\Listing();
  239.                     $listing->setCondition('o_parentId = ' $listing->quote($object['id']) . ' AND (o_type != ' $listing->quote('object') . '  OR o_classId != ' $listing->quote(EquipmentPart::classId()) . ')');
  240.                     $count =  $listing->count();
  241.                     if ($count == 0) {
  242.                         $objects[$key]['leaf'] = false;
  243.                         $objects[$key]['expanded'] = false;
  244.                         $objects[$key]['expandable'] = false;
  245.                         $objects[$key]['loaded'] = false;
  246.                     }
  247.                 }
  248.             }
  249.             $event->setArgument("objects"$objects);
  250.         } 
  251.     }
  252. }