/** * generate a docComment for class files. Add a license header if none found * @param \EBT\ExtensionBuilder\Domain\Model\ClassObject\ClassObject $classObject * * @return void; */ protected function addLicenseHeader($classObject) { $comments = $classObject->getComments(); $needsLicenseHeader = true; foreach ($comments as $comment) { if (strpos($comment, 'license information') !== false) { $needsLicenseHeader = false; } } $extensionSettings = $this->extension->getSettings(); if ($needsLicenseHeader && empty($extensionSettings['skipDocComment'])) { $licenseHeader = $this->renderTemplate('Partials/Classes/licenseHeader.phpt', array('extension' => $this->extension)); $classObject->addComment($licenseHeader); } }
/** * @param \EBT\ExtensionBuilder\Domain\Model\Extension $extension * @param array $propertyConfiguration * @return void */ protected function setExtensionProperties(&$extension, $propertyConfiguration) { // name $extension->setName(trim($propertyConfiguration['name'])); // description $extension->setDescription($propertyConfiguration['description']); // extensionKey $extension->setExtensionKey(trim($propertyConfiguration['extensionKey'])); // vendorName $extension->setVendorName(trim($propertyConfiguration['vendorName'])); if (!empty($propertyConfiguration['emConf']['sourceLanguage'])) { $extension->setSourceLanguage($propertyConfiguration['emConf']['sourceLanguage']); } if ($propertyConfiguration['emConf']['disableVersioning']) { $extension->setSupportVersioning(false); } if ($propertyConfiguration['emConf']['disableLocalization']) { $extension->setSupportLocalization(false); } if (!empty($propertyConfiguration['emConf']['skipGenerateDocumentationTemplate'])) { $extension->setGenerateDocumentationTemplate(false); } // various extension properties $extension->setVersion($propertyConfiguration['emConf']['version']); if (!empty($propertyConfiguration['emConf']['dependsOn'])) { $dependencies = array(); $lines = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(LF, $propertyConfiguration['emConf']['dependsOn']); foreach ($lines as $line) { if (strpos($line, '=>')) { list($extensionKey, $version) = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode('=>', $line); $dependencies[$extensionKey] = $version; } } $extension->setDependencies($dependencies); } if (!empty($propertyConfiguration['emConf']['targetVersion'])) { $extension->setTargetVersion(floatval($propertyConfiguration['emConf']['targetVersion'])); } if (!empty($propertyConfiguration['emConf']['custom_category'])) { $category = $propertyConfiguration['emConf']['custom_category']; } else { $category = $propertyConfiguration['emConf']['category']; } $extension->setCategory($category); // state $state = 0; switch ($propertyConfiguration['emConf']['state']) { case 'alpha': $state = \EBT\ExtensionBuilder\Domain\Model\Extension::STATE_ALPHA; break; case 'beta': $state = \EBT\ExtensionBuilder\Domain\Model\Extension::STATE_BETA; break; case 'stable': $state = \EBT\ExtensionBuilder\Domain\Model\Extension::STATE_STABLE; break; case 'experimental': $state = \EBT\ExtensionBuilder\Domain\Model\Extension::STATE_EXPERIMENTAL; break; case 'test': $state = \EBT\ExtensionBuilder\Domain\Model\Extension::STATE_TEST; break; } $extension->setState($state); if (!empty($propertyConfiguration['originalExtensionKey'])) { // handle renaming of extensions // original extensionKey $extension->setOriginalExtensionKey($propertyConfiguration['originalExtensionKey']); \TYPO3\CMS\Core\Utility\GeneralUtility::devLog('Extension setOriginalExtensionKey:' . $extension->getOriginalExtensionKey(), 'extbase', 0, $propertyConfiguration); } if (!empty($propertyConfiguration['originalExtensionKey']) && $extension->getOriginalExtensionKey() != $extension->getExtensionKey()) { $settings = $this->configurationManager->getExtensionSettings($extension->getOriginalExtensionKey()); // if an extension was renamed, a new extension dir is created and we // have to copy the old settings file to the new extension dir copy($this->configurationManager->getSettingsFile($extension->getOriginalExtensionKey()), $this->configurationManager->getSettingsFile($extension->getExtensionKey())); } else { $settings = $this->configurationManager->getExtensionSettings($extension->getExtensionKey()); } if (!empty($settings)) { $extension->setSettings($settings); \TYPO3\CMS\Core\Utility\GeneralUtility::devLog('Extension settings:' . $extension->getExtensionKey(), 'extbase', 0, $extension->getSettings()); } }
/** * generate all domainObject related * files like PHP class files, templates etc. * * @throws \Exception */ protected function generateDomainObjectRelatedFiles() { if (count($this->extension->getDomainObjects()) > 0) { $this->classBuilder->initialize($this->extension); // Generate Domain Model try { $domainModelDirectory = 'Classes/Domain/Model/'; $this->mkdir_deep($this->extensionDirectory, $domainModelDirectory); $domainRepositoryDirectory = 'Classes/Domain/Repository/'; $this->mkdir_deep($this->extensionDirectory, $domainRepositoryDirectory); $this->mkdir_deep($this->extensionDirectory, 'Tests/Unit/Domain/Model'); $domainModelTestsDirectory = $this->extensionDirectory . 'Tests/Unit/Domain/Model/'; $this->mkdir_deep($this->extensionDirectory, 'Tests/Unit/Controller'); $crudEnabledControllerTestsDirectory = $this->extensionDirectory . 'Tests/Unit/Controller/'; foreach ($this->extension->getDomainObjects() as $domainObject) { /** * @var \EBT\ExtensionBuilder\Domain\Model\DomainObject $domainObject */ $destinationFile = $domainModelDirectory . $domainObject->getName() . '.php'; if ($this->fileShouldBeMerged($destinationFile)) { $mergeWithExistingClass = true; } else { $mergeWithExistingClass = false; } $fileContents = $this->generateDomainObjectCode($domainObject, $mergeWithExistingClass); $this->writeFile($this->extensionDirectory . $destinationFile, $fileContents); GeneralUtility::devlog('Generated ' . $domainObject->getName() . '.php', 'extension_builder', 0); $this->extension->setMD5Hash($this->extensionDirectory . $destinationFile); if ($domainObject->isAggregateRoot()) { $iconFileName = 'aggregate_root.gif'; } elseif ($domainObject->isEntity()) { $iconFileName = 'entity.gif'; } else { $iconFileName = 'value_object.gif'; } $this->upload_copy_move(ExtensionManagementUtility::extPath('extension_builder') . 'Resources/Private/Icons/' . $iconFileName, $this->iconsDirectory . $domainObject->getDatabaseTableName() . '.gif'); if ($domainObject->isAggregateRoot()) { $destinationFile = $domainRepositoryDirectory . $domainObject->getName() . 'Repository.php'; if ($this->fileShouldBeMerged($destinationFile)) { $mergeWithExistingClass = true; } else { $mergeWithExistingClass = false; } $fileContents = $this->generateDomainRepositoryCode($domainObject, $mergeWithExistingClass); $this->writeFile($this->extensionDirectory . $destinationFile, $fileContents); GeneralUtility::devlog('Generated ' . $domainObject->getName() . 'Repository.php', 'extension_builder', 0); $this->extension->setMD5Hash($this->extensionDirectory . $destinationFile); } // Generate basic UnitTests $fileContents = $this->generateDomainModelTests($domainObject); $this->writeFile($domainModelTestsDirectory . $domainObject->getName() . 'Test.php', $fileContents); } } catch (\Exception $e) { throw new \Exception('Could not generate domain model, error: ' . $e->getMessage()); } // Generate Action Controller try { $this->mkdir_deep($this->extensionDirectory, 'Classes/Controller'); $controllerDirectory = 'Classes/Controller/'; foreach ($this->extension->getDomainObjectsForWhichAControllerShouldBeBuilt() as $domainObject) { $destinationFile = $controllerDirectory . $domainObject->getName() . 'Controller.php'; if ($this->fileShouldBeMerged($destinationFile)) { $mergeWithExistingClass = true; } else { $mergeWithExistingClass = false; } $fileContents = $this->generateActionControllerCode($domainObject, $mergeWithExistingClass); $this->writeFile($this->extensionDirectory . $destinationFile, $fileContents); GeneralUtility::devlog('Generated ' . $domainObject->getName() . 'Controller.php', 'extension_builder', 0); $this->extension->setMD5Hash($this->extensionDirectory . $destinationFile); // Generate basic UnitTests $fileContents = $this->generateControllerTests($domainObject->getName() . 'Controller', $domainObject); $this->writeFile($crudEnabledControllerTestsDirectory . $domainObject->getName() . 'ControllerTest.php', $fileContents); } } catch (\Exception $e) { throw new \Exception('Could not generate action controller, error: ' . $e->getMessage()); } // Generate Domain Templates try { if ($this->extension->getPlugins()) { $this->generateTemplateFiles(); } if ($this->extension->getBackendModules()) { $this->generateTemplateFiles('Backend/'); } } catch (\Exception $e) { throw new \Exception('Could not generate domain templates, error: ' . $e->getMessage()); } try { $settings = $this->extension->getSettings(); } catch (\Exception $e) { throw new \Exception('Could not generate ext_autoload.php, error: ' . $e->getMessage()); } } else { GeneralUtility::devlog('No domainObjects in this extension', 'extension_builder', 3, (array) $this->extension); } }
/** * * @param \EBT\ExtensionBuilder\Domain\Model\Extension $extension * * @return void */ public function initialize(Model\Extension $extension) { $this->extension = $extension; $settings = $extension->getSettings(); $this->settings = $settings['classBuilder']; $this->extensionDirectory = $this->extension->getExtensionDir(); }
/** * * @param \EBT\ExtensionBuilder\Service\FileGenerator $fileGenerator * @param \EBT\ExtensionBuilder\Domain\Model\Extension $extension * @param boolean roundtrip enabled? * * @return void */ public function initialize(FileGenerator $fileGenerator, Model\Extension $extension, $roundTripEnabled) { $this->fileGenerator = $fileGenerator; $this->extension = $extension; $settings = $extension->getSettings(); if ($roundTripEnabled) { $this->roundTripService->initialize($this->extension); \EBT\ExtensionBuilder\Parser\AutoLoader::register(); } $this->settings = $settings['classBuilder']; $this->extensionDirectory = $this->extension->getExtensionDir(); }
/** * Validate the given extension * * @param \EBT\ExtensionBuilder\Domain\Model\Extension $extension * @return array[] */ public function isValid($extension) { $extensionSettings = $extension->getSettings(); GeneralUtility::devLog('isValid: settings', 'extension_builder', 0, $extension->getSettings()); if (isset($extensionSettings['ignoreWarnings'])) { $this->warningsToIgnore = $extensionSettings['ignoreWarnings']; } $this->validationResult = array('errors' => array(), 'warnings' => array()); $this->validateExtensionKey($extension->getExtensionKey()); $this->checkExistingExtensions($extension); $this->validatePlugins($extension); $this->validateBackendModules($extension); $this->validateDomainObjects($extension); if (!empty($this->warningsToIgnore)) { $warningsToKeep = array(); foreach ($this->validationResult['warnings'] as $warning) { /* @var ExtensionException $warning */ GeneralUtility::devLog('warning: ' . $warning->getCode(), 'extension_builder', 0, $this->warningsToIgnore); if (!in_array($warning->getCode(), $this->warningsToIgnore)) { $warningsToKeep[] = $warning; } } $this->validationResult['warnings'] = $warningsToKeep; } return $this->validationResult; }
/** * finds a related overwrite setting to a path * and returns the overWrite setting * -1 for do not create at all * 0 for overwrite * 1 for merge (if possible) * 2 for keep existing file * * @param string $path of the file to get the settings for * @param \EBT\ExtensionBuilder\Domain\Model\Extension $extension * @return int overWriteSetting */ public static function getOverWriteSettingForPath($path, $extension) { $map = array('skip' => -1, 'merge' => 1, 'keep' => 2); $settings = $extension->getSettings(); if (!is_array($settings)) { throw new \Exception('overWrite settings could not be parsed'); } if (strpos($path, $extension->getExtensionDir()) === 0) { $path = str_replace($extension->getExtensionDir(), '', $path); } $pathParts = explode('/', $path); $overWriteSettings = $settings['overwriteSettings']; foreach ($pathParts as $pathPart) { if (isset($overWriteSettings[$pathPart]) && is_array($overWriteSettings[$pathPart])) { // step one level deeper $overWriteSettings = $overWriteSettings[$pathPart]; } else { return $map[$overWriteSettings[$pathPart]]; } } return 0; }