Esempio n. 1
0
 /**
  * Erstellt die i18nAPI für ein i18nProperty
  *
  * i18nPropertyName ist title:
  * 
  * erstellt einen virtuellen Getter für den OriginalNamen des Properties (getTitle($lang))
  * erstellt einen virtuellen Setter für den OriginalNamen des Properties (setTitle($value, $lang))
  *
  * setI18nTitle(Array $titles);
  * getI18nTitle() -> array
  * gibt es schon
  *
  * zusätzlich müssen wir die Properties (welche nicht im MetaSet sind) erstellen:
  * titleDe, titleEn, usw je nach $this->languages
  * alle ohne getter
  */
 public function generateI18nAPI(ClassBuilderProperty $property, $originalName, $originalFlags = 0x0, $originalUpperCaseName = NULL)
 {
     $originalType = $property->getType()->getType();
     $properties = array();
     foreach ($this->getLanguages() as $lang) {
         $properties[$lang] = $this->createProperty($originalName . ucfirst($lang), $originalType, $originalFlags & (self::NULLABLE | self::UNIQUE) | self::WITHOUT_GETTER | self::WITHOUT_SETTER, $originalUpperCaseName ? $originalUpperCaseName . ucfirst($lang) : NULL);
         $this->setForcedMetaProperty($properties[$lang], FALSE);
         // nicht in die meta exportieren, weil wir sie da nicht wollen, das i18n-property schon!
     }
     // wir müssen den initialisierungs code für den i18n array in den getter injecten
     $initCode = array();
     $initCode[] = sprintf('if (count($this->%s) == 0) {', $property->getName());
     foreach ($this->getLanguages() as $lang) {
         $initCode[] = sprintf('  $this->%s[\'%s\'] = $this->%s;', $property->getName(), $lang, $properties[$lang]->getName());
     }
     $initCode[] = '}';
     $this->getMethod($property->getGetterName())->beforeBody($initCode);
     // wir müssen den setter für den i18n Array injecten (der soll die virtuellen properties setzen)
     $updateCode = array();
     foreach ($this->getLanguages() as $lang) {
         $updateCode[] = sprintf('$this->%s = $this->%s[\'%s\'];', $properties[$lang]->getName(), $property->getName(), $lang);
     }
     $this->getMethod($property->getSetterName())->insertBody($updateCode, -1);
     // vor: return $this;
     // dann müssen wir getField
     $getCode = array();
     $getCode[] = sprintf('$title = $this->%s();', $property->getGetterName());
     $getCode[] = 'return $title[$lang];';
     $this->addMethod(new GMethod('get' . ($originalUpperCaseName ?: ucfirst($originalName)), array(new GParameter('lang', NULL)), $getCode));
     // und setField bauen
     $setCode = array();
     // wir könnten uns noch überlegen bei else: eine exception zu schmeissen?
     foreach ($this->getLanguages() as $key => $lang) {
         if ($key === 0) {
             $setCode[] = sprintf('if ($lang === \'%s\') {', $lang);
         } else {
             $setCode[] = sprintf('} elseif ($lang === \'%s\') {', $lang);
         }
         // setze klassenVariable und i18nVariable auf den neuen Wert
         $setCode[] = sprintf('  $this->%s = $this->%s[\'%s\'] = $value;', $properties[$lang]->getName(), $property->getName(), $lang);
     }
     $setCode[] = '}';
     $setCode[] = 'return $this;';
     $this->addMethod(new GMethod('set' . ($originalUpperCaseName ?: ucfirst($originalName)), array(new GParameter('value', $originalType->getPHPHint()), new GParameter('lang', NULL)), $setCode));
 }
Esempio n. 2
0
 /**
  * 
  * existiert der Getter wird er nicht überschrieben
  * @param string $getter der volle Name des Getters ansonsten wir get.ucfirst($property) genommen
  */
 public function generateGetter(ClassBuilderProperty $property, $getter = NULL, $flags = 0)
 {
     $getter = $getter ?: $property->getGetterName();
     // wenn die klasse die Methode wirklich selbst hat, überschreiben wir diesen nicht
     if ($this->class->hasOwnMethod($getter)) {
         return $this;
     }
     // die methode gibt es auch nicht in der hierarchy, dann erstelleln wir sie ganz normal
     if (!$this->class->hasMethod($getter)) {
         $gMethod = $this->class->createMethod($getter, array(), $this->createCode('getter', array('property' => $property->getName())), GMethod::MODIFIER_PUBLIC);
         $gMethod->createDocBlock()->addSimpleAnnotation('return ' . $property->getDocType());
     } elseif ($flags & self::INHERIT) {
         // wir wollen die methode in dieser klasse haben (das besagt das flag), allerdings müssen wird ie methode ableiten
         $method = clone $this->class->getMethod($getter);
         if ($method->isAbstract()) {
             $method->setAbstract(FALSE);
         }
         // check ob das property->getName() richtig ist?
         $method->setBodyCode($this->createCode('getter', array('property' => $property->getName())));
         $this->addMethod($method);
     }
     return $this;
 }