create-form-type
Read @.ai/Component/Forms/CONTEXT.md for form conventions (base classes, data flow, service registration).
1. Root form type
Create src/PrestaShopBundle/Form/Admin/{Section}/{Domain}/{Domain}Type.php:
- Extend
TranslatorAwareType(provides$this->trans()) orAbstractTypefor simple forms buildForm(): add all fields for the entityconfigureOptions(): set defaults as needed- Form types define structure and validation only — no knowledge of commands/queries
Reference: src/PrestaShopBundle/Form/Admin/Improve/International/Tax/TaxType.php (simple), src/PrestaShopBundle/Form/Admin/Sell/Catalog/Manufacturer/ManufacturerType.php (with image)
2. Standard field types
| PS field concept | Symfony/PS type | Notes |
|---|---|---|
| Text | TextType |
Standard input |
| Boolean toggle | SwitchType (PS-specific) |
On/off switch |
| Select with static options | ChoiceType |
Inline choices array |
| Select with dynamic options | ChoiceType + ChoiceProvider |
See section 5 |
| Textarea / HTML | TextareaType or FormattedTextareaType |
3. Translatable fields
For multilingual fields (entity has _lang table):
->add('name', TranslatableType::class, [
'type' => TextType::class,
'options' => ['constraints' => [new NotBlank()]],
])
TranslatableTyperenders one input per active shop language- Submitted data:
['name' => [1 => 'English', 2 => 'French']] - Map to command's
setLocalizedNames()setter in the DataHandler
For translatable textareas: wrap TextareaType or FormattedTextareaType.
4. Money / price fields
For monetary fields (see Forms/CONTEXT.md for decimal scale convention):
- Static currency:
MoneyType::classwith'currency' => $defaultCurrencyIsoCode - Multi-currency: PS-specific
AmountTypeif available - Use appropriate transformers to convert between form display and storage
5. Choice providers
For select fields with dynamic options from DB:
- Create
{Domain}{Field}ChoiceProvider.phpimplementingChoiceProviderInterface - Inject repository or DBAL connection
getChoices(): array— return['Label' => value]array- Inject into the form type and pass as
choicesoption
Reference: src/Core/Form/ChoiceProvider/ (61+ existing providers)
6. File upload fields
For image/logo uploads (see Forms/CONTEXT.md for file upload conventions):
- Add
FileType::classwith'mapped' => false, 'required' => false - Add
Fileconstraint with allowed MIME types - Display existing image in the edit template via custom Twig block
Rules
Conventions (base classes, file uploads, choice providers, NavigationTabType) are in Forms/CONTEXT.md. Skill-specific reminders:
- Add Symfony validation constraints directly on form fields (
NotBlank,Length,Regex) - For multi-tab layout, use the
create-form-tab-layoutskill instead