- Documentation >
- Content management >
- Pages >
- Page block validators
Page block validators
Validators check values passed to Page block attributes.
The following block validators are available:
- required- checks whether the attribute is provided
- regexp- validates attribute according to the provided regular expression
- not_blank- checks whether the attribute isn't left empty
- not_blank_richtext- checks whether a- richtextattribute isn't left empty
- content_type- checks whether the selected content types match the provided values
- content_container- checks whether the selected content item is a container
Note
Don't use the required and not_blank validators for richtext attributes.
Instead, use not_blank_richtext.
 
For each validator you can provide a message that displays in the Page Builder when an attribute field doesn't fulfill the criteria.
Additionally, for some validators you can provide settings under the
ibexa_fieldtype_page.blocks.<block_name>.validators.regexp.options configuration key, for example:
|  | email:
    type: string
    name: E-mail address
    validators:
        regexp:
            options:
                pattern: '/^\S+@\S+\.\S+$/'
            message: Provide a valid e-mail address
 | 
Custom validators
You can create Page block attributes with custom validators.
The following example shows how to create a validator which requires that string attributes contain only alphanumeric characters.
First, create classes that support your intended method of validation.
For example, in src/Validator, create an AlphaOnly.php file:
|  | <?php declare(strict_types=1);
namespace App\Validator;
use Symfony\Component\Validator\Constraint;
class AlphaOnly extends Constraint
{
    public string $message = 'The attribute can only contain letters or numbers.';
}
 | 
In src/Validator, create an AlphaOnlyValidator.php class that performs the validation.
|  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 | <?php declare(strict_types=1);
namespace App\Validator;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;
class AlphaOnlyValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint): void
    {
        if (!$constraint instanceof AlphaOnly) {
            throw new UnexpectedTypeException($constraint, AlphaOnly::class);
        }
        if (null === $value || '' === $value) {
            return;
        }
        // Throw an exception if the validator cannot handle the passed type.
        if (!is_string($value)) {
            throw new UnexpectedValueException($value, 'string');
        }
        if (!preg_match('/^[A-Za-z0-9]+$/', $value, $matches)) {
            // The argument must be a string or an object implementing __toString()
            $this->context->buildViolation($constraint->message)
                ->setParameter('{{ string }}', $value)
                ->addViolation();
        }
    }
}
 | 
Then, under ibexa_fieldtype_page.block_validators, enable the new validator in Page Builder:
|  | ibexa_fieldtype_page:
    block_validators:
        alpha_only: 'App\Validator\AlphaOnly'
 | 
Finally, add the validator to one of your block attributes, for example:
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18 | ibexa_fieldtype_page:
    blocks:
        my_block:
            name: My Block
            category: default
            thumbnail: /bundles/ibexaicons/img/all-icons.svg#edit
            views:
                default:
                    name: Default block layout
                    template: '@ibexadesign/blocks/my_block.html.twig'
                    priority: -255
            attributes:
                my_text_attribute:
                    type: text
                    name: My text attribute
                    validators:
                        alpha_only:
                            message: The field can only contain letters or numbers.
 | 
Custom required validator
By default, only not_blank and not_blank_richtext validators mark a block attribute as required.
If you create a custom validator custom_not_blank with attribute-specific logic, you can extend the AttributeType class with a Symfony form type extension to make sure that the attribute is also considered required:
|  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 | <?php declare(strict_types=1);
use Ibexa\PageBuilder\Form\Type\Attribute\AttributeType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;
final class AttributeTypeExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        /** @var \Ibexa\Contracts\FieldTypePage\FieldType\Page\Block\Definition\BlockAttributeDefinition $attributeDefinition */
        $attributeDefinition = $options['block_attribute_definition'];
        if (isset($attributeDefinition->getConstraints()['custom_not_blank'])) {
            $builder->setRequired(true);
        }
    }
    public static function getExtendedTypes(): iterable
    {
        return [
            AttributeType::class,
        ];
    }
}
 |