为所有 DateTimeField 设置默认值 view_timezone
Set default view_timezone for all DateTimeField
在 EasyAdmin 3 / Symfony 5.2 后端,我有几个带有日期时间字段的 *CrudController classes,它们的配置如下:
public function configureFields(string $pageName): iterable
{
return [
// ...
DateTimeField::new('createdAt')
->setTimezone($this->getUser()->getTimezone())
->setFormTypeOption('view_timezone', $this->getUser()->getTimezone()),
];
}
有没有办法将时区定义为默认时区,而不是为每个实体的每个日期时间字段复制粘贴相同的代码?
编辑:
我发现 setTimezone()
可以为 ConfigureCrud()
中的整个 *CrudController class 调用一次,这默认适用于所有字段:
class MyCrudController extends AbstractCrudController
{
public function configureCrud(Crud $crud): Crud
{
return $crud->setTimezone($this->getUser()->getTimezone());
}
}
实际上,它甚至可以在仪表板上设置为默认应用于所有 crud 控制器及其字段。
class DashboardController extends AbstractDashboardController
{
public function configureCrud(): Crud
{
// Default config for all cruds in this controller.
// Only impact index and detail actions.
// For Forms, use ->setFormTypeOption('view_timezone', '...')
// on all fields
return Crud::new()->setTimezone($this->getUser()->getTimezone());
}
}
因此,DashboardController class 中的 configureCrud()
是索引和详细信息操作的最简单解决方案。
我仍然对每个领域的 avoir setFormTypeOption('view_timezone', '...')
类似解决方案感兴趣。
您可以做的一件事是创建一种方法来缩短您的代码。我做了一个特性来做到这一点,但它可以是你扩展的基础 class 中的方法,带有静态方法的 class 或类似的东西。请注意,如果您在控制器或仪表板级别设置 setTimezone()
,这里的 setTimezone()
是可选的,但为了确保它们保持同步,我还是将其包含在此处。
<?php
// src/Helper/Admin/DateTimeFieldTrait.php
namespace App\Helper\Admin;
use App\Entity\User;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
trait DateTimeFieldTrait
{
protected function createDateTimeFieldForUser(string $propertyName, User $user): DateTimeField
{
return DateTimeField::new($propertyName)
->setTimezone($user->getTimezone())
->setFormTypeOption('view_timezone', $user->getTimezone())
;
}
}
然后在您的代码中,您可以在需要的地方使用它。
//...
use DateTimeFieldTrait;
// ...
public function configureFields(string $pageName): iterable
{
return [
// ...
$this->createDateTimeFieldForUser('createdAt', $this->getUser()),
];
}
在 EasyAdmin 3 / Symfony 5.2 后端,我有几个带有日期时间字段的 *CrudController classes,它们的配置如下:
public function configureFields(string $pageName): iterable
{
return [
// ...
DateTimeField::new('createdAt')
->setTimezone($this->getUser()->getTimezone())
->setFormTypeOption('view_timezone', $this->getUser()->getTimezone()),
];
}
有没有办法将时区定义为默认时区,而不是为每个实体的每个日期时间字段复制粘贴相同的代码?
编辑:
我发现 setTimezone()
可以为 ConfigureCrud()
中的整个 *CrudController class 调用一次,这默认适用于所有字段:
class MyCrudController extends AbstractCrudController
{
public function configureCrud(Crud $crud): Crud
{
return $crud->setTimezone($this->getUser()->getTimezone());
}
}
实际上,它甚至可以在仪表板上设置为默认应用于所有 crud 控制器及其字段。
class DashboardController extends AbstractDashboardController
{
public function configureCrud(): Crud
{
// Default config for all cruds in this controller.
// Only impact index and detail actions.
// For Forms, use ->setFormTypeOption('view_timezone', '...')
// on all fields
return Crud::new()->setTimezone($this->getUser()->getTimezone());
}
}
因此,DashboardController class 中的 configureCrud()
是索引和详细信息操作的最简单解决方案。
我仍然对每个领域的 avoir setFormTypeOption('view_timezone', '...')
类似解决方案感兴趣。
您可以做的一件事是创建一种方法来缩短您的代码。我做了一个特性来做到这一点,但它可以是你扩展的基础 class 中的方法,带有静态方法的 class 或类似的东西。请注意,如果您在控制器或仪表板级别设置 setTimezone()
,这里的 setTimezone()
是可选的,但为了确保它们保持同步,我还是将其包含在此处。
<?php
// src/Helper/Admin/DateTimeFieldTrait.php
namespace App\Helper\Admin;
use App\Entity\User;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
trait DateTimeFieldTrait
{
protected function createDateTimeFieldForUser(string $propertyName, User $user): DateTimeField
{
return DateTimeField::new($propertyName)
->setTimezone($user->getTimezone())
->setFormTypeOption('view_timezone', $user->getTimezone())
;
}
}
然后在您的代码中,您可以在需要的地方使用它。
//...
use DateTimeFieldTrait;
// ...
public function configureFields(string $pageName): iterable
{
return [
// ...
$this->createDateTimeFieldForUser('createdAt', $this->getUser()),
];
}