diff --git a/src/Entity/LogSystem/AbstractLogEntry.php b/src/Entity/LogSystem/AbstractLogEntry.php index c4107bae..d7ab547b 100644 --- a/src/Entity/LogSystem/AbstractLogEntry.php +++ b/src/Entity/LogSystem/AbstractLogEntry.php @@ -129,7 +129,7 @@ abstract class AbstractLogEntry extends AbstractDBElement ]; /** @var User The user which has caused this log entry - * @ORM\ManyToOne(targetEntity="App\Entity\UserSystem\User") + * @ORM\ManyToOne(targetEntity="App\Entity\UserSystem\User", fetch="EAGER") * @ORM\JoinColumn(name="id_user", nullable=false) */ protected $user; diff --git a/src/Repository/LogEntryRepository.php b/src/Repository/LogEntryRepository.php index 27a0b4f8..9ff420fa 100644 --- a/src/Repository/LogEntryRepository.php +++ b/src/Repository/LogEntryRepository.php @@ -26,7 +26,11 @@ namespace App\Repository; use App\Entity\Base\AbstractDBElement; use App\Entity\LogSystem\AbstractLogEntry; +use App\Entity\LogSystem\ElementCreatedLogEntry; +use App\Entity\LogSystem\ElementEditedLogEntry; +use App\Entity\UserSystem\User; use Doctrine\ORM\EntityRepository; +use Doctrine\ORM\QueryBuilder; class LogEntryRepository extends EntityRepository { @@ -34,8 +38,9 @@ class LogEntryRepository extends EntityRepository { //Emulate a target element criteria by splitting it manually in the needed criterias if (isset($criteria['target']) && $criteria['target'] instanceof AbstractDBElement) { + /** @var AbstractDBElement $element */ $element = $criteria['target']; - $criteria['target_id'] = $element; + $criteria['target_id'] = $element->getID(); $criteria['target_type'] = AbstractLogEntry::targetTypeClassToID(get_class($element)); unset($criteria['target']); } @@ -93,4 +98,49 @@ class LogEntryRepository extends EntityRepository return $this->getEntityManager()->find($class, $id); } + + protected function getLastUser(AbstractDBElement $element, string $class) + { + $qb = $this->createQueryBuilder('log'); + $qb->select('log') + //->where('log INSTANCE OF App\Entity\LogSystem\ElementEditedLogEntry') + ->where('log INSTANCE OF ' . $class) + ->andWhere('log.target_type = :target_type') + ->andWhere('log.target_id = :target_id') + ->orderBy('log.timestamp', 'DESC'); + + $qb->setParameters([ + 'target_type' => AbstractLogEntry::targetTypeClassToID(get_class($element)), + 'target_id' => $element->getID() + ]); + + $query = $qb->getQuery(); + $query->setMaxResults(1); + /** @var AbstractLogEntry[] $results */ + $results = $query->execute(); + if (isset($results[0])) { + return $results[0]->getUser(); + } + return null; + } + + /** + * Returns the last user that has edited the given element. + * @param AbstractDBElement $element + * @return User|null A user object, or null if no user could be determined. + */ + public function getLastEditingUser(AbstractDBElement $element): ?User + { + return $this->getLastUser($element, ElementEditedLogEntry::class); + } + + /** + * Returns the user that has created the given element. + * @param AbstractDBElement $element + * @return User|null A user object, or null if no user could be determined. + */ + public function getCreatingUser(AbstractDBElement $element): ?User + { + return $this->getLastUser($element, ElementCreatedLogEntry::class); + } } diff --git a/src/Twig/LastUserExtension.php b/src/Twig/LastUserExtension.php new file mode 100644 index 00000000..9aa3fa1e --- /dev/null +++ b/src/Twig/LastUserExtension.php @@ -0,0 +1,49 @@ +em = $em; + $this->repo = $em->getRepository(AbstractLogEntry::class); + } + + public function getFunctions() + { + return [ + new TwigFunction('getLastEditingUser', [$this->repo, 'getLastEditingUser']), + new TwigFunction('getCreatingUser', [$this->repo, 'getCreatingUser']) + ]; + } +} \ No newline at end of file diff --git a/templates/AdminPages/_info.html.twig b/templates/AdminPages/_info.html.twig index acae0ae0..a6b01460 100644 --- a/templates/AdminPages/_info.html.twig +++ b/templates/AdminPages/_info.html.twig @@ -1,3 +1,5 @@ +{% import "helper.twig" as helper %} +
- {% if date(entity.addedDate) > date('1900/01/01') %} - {{ entity.addedDate | format_datetime("long") }} + {% if entity.id is not null and date(entity.addedDate) > date('1900/01/01') %} + {{ helper.date_user_combination(entity, false, "long") }} {% else %} - {% endif %} @@ -23,8 +25,8 @@
- {% if date(entity.lastModified) > date('1900/01/01') %} - {{ entity.lastModified | format_datetime("long") }} + {% if entity.id is not null and date(entity.lastModified) > date('1900/01/01') %} + {{ helper.date_user_combination(entity, true, "long") }} {% else %} - {% endif %} diff --git a/templates/Parts/info/_extended_infos.html.twig b/templates/Parts/info/_extended_infos.html.twig index d84552c5..5f4889f0 100644 --- a/templates/Parts/info/_extended_infos.html.twig +++ b/templates/Parts/info/_extended_infos.html.twig @@ -7,11 +7,31 @@