/** * Load metadata for a translation class * * @param string $className * @param mixed $config * @return TranslationMetadata|null */ protected function loadTranslationMetadata($className, $config) { if (!isset($config[$className]) || !isset($config[$className]['prezent']) || !array_key_exists('translatable', $config[$className]['prezent'])) { return; } $classMetadata = new TranslationMetadata($className); $translatable = $config[$className]['prezent']['translatable'] ?: array(); $propertyMetadata = new PropertyMetadata($className, isset($translatable['field']) ? $translatable['field'] : 'translatable'); $targetEntity = 'Translation' === substr($className, -11) ? substr($className, 0, -11) : null; $classMetadata->targetEntity = isset($translatable['targetEntity']) ? $translatable['targetEntity'] : $targetEntity; $classMetadata->translatable = $propertyMetadata; $classMetadata->addPropertyMetadata($propertyMetadata); $locale = isset($translatable['locale']) ? $translatable['locale'] : 'locale'; $propertyMetadata = new PropertyMetadata($className, $locale); $classMetadata->locale = $propertyMetadata; $classMetadata->addPropertyMetadata($propertyMetadata); return $classMetadata; }
/** * Load metadata for a translation class * * @param \ReflectionClass $class * @return TranslationMetadata */ private function loadTranslationMetadata(\ReflectionClass $class) { $classMetadata = new TranslationMetadata($class->name); foreach ($class->getProperties() as $property) { if ($property->class !== $class->name) { continue; } $propertyMetadata = new PropertyMetadata($class->name, $property->getName()); if ($annot = $this->reader->getPropertyAnnotation($property, 'Prezent\\Doctrine\\Translatable\\Annotation\\Translatable')) { $classMetadata->targetEntity = $annot->targetEntity; $classMetadata->translatable = $propertyMetadata; $classMetadata->addPropertyMetadata($propertyMetadata); } if ($this->reader->getPropertyAnnotation($property, 'Prezent\\Doctrine\\Translatable\\Annotation\\Locale')) { $classMetadata->locale = $propertyMetadata; $classMetadata->addPropertyMetadata($propertyMetadata); } } return $classMetadata; }
/** * Load metadata for a translation class * * @param string $className * @param mixed $config * * @throws \Exception * @return TranslationMetadata|null */ protected function loadTranslationMetadata($className, $config) { if (!$config) { return; } $xml = new SimpleXMLElement($config); $xml->registerXPathNamespace('prezent', 'prezent'); $nodeList = $xml->xpath('//prezent:translatable'); if (0 == count($nodeList)) { return; } if (1 < count($nodeList)) { throw new \Exception("Configuration defined twice"); } $nodeTranslatable = $nodeList[0]; $translatableField = (string) $nodeTranslatable['field']; $translatableTargetEntity = (string) $nodeTranslatable['target-entity']; $locale = (string) (string) $nodeTranslatable['locale']; $classMetadata = new TranslationMetadata($className); $propertyMetadata = new PropertyMetadata($className, !empty($translatableField) ? $translatableField : 'translatable'); $targetEntity = 'Translation' === substr($className, -11) ? substr($className, 0, -11) : null; $classMetadata->targetEntity = !empty($translatableTargetEntity) ? $translatableTargetEntity : $targetEntity; $classMetadata->translatable = $propertyMetadata; $classMetadata->addPropertyMetadata($propertyMetadata); if ($locale) { $propertyMetadata = new PropertyMetadata($className, $locale); $classMetadata->locale = $propertyMetadata; $classMetadata->addPropertyMetadata($propertyMetadata); } // Set to default if no locale property has been set if (!$classMetadata->locale) { $propertyMetadata = new PropertyMetadata($className, 'locale'); $classMetadata->locale = $propertyMetadata; $classMetadata->addPropertyMetadata($propertyMetadata); } return $classMetadata; }
/** * @expectedException Prezent\Doctrine\Translatable\Mapping\MappingException */ public function testTranslationValidation() { $meta = new TranslationMetadata('Prezent\\Tests\\Fixture\\BasicTranslation'); $meta->validate(); }