根据编辑的对象动态修改表单字段
在很多情况下,您需要根据编辑对象的属性或结构来修改表单字段。 假设您只想为新对象显示一个管理表单字段,而不希望为已保存到数据库并正在编辑的对象显示该字段。
这是一种实现此目的的方法。
在您的 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 许可下获得许可。