예제 #1
0
 /**
  * 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;
 }
예제 #3
0
 /**
  * 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();
 }