简体   繁体   中英

Make an admin form listen for validation from child admins

I am adding features to an application based on Symfony 2.8 and Sonata.

The application already has a Page entity and a PageAdmin class. I want to add a nested set of Synonym entities on every page, so I make my PageAdmin's configureFormFields() method look like this:

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ->add('title')
        ->add('synonym', 'sonata_type_collection', array(
            'label' => "Synonyme",
            'cascade_validation' => true,
            'required' => false,
            'error_bubbling' => true,
        ), array(
            'edit' => 'inline',
            'inline' => 'table'
        ))
        ->add('contentBlock', 'sonata_type_collection', array(
            'label' => "Inhalt",
            'cascade_validation' => true,
            'required' => false
        ), array(
            'edit' => 'inline',
            'inline' => 'table'
        ))
    ;
}

... which generally works pretty well. The only problem is that when I leave one of the required fields in my Synonym entity blank, the application does not give me a pretty red "flash" message scolding me for my omission. Instead, it throws an exception and returns 500 status, which is not what I want to see:

Failed to update object: Application\\Sonata\\PageBundle\\Entity\\Page 500 Internal Server Error - ModelManagerException 3 linked Exceptions: NotNullConstraintViolationException » PDOException » PDOException »

...

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null

Is there a way to make omissions from the Synonym fields get flagged nicely for the user, rather than throwing and exception and returning a 500 status?

=====

Update 1: Here is the content of the configureFormFields() method in my SynonymAdmin class:

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ->add('name', null, ['label' => 'Name *', 'required' => true, 'error_bubbling' => true,])
        ->add('title', null, ['label' => 'Titel', 'required' => false, 'error_bubbling' => true,])
        ->add('visible', null, ['label'=>'Sichtbarkeit', 'required' => false, 'error_bubbling' => true,])
    ;
}

Update 2: Here is the Synonyms definition in my entity class.

/**
 * @var ArrayCollection
 *
 * @Assert\NotBlank
 *
 */
private $synonyms;

... and from Synonym.php:

/**
 * @var string
 *
 * @Assert\NotBlank
 *
 * @ORM\Column(name="name", type="string", length=255)
 */
private $name;

For starters I think you can add 'required' => true to the fields in your SynonymAdmin to trigger html5 validation.

besides that you can add validation rules to your entity and Sonata should pick up on that.

class Page
{
    /**
     * @Assert\Valid
     */
     protected $synonyms;
}

class Synonym
{
    /**
     * @Assert\NotBlank
     */
     private $name;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM