Bonjour,
Dans mon backend easyadmin, j'ai une entité qui écoute et enregistrer les actions faitres sur les autres entités (création, modification, suppression) pour avoir un historique. J'y stocke le nom de l'entité, l'id de l'entité, la date de modification et l'utilisateur qui a fait la modification, les champs modifiés avec leurs valeurs avant et après modification. Elle s'appele EntityHistory pour la suite de mon explication
Comme j'ai plusieurs entités écoutés, je n'ai pas fait de relation entre chacune de ses entités avec EntityHistory, ce ne me semblait être une bonne pratique vu le nombre d'entités concernés. (mais j'ai peut-être tord)
Actuellement, j'ai fais une version simplifié sur une seule entité et av ec juste la date a récuperé mais lros de l'affichage de la page-index, j'ai la valeur "inaccessible" au lieu d'avoir une date.
Pourtant quand je fais des dumps a différents étapes, j'ai bien des dates qui sont récupérés, le problème semble être uniquement à l'affichage.
le code de mon champs Date dans mon CRUD
DateTimeField::new('lastModificationDate', 'Date de modification')
->setVirtual(true)
->formatValue(function ($value, $entity) {
$historyRepository = $this->entityManager->getRepository(EntityHistory::class);
$date= $entity->getLastModificationDate($historyRepository);
dump($date);
return $date;
})
la focntion getLastModificationDate dans l'entité ou je veux afficher la date
public function getLastModificationDate(EntityHistoryRepository $historyRepository): ?\DateTime
{
return $historyRepository->findLastModificationDate($this->getId());
}
la fonction findLastModificationDate dans EntityHistoryRepository
public function findLastModificationDate(int $entityId): ?\DateTime
{
$result = $this->createQueryBuilder('e')
->select('e.dateAction')
->where('e.entityId = :entityId')
->setParameter('entityId', $entityId)
->orderBy('e.dateAction', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
return $result ? $result['dateAction'] : null;
}
Ce que je veux
Je voudrais dans chaque Page_Index de chaque entité (hors EntityHistory) récupéré la dernière date de modification et l'utilisateur, si cela est possible sans avoir défini de relation entre les entités.
Ce que j'obtiens
Actuellement, j'ai fais une version simplifié sur une seule entité et av ec juste la date a récuperé mais lros de l'affichage de la page-index, j'ai la valeur "inaccessible" au lieu d'avoir une date.
Pourtant quand je fais des dumps a différents étapes, j'ai bien des dates qui sont récupérés, le problème semble être uniquement à l'affichage.
Salut, tu vérifies bien que le retour de ta méthode findLastModificationDate
ne renvoie pas null ?
La méthode (en tout cas celle actuelle car je continue de chercher même si pour l'instant je fais autrement) retoune bien des dates qui sont dans le BDD. Et j'ai essayé aussi quand j'ai aucune valeur dans la BDD et dans ce cas cela affiche "aucun" au lieu de "inaccessible" pour les autres qui ont une date.
alexandre06 si tu veux m'ajouter sur discord, on pourra poster la soluce ici si on trouve :)
Salut, alors j'ai également bataillé plusieurs heures sur un problème similaire, ça pourrait aider.
Sous Symfo 6.4 ; EasyAdmin 4.20 et MariaDb 11.. j'ai plusieurs tables, avec des colonnes, représentant des dates en TimeStamp.
Concrètement, dans ma table : messages, j'ai différentes colonnes, dont une qui est message_timestamp ,avec le type BigInt(20) : 1712510011321
Ma première approche fut, sous mon crud controller, de faire un champ virtuel comme ceci :
TextField::new('message_timestamp_virtuel', 'Date/Heure')
->onlyOnIndex()
->formatValue(function ($value, $entity) {
$value = $entity->getMessageTimestamp() ;
if ($value !== null) {
// Convertir BigInt en timestamp humain
$timestamp = (int) substr($value, 0, 10); // Garde les 10 premiers caractères
return date('j-m-Y H:i:s', $timestamp); // Formatage
}
return null;
}),
Dans la logique, si on met un dd() au milieu, la date est bien formatée, mais EA ne reconnaît pas "message_timestamp_virtuel" comme étant dans mon entité Messages et m'affiche le mot "Inaccessible" en rouge, sur ma vue EasyAdmin, à la place des Dates / Heures
La solution était d'ajouter un getter dans mon entité Messages :
// src/Entity/Messages.php
// ...
public function getFormattedTimestamp(): ?string
{
if ($this->messageTimestamp !== null) {
// Convertir BigInt en timestamp et formater la date
$timestamp = (int) substr($this->messageTimestamp, 0, 10); // On conserve les 10 premiers chiffres
return date('d-m-Y H:i:s', $timestamp); // Format lisible
}
return null;
}
Puis, dans mon MessagesCrudController, appeler mon getter >
TextField::new('formattedTimestamp', 'Date/Heure')
->onlyOnIndex()
,
J'obtiens bien ma date formatée : 07-04-2024 19:13:31