在 symfony2 sonata 管理包中设置默认值

Posted

技术标签:

【中文标题】在 symfony2 sonata 管理包中设置默认值【英文标题】:setting default value in symfony2 sonata admin bundle 【发布时间】:2012-05-19 17:51:05 【问题描述】:

如何在奏鸣曲管理包中设置默认值 configureFormFields 方法中缺少 data 选项

protected function configureFormFields(FormMapper $formMapper)

    $formMapper
        ->add('name', null, array('required' => true, 'data' => "my default value"))
    ;

如何使用数据属性设置字段内的默认值???

【问题讨论】:

name 的 fieldType 是什么? 【参考方案1】:

我想您现在可能已经解决了这个问题,但是作为对其他任何人的引用,您可以覆盖 getNewInstance() 方法并为对象设置默认值:

public function getNewInstance()

    $instance = parent::getNewInstance();
    $instance->setName('my default value');

    return $instance;

【讨论】:

正是我想要的。谢谢! @RobMasters 如果我们需要显示的属性实际上是一个方法呢? 当尝试以这种方式设置日期时间时 $instance->setCloseTimeUTC((new \DateTime())->format('Y-m-d H:i:s'));保存时出现错误“预期以下类型之一:null,DateTime”【参考方案2】:

您也可以直接将默认值分配给实体的属性:

class TheEntity

    private $name = 'default name';

【讨论】:

为什么这个答案被否决了?它有效并且涉及最少的供应商代码覆盖。最佳答案恕我直言。 @FallenSquirrel 它可以工作,但我认为这不是所需的解决方案,因为 OP 可能希望在 Sonata 中完成解决方案并且不想触及类属性【参考方案3】:

除了@RobMasters 解决方案:

如果要设置关系,可以从实体管理器(而不是完整对象)获取引用:

public function getNewInstance()

    $instance = parent::getNewInstance();

    if ($this->hasRequest()) 
        $branch = $this->getRequest()->get('branch', null);

        if ($branch !== null) 
            $entityManager = $this->getModelManager()->getEntityManager('MyBundle\Entity\Branch');
            $branchReference = $entityManager->getReference('MyBundle\Entity\Branch', $branch);

            $instance->setBranch($branchReference);
        
    
    return $instance;

我将示例添加到我的博客中: http://blog.webdevilopers.net/populate-resp-set-default-values-on-form-resp-object-or-instance-in-sonataadminbundle/

【讨论】:

标识符在哪里? “11”从何而来? 是的,正是我的问题。 不确定你的意思。在我的示例中只是硬编码,因为我从测试用例中复制了它。只需将 11 替换为来自请求堆栈的 $branch。我认为这很明显。除此之外,我将编辑我的示例。 你的博客对我很有帮助 【参考方案4】:

对于布尔值,另一种选择是在configureFormFields 内部传递给add 方法的第一个数组中设置data

所以经过一些记忆后,我的代码(对于一个我想默认检查的复选框)最终看起来像这样:

protected function configureFormFields(FormMapper $formMapper)

    $formMapper
        ->add('name')
        ->add('visible', null, ['label'=>'Visibility', 'data' => true ])
    ;

... 它在我的文件顶部保存了几行,因为我可以摆脱 getNewInstance() 定义。

【讨论】:

从“数据”编辑现有项目值时,将覆盖实体的值。

以上是关于在 symfony2 sonata 管理包中设置默认值的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2 Sonata 媒体包:在没有奏鸣曲管理员的情况下保存媒体文件图像

Symfony 2.8 Twig_Error_Runtime Sonata 管理包

Symfony2、Sonata、UserBundle:当用户启用更新时发送电子邮件

阻止 SonataAdmin / Symfony2 使用 sonata_type_admin 嵌入式管理员创建空对象

Symfony 2 / Sonata / 电子商务路线问题

Symfony2 Sonata Media Bundle -- 上传图片时出错