/**
  *
  * all properties that have a setter in this class and a getter in the reflection class will be set here
  *
  * @param Tx_ExtensionBuilder_Reflection_PropertyReflection $propertyReflection
  * @return void
  */
 public function mapToReflectionProperty($propertyReflection)
 {
     if ($propertyReflection instanceof Tx_ExtensionBuilder_Reflection_PropertyReflection) {
         $tags = $propertyReflection->getTagsValues();
         // just to initialize the docCommentParser
         foreach ($this as $key => $value) {
             $setterMethodName = 'set' . t3lib_div::underscoredToUpperCamelCase($key);
             $getterMethodName = 'get' . t3lib_div::underscoredToUpperCamelCase($key);
             // map properties of reflection class to this class
             if (method_exists($propertyReflection, $getterMethodName) && method_exists($this, $setterMethodName) && $key != 'value') {
                 $this->{$setterMethodName}($propertyReflection->{$getterMethodName}());
             }
             $isMethodName = 'is' . t3lib_div::underscoredToUpperCamelCase($key);
             // map properties of reflection class to this class
             if (method_exists($propertyReflection, $setterMethodName) && method_exists($this, $isMethodName)) {
                 $this->{$setterMethodName}($propertyReflection->{$isMethodName}());
             }
         }
         // This is not yet used later on. The type is not validated, so it might be anything!!
         if (isset($this->tags['var'])) {
             $parts = preg_split('/\\s/', $this->tags['var'][0], 2);
             $this->varType = $parts[0];
         } else {
             t3lib_div::devLog('No var type set for property $' . $this->name . ' in class ' . $propertyReflection->getDeclaringClass()->name, 'extension_builder');
         }
         if (empty($this->tags)) {
             // strange behaviour in php ReflectionProperty->getDescription(). A backslash is added to the description
             $this->description = str_replace("\n/", '', $this->description);
             $this->description = trim($this->description);
             $this->setTag('var', 'mixed // please define a var type here');
         }
     }
 }
	/**
	 * Solution for {outer.{inner}} problem with variables in fluid
	 *
	 * @param $obj  object Object
	 * @param $prop	string Property
	 */
	public function render($obj, $prop) {
		if (is_object($obj) && method_exists($obj, 'get' . t3lib_div::underscoredToUpperCamelCase($prop))) {
			return $obj->{'get' . t3lib_div::underscoredToUpperCamelCase($prop)}();
		} elseif (is_array($obj)) {
			if (array_key_exists($prop, $obj)) {
				return $obj[$prop];
			}
		}
		return NULL;
	}
 public function getRecurranceSubtype($config)
 {
     $type = trim($config['row']['recurrance_type']);
     if (empty($type)) {
         return;
     }
     $className = 'Tx_CzSimpleCal_Recurrance_Type_' . t3lib_div::underscoredToUpperCamelCase($type);
     $callback = array($className, 'getSubtypes');
     if (!class_exists($className) || !is_callable($callback)) {
         return;
     }
     $config['items'] = call_user_func($callback);
 }
 /**
  * create a new instance with data from a given array
  * 
  * @param $data
  * @return Tx_CzSimpleCal_Tests_Mocks_IsRecurringMock
  */
 public static function fromArray($data)
 {
     $className = __CLASS__;
     $obj = new $className();
     foreach ($data as $name => $value) {
         $methodName = 'set' . t3lib_div::underscoredToUpperCamelCase($name);
         // check if there is a setter defined (use of is_callable to check if the scope is public)
         if (!is_callable(array($obj, $methodName))) {
             throw new InvalidArgumentException(sprintf('Could not find the %s method to set %s in %s.', $methodName, $name, get_class($obj)));
         }
         call_user_func(array($obj, $methodName), $value);
     }
     return $obj;
 }
 public function __construct($methodName, $methodReflection = NULL)
 {
     $this->setName($methodName);
     if ($methodReflection instanceof Tx_ExtensionBuilder_Reflection_MethodReflection) {
         $methodReflection->getTagsValues();
         // just to initialize the docCommentParser
         foreach ($this as $key => $value) {
             $setterMethodName = 'set' . t3lib_div::underscoredToUpperCamelCase($key);
             $getterMethodName = 'get' . t3lib_div::underscoredToUpperCamelCase($key);
             // map properties of reflection class to this class
             if (method_exists($methodReflection, $getterMethodName) && method_exists($this, $setterMethodName)) {
                 $this->{$setterMethodName}($methodReflection->{$getterMethodName}());
                 //t3lib_div::print_array($getterMethodName);
             }
         }
         if (empty($this->tags)) {
             // strange behaviour in php ReflectionProperty->getDescription(). A backslash is added to the description
             $this->description = str_replace("\n/", '', $this->description);
             $this->description = trim($this->description);
             //$this->setTag('return','void');
         }
     }
 }
<?php

if (!defined('TYPO3_MODE')) {
    die('Access denied.');
}
$extensionName = t3lib_div::underscoredToUpperCamelCase($_EXTKEY);
/**
 * Registers a Plugin to be listed in the Backend. You also have to configure the Dispatcher in ext_localconf.php.
 */
if ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF'][$_EXTKEY]['registerSinglePlugin']) {
    Tx_Extbase_Utility_Extension::registerPlugin($_EXTKEY, 'Pi1', 'A Blog Example');
    $pluginSignature = strtolower($extensionName) . '_pi1';
    $GLOBALS['TCA']['tt_content']['types']['list']['subtypes_excludelist'][$pluginSignature] = 'select_key';
    $GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$pluginSignature] = 'pi_flexform,recursive';
    t3lib_extMgm::addPiFlexFormValue($pluginSignature, 'FILE:EXT:' . $_EXTKEY . '/Configuration/FlexForms/flexform_list.xml');
} else {
    t3lib_div::loadTCA('tt_content');
    // These dividers are a little trick to group these items in the plugin selector
    $TCA['tt_content']['columns']['list_type']['config']['items'][] = array('Blog Example', '--div--', t3lib_extMgm::extRelPath($_EXTKEY) . 'ext_icon.gif');
    Tx_Extbase_Utility_Extension::registerPlugin($_EXTKEY, 'BlogList', 'List of Blogs (BlogExample)');
    Tx_Extbase_Utility_Extension::registerPlugin($_EXTKEY, 'PostList', 'List of Posts (BlogExample)');
    Tx_Extbase_Utility_Extension::registerPlugin($_EXTKEY, 'PostSingle', 'Single Post (BlogExample)');
    Tx_Extbase_Utility_Extension::registerPlugin($_EXTKEY, 'BlogAdmin', 'Admin Plugin (BlogExample)');
    $TCA['tt_content']['columns']['list_type']['config']['items'][] = array('', '--div--');
    $pluginSignature = strtolower($extensionName) . '_postlist';
    $GLOBALS['TCA']['tt_content']['types']['list']['subtypes_excludelist'][$pluginSignature] = 'select_key';
    $GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$pluginSignature] = 'pi_flexform,recursive';
    t3lib_extMgm::addPiFlexFormValue($pluginSignature, 'FILE:EXT:' . $_EXTKEY . '/Configuration/FlexForms/flexform_list.xml');
}
if (TYPO3_MODE === 'BE') {
    /**
<?php

if (!defined('TYPO3_MODE')) {
    die('Access denied.');
}
Tx_Extbase_Utility_Extension::registerPlugin($_EXTKEY, 'Pi1', 'TeamPoint-Supportformular: Formular-Selektor');
Tx_Extbase_Utility_Extension::registerPlugin($_EXTKEY, 'Pi2', 'TeamPoint-Supportformular: Formular');
Tx_Extbase_Utility_Extension::registerPlugin($_EXTKEY, 'Pi3', 'TeamPoint-Supportformular: Link zu einem Einzelformular');
t3lib_extMgm::addStaticFile($_EXTKEY, 'Configuration/TypoScript', 'TeamPoint-Supportformular');
t3lib_extMgm::addLLrefForTCAdescr('tx_jhesupportform_domain_model_form', 'EXT:jhe_supportform/Resources/Private/Language/locallang_csh_tx_jhesupportform_domain_model_form.xml');
t3lib_extMgm::allowTableOnStandardPages('tx_jhesupportform_domain_model_form');
$TCA['tx_jhesupportform_domain_model_form'] = array('ctrl' => array('title' => 'LLL:EXT:jhe_supportform/Resources/Private/Language/locallang_db.xml:tx_jhesupportform_domain_model_form', 'label' => 'uid', 'tstamp' => 'tstamp', 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', 'dividers2tabs' => TRUE, 'versioningWS' => 2, 'versioning_followPages' => TRUE, 'origUid' => 't3_origuid', 'languageField' => 'sys_language_uid', 'transOrigPointerField' => 'l10n_parent', 'transOrigDiffSourceField' => 'l10n_diffsource', 'delete' => 'deleted', 'enablecolumns' => array('disabled' => 'hidden', 'starttime' => 'starttime', 'endtime' => 'endtime'), 'searchFields' => '', 'dynamicConfigFile' => t3lib_extMgm::extPath($_EXTKEY) . 'Configuration/TCA/Form.php', 'iconfile' => t3lib_extMgm::extRelPath($_EXTKEY) . 'Resources/Public/Icons/tx_jhesupportform_domain_model_form.gif'));
t3lib_extMgm::addLLrefForTCAdescr('tx_jhesupportform_domain_model_selector', 'EXT:jhe_supportform/Resources/Private/Language/locallang_csh_tx_jhesupportform_domain_model_selector.xml');
t3lib_extMgm::allowTableOnStandardPages('tx_jhesupportform_domain_model_selector');
$TCA['tx_jhesupportform_domain_model_selector'] = array('ctrl' => array('title' => 'LLL:EXT:jhe_supportform/Resources/Private/Language/locallang_db.xml:tx_jhesupportform_domain_model_selector', 'label' => 'uid', 'tstamp' => 'tstamp', 'crdate' => 'crdate', 'cruser_id' => 'cruser_id', 'dividers2tabs' => TRUE, 'versioningWS' => 2, 'versioning_followPages' => TRUE, 'origUid' => 't3_origuid', 'languageField' => 'sys_language_uid', 'transOrigPointerField' => 'l10n_parent', 'transOrigDiffSourceField' => 'l10n_diffsource', 'delete' => 'deleted', 'enablecolumns' => array('disabled' => 'hidden', 'starttime' => 'starttime', 'endtime' => 'endtime'), 'searchFields' => '', 'dynamicConfigFile' => t3lib_extMgm::extPath($_EXTKEY) . 'Configuration/TCA/Selector.php', 'iconfile' => t3lib_extMgm::extRelPath($_EXTKEY) . 'Resources/Public/Icons/tx_jhesupportform_domain_model_selector.gif'));
$extensionName = strtolower(t3lib_div::underscoredToUpperCamelCase($_EXTKEY));
$pluginName = strtolower('Pi3');
$pluginSignature = $extensionName . '_' . $pluginName;
$TCA['tt_content']['types']['list']['subtypes_excludelist'][$pluginSignature] = 'layout,select_key,pages,recursive';
$TCA['tt_content']['types']['list']['subtypes_addlist'][$pluginSignature] = 'pi_flexform';
t3lib_extMgm::addPiFlexFormValue($pluginSignature, 'FILE:EXT:' . $_EXTKEY . '/Configuration/Flexform/Link.xml');
 /**
  * If a JSON file is found in the extensions directory the previous version
  * of the extension is build to compare it with the new configuration coming
  * from the extension builder input
  *
  * @param Tx_ExtensionBuilder_Domain_Model_Extension $extension
  */
 public function initialize(Tx_ExtensionBuilder_Domain_Model_Extension $extension)
 {
     $this->extension = $extension;
     $this->extensionDirectory = $this->extension->getExtensionDir();
     $this->extClassPrefix = 'Tx_' . t3lib_div::underscoredToUpperCamelCase($this->extension->getExtensionKey());
     if (!$this->classParser instanceof Tx_ExtensionBuilder_Utility_ClassParser) {
         $this->injectClassParser(t3lib_div::makeInstance('Tx_ExtensionBuilder_Utility_ClassParser'));
     }
     $this->settings = $this->configurationManager->getExtensionBuilderSettings();
     // defaults
     $this->previousExtensionDirectory = $this->extensionDirectory;
     $this->previousExtensionKey = $this->extension->getExtensionKey();
     if ($extension->isRenamed()) {
         $this->previousExtensionDirectory = $extension->getPreviousExtensionDirectory();
         $this->previousExtensionKey = $extension->getOriginalExtensionKey();
         $this->extensionRenamed = TRUE;
         t3lib_div::devlog('Extension renamed: ' . $this->previousExtensionKey . ' => ' . $this->extension->getExtensionKey(), 'extension_builder', 1, array('$previousExtensionDirectory ' => $this->previousExtensionDirectory));
     }
     // Rename the old kickstarter.json file to ExtensionBuilder.json
     if (file_exists($this->previousExtensionDirectory . 'kickstarter.json')) {
         rename($this->previousExtensionDirectory . 'kickstarter.json', $this->previousExtensionDirectory . Tx_ExtensionBuilder_Configuration_ConfigurationManager::EXTENSION_BUILDER_SETTINGS_FILE);
     }
     if (file_exists($this->previousExtensionDirectory . Tx_ExtensionBuilder_Configuration_ConfigurationManager::EXTENSION_BUILDER_SETTINGS_FILE)) {
         $extensionSchemaBuilder = t3lib_div::makeInstance('Tx_ExtensionBuilder_Service_ExtensionSchemaBuilder');
         $jsonConfig = $this->configurationManager->getExtensionBuilderConfiguration($this->previousExtensionKey, FALSE);
         t3lib_div::devlog('old JSON:' . $this->previousExtensionDirectory . 'ExtensionBuilder.json', 'extension_builder', 0, $jsonConfig);
         $this->previousExtension = $extensionSchemaBuilder->build($jsonConfig);
         $oldDomainObjects = $this->previousExtension->getDomainObjects();
         foreach ($oldDomainObjects as $oldDomainObject) {
             $this->oldDomainObjects[$oldDomainObject->getUniqueIdentifier()] = $oldDomainObject;
             t3lib_div::devlog('Old domain object: ' . $oldDomainObject->getName() . ' - ' . $oldDomainObject->getUniqueIdentifier(), 'extension_builder');
         }
         // now we store all renamed domainObjects in an array to enable detection of renaming in
         // relationProperties (property->getForeignModel)
         // we also build an array with the new unique identifiers to detect deleting of domainObjects
         $currentDomainsObjects = array();
         foreach ($this->extension->getDomainObjects() as $domainObject) {
             if (isset($this->oldDomainObjects[$domainObject->getUniqueIdentifier()])) {
                 if ($this->oldDomainObjects[$domainObject->getUniqueIdentifier()]->getName() != $domainObject->getName()) {
                     $renamedDomainObjects[$domainObject->getUniqueIdentifier()] = $domainObject;
                 }
             }
             $currentDomainsObjects[$domainObject->getUniqueIdentifier()] = $domainObject;
         }
         // remove deleted objects
         foreach ($oldDomainObjects as $oldDomainObject) {
             if (!isset($currentDomainsObjects[$oldDomainObject->getUniqueIdentifier()])) {
                 $this->removeDomainObjectFiles($oldDomainObject);
             }
         }
     }
     spl_autoload_register('Tx_ExtensionBuilder_Utility_ClassLoader::loadClass', FALSE, TRUE);
 }
 protected function order($events)
 {
     if (!$this->arguments['orderBy'] && !$this->arguments['order']) {
         return $events;
     } elseif ($this->arguments['orderBy']) {
         $this->orderGetMethodName = 'get' . t3lib_div::underscoredToUpperCamelCase($this->arguments['orderBy']);
         if (usort($events, array($this, "orderByObjectMethod"))) {
             return $events;
         } else {
             throw new RuntimeException(sprintf('%s could not sort the events.', get_class($this)));
         }
     }
 }
 /**
  * cover all cases:
  * 1. extend TYPO3 class like fe_users (no mapping table needed)
  *
  * @param Tx_ExtensionBuilder_Domain_Model_DomainObject $domainObject
  */
 private function validateMapping(Tx_ExtensionBuilder_Domain_Model_DomainObject $domainObject)
 {
     $parentClass = $domainObject->getParentClass();
     $tableName = $domainObject->getMapToTable();
     $extensionPrefix = 'Tx_' . t3lib_div::underscoredToUpperCamelCase($domainObject->getExtension()->getExtensionKey()) . '_Domain_Model_';
     if (!empty($parentClass)) {
         $classConfiguration = $this->configurationManager->getExtbaseClassConfiguration($parentClass);
         t3lib_div::devlog('class settings ' . $parentClass, 'extension_builder', 0, $classConfiguration);
         if (!isset($classConfiguration['tableName'])) {
             if (!$tableName) {
                 $this->validationResult['errors'][] = new Tx_ExtensionBuilder_Domain_Exception_ExtensionException('Mapping configuration error in domain object ' . $domainObject->getName() . ': The mapping table could not be detected from Extbase Configuration. Please enter a table name', self::ERROR_MAPPING_NO_TABLE);
             }
         } else {
             // get the table name from the parent class configuration
             $tableName = $classConfiguration['tableName'];
         }
         if (!class_exists($parentClass, TRUE)) {
             $this->validationResult['errors'][] = new Tx_ExtensionBuilder_Domain_Exception_ExtensionException('Mapping configuration error in domain object ' . $domainObject->getName() . ': the parent class ' . $parentClass . 'seems not to exist ', self::ERROR_MAPPING_NO_PARENTCLASS);
         }
     }
     if ($tableName) {
         if (strpos($extensionPrefix, $tableName) !== FALSE) {
             // the domainObject extends a class of the same extension
             if (!$parentClass) {
                 $this->validationResult['errors'][] = new Tx_ExtensionBuilder_Domain_Exception_ExtensionException('Mapping configuration error in domain object ' . $domainObject->getName() . ': you have to define a parent class if you map to a table of another domain object of the same extension ', self::ERROR_MAPPING_NO_PARENTCLASS);
             }
         }
         if (!isset($GLOBALS['TCA'][$tableName])) {
             $this->validationResult['errors'][] = new Tx_ExtensionBuilder_Domain_Exception_ExtensionException('There is no entry for table "' . $tableName . '" of ' . $domainObject->getName() . ' in TCA. For technical reasons you can only extend tables with TCA configuration.', self::ERROR_MAPPING_NO_TCA);
         }
     }
     if (isset($GLOBALS['TCA'][$tableName]['ctrl']['type'])) {
         $dataTypeRes = $GLOBALS['TYPO3_DB']->sql_query('DESCRIBE ' . $tableName);
         while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($dataTypeRes)) {
             if ($row['Field'] == $GLOBALS['TCA'][$tableName]['ctrl']['type']) {
                 if (strpos($row['Type'], 'int') !== FALSE) {
                     $this->validationResult['warnings'][] = new Tx_ExtensionBuilder_Domain_Exception_ExtensionException('The configured type field for table "' . $tableName . '" is of type ' . $row['Type'] . '<br />This means the type field can not be used for defining the record type. <br />You have to configure the mappings yourself if you want to map to this<br /> table or extend the correlated class', self::ERROR_MAPPING_WRONG_TYPEFIELD_CONFIGURATION);
                 }
             }
         }
     }
 }
 /**
  * returns the name of the domain repository class name, if it is an aggregateroot.
  *
  * @return string
  */
 public function getDomainRepositoryClassName()
 {
     if (!$this->aggregateRoot) {
         return '';
     }
     return 'Tx_' . t3lib_div::underscoredToUpperCamelCase($this->extension->getExtensionKey()) . '_Domain_Repository_' . $this->getName() . 'Repository';
 }
 /**
  * @test
  * @see t3lib_div::underscoredToUpperCamelCase
  */
 public function canConvertFromUnderscoredToUpperCamelCase()
 {
     $this->assertEquals('BlogExample', t3lib_div::underscoredToUpperCamelCase('blog_example'));
     $this->assertEquals('Blogexample', t3lib_div::underscoredToUpperCamelCase('blogexample'));
 }
 public static function convertLowerUnderscoreToUpperCamelCase($camelCasedString)
 {
     return t3lib_div::underscoredToUpperCamelCase($camelCasedString);
 }
	/**
	 * Is {outer.{inner}} a datetime?
	 *
	 * @param	$obj	object Object
	 * @param	$prop	string Property
	 * @return	bool
	 */
	public function render($obj, $prop) {
		if (is_object($obj) && method_exists($obj, 'get' . t3lib_div::underscoredToUpperCamelCase($prop))) {
			$mixed = $obj->{'get' . t3lib_div::underscoredToUpperCamelCase($prop)}();
		}
		return method_exists($mixed, 'getTimestamp');
	}
 /**
  *
  * @param Tx_ExtensionBuilder_Service_CodeGenerator $codeGenerator
  * @param Tx_ExtensionBuilder_Domain_Model_Extension $extension
  * @param boolean roundtrip enabled?
  *
  * @return void
  */
 public function initialize(Tx_ExtensionBuilder_Service_CodeGenerator $codeGenerator, Tx_ExtensionBuilder_Domain_Model_Extension $extension, $roundTripEnabled)
 {
     $this->codeGenerator = $codeGenerator;
     $this->extension = $extension;
     $settings = $extension->getSettings();
     if ($roundTripEnabled) {
         $this->roundTripService->initialize($this->extension);
     }
     $this->settings = $settings['classBuilder'];
     $this->extensionDirectory = $this->extension->getExtensionDir();
     $this->extClassPrefix = 'Tx_' . t3lib_div::underscoredToUpperCamelCase($this->extension->getExtensionKey());
 }
 /**
  * Enable the import of actions configuration of installed extensions
  * by importing the settings from $TYPO3_CONF_VARS
  * @param array $extensionConfigurationJSON
  * @return array
  */
 protected function importExistingActionConfiguration(array $extensionConfigurationJSON)
 {
     if (isset($extensionConfigurationJSON['properties']['plugins'])) {
         $extKey = $extensionConfigurationJSON['properties']['extensionKey'];
         if (t3lib_extMgm::isLoaded($extKey)) {
             foreach ($extensionConfigurationJSON['properties']['plugins'] as &$pluginJSON) {
                 if (isset($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][t3lib_div::underscoredToUpperCamelCase($extKey)]['plugins'][ucfirst($pluginJSON['key'])]['controllers'])) {
                     $controllerActionCombinationsConfig = "";
                     $nonCachableActionConfig = "";
                     $pluginJSON['actions'] = array();
                     foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'][t3lib_div::underscoredToUpperCamelCase($extKey)]['plugins'][ucfirst($pluginJSON['key'])]['controllers'] as $controllerName => $controllerConfig) {
                         if (isset($controllerConfig['actions'])) {
                             $controllerActionCombinationsConfig .= $controllerName . '=>' . implode(',', $controllerConfig['actions']) . LF;
                         }
                         if (isset($controllerConfig['nonCacheableActions'])) {
                             $nonCachableActionConfig .= $controllerName . '=>' . implode(',', $controllerConfig['nonCacheableActions']) . LF;
                         }
                     }
                     if (!empty($controllerActionCombinationsConfig)) {
                         $pluginJSON['actions']['controllerActionCombinations'] = $controllerActionCombinationsConfig;
                     }
                     if (!empty($nonCachableActionConfig)) {
                         $pluginJSON['actions']['noncacheableActions'] = $nonCachableActionConfig;
                     }
                 }
             }
         }
     }
     return $extensionConfigurationJSON;
 }