Простой администратор Symfony, как сравнить DateTimeField с текущей датой

Я впервые программирую серверную часть для проекта с помощью пакета easy admin, и у меня возникли проблемы с модификацией контроллера crud в соответствии с моими потребностями. У меня есть объект-заемщик, у которого есть поле ожидаемой даты возврата. Я хочу, чтобы текст этого поля в контроллере crud отображался красным, если ожидаемая текущая дата пройдена.

Я попробовал следующий код, но он не работает:

<?php

namespace App\Controller\Admin;

use App\Entity\Borrowing;
use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;

class BorrowingCrudController extends AbstractCrudController
{
    public static function getEntityFqcn(): string
    {
        return Borrowing::class;
    }


    public function configureFields(string $pageName): iterable
    {
        $id = IntegerField::new('id');

        $prolongated = BooleanField::new('prolongated');

        $borrowingDate = DateTimeField::new('borrowingDate')
            ->formatValue(function ($value) {
                return $value->format('Y-m-d');
            });

        $currentDate = new \DateTime();

        $cssClass = DateTimeField::new('expectedReturnDate') < $currentDate ? 'text-danger' : '';

        $expectedReturnDate = DateTimeField::new('expectedReturnDate')->formatValue(function ($value) {
            return $value->format('Y-m-d');
        })
            ->setCssClass($cssClass);

        $finalReturnDate = DateTimeField::new('finalReturnDate')->formatValue(function ($value) {
            if ($value === null) {
                return null;
            } else {
                return $value->format('Y-m-d');
            }
        });

        $fieldsArray = [
            $id,
            $prolongated,
            $borrowingDate,
            $expectedReturnDate,
            $finalReturnDate
        ];
        
        return $fieldsArray;
    }
}

Я попытался dd(DateTimeField::new('expectedReturnDate')) чтобы понять, почему это не работает, но, как ни странно, все, что я получаю, это объект dto, и я не могу найти, как получить доступ к его значению. Я перепробовал все, и у меня закончились идеи. Помощь будет принята с благодарностью. Заранее спасибо.

Решение

Я изменил поле ожидаемой даты возвращения в файле заимствованияCrudController. Теперь это выглядит так:

yield DateTimeField::new('expectedReturnDate')->formatValue(function ($value) {
            return $value->format('Y-m-d');
        })
            ->setTemplatePath('admin/field/date_expected_return.html.twig'); 

Я также создал файл date_expected_return.html.twig в templates/admin/field со следующим кодом:

 {# admin/field/date_expected_return.html.twig #} 
<time class = "{{field.formattedValue < 'now'|date("Y-m-d") ? "text-danger" : ""}} " datetime = "{{ field.value|date('c') }}" title = "{{ field.value|date('r') }}">{{ field.formattedValue }}</time> 

и теперь это работает!

Я принял ваш ответ, но, к сожалению, у меня недостаточно репутации, чтобы проголосовать за него. Я бы сделал, если б мог. Еще раз спасибо, хорошего дня!

Tommy-BOU 23.04.2024 10:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
1
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете получить значение даты из DateTimeField::new('expectedReturnDate'), которое просто возвращает простое поле администратора, которое является объектом DTO для настройки вашего поля.

Кстати, вы можете использовать выход, поскольку configureFields ожидает итерации, что сделает метод более чистым.

В вашем случае вы можете создать собственный шаблон, чтобы определить, как и когда ваше поле должно стать красным. Поэтому используйте addTemplatePath, чтобы добавить новый пользовательский шаблон для вашего варианта использования.

public function configureFields(string $pageName): iterable
{
    yield IntegerField::new('id');

    yield BooleanField::new('prolongated');

    yield DateTimeField::new('borrowingDate')
        ->setFormat('Y-m-d');
    yield DateTimeField::new('expectedReturnDate')
        ->setTemplatePath('admin/field/date_expected_return.html.twig')
        ->setFormat('Y-m-d');

    yield DateTimeField::new('finalReturnDate')
        ->setFormat('Y-m-d');
}

И ваш новый файл ветки:

{# admin/field/date_expected_return.html.twig #}
{% if field.value < 'now'|date() %}
    <span class = "text-danger">{{ field.value }}</span>
{% else %}
    <span>{{ field.value }}</span>
{% endif %}

Возможно, вам придется проверить, как получить значение в вашем шаблоне, я не помню, действительно ли это поле.значение, но вы можете просто {{ dump(field) }} и при необходимости обновить шаблон.

Если вы не знаете, вы можете настроить формат даты и времени по умолчанию в простой конфигурации панели администратора. Вместо того, чтобы задавать формат везде.

Большое спасибо ! Я сделал это, используя предложенный вами метод setTemplatePath и создав date_expected_return.html.twig в templates/admin/field со следующим кодом: {# admin/field/date_expected_return.html.twig #} <time class = " {{field.formattedValue < 'now'|date("Y-m-d") ? "text-danger" : ""}} " datetime = "{{ field.value|date('c') }}" title = "{ { field.value|date('r') }}">{{ field.formattedValue }}</time> Большое спасибо за помощь!

Tommy-BOU 22.04.2024 22:48

Другие вопросы по теме