跳到内容

根据编辑的对象动态修改表单字段

编辑此页

在很多情况下,您需要根据编辑对象的属性或结构来修改表单字段。 假设您只想为新对象显示一个管理表单字段,而不希望为已保存到数据库并正在编辑的对象显示该字段。

这是一种实现此目的的方法。

在您的 Admin 类的 configureFormFields 方法中,您可以通过调用 $this->getSubject() 来获取当前对象。 返回值将是您关联的模型。 另一个方法 isCurrentRoute 用于检查当前请求的路由。 然后,您应该能够动态地向表单添加所需的字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// src/Admin/PostAdmin

namespace App\Admin;

use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\FileType;

final class PostAdmin extends AbstractAdmin
{
    // ...

    protected function configureFormFields(FormMapper $form): void
    {
        // Description field will always be added to the form:
        $form
            ->add('description', TextareaType::class)
        ;

        $subject = $this->getSubject();

        // If you're using auto-generated identifiers
        if ($subject->getId() === null) {
            // The thumbnail field will only be added when the edited item is created
            $form->add('thumbnail', FileType::class);
        }

        // Name field will be added only when create an item
        if ($this->isCurrentRoute('create')) {
            $form->add('name', TextType::class);
        }

        // The foo field will added when current action is related acme.demo.admin.code Admin's edit form
        if ($this->isCurrentRoute('edit', 'acme.demo.admin.code')) {
            $form->add('foo', 'text');
        }
    }
}
本作品,包括代码示例,均在 Creative Commons BY-SA 3.0 许可下获得许可。
目录
    版本