alengo/sulu-contact-account-extra-bundle
Installation:
composer require alengo/sulu-contact-account-extra-bundle
Register the bundle in config/bundles.php and import routes in config/routes/sulu_admin.yaml.
Database Migration:
bin/adminconsole doctrine:migrations:diff
bin/adminconsole doctrine:migrations:migrate
Create Form:
Define a form in config/forms/contact_additional_data.xml (or account_additional_data.xml) with your desired fields.
Verify:
sulu_admin.app.additional_data).Add a custom field (e.g., externalId) to the Additional Data tab for Contacts:
<!-- config/forms/contact_additional_data.xml -->
<form xmlns="...">
<key>contact_additional_data</key>
<properties>
<property name="externalId" type="text_line" mandatory="false">
<meta>
<title lang="en">External ID</title>
</meta>
</property>
</properties>
</form>
Now, when editing a contact, the field appears under the Additional Data tab.
Field Management:
customerTier:
<property name="customerTier" type="select">
<meta>
<title lang="en">Customer Tier</title>
</meta>
<options>
<option value="bronze">Bronze</option>
<option value="silver">Silver</option>
<option value="gold">Gold</option>
</options>
</property>
API Integration:
GET /admin/api/contact-additional-data/123
PUT /admin/api/contact-additional-data/123 {"externalId": "ABC123"}
Custom Entities:
alengo_contact_account_extra:
contact:
entity_class: App\Entity\CustomContact
CustomContact extends Alengo\SuluContactAccountExtraBundle\Entity\Contact.Localization:
<meta> tags:
<meta>
<title lang="en">External ID</title>
<title lang="de">Externe ID</title>
</meta>
mandatory="true" or regex patterns).// Fetch contact additional data
await fetch(`/admin/api/contact-additional-data/${contactId}`)
.then(res => res.json())
.then(data => console.log(data));
additionalData column later, use Doctrine migrations:
bin/adminconsole make:migration
Form Key Mismatch:
key in your form XML matches the form_key in the bundle config (default: contact_additional_data).key="wrong_key" but config uses contact_additional_data.Database Schema:
additionalData column is added as a JSON type. Ensure your database supports it (e.g., PostgreSQL, MySQL 5.7+).Caching:
bin/adminconsole cache:clear
Entity Overrides:
entity_class, ensure the new entity:
co_contacts/co_accounts).additionalData property as a JsonType column.API Endpoints:
const { externalId, customerTier } = await res.json();
Missing Tab:
bundles.php.config/forms/ and has the correct key.var/log/dev.log.API 404 Errors:
sulu_admin.yaml.JSON Serialization:
additionalData appears as null or malformed, check:
PUT request sends a valid JSON payload.Custom Data Processing:
additionalData is handled:
# config/services.yaml
Alengo\SuluContactAccountExtraBundle\Service\AdditionalDataHandler:
arguments:
$customLogic: '@app.custom.additional_data_handler'
Dynamic Forms:
// src/EventListener/FormBuilderListener.php
public function onKernelRequest(GetResponseEvent $event) {
if ($event->isMasterRequest()) {
$form = $this->createFormBuilder()
->add('dynamicField', TextType::class, ['required' => false])
->getForm();
// Save to XML or render dynamically.
}
}
Webhook Triggers:
pre_update/post_update events on Contact/Account to trigger actions when additionalData changes:
// src/EventSubscriber/AdditionalDataSubscriber.php
public function onPreUpdate(PreUpdateEventArgs $args) {
$entity = $args->getEntity();
if ($entity instanceof Contact && $args->hasChangedField('additionalData')) {
// Dispatch event or call external API.
}
}
Localization:
translations/messages.en.xlf or de.xlf:
<trans-unit id="sulu_admin.app.additional_data">
<source>Additional Data</source>
<target>Zusätzliche Daten</target>
</trans-unit>
How can I help you explore Laravel packages today?