Я впервые программирую серверную часть для проекта с помощью пакета 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>
и теперь это работает!




Вы не можете получить значение даты из 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> Большое спасибо за помощь!
Я принял ваш ответ, но, к сожалению, у меня недостаточно репутации, чтобы проголосовать за него. Я бы сделал, если б мог. Еще раз спасибо, хорошего дня!