/** * update means renaming of method name, parameter and replacing parameter names in method body * * @param Tx_ExtensionBuilder_Domain_Model_AbstractDomainObjectProperty $oldProperty * @param Tx_ExtensionBuilder_Domain_Model_AbstractDomainObjectProperty $newProperty * @param string $methodType get,set,add,remove,is * * @return void */ protected function updateMethod($oldProperty, $newProperty, $methodType) { $oldMethodName = $this->classBuilder->getMethodName($oldProperty, $methodType); // the method to be merged $mergedMethod = $this->classObject->getMethod($oldMethodName); if (!$mergedMethod) { // no previous version of the method exists return; } $newMethodName = $this->classBuilder->getMethodName($newProperty, $methodType); t3lib_div::devlog('updateMethod:' . $oldMethodName . '=>' . $newMethodName, 'extension_builder'); if ($oldProperty->getName() != $newProperty->getName()) { // rename the method $mergedMethod->setName($newMethodName); $oldMethodBody = $mergedMethod->getBody(); $oldComment = $mergedMethod->getDocComment(); $newMethodBody = $this->replacePropertyNameInMethodBody($oldProperty->getName(), $newProperty->getName(), $oldMethodBody); $mergedMethod->setBody($newMethodBody); } // update the method parameters $methodParameters = $mergedMethod->getParameters(); if (!empty($methodParameters)) { $parameterTags = $mergedMethod->getTagsValues('param'); foreach ($methodParameters as $methodParameter) { $oldParameterName = $methodParameter->getName(); if ($oldParameterName == $this->classBuilder->getParameterName($oldProperty, $methodType)) { $newParameterName = $this->classBuilder->getParameterName($newProperty, $methodType); $methodParameter->setName($newParameterName); $newMethodBody = $this->replacePropertyNameInMethodBody($oldParameterName, $newParameterName, $mergedMethod->getBody()); $mergedMethod->setBody($newMethodBody); } $typeHint = $methodParameter->getTypeHint(); if ($typeHint) { if ($oldProperty->isRelation() && $typeHint == $oldProperty->getForeignClassName()) { $methodParameter->setTypeHint($this->updateExtensionKey($this->getForeignClassName($newProperty))); } } $parameterTags[$methodParameter->getPosition()] = $this->classBuilder->getParamTag($newProperty, $methodType); $mergedMethod->replaceParameter($methodParameter); } $mergedMethod->setTag('param', $parameterTags); } $returnTagValue = trim($mergedMethod->getTagsValues('return')); if ($returnTagValue != 'void') { $mergedMethod->setTag('return', $newProperty->getTypeForComment() . ' ' . $newProperty->getName()); } // replace property names in description $mergedMethod->setDescription(str_replace($oldProperty->getName(), $newProperty->getName(), $mergedMethod->getDescription())); if (method_exists($oldProperty, 'getForeignModel') && method_exists($newProperty, 'getForeignModel')) { $mergedMethod->setDescription(str_replace($oldProperty->getForeignClassName(), $newProperty->getForeignClassName(), $mergedMethod->getDescription())); } $this->classObject->removeMethod($oldMethodName); $this->classObject->addMethod($mergedMethod); }
/** * Generates the code for the repository class * Either from domainRepository template or from class partial * * @param Tx_ExtensionBuilder_Domain_Model_DomainObject $domainObject * @param boolean $mergeWithExistingClass */ public function generateDomainRepositoryCode(Tx_ExtensionBuilder_Domain_Model_DomainObject $domainObject, $mergeWithExistingClass) { $repositoryClassObject = $this->classBuilder->generateRepositoryClassObject($domainObject, $mergeWithExistingClass); if ($repositoryClassObject) { $classDocComment = $this->renderDocComment($repositoryClassObject, $domainObject); $repositoryClassObject->setDocComment($classDocComment); return $this->renderTemplate('Classes/class.phpt', array('domainObject' => $domainObject, 'classObject' => $repositoryClassObject)); } else { throw new Exception('Class file for repository could not be generated'); } }