<?php
namespace App\EventListener;
use App\Tool\Folder;
use Carbon\Carbon;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Event\Model\ElementEventInterface;
use Pimcore\Event\Model\UserRoleEvent;
use Pimcore\Log\Simple;
use Pimcore\Model\DataObject\User;
use Pimcore\Model\WebsiteSetting;
use Pimcore\Tool\Authentication;
class UserRoleEventListener
{
private $needCreateUserManually = true;
public function onUserPreAdd(UserRoleEvent $userRoleEvent): void
{
if($userRoleEvent->getUserRole()->getType() != "role"){
$this->disableCreateUserManually();
$this->createObjectUser($userRoleEvent);
}
}
public function onUserPreUpdate(UserRoleEvent $userRoleEvent): void
{
if($userRoleEvent->getUserRole()->getType() != "role"){
$this->createObjectUser($userRoleEvent);
}
}
public function onUserPostDelete(UserRoleEvent $userRoleEvent): void
{
if($userRoleEvent->getUserRole()->getType() != "role"){
$this->deleteObjectUser($userRoleEvent);
}
}
private function createObjectUser(UserRoleEvent $userRoleEvent): void
{
if (!class_exists(\Pimcore\Model\DataObject\User::class)) {
return;
}
$pimcoreUserId = $userRoleEvent->getUserRole()->getId();
$firstName = $userRoleEvent->getUserRole()->getFirstName();
$lastName = $userRoleEvent->getUserRole()->getLastName();
$userName = $userRoleEvent->getUserRole()->getUserName();
$user = User::getByNip($userName, 1);
$folder = Folder::checkAndCreate('User');
$user = $user ?: new User();
$user->setParent($folder);
$user->setKey($userName);
$user->setName(sprintf('%s %s', $firstName, $lastName));
$user->setPimcoreUserId($pimcoreUserId);
$user->setNip($userName);
if (!$user->getDivisionId()) {
$division = $this->getDefaultDivision();
if ($division)
$user->setDivisionId($division);
}
$user->setUserOwner($userRoleEvent->getUserRole()->getId());
$user->setPublished(true);
try {
$user->save();
} catch (\Exception $exception) {
$logName = sprintf('USER_ROLE_EVENT_LISTENER_%s', Carbon::now()->format('d-m-Y'));
Simple::log($logName, $exception->getMessage());
}
}
private function deleteObjectUser(UserRoleEvent $userRoleEvent): void
{
$pimcoreUserId = $userRoleEvent->getUserRole()->getId();
$user = User::getByPimcoreUserId($pimcoreUserId, 1);
if(!empty($user)){
try {
$user->delete();
} catch (\Exception $exception) {
$logName = sprintf('USER_ROLE_EVENT_LISTENER_%s', Carbon::now()->format('d-m-Y'));
Simple::log($logName, $exception->getMessage());
}
}
}
/**
* auto create model user when dataobject user is created
*/
public function onPostAdd(ElementEventInterface $e): void
{
if (
$e instanceof DataObjectEvent
&& method_exists($e->getObject(), 'getClassName')
&& $e->getObject() instanceof \Pimcore\Model\DataObject\User
) {
/** @var \Pimcore\Model\DataObject\User */
$object = $e->getObject();
try {
$key = $object->getKey();
$object->setNip($key);
$object->save();
if ($this->needCreateUserManually) {
$defaultPassword = getenv('USER_DEFAULT_PASSWORD') == '' ?
'salt654321' : getenv('USER_DEFAULT_PASSWORD');
\Pimcore\Model\User::create([
"parentId" => 0,
"username" => $key,
"password" => Authentication::getPasswordHash($key, $defaultPassword),
"hasCredentials" => true,
"active" => true
]);
}
} catch (\Exception $e) {
$logName = sprintf('USER_ROLE_EVENT_LISTENER_%s', Carbon::now()->format('d-m-Y'));
Simple::log($logName, "postAddDO|".$e->getMessage());
}
}
}
public function objectOnPostUpdate(ElementEventInterface $e): bool
{
if (
$e instanceof DataObjectEvent
&& method_exists($e->getObject(), 'getClassName')
&& $e->getObject() instanceof \Pimcore\Model\DataObject\User
) {
/** @var \Pimcore\Model\DataObject\User */
$object = $e->getObject();
try {
$user = \Pimcore\Model\User::getById( $object->getPimcoreUserId() );
if ($user) {
$fullName = explode(" ", $object->getName());
$firstName = $fullName[0];
array_shift($fullName);
$lastName = implode(" ", $fullName);
$user->setFirstname($firstName);
$user->setLastname($lastName);
$user->save();
}
} catch (\Exception $e) {
$logName = sprintf('USER_ROLE_EVENT_LISTENER_%s', Carbon::now()->format('d-m-Y'));
Simple::log($logName, "postAddDO|".$e->getMessage());
}
}
return false;
}
private function getDefaultDivision(): object
{
$defaultDivisionCode = WebsiteSetting::getByName('DEFAULT_DIVISION_CODE') ?
WebsiteSetting::getByName('DEFAULT_DIVISION_CODE')->getData() : 'DUM';
$division = \Pimcore\Model\DataObject\Division::getByCode($defaultDivisionCode, 1);
return $division;
}
private function disableCreateUserManually(): void
{
$this->needCreateUserManually = false;
}
public function onDeleteDataObjectUser(ElementEventInterface $e): bool
{
if (
$e instanceof DataObjectEvent
&& method_exists($e->getObject(), 'getClassName')
&& $e->getObject() instanceof \Pimcore\Model\DataObject\User
) {
/** @var \Pimcore\Model\DataObject\User $object */
$object = $e->getObject();
$user = \Pimcore\Model\User::getById($object->getPimcoreUserId());
if ($user) {
try {
$user->delete();
} catch (\Exception $e) {
$logName = sprintf('USER_ROLE_EVENT_LISTENER_%s', Carbon::now()->format('d-m-Y'));
Simple::log($logName, $e->getMessage());
}
}
}
return false;
}
}