composer require arnaud-ritti/mosparo-bundle
config/bundles.php:
Mosparo\MosparoBundle\MosparoBundle::class => ['all' => true],
.env with your Mosparo instance credentials:
MOSPARO_INSTANCE_URL=https://your-mosparo-instance.com
MOSPARO_UUID=your-project-uuid
MOSPARO_PUBLIC_KEY=your-public-key
MOSPARO_PRIVATE_KEY=your-private-key
config/packages/mosparo.yaml:
mosparo:
instance_url: '%env(MOSPARO_INSTANCE_URL)%'
uuid: '%env(MOSPARO_UUID)%'
public_key: '%env(MOSPARO_PUBLIC_KEY)%'
private_key: '%env(MOSPARO_PRIVATE_KEY)%'
Add the MosparoType to your form class:
use Mosparo\MosparoBundle\Form\Type\MosparoType;
class ContactType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('name', TextType::class)
->add('email', EmailType::class)
->add('message', TextareaType::class)
->add('mosparo', MosparoType::class, [
'project' => 'default',
'loadCssResource' => true
]);
}
}
Use separate configurations for different form types (e.g., login vs. contact forms):
# config/packages/mosparo.yaml
mosparo:
default_project: '%env(MOSPARO_DEFAULT)%'
projects:
login:
instance_url: '%env(MOSPARO_LOGIN_URL)%'
uuid: '%env(MOSPARO_LOGIN_UUID)%'
# ...
contact:
instance_url: '%env(MOSPARO_CONTACT_URL)%'
uuid: '%env(MOSPARO_CONTACT_UUID)%'
# ...
Usage in Form:
$builder->add('mosparo', MosparoType::class, ['project' => 'contact']);
Override default ignored/verifiable field types via event listeners:
// src/EventListener/MosparoFieldListener.php
use Mosparo\MosparoBundle\Event\FilterFieldTypesEvent;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
#[AsEventListener]
class MosparoFieldListener {
public function __invoke(FilterFieldTypesEvent $event) {
$event->setIgnoredFieldTypes(array_diff(
$event->getIgnoredFieldTypes(),
[PasswordType::class]
));
$event->setVerifiableFieldTypes(array_merge(
$event->getVerifiableFieldTypes(),
[PasswordType::class]
));
}
}
Disable Mosparo in test environments:
# config/packages/mosparo.yaml
mosparo:
enabled: '%env(bool:MOSPARO_ENABLED)%' # Set to `false` in .env.test
# .env.test
MOSPARO_ENABLED=0
cssResourceUrl to a cached path:
$builder->add('mosparo', MosparoType::class, [
'cssResourceUrl' => '/cached/mosparo.css',
'loadCssResource' => false
]);
$builder->add('mosparo', MosparoType::class, [
'allowBrowserValidation' => false
]);
For Symfony Forms:
// Twig template
{{ form_start(form) }}
{{ form_row(form.name) }}
{{ form_row(form.email) }}
{{ form_row(form.mosparo) }} <!-- Renders hidden token + JS -->
{{ form_end(form) }}
For API Submissions:
allowBrowserValidation: false and validate server-side via Mosparo’s API.SSL Verification Errors:
mosparo:
verify_ssl: '%env(bool:MOSPARO_VERIFY_SSL)%'
MOSPARO_VERIFY_SSL=0
Field Name Conflicts:
_mosparo_ in their name. Avoid naming conventions like submit_mosparo_token.Token Mismatches:
requestSubmitTokenOnInit: true, ensure the form’s CSRF token is compatible with Mosparo’s token. Reset the form carefully:
$form->reset();
$form->submit($data); // Mosparo token will auto-reload
JavaScript Dependencies:
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
{{ form_widget(form.mosparo) }} <!-- Auto-loads Mosparo JS -->
Check Mosparo Logs:
mosparo.yaml:
mosparo:
debug: true
var/log/dev.log.Validate API Responses:
Form Submission Issues:
inputFieldSelector matches your form’s structure:
$builder->add('mosparo', MosparoType::class, [
'inputFieldSelector' => '[data-mosparo="enabled"]' // Custom selector
]);
Custom Validation Logic:
MosparoType class to add pre/post-validation hooks:
use Mosparo\MosparoBundle\Form\Type\MosparoType as BaseMosparoType;
class CustomMosparoType extends BaseMosparoType {
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults([
'custom_option' => null,
]);
}
}
Event-Driven Extensions:
mosparo.form.submit events to intercept submissions:
#[AsEventListener(event: 'mosparo.form.submit')]
public function onMosparoSubmit(MosparoEvent $event) {
if ($event->isValid()) {
// Custom logic
}
}
Multi-Tenant Support:
$project = $this->getMosparoProjectForUser($user);
$builder->add('mosparo', MosparoType::class, ['project' => $project]);
loadCssResource: true, the bundle injects a <link> tag. For SPAs, preload the CSS manually.localStorage)..env files. Use Symfony’s env() function in code:
$this->container->getParameter('mosparo.private_key');
How can I help you explore Laravel packages today?