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