/** * 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)); }
/** * * 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; }