From 25e8fa62e0da736b78318925c36b11a01e512465 Mon Sep 17 00:00:00 2001 From: Christian Raue Date: Mon, 25 Nov 2013 12:13:41 +0100 Subject: [PATCH 1/9] add a validation error to the current form if a form of a previous step became invalid --- CHANGELOG.md | 2 + Form/FormFlow.php | 60 ++++++++++++++++++- Form/FormFlowInterface.php | 6 ++ Resources/config/form_flow.xml | 3 + Resources/translations/validators.de.yml | 1 + Resources/translations/validators.en.yml | 1 + .../Controller/FormFlowController.php | 9 +++ .../Entity/RevalidatePreviousStepsData.php | 27 +++++++++ .../Form/RevalidatePreviousStepsFlow.php | 38 ++++++++++++ .../Resources/config/form_flow.xml | 6 ++ .../revalidatePreviousSteps.html.twig | 1 + Tests/RevalidatePreviousStepsFlowTest.php | 44 ++++++++++++++ 12 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 Resources/translations/validators.de.yml create mode 100644 Resources/translations/validators.en.yml create mode 100644 Tests/IntegrationTestBundle/Entity/RevalidatePreviousStepsData.php create mode 100644 Tests/IntegrationTestBundle/Form/RevalidatePreviousStepsFlow.php create mode 100644 Tests/IntegrationTestBundle/Resources/views/FormFlow/revalidatePreviousSteps.html.twig create mode 100644 Tests/RevalidatePreviousStepsFlowTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index e11164d2..ffbed586 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,12 @@ ## master +- [#98]: add a validation error to the current form if a form of a previous step became invalid - BC breaks (follow `UPGRADE-3.0.md` to upgrade): - [#101]: support for concurrent instances of the same flow - removed the step field template +[#98]: https://github.com/craue/CraueFormFlowBundle/issues/98 [#101]: https://github.com/craue/CraueFormFlowBundle/issues/101 ## 2.1.4 (2013-12-05) diff --git a/Form/FormFlow.php b/Form/FormFlow.php index df0a6767..bf627fe5 100644 --- a/Form/FormFlow.php +++ b/Form/FormFlow.php @@ -12,10 +12,12 @@ use Craue\FormFlowBundle\Storage\StorageInterface; use Craue\FormFlowBundle\Util\StringUtil; use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\Form\FormError; use Symfony\Component\Form\FormFactoryInterface; use Symfony\Component\Form\FormInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Kernel; +use Symfony\Component\Translation\TranslatorInterface; /** * @author Christian Raue @@ -44,6 +46,11 @@ abstract class FormFlow implements FormFlowInterface { */ protected $eventDispatcher = null; + /** + * @var TranslatorInterface + */ + protected $translator; + /** * @var string */ @@ -129,6 +136,11 @@ abstract class FormFlow implements FormFlowInterface { */ private $currentStepNumber = null; + /** + * @var FormInterface[] + */ + private $stepForms = array(); + /** * {@inheritDoc} */ @@ -176,6 +188,13 @@ public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) { $this->eventDispatcher = $eventDispatcher; } + /** + * {@inheritDoc} + */ + public function setTranslator(TranslatorInterface $translator) { + $this->translator = $translator; + } + public function setId($id) { $this->id = $id; } @@ -597,12 +616,15 @@ public function invalidateStepData($fromStepNumber) { protected function applyDataFromSavedSteps() { $stepData = $this->retrieveStepData(); + $this->stepForms = array(); + foreach ($this->getSteps() as $step) { $stepNumber = $step->getNumber(); if (array_key_exists($stepNumber, $stepData)) { $stepForm = $this->createFormForStep($stepNumber); - $stepForm->bind($stepData[$stepNumber]); + $stepForm->bind($stepData[$stepNumber]); // the form is also validated here + $this->stepForms[$stepNumber] = $stepForm; if ($this->hasListeners(FormFlowEvents::POST_BIND_SAVED_DATA)) { $event = new PostBindSavedDataEvent($this, $this->formData, $stepNumber); @@ -722,6 +744,25 @@ public function isValid(FormInterface $form) { $this->eventDispatcher->dispatch(FormFlowEvents::POST_BIND_REQUEST, $event); } + // check if forms of previous steps are still valid + foreach ($this->stepForms as $stepNumber => $stepForm) { + // ignore form of the current step + if ($this->currentStepNumber === $stepNumber) { + break; + } + + // ignore forms of skipped steps + if ($this->isStepSkipped($stepNumber)) { + break; + } + + if (!$stepForm->isValid()) { + $form->addError($this->getPreviousStepInvalidFormError($stepNumber)); + + return false; + } + } + if ($form->isValid()) { if ($this->hasListeners(FormFlowEvents::POST_VALIDATE)) { $event = new PostValidateEvent($this, $form->getData()); @@ -790,6 +831,23 @@ protected function hasListeners($eventName) { return $this->eventDispatcher !== null && $this->eventDispatcher->hasListeners($eventName); } + /** + * @param integer $stepNumber + * @return FormError + */ + protected function getPreviousStepInvalidFormError($stepNumber) { + $messageId = 'craueFormFlow.previousStepInvalid'; + $messageParameters = array('%stepNumber%' => $stepNumber); + + if (version_compare(Kernel::VERSION, '2.2', '>=')) { + $message = $this->translator->trans($messageId, $messageParameters, 'validators'); + return new FormError($message, $messageId, $messageParameters); + } + + // TODO remove as soon as Symfony >= 2.2 is required + return new FormError($messageId, $messageParameters); + } + // methods for BC with third-party templates (e.g. MopaBootstrapBundle) public function getCurrentStep() { diff --git a/Form/FormFlowInterface.php b/Form/FormFlowInterface.php index ba11b24d..11c803e2 100644 --- a/Form/FormFlowInterface.php +++ b/Form/FormFlowInterface.php @@ -8,6 +8,7 @@ use Symfony\Component\Form\FormFactoryInterface; use Symfony\Component\Form\FormInterface; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Translation\TranslatorInterface; /** * @author Christian Raue @@ -46,6 +47,11 @@ function getStorage(); */ function setEventDispatcher(EventDispatcherInterface $eventDispatcher); + /** + * @param TranslatorInterface $translator + */ + function setTranslator(TranslatorInterface $translator); + /** * @return boolean */ diff --git a/Resources/config/form_flow.xml b/Resources/config/form_flow.xml index 43e92397..3cc15fce 100644 --- a/Resources/config/form_flow.xml +++ b/Resources/config/form_flow.xml @@ -34,6 +34,9 @@ + + + diff --git a/Resources/translations/validators.de.yml b/Resources/translations/validators.de.yml new file mode 100644 index 00000000..48cd5c20 --- /dev/null +++ b/Resources/translations/validators.de.yml @@ -0,0 +1 @@ +craueFormFlow.previousStepInvalid: Das Formular für Schritt %stepNumber% ist ungültig. Gehen Sie bitte zurück und versuchen das Formular erneut zu senden. diff --git a/Resources/translations/validators.en.yml b/Resources/translations/validators.en.yml new file mode 100644 index 00000000..40bb2c36 --- /dev/null +++ b/Resources/translations/validators.en.yml @@ -0,0 +1 @@ +craueFormFlow.previousStepInvalid: The form for step %stepNumber% is invalid. Please go back and try to submit it again. diff --git a/Tests/IntegrationTestBundle/Controller/FormFlowController.php b/Tests/IntegrationTestBundle/Controller/FormFlowController.php index c94e8123..befb82d7 100644 --- a/Tests/IntegrationTestBundle/Controller/FormFlowController.php +++ b/Tests/IntegrationTestBundle/Controller/FormFlowController.php @@ -4,6 +4,7 @@ use Craue\FormFlowBundle\Form\FormFlow; use Craue\FormFlowBundle\Tests\IntegrationTestBundle\Entity\Issue64Data; +use Craue\FormFlowBundle\Tests\IntegrationTestBundle\Entity\RevalidatePreviousStepsData; use Craue\FormFlowBundle\Tests\IntegrationTestBundle\Entity\Topic; use Craue\FormFlowBundle\Tests\IntegrationTestBundle\Entity\Vehicle; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; @@ -59,6 +60,14 @@ public function issue87Action() { return $this->processFlow((object) array(), $this->get('integrationTestBundle.form.flow.issue87')); } + /** + * @Route("/revalidatePreviousSteps/", name="_FormFlow_revalidatePreviousSteps") + * @Template("IntegrationTestBundle:FormFlow:revalidatePreviousSteps.html.twig") + */ + public function revalidatePreviousStepsAction() { + return $this->processFlow(new RevalidatePreviousStepsData(), $this->get('integrationTestBundle.form.flow.revalidatePreviousSteps')); + } + /** * @Route("/skipFirstStepUsingClosure/", name="_FormFlow_skipFirstStepUsingClosure") * @Template("IntegrationTestBundle:FormFlow:skipFirstStepUsingClosure.html.twig") diff --git a/Tests/IntegrationTestBundle/Entity/RevalidatePreviousStepsData.php b/Tests/IntegrationTestBundle/Entity/RevalidatePreviousStepsData.php new file mode 100644 index 00000000..8954892a --- /dev/null +++ b/Tests/IntegrationTestBundle/Entity/RevalidatePreviousStepsData.php @@ -0,0 +1,27 @@ + + * @copyright 2011-2013 Christian Raue + * @license http://opensource.org/licenses/mit-license.php MIT License + * + * @Assert\Callback(methods={"isDataValid"}, groups={"flow_revalidatePreviousSteps_step1"}) + */ +class RevalidatePreviousStepsData { + + private static $validationCalls; + + // TODO replace with ExecutionContextInterface as soon as Symfony >= 2.2 is required + public function isDataValid(ExecutionContext $context) { + // valid only on first call + if (++self::$validationCalls > 1) { + $context->addViolation('Take this!'); + } + } + +} diff --git a/Tests/IntegrationTestBundle/Form/RevalidatePreviousStepsFlow.php b/Tests/IntegrationTestBundle/Form/RevalidatePreviousStepsFlow.php new file mode 100644 index 00000000..7f929edd --- /dev/null +++ b/Tests/IntegrationTestBundle/Form/RevalidatePreviousStepsFlow.php @@ -0,0 +1,38 @@ + + * @copyright 2011-2013 Christian Raue + * @license http://opensource.org/licenses/mit-license.php MIT License + */ +class RevalidatePreviousStepsFlow extends FormFlow { + + /** + * {@inheritDoc} + */ + public function getName() { + return 'revalidatePreviousSteps'; + } + + /** + * {@inheritDoc} + */ + protected function loadStepsConfig() { + return array( + array( + 'label' => 'step1', + ), + array( + 'label' => 'step2', + ), + array( + 'label' => 'step3', + ), + ); + } + +} diff --git a/Tests/IntegrationTestBundle/Resources/config/form_flow.xml b/Tests/IntegrationTestBundle/Resources/config/form_flow.xml index 1a1052ac..8bd5b9b4 100644 --- a/Tests/IntegrationTestBundle/Resources/config/form_flow.xml +++ b/Tests/IntegrationTestBundle/Resources/config/form_flow.xml @@ -42,6 +42,12 @@ scope="request"> + + + + * @copyright 2011-2013 Christian Raue + * @license http://opensource.org/licenses/mit-license.php MIT License + */ +class RevalidatePreviousStepsFlowTest extends IntegrationTestCase { + + public function testRevalidatePreviousSteps() { + $crawler = $this->client->request('GET', $this->url('_FormFlow_revalidatePreviousSteps')); + $this->assertSame(200, $this->client->getResponse()->getStatusCode()); + + // next -> step 2 + $form = $crawler->selectButton('next')->form(); + $crawler = $this->client->submit($form); + + // trying to go to step 3, but validation changed for step 1 + $form = $crawler->selectButton('next')->form(); + $crawler = $this->client->submit($form); + $this->assertCurrentStepNumber(2, $crawler); + $this->assertContainsFormError('The form for step 1 is invalid. Please go back and try to submit it again.', $crawler); + + // back -> step 1 + $form = $crawler->selectButton('back')->form(); + $crawler = $this->client->submit($form); + + // trying to go to step 2 + $form = $crawler->selectButton('next')->form(); + $crawler = $this->client->submit($form); + $this->assertCurrentStepNumber(1, $crawler); + $this->assertContainsFormError('Take this!', $crawler); + +// var_dump($this->client->getResponse()->getContent()); +// die; + } + +} From f62f3a89b213abc294529c1a8d4b2dbf8b46495d Mon Sep 17 00:00:00 2001 From: Christian Raue Date: Fri, 29 Nov 2013 10:36:09 +0100 Subject: [PATCH 2/9] allow disabling revalidation of previous steps --- Form/FormFlow.php | 58 ++++++++++++++----- Form/FormFlowInterface.php | 5 ++ README.md | 17 ++++++ .../Controller/FormFlowController.php | 10 +++- .../Entity/RevalidatePreviousStepsData.php | 4 ++ Tests/RevalidatePreviousStepsFlowTest.php | 31 +++++++++- 6 files changed, 104 insertions(+), 21 deletions(-) diff --git a/Form/FormFlow.php b/Form/FormFlow.php index bf627fe5..69b82fbd 100644 --- a/Form/FormFlow.php +++ b/Form/FormFlow.php @@ -56,6 +56,11 @@ abstract class FormFlow implements FormFlowInterface { */ protected $transition; + /** + * @var boolean + */ + protected $revalidatePreviousSteps = true; + /** * @var boolean */ @@ -315,6 +320,17 @@ public function getCurrentStepNumber() { return $this->currentStepNumber; } + public function setRevalidatePreviousSteps($revalidatePreviousSteps) { + $this->revalidatePreviousSteps = (boolean) $revalidatePreviousSteps; + } + + /** + * {@inheritDoc} + */ + public function isRevalidatePreviousSteps() { + return $this->revalidatePreviousSteps; + } + public function setAllowDynamicStepNavigation($allowDynamicStepNavigation) { $this->allowDynamicStepNavigation = (boolean) $allowDynamicStepNavigation; } @@ -618,13 +634,21 @@ protected function applyDataFromSavedSteps() { $this->stepForms = array(); + $options = array(); + if (!$this->revalidatePreviousSteps) { + $options['validation_groups'] = array(); // disable validation + } + foreach ($this->getSteps() as $step) { $stepNumber = $step->getNumber(); if (array_key_exists($stepNumber, $stepData)) { - $stepForm = $this->createFormForStep($stepNumber); - $stepForm->bind($stepData[$stepNumber]); // the form is also validated here - $this->stepForms[$stepNumber] = $stepForm; + $stepForm = $this->createFormForStep($stepNumber, $options); + $stepForm->bind($stepData[$stepNumber]); // the form is validated here + + if ($this->revalidatePreviousSteps) { + $this->stepForms[$stepNumber] = $stepForm; + } if ($this->hasListeners(FormFlowEvents::POST_BIND_SAVED_DATA)) { $event = new PostBindSavedDataEvent($this, $this->formData, $stepNumber); @@ -744,22 +768,24 @@ public function isValid(FormInterface $form) { $this->eventDispatcher->dispatch(FormFlowEvents::POST_BIND_REQUEST, $event); } - // check if forms of previous steps are still valid - foreach ($this->stepForms as $stepNumber => $stepForm) { - // ignore form of the current step - if ($this->currentStepNumber === $stepNumber) { - break; - } + if ($this->revalidatePreviousSteps) { + // check if forms of previous steps are still valid + foreach ($this->stepForms as $stepNumber => $stepForm) { + // ignore form of the current step + if ($this->currentStepNumber === $stepNumber) { + break; + } - // ignore forms of skipped steps - if ($this->isStepSkipped($stepNumber)) { - break; - } + // ignore forms of skipped steps + if ($this->isStepSkipped($stepNumber)) { + break; + } - if (!$stepForm->isValid()) { - $form->addError($this->getPreviousStepInvalidFormError($stepNumber)); + if (!$stepForm->isValid()) { + $form->addError($this->getPreviousStepInvalidFormError($stepNumber)); - return false; + return false; + } } } diff --git a/Form/FormFlowInterface.php b/Form/FormFlowInterface.php index 11c803e2..16da21f2 100644 --- a/Form/FormFlowInterface.php +++ b/Form/FormFlowInterface.php @@ -52,6 +52,11 @@ function setEventDispatcher(EventDispatcherInterface $eventDispatcher); */ function setTranslator(TranslatorInterface $translator); + /** + * @return boolean + */ + function isRevalidatePreviousSteps(); + /** * @return boolean */ diff --git a/README.md b/README.md index ace7a552..7ed92ffe 100644 --- a/README.md +++ b/README.md @@ -400,6 +400,23 @@ To validate the form data class a step-based validation group is passed to the f By default, if `getName()` of the flow returns `createVehicle`, such a group is named `flow_createVehicle_step1` for the first step. +## Disabling revalidation of previous steps + +Take a look at [#98](https://github.com/craue/CraueFormFlowBundle/issues/98) for an example on why it's useful to +revalidate previous steps by default. But if you want (or need) to avoid revalidating previous steps, you could extend +the flow class mentioned in the example above as follows: + +```php +// in src/MyCompany/MyBundle/Form/CreateVehicleFlow.php +class CreateVehicleFlow extends FormFlow { + + protected $revalidatePreviousSteps = false; + + // ... + +} +``` + ## Passing step-based options to the form type If your form type needs options to build the form (e.g. conditional fields) you can override method `getFormOptions` diff --git a/Tests/IntegrationTestBundle/Controller/FormFlowController.php b/Tests/IntegrationTestBundle/Controller/FormFlowController.php index befb82d7..21f23e5d 100644 --- a/Tests/IntegrationTestBundle/Controller/FormFlowController.php +++ b/Tests/IntegrationTestBundle/Controller/FormFlowController.php @@ -61,11 +61,15 @@ public function issue87Action() { } /** - * @Route("/revalidatePreviousSteps/", name="_FormFlow_revalidatePreviousSteps") + * @Route("/revalidatePreviousSteps/enabled/", defaults={"enabled"=true}, name="_FormFlow_revalidatePreviousSteps_enabled") + * @Route("/revalidatePreviousSteps/disabled/", defaults={"enabled"=false}, name="_FormFlow_revalidatePreviousSteps_disabled") * @Template("IntegrationTestBundle:FormFlow:revalidatePreviousSteps.html.twig") */ - public function revalidatePreviousStepsAction() { - return $this->processFlow(new RevalidatePreviousStepsData(), $this->get('integrationTestBundle.form.flow.revalidatePreviousSteps')); + public function revalidatePreviousStepsAction($enabled) { + $flow = $this->get('integrationTestBundle.form.flow.revalidatePreviousSteps'); + $flow->setRevalidatePreviousSteps($enabled); + + return $this->processFlow(new RevalidatePreviousStepsData(), $flow); } /** diff --git a/Tests/IntegrationTestBundle/Entity/RevalidatePreviousStepsData.php b/Tests/IntegrationTestBundle/Entity/RevalidatePreviousStepsData.php index 8954892a..84c4632f 100644 --- a/Tests/IntegrationTestBundle/Entity/RevalidatePreviousStepsData.php +++ b/Tests/IntegrationTestBundle/Entity/RevalidatePreviousStepsData.php @@ -16,6 +16,10 @@ class RevalidatePreviousStepsData { private static $validationCalls; + public static function resetValidationCalls() { + self::$validationCalls = 0; + } + // TODO replace with ExecutionContextInterface as soon as Symfony >= 2.2 is required public function isDataValid(ExecutionContext $context) { // valid only on first call diff --git a/Tests/RevalidatePreviousStepsFlowTest.php b/Tests/RevalidatePreviousStepsFlowTest.php index 10253bba..a83f5e9b 100644 --- a/Tests/RevalidatePreviousStepsFlowTest.php +++ b/Tests/RevalidatePreviousStepsFlowTest.php @@ -2,6 +2,7 @@ namespace Craue\FormFlowBundle\Tests; +use Craue\FormFlowBundle\Tests\IntegrationTestBundle\Entity\RevalidatePreviousStepsData; use Craue\FormFlowBundle\Tests\IntegrationTestCase; /** @@ -13,8 +14,17 @@ */ class RevalidatePreviousStepsFlowTest extends IntegrationTestCase { - public function testRevalidatePreviousSteps() { - $crawler = $this->client->request('GET', $this->url('_FormFlow_revalidatePreviousSteps')); + /** + * {@inheritDoc} + */ + protected function setUp() { + parent::setUp(); + + RevalidatePreviousStepsData::resetValidationCalls(); + } + + public function testRevalidatePreviousSteps_enabled() { + $crawler = $this->client->request('GET', $this->url('_FormFlow_revalidatePreviousSteps_enabled')); $this->assertSame(200, $this->client->getResponse()->getStatusCode()); // next -> step 2 @@ -37,6 +47,23 @@ public function testRevalidatePreviousSteps() { $this->assertCurrentStepNumber(1, $crawler); $this->assertContainsFormError('Take this!', $crawler); +// var_dump($this->client->getResponse()->getContent()); +// die; + } + + public function testRevalidatePreviousSteps_disabled() { + $crawler = $this->client->request('GET', $this->url('_FormFlow_revalidatePreviousSteps_disabled')); + $this->assertSame(200, $this->client->getResponse()->getStatusCode()); + + // next -> step 2 + $form = $crawler->selectButton('next')->form(); + $crawler = $this->client->submit($form); + + // next -> step 3 + $form = $crawler->selectButton('next')->form(); + $crawler = $this->client->submit($form); + $this->assertCurrentStepNumber(3, $crawler); + // var_dump($this->client->getResponse()->getContent()); // die; } From c7a286db41f0369f77d3c61174f083f2bbbbb426 Mon Sep 17 00:00:00 2001 From: Christian Raue Date: Mon, 2 Dec 2013 12:51:19 +0100 Subject: [PATCH 3/9] added Polish translation --- Resources/translations/validators.pl.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 Resources/translations/validators.pl.yml diff --git a/Resources/translations/validators.pl.yml b/Resources/translations/validators.pl.yml new file mode 100644 index 00000000..0efa58a1 --- /dev/null +++ b/Resources/translations/validators.pl.yml @@ -0,0 +1 @@ +craueFormFlow.previousStepInvalid: Formularz dla kroku %stepNumber% został wypełniony nieprawidłowo. Proszę cofnąć się i wypełnić go ponownie. From ba77443e781ee8cfad49a078b794a3e550779705 Mon Sep 17 00:00:00 2001 From: Christian Raue Date: Mon, 2 Dec 2013 14:05:14 +0100 Subject: [PATCH 4/9] added French translation, contributed by Wolfgang A. Borchardt --- Resources/translations/validators.fr.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 Resources/translations/validators.fr.yml diff --git a/Resources/translations/validators.fr.yml b/Resources/translations/validators.fr.yml new file mode 100644 index 00000000..47c6028b --- /dev/null +++ b/Resources/translations/validators.fr.yml @@ -0,0 +1 @@ +craueFormFlow.previousStepInvalid: Le formulaire pour l'étape %stepNumber% est invalide. Veuillez retourner et essayez de le renvoyer. From 4964abe0031a6cb5c441e8ecca473e97db0eb58d Mon Sep 17 00:00:00 2001 From: Christian Raue Date: Mon, 2 Dec 2013 17:29:07 +0100 Subject: [PATCH 5/9] added Spanish translation, contributed by Matthias Holder --- Resources/translations/validators.es.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 Resources/translations/validators.es.yml diff --git a/Resources/translations/validators.es.yml b/Resources/translations/validators.es.yml new file mode 100644 index 00000000..6ace54b1 --- /dev/null +++ b/Resources/translations/validators.es.yml @@ -0,0 +1 @@ +craueFormFlow.previousStepInvalid: El formulario del paso %stepNumber% está inválido. Por favor, utilice el botón de atrás y pruebe de enviar el formulario de nuevo. From 553481fe546cf5263b713c56b3f901348302314b Mon Sep 17 00:00:00 2001 From: Christian Raue Date: Mon, 2 Dec 2013 18:34:45 +0100 Subject: [PATCH 6/9] added Dutch translation --- Resources/translations/validators.nl.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 Resources/translations/validators.nl.yml diff --git a/Resources/translations/validators.nl.yml b/Resources/translations/validators.nl.yml new file mode 100644 index 00000000..ead73c4e --- /dev/null +++ b/Resources/translations/validators.nl.yml @@ -0,0 +1 @@ +craueFormFlow.previousStepInvalid: Het formulier voor stap %stepNumber% is ongeldig. Ga terug en probeer het opnieuw te versturen. From 37d2773a03607abfd8d3ba512196e0b8fe08c839 Mon Sep 17 00:00:00 2001 From: Christian Raue Date: Mon, 2 Dec 2013 22:14:32 +0100 Subject: [PATCH 7/9] added Russian translation --- Resources/translations/validators.ru.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 Resources/translations/validators.ru.yml diff --git a/Resources/translations/validators.ru.yml b/Resources/translations/validators.ru.yml new file mode 100644 index 00000000..0aa084d8 --- /dev/null +++ b/Resources/translations/validators.ru.yml @@ -0,0 +1 @@ +craueFormFlow.previousStepInvalid: Форма для шага %stepNumber% имеет недопустимое значение. Пожалуйста, вернитесь назад и попробуйте повторить отправку. From 73324833994ba4b403c75120c86d09e1666ff61d Mon Sep 17 00:00:00 2001 From: Christian Raue Date: Mon, 2 Dec 2013 22:14:42 +0100 Subject: [PATCH 8/9] added Ukrainian translation --- Resources/translations/validators.uk.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 Resources/translations/validators.uk.yml diff --git a/Resources/translations/validators.uk.yml b/Resources/translations/validators.uk.yml new file mode 100644 index 00000000..267b9a1c --- /dev/null +++ b/Resources/translations/validators.uk.yml @@ -0,0 +1 @@ +craueFormFlow.previousStepInvalid: Форма для кроку %stepNumber% є недопустимою. Будь ласка, поверніться та спробуйте повторно відправити форму. From 955c3ca858ddae11a98211e911d3617110e02ec7 Mon Sep 17 00:00:00 2001 From: Christian Raue Date: Sun, 15 Dec 2013 13:53:33 +0100 Subject: [PATCH 9/9] =?UTF-8?q?added=20Chinese=20translation,=20contribute?= =?UTF-8?q?d=20by=20=E9=BB=83=E6=B2=81=E7=91=9C=20(Nancy=20Huang)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Resources/translations/validators.zh.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 Resources/translations/validators.zh.yml diff --git a/Resources/translations/validators.zh.yml b/Resources/translations/validators.zh.yml new file mode 100644 index 00000000..808a8c1b --- /dev/null +++ b/Resources/translations/validators.zh.yml @@ -0,0 +1 @@ +craueFormFlow.previousStepInvalid: 步驟%stepNumber%的表格無效,請回到上一個步驟並重新提交。