【问题标题】:Symfony2 - making a list of entities selectableSymfony2 - 使实体列表可选
【发布时间】:2014-04-26 12:29:33
【问题描述】:

在我的 Symfony2 中,我有一个用户电子邮件表(我的数据库中的实体):

{% for email in emails %}
    ...
    {{ email.subject }}
    ...
{% endfor %}

我想通过将表格包装在一个表单中并为每一行添加一个复选框来使这些可选。

在 Symfony2 中解决此问题的最佳方法是什么?我只能认为我必须在 Type 中创建一个 Type,这似乎不太理想:

class SelectableEmailsType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('selectableEmails', 'collection', [ 'type' => new SelectableEmailType() ]);
    }

    public function getName()
    {
        return 'selectableEmails';
    }
}

class SelectableEmailType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('email', new EmailType());
        $builder->add('selected', 'checkbox');
    }

    public function getName()
    {
        return 'selectableEmail';
    }
}

class EmailType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('subject', 'text');
        ...
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'EmailOctopus\Bundle\ListsBundle\Entity\ListEntity',
        ]);
    }

    public function getName()
    {
        return 'email';
    }
}

【问题讨论】:

  • 这就是它所需要的,特别是如果 EmailType 用于其他形式。这种嵌套很常见。当然,如果您真正需要做的只是选择电子邮件(而不是编辑主题),则不需要 EmailType。
  • @Cerad 谢谢,很高兴知道。我只需要选择电子邮件 - 如果我删除 EmailType,我应该如何绑定实体?
  • 您实际上不需要绑定电子邮件实体,因为您没有修改它。相反,您可以使用 vars 参数直接从 twig 模板访问它。 {{ selectableEmail.vars.email.subject }}
  • @Cerad 但是如果不绑定至少 id,我怎么知道选择了哪些电子邮件?

标签: php symfony


【解决方案1】:

这是对约束性问题的回答。

// Query a list of emails
$emails = $emailRepository->findAll();

// Turn them into selectable emails
$selectableEmails = array();
foreach($emails as $email)
{
    $selectableEmails[] = array('email' => $email, 'selected' => false);
}

// Pass this to the root form
$formData = array('selectableEmails' => $selectableEmails);

在处理完已发布的表单后,您将拉出 selectableEmails 列表并运行它以获取实际选中的列表。

这只是一种方法。它适用于在不更改实体本身的情况下向实体添加额外的表单相关属性。

【讨论】:

  • 谢谢。我不应该在foreach 中使用SelectableEmail 模型吗?
【解决方案2】:

我最终分配了 ID。使用此解决方案将每封电子邮件添加到复选框:

Build a form having a checkbox for each entity in a doctrine collection

【讨论】:

    猜你喜欢
    • 2013-06-07
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多