Symfony EasyAdmin:实现DateTimeField与当前日期对比并标红过期日期
问题
首次使用EasyAdmin Bundle开发项目后端,需要实现:Borrowing实体的expectedReturnDate(预计归还日期)字段,在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; } }
排查后发现DateTimeField::new('expectedReturnDate')返回的是DTO对象,无法直接访问字段值进行比较,因此代码逻辑不生效。
解决方案
1. 修改CRUD控制器代码
在BorrowingCrudController的configureFields方法中,修改expectedReturnDate字段的定义,指定自定义模板:
yield DateTimeField::new('expectedReturnDate') ->formatValue(function ($value) { return $value->format('Y-m-d'); }) ->setTemplatePath('admin/field/date_expected_return.html.twig');
2. 创建自定义Twig模板
在项目的templates/admin/field目录下创建date_expected_return.html.twig文件,内容如下:
{# 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>
修改完成后,功能即可正常运行:当expectedReturnDate超过当前日期时,字段文本会自动变为红色。
内容的提问来源于stack exchange,提问作者Tommy-BOU
相关产品推荐
相关产品推荐

