<?php
namespace App\EventListener;
use Pimcore\Db;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Event\Model\ElementEventInterface;
use Pimcore\Model\User\Permission\Definition as Permission;
class TabPermissionEventListener
{
public function onPostUpdate(ElementEventInterface $e)
{
if (
$e instanceof DataObjectEvent &&
method_exists($e->getObject(), 'getCLassName') &&
!empty($e->getObject()->getCLassName()) &&
strtolower($e->getObject()->getCLassName()) == 'tab'
) {
$obj = $e->getObject();
if ($obj->getPermission()) {
$permissionKey = $obj->getPermission();
// check if permission is available
$permission = Permission::getByKey($permissionKey);
if (!$permission) {
$permission = new Permission();
$permission->setKey($permissionKey);
$permission->setCategory('Tab');
$permission->save();
}
}
}
}
/**
* @var \Pimcore\Model\DataObject\Menu $obj
*/
public function onPostDelete(ElementEventInterface $e)
{
if (
$e instanceof DataObjectEvent &&
method_exists($e->getObject(), 'getClassName') &&
$e->getObject() instanceof \Pimcore\Model\DataObject\Menu
) {
$obj = $e->getObject();
$permissions = $obj->getPermissions_();
if (count($permissions) > 0) {
$menuId = $obj->getId();
foreach ($permissions as $permission) {
$permissionName = $permission->getName();
$permissionKey = $menuId . '|' . $permissionName;
if (Permission::getByKey($permissionKey)) {
$roles = new \Pimcore\Model\User\Role\Listing();
if (count($roles) > 0) {
foreach ($roles as $role) {
$permissions = $role->getPermissions();
if (($key = array_search($permissionKey, $permissions)) !== false) {
unset($permissions[$key]);
}
$role->setPermissions($permissions);
$role->save();
}
}
$users = new \Pimcore\Model\User\Listing();
if (count($users) > 0) {
foreach ($users as $user) {
$permissions = $user->getPermissions();
if (($key = array_search($permissionKey, $permissions)) !== false) {
unset($permissions[$key]);
}
$user->setPermissions($permissions);
$user->save();
}
}
$sql = "DELETE FROM users_permission_definitions WHERE `key` = :permission";
$stmt = Db::get()->prepare($sql);
$stmt->bindParam('permission', $permissionKey, \PDO::PARAM_STR);
$stmt->execute();
}
}
}
}
}
}