You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 11:52:40