/** * @param LoadClassMetadataEventArgs $eventArgs */ public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs) { // the $metadata is the whole mapping info for this class /** @var \Doctrine\ORM\Mapping\ClassMetadata $metadata */ $metadata = $eventArgs->getClassMetadata(); $reflection = $metadata->getReflectionClass(); if (!isset($this->entityMappings[$metadata->getName()])) { return; } // map all the user fields automatically if they aren't defined if (!$metadata->hasAssociation('createdBy')) { $metadata->mapManyToOne(['fieldName' => 'createdBy', 'targetEntity' => $this->userEntity]); } if (!$metadata->hasAssociation('editedBy')) { $metadata->mapManyToOne(['fieldName' => 'editedBy', 'targetEntity' => $this->userEntity]); } if (!$metadata->hasAssociation('deletedBy')) { $metadata->mapManyToOne(['fieldName' => 'deletedBy', 'targetEntity' => $this->userEntity]); } $entityManager = $eventArgs->getEntityManager(); $namingStrategy = $entityManager->getConfiguration()->getNamingStrategy(); foreach ($this->entityMappings[$metadata->getName()] as $field => $fieldConfig) { $fieldDefinition = $this->fieldManager->getFieldDefinition($fieldConfig['type']); if ($fieldConfig['dynamic']) { if ($fieldConfig['options']['limit'] > 1) { $mapping = ['targetEntity' => $fieldDefinition->getEntityClass(), 'fieldName' => $field, 'cascade' => ['persist'], 'joinTable' => ['name' => strtolower($namingStrategy->classToTableName($metadata->getName())) . '_field_' . $namingStrategy->propertyToColumnName($field)], 'orderBy' => ['delta' => 'ASC'], 'unique' => false]; } else { $mapping = ['targetEntity' => $fieldDefinition->getEntityClass(), 'fieldName' => $field, 'cascade' => ['persist'], 'unique' => false]; } $event = new FieldMappingEvent($entityManager, $fieldDefinition, $metadata, $field, $fieldConfig, $mapping); $this->eventDispatcher->dispatch(GravityEvents::FIELD_MAPPING, $event); if ($fieldConfig['options']['limit'] > 1) { $metadata->mapManyToMany($event->getMapping()); } else { $metadata->mapManyToOne($event->getMapping()); } } } }
/** * @param FormMapper $formMapper */ protected function configureFormFields(FormMapper $formMapper) { $formMapper->with('Content', ['class' => 'col-md-9'])->end()->with('Publishing', ['class' => 'col-md-3'])->end()->with('Routing', ['class' => 'col-md-3'])->add('path', 'text', ['required' => false])->end(); $fieldMappings = $this->fieldManager->getEntityFieldMapping($this->getClass()); $formMapper->with('Content'); foreach ($fieldMappings as $field => $settings) { $fieldDefinition = $this->fieldManager->getFieldDefinition($settings['type']); $fieldWidgetDefinition = $this->fieldManager->getFieldWidgetDefinition($settings['widget']['type']); $constraints = $fieldDefinition->getConstraints($field, $settings['options']); // TODO: deprecate dynamic if ($settings['dynamic']) { $fieldWidgetDefinition->configureForm($formMapper, $fieldDefinition, $field, $settings['options'], $settings['widget']['type'], $settings['widget']['options']); $formMapper->getFormBuilder()->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $formEvent) use($fieldDefinition, $field, $settings) { $data = $formEvent->getData(); if ($data instanceof Node) { $value = $data->{"get{$field}"}(); if (!$value || !count($value) && $settings['options']['limit'] == 1) { $fieldClass = $fieldDefinition->getEntityClass(); if ($fieldClass) { $data->{"set{$field}"}(new $fieldClass()); } } } }); } else { $fieldWidgetDefinition->configureForm($formMapper, $fieldDefinition, $field, $settings['options'], $settings['widget']['type'], $settings['widget']['options']); /** @var ClassMetadata $metadata */ $metadata = $this->validator->getMetadataFactory()->getMetadataFor($this->getClass()); foreach ($constraints as $constraintField => $constraint) { $metadata->addPropertyConstraints($constraintField, $constraint); } } } $formMapper->end(); $formMapper->end(); }