/** * Builds form * * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { foreach ($this->translationsHelper->getLanguages() as $locale => $name) { $builder->add($locale, @$options['field_type'], array_merge($options['field_options'], array('label' => $name, 'required' => $locale == $this->translationsHelper->getDefaultLocale() ? $options['required'] : false))); } $transformer = new TranslationFieldDataTransformer(); $transformer->setCultures(array_keys($this->translationsHelper->getLanguages()))->setField($builder->getName())->setDefaultCulture($this->translatableListener->getDefaultLocale()); // Adds transformer $builder->addModelTransformer($transformer); // On PreSet data - build translations $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use($transformer) { $form = $event->getForm(); $parentForm = $form->getParent(); if ($parentForm->getData()) { $transformer->setObject($parentForm->getData()); } }, -10); // On PostSet data - persist translations $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use($transformer) { foreach ($transformer->getFieldTranslations() as $translation) { $this->entityManager->persist($translation); } }, -10); }
/** * Gets field names * * @return array */ private function getFieldNames() { //helper function to generate all field names in format: // '<locale>' => '<field>|<locale>' $collection = array(); foreach ($this->translationsHelper->getLanguages() as $key => $locale) { if (is_numeric($key)) { $key = $locale; } foreach ($this->options['fields'] as $field) { $collection[$key][$field] = $field . ":" . $key; } } return $collection; }