Пример #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));
 }
Пример #2
0
 /**
  * @param string der volle Name des Setters
  * 
  * @param $flags wenn dies z.B: INHERIT ist wird immer eine eigene Methode für den Setter erstellt (auch wenn es die Methode schon in der Hierarchy gibt)
  */
 public function generateSetter(ClassBuilderProperty $property, $setter = NULL, $flags = 0)
 {
     $setter = $setter ?: $property->getSetterName();
     // wenn die klasse die Methode wirklich selbst hat, überschreiben wir diesen nicht
     if ($this->class->hasOwnMethod($setter)) {
         return $this;
     }
     // die methode gibt es auch nicht in der hierarchy, dann erstelleln wir sie ganz normal
     if (!$this->class->hasMethod($setter)) {
         $gMethod = $this->class->createMethod($setter, array(new GParameter($property->getName(), $property->getPHPHint(), $property->isNullable() && $property->getPHPHint() != NULL ? NULL : GParameter::UNDEFINED)), $this->createCode('setter', array('property' => $property->getName())), GMethod::MODIFIER_PUBLIC);
         $gMethod->createDocBlock()->addSimpleAnnotation('param ' . ($property->getDocType() ?: 'undefined') . ' $' . $property->getName());
     } 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($setter);
         if ($method->isAbstract()) {
             $method->setAbstract(FALSE);
         }
         // check ob das property->getName() richtig ist?
         if (count($method->getParameters()) === 0) {
             $method->addParameter(new GParameter($property->getName(), $property->getPHPHint()));
         } elseif (count($method->getParameters()) > 0) {
             $method->getParameterByIndex(0)->setName($property->getName());
         }
         $method->setBodyCode($this->createCode('setter', array('property' => $property->getName())));
         $this->addMethod($method);
     }
     return $this;
 }