/** * This test creates an extension based on a JSON file, generated * with version 1.0 of the ExtensionBuilder and compares all * generated files with the originally created ones * This test should help, to find compatibility breaking changes * * @test */ function generateExtensionFromVersion1Configuration() { $this->configurationManager = $this->getMock($this->buildAccessibleProxy('Tx_ExtensionBuilder_Configuration_ConfigurationManager'), array('dummy')); $this->extensionSchemaBuilder = $this->objectManager->get('Tx_ExtensionBuilder_Service_ExtensionSchemaBuilder'); $testExtensionDir = PATH_typo3conf . 'ext/extension_builder/Tests/Examples/TestExtensions/test_extension_v1/'; $jsonFile = $testExtensionDir . Tx_ExtensionBuilder_Configuration_ConfigurationManager::EXTENSION_BUILDER_SETTINGS_FILE; if (file_exists($jsonFile)) { // compatibility adaptions for configurations from older versions $extensionConfigurationJSON = json_decode(file_get_contents($jsonFile), TRUE); $extensionConfigurationJSON = $this->configurationManager->fixExtensionBuilderJSON($extensionConfigurationJSON); } else { $this->fail('JSON file not found'); } $this->extension = $this->extensionSchemaBuilder->build($extensionConfigurationJSON); $this->codeGenerator->setSettings(array('codeTemplateRootPath' => PATH_typo3conf . 'ext/extension_builder/Resources/Private/CodeTemplates/Extbase/', 'extConf' => array('enableRoundtrip' => '0'))); $newExtensionDir = vfsStream::url('testDir') . '/'; $this->extension->setExtensionDir($newExtensionDir . 'test_extension/'); $this->codeGenerator->build($this->extension); $referenceFiles = t3lib_div::getAllFilesAndFoldersInPath(array(), $testExtensionDir); foreach ($referenceFiles as $referenceFile) { $createdFile = str_replace($testExtensionDir, $this->extension->getExtensionDir(), $referenceFile); if (!in_array(basename($createdFile), array('ExtensionBuilder.json'))) { // json file is generated by controller $referenceFileContent = str_replace(array('2011-08-11', '###YEAR###'), array(date('Y-m-d'), date('Y')), file_get_contents($referenceFile)); //t3lib_div::writeFile(PATH_site.'fileadmin/'.basename($createdFile), file_get_contents($createdFile)); $this->assertFileExists($createdFile, 'File ' . $createdFile . ' was not created!'); $this->assertEquals(t3lib_div::trimExplode("\n", $referenceFileContent, TRUE), t3lib_div::trimExplode("\n", file_get_contents($createdFile), TRUE), 'File ' . $createdFile . ' was not equal to original file.'); } } }
/** * Recursively gather all files and folders of a path. * Usage: 5 * * @param array $fileArr: Empty input array (will have files added to it) * @param string $path: The path to read recursively from (absolute) (include trailing slash!) * @param string $extList: Comma list of file extensions: Only files with extensions in this list (if applicable) will be selected. * @param boolean $regDirs: If set, directories are also included in output. * @param integer $recursivityLevels: The number of levels to dig down... * @return array An array with the found files/directories. */ function getAllFilesAndFoldersInPath($fileArr, $path, $extList = '', $regDirs = 0, $recursivityLevels = 99) { if ($regDirs) { $fileArr[] = $path; } $fileArr = array_merge($fileArr, t3lib_div::getFilesInDir($path, $extList, 1, 1)); $dirs = t3lib_div::get_dirs($path); if (is_array($dirs) && $recursivityLevels > 0) { foreach ($dirs as $subdirs) { if ((string) $subdirs != '') { $fileArr = t3lib_div::getAllFilesAndFoldersInPath($fileArr, $path . $subdirs . '/', $extList, $regDirs, $recursivityLevels - 1); } } } return $fileArr; }
/** * Make upload array out of extension * * @param string Extension key * @param array Extension information array * @return mixed Returns array with extension upload array on success, otherwise an error string. */ function makeUploadarray($extKey, $conf) { $extPath = tx_em_Tools::getExtPath($extKey, $conf['type']); if ($extPath) { // Get files for extension: $fileArr = array(); $fileArr = t3lib_div::getAllFilesAndFoldersInPath($fileArr, $extPath, '', 0, 99, $GLOBALS['TYPO3_CONF_VARS']['EXT']['excludeForPackaging']); // Calculate the total size of those files: $totalSize = 0; foreach ($fileArr as $file) { $totalSize += filesize($file); } // If the total size is less than the upper limit, proceed: if ($totalSize < $this->maxUploadSize) { // Initialize output array: $uploadArray = array(); $uploadArray['extKey'] = $extKey; $uploadArray['EM_CONF'] = $conf['EM_CONF']; $uploadArray['misc']['codelines'] = 0; $uploadArray['misc']['codebytes'] = 0; $uploadArray['techInfo'] = $this->install->makeDetailedExtensionAnalysis($extKey, $conf, 1); // Read all files: foreach ($fileArr as $file) { $relFileName = substr($file, strlen($extPath)); $fI = pathinfo($relFileName); if ($relFileName != 'ext_emconf.php') { // This file should be dynamically written... $uploadArray['FILES'][$relFileName] = array('name' => $relFileName, 'size' => filesize($file), 'mtime' => filemtime($file), 'is_executable' => TYPO3_OS == 'WIN' ? 0 : is_executable($file), 'content' => t3lib_div::getUrl($file)); if (t3lib_div::inList('php,inc', strtolower($fI['extension']))) { $uploadArray['FILES'][$relFileName]['codelines'] = count(explode(LF, $uploadArray['FILES'][$relFileName]['content'])); $uploadArray['misc']['codelines'] += $uploadArray['FILES'][$relFileName]['codelines']; $uploadArray['misc']['codebytes'] += $uploadArray['FILES'][$relFileName]['size']; // locallang*.php files: if (substr($fI['basename'], 0, 9) == 'locallang' && strstr($uploadArray['FILES'][$relFileName]['content'], '$LOCAL_LANG')) { $uploadArray['FILES'][$relFileName]['LOCAL_LANG'] = tx_em_Tools::getSerializedLocalLang($file, $uploadArray['FILES'][$relFileName]['content']); } } $uploadArray['FILES'][$relFileName]['content_md5'] = md5($uploadArray['FILES'][$relFileName]['content']); } } // Return upload-array: return $uploadArray; } else { return sprintf($GLOBALS['LANG']->getLL('makeUploadArray_error_size'), $totalSize, t3lib_div::formatSize($this->maxUploadSize)); } } else { return sprintf($GLOBALS['LANG']->getLL('makeUploadArray_error_path'), $extKey); } }
/** * Add selector box items of more exotic kinds. * * @param array The array of items (label,value,icon) * @param array The "columns" array for the field (from TCA) * @param array TSconfig for the table/row * @param string The fieldname * @return array The $items array modified. */ function addSelectOptionsToItemArray($items, $fieldValue, $TSconfig, $field) { global $TCA; // Values from foreign tables: if ($fieldValue['config']['foreign_table']) { $items = $this->foreignTable($items, $fieldValue, $TSconfig, $field); if ($fieldValue['config']['neg_foreign_table']) { $items = $this->foreignTable($items, $fieldValue, $TSconfig, $field, 1); } } // Values from a file folder: if ($fieldValue['config']['fileFolder']) { $fileFolder = t3lib_div::getFileAbsFileName($fieldValue['config']['fileFolder']); if (@is_dir($fileFolder)) { // Configurations: $extList = $fieldValue['config']['fileFolder_extList']; $recursivityLevels = isset($fieldValue['config']['fileFolder_recursions']) ? t3lib_div::intInRange($fieldValue['config']['fileFolder_recursions'], 0, 99) : 99; // Get files: $fileFolder = rtrim($fileFolder, '/') . '/'; $fileArr = t3lib_div::getAllFilesAndFoldersInPath(array(), $fileFolder, $extList, 0, $recursivityLevels); $fileArr = t3lib_div::removePrefixPathFromList($fileArr, $fileFolder); foreach ($fileArr as $fileRef) { $fI = pathinfo($fileRef); $icon = t3lib_div::inList('gif,png,jpeg,jpg', strtolower($fI['extension'])) ? '../' . substr($fileFolder, strlen(PATH_site)) . $fileRef : ''; $items[] = array($fileRef, $fileRef, $icon); } } } // If 'special' is configured: if ($fieldValue['config']['special']) { switch ($fieldValue['config']['special']) { case 'tables': $temp_tc = array_keys($TCA); $descr = ''; foreach ($temp_tc as $theTableNames) { if (!$TCA[$theTableNames]['ctrl']['adminOnly']) { // Icon: $icon = t3lib_iconWorks::mapRecordTypeToSpriteIconName($theTableNames, array()); // Add help text $helpText = array(); $GLOBALS['LANG']->loadSingleTableDescription($theTableNames); $helpTextArray = $GLOBALS['TCA_DESCR'][$theTableNames]['columns']['']; if (!empty($helpTextArray['description'])) { $helpText['description'] = $helpTextArray['description']; } // Item configuration: $items[] = array($this->sL($TCA[$theTableNames]['ctrl']['title']), $theTableNames, $icon, $helpText); } } break; case 'pagetypes': $theTypes = $TCA['pages']['columns']['doktype']['config']['items']; foreach ($theTypes as $theTypeArrays) { // Icon: $icon = t3lib_iconWorks::mapRecordTypeToSpriteIconName('pages', array('doktype' => $theTypeArrays[1])); // Item configuration: $items[] = array($this->sL($theTypeArrays[0]), $theTypeArrays[1], $icon); } break; case 'exclude': $theTypes = t3lib_BEfunc::getExcludeFields(); $descr = ''; foreach ($theTypes as $theTypeArrays) { list($theTable, $theField) = explode(':', $theTypeArrays[1]); // Add help text $helpText = array(); $GLOBALS['LANG']->loadSingleTableDescription($theTable); $helpTextArray = $GLOBALS['TCA_DESCR'][$theTable]['columns'][$theField]; if (!empty($helpTextArray['description'])) { $helpText['description'] = $helpTextArray['description']; } // Item configuration: $items[] = array(rtrim($theTypeArrays[0], ':'), $theTypeArrays[1], 'empty-empty', $helpText); } break; case 'explicitValues': $theTypes = t3lib_BEfunc::getExplicitAuthFieldValues(); // Icons: $icons = array('ALLOW' => 'status-status-permission-granted', 'DENY' => 'status-status-permission-denied'); // Traverse types: foreach ($theTypes as $tableFieldKey => $theTypeArrays) { if (is_array($theTypeArrays['items'])) { // Add header: $items[] = array($theTypeArrays['tableFieldLabel'], '--div--'); // Traverse options for this field: foreach ($theTypeArrays['items'] as $itemValue => $itemContent) { // Add item to be selected: $items[] = array('[' . $itemContent[2] . '] ' . $itemContent[1], $tableFieldKey . ':' . preg_replace('/[:|,]/', '', $itemValue) . ':' . $itemContent[0], $icons[$itemContent[0]]); } } } break; case 'languages': $items = array_merge($items, t3lib_BEfunc::getSystemLanguages()); break; case 'custom': // Initialize: $customOptions = $GLOBALS['TYPO3_CONF_VARS']['BE']['customPermOptions']; if (is_array($customOptions)) { foreach ($customOptions as $coKey => $coValue) { if (is_array($coValue['items'])) { // Add header: $items[] = array($GLOBALS['LANG']->sl($coValue['header']), '--div--'); // Traverse items: foreach ($coValue['items'] as $itemKey => $itemCfg) { // Icon: if ($itemCfg[1]) { list($icon) = $this->getIcon($itemCfg[1]); } else { $icon = 'empty-empty'; } // Add help text $helpText = array(); if (!empty($itemCfg[2])) { $helpText['description'] = $GLOBALS['LANG']->sl($itemCfg[2]); } // Add item to be selected: $items[] = array($GLOBALS['LANG']->sl($itemCfg[0]), $coKey . ':' . preg_replace('/[:|,]/', '', $itemKey), $icon, $helpText); } } } } break; case 'modListGroup': case 'modListUser': $loadModules = t3lib_div::makeInstance('t3lib_loadModules'); $loadModules->load($GLOBALS['TBE_MODULES']); $modList = $fieldValue['config']['special'] == 'modListUser' ? $loadModules->modListUser : $loadModules->modListGroup; if (is_array($modList)) { $descr = ''; foreach ($modList as $theMod) { // Icon: $icon = $GLOBALS['LANG']->moduleLabels['tabs_images'][$theMod . '_tab']; if ($icon) { $icon = '../' . substr($icon, strlen(PATH_site)); } // Add help text $helpText = array('title' => $GLOBALS['LANG']->moduleLabels['labels'][$theMod . '_tablabel'], 'description' => $GLOBALS['LANG']->moduleLabels['labels'][$theMod . '_tabdescr']); // Item configuration: $items[] = array($this->addSelectOptionsToItemArray_makeModuleData($theMod), $theMod, $icon, $helpText); } } break; } } // Return the items: return $items; }
/** * generate the folder structure for reST documentation */ protected function generateDocumentationFiles() { $this->mkdir_deep($this->extensionDirectory, 'Documentation'); $docFiles = array(); $docFiles = t3lib_div::getAllFilesAndFoldersInPath($docFiles, t3lib_extMgm::extPath('extension_builder') . 'Resources/Private/CodeTemplates/Extbase/Documentation/', '', TRUE, 5, '/.*rstt/'); foreach ($docFiles as $docFile) { if (is_dir($docFile)) { $this->mkdir_deep($this->extensionDirectory, 'Documentation/' . str_replace($this->codeTemplateRootPath . 'Documentation/', '', $docFile)); } else { if (strpos($docFile, '.rstt') === FALSE) { $this->upload_copy_move($docFile, str_replace(t3lib_extMgm::extPath('extension_builder') . 'Resources/Private/CodeTemplates/Extbase/', $this->extensionDirectory, $docFile)); } } } $this->upload_copy_move(t3lib_extMgm::extPath('extension_builder') . 'Resources/Private/CodeTemplates/Extbase/Readme.rst', $this->extensionDirectory . 'Readme.rst'); $fileContents = $this->renderTemplate('Documentation/Index.rstt', array('extension' => $this->extension)); $this->writeFile($this->extensionDirectory . 'Documentation/Index.rst', $fileContents); }
/** * Analyses the php-scripts of an available extension on server * * @param string Absolute path to extension * @param string Prefix for tables/classes. * @param string Extension key * @return array Information array. * @see makeDetailedExtensionAnalysis() */ public static function getClassIndexLocallangFiles($absPath, $table_class_prefix, $extKey) { $excludeForPackaging = $GLOBALS['TYPO3_CONF_VARS']['EXT']['excludeForPackaging']; $filesInside = t3lib_div::removePrefixPathFromList(t3lib_div::getAllFilesAndFoldersInPath(array(), $absPath, 'php,inc', 0, 99, $excludeForPackaging), $absPath); $out = array(); $reg = array(); foreach ($filesInside as $fileName) { if (substr($fileName, 0, 4) != 'ext_' && substr($fileName, 0, 6) != 'tests/') { // ignore supposed-to-be unit tests as well $baseName = basename($fileName); if (substr($baseName, 0, 9) == 'locallang' && substr($baseName, -4) == '.php') { $out['locallang'][] = $fileName; } elseif ($baseName != 'conf.php') { if (filesize($absPath . $fileName) < 500 * 1024) { $fContent = t3lib_div::getUrl($absPath . $fileName); unset($reg); if (preg_match('/\\n[[:space:]]*class[[:space:]]*([[:alnum:]_]+)([[:alnum:][:space:]_]*)/', $fContent, $reg)) { // Find classes: $lines = explode(LF, $fContent); foreach ($lines as $l) { $line = trim($l); unset($reg); if (preg_match('/^class[[:space:]]*([[:alnum:]_]+)([[:alnum:][:space:]_]*)/', $line, $reg)) { $out['classes'][] = $reg[1]; $out['files'][$fileName]['classes'][] = $reg[1]; if ($reg[1] !== 'ext_update' && substr($reg[1], 0, 3) != 'ux_' && !t3lib_div::isFirstPartOfStr($reg[1], $table_class_prefix) && strcmp(substr($table_class_prefix, 0, -1), $reg[1])) { $out['NSerrors']['classname'][] = $reg[1]; } else { $out['NSok']['classname'][] = $reg[1]; } } } // If class file prefixed 'class.'.... if (substr($baseName, 0, 6) == 'class.') { $fI = pathinfo($baseName); $testName = substr($baseName, 6, -(1 + strlen($fI['extension']))); if ($testName !== 'ext_update' && substr($testName, 0, 3) != 'ux_' && !t3lib_div::isFirstPartOfStr($testName, $table_class_prefix) && strcmp(substr($table_class_prefix, 0, -1), $testName)) { $out['NSerrors']['classfilename'][] = $baseName; } else { $out['NSok']['classfilename'][] = $baseName; if (is_array($out['files'][$fileName]['classes']) && tx_em_Tools::first_in_array($testName, $out['files'][$fileName]['classes'], 1)) { $out['msg'][] = sprintf($GLOBALS['LANG']->getLL('detailedExtAnalysis_class_ok'), $fileName, $testName); } else { $out['errors'][] = sprintf($GLOBALS['LANG']->getLL('detailedExtAnalysis_class_not_ok'), $fileName, $testName); } } } // Check for proper XCLASS definition // Match $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS'] with single or doublequotes $XclassSearch = '\\$TYPO3_CONF_VARS\\[TYPO3_MODE\\]\\[[\'"]XCLASS[\'"]\\]'; $XclassParts = preg_split('/if \\(defined\\([\'"]TYPO3_MODE[\'"]\\)(.*)' . $XclassSearch . '/', $fContent, 2); if (count($XclassParts) !== 2) { // Match $GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS'] with single or doublequotes $XclassSearch = '\\$GLOBALS\\[[\'"]TYPO3_CONF_VARS[\'"]\\]\\[TYPO3_MODE\\]\\[[\'"]XCLASS[\'"]\\]'; $XclassParts = preg_split('/if \\(defined\\([\'"]TYPO3_MODE[\'"]\\)(.*)' . $XclassSearch . '/', $fContent, 2); } if (count($XclassParts) == 2) { unset($reg); preg_match('/^\\[[\'"]([[:alnum:]_\\/\\.]*)[\'"]\\]/', $XclassParts[1], $reg); if ($reg[1]) { $cmpF = 'ext/' . $extKey . '/' . $fileName; if (!strcmp($reg[1], $cmpF)) { if (preg_match('/_once[[:space:]]*\\(' . $XclassSearch . '\\[[\'"]' . preg_quote($cmpF, '/') . '[\'"]\\]\\);/', $XclassParts[1])) { $out['msg'][] = sprintf($GLOBALS['LANG']->getLL('detailedExtAnalysis_xclass_ok'), $fileName); } else { $out['errors'][] = $GLOBALS['LANG']->getLL('detailedExtAnalysis_xclass_no_include'); } } else { $out['errors'][] = sprintf($GLOBALS['LANG']->getLL('detailedExtAnalysis_xclass_incorrect'), $reg[1], $cmpF); } } else { $out['errors'][] = sprintf($GLOBALS['LANG']->getLL('detailedExtAnalysis_no_xclass_filename'), $fileName); } } elseif (!tx_em_Tools::first_in_array('ux_', $out['files'][$fileName]['classes'])) { // No Xclass definition required if classname starts with 'ux_' $out['errors'][] = sprintf($GLOBALS['LANG']->getLL('detailedExtAnalysis_no_xclass_found'), $fileName); } } } } } } return $out; }
/** * get files from given relative directory path array * * @param array $directoryArray * @return array An Array containing all files of all valid directories */ public function getFilesFromDirectories(array $directoryArray) { $directoryArray = $this->getAbsoluteDirectoryPath($directoryArray); if (is_array($directoryArray) && count($directoryArray)) { foreach ($directoryArray as $directory) { if (TYPO3_VERSION_INTEGER >= 7000000) { $foundFiles = TYPO3\CMS\Core\Utility\GeneralUtility::getAllFilesAndFoldersInPath(array(), $directory, $this->indexerConfig['fileext']); } else { $foundFiles = t3lib_div::getAllFilesAndFoldersInPath(array(), $directory, $this->indexerConfig['fileext']); } if (is_array($foundFiles) && count($foundFiles)) { foreach ($foundFiles as $file) { $files[] = $file; } } } return $files; } else { return array(); } }
/** * Find lost files in uploads/ folder * FIX METHOD: Simply delete the file... * * TODO: Add parameter to exclude filepath * TODO: Add parameter to list more file names/patterns to ignore * TODO: Add parameter to include RTEmagic images * * @return array */ function main() { global $TYPO3_DB; // Initialize result array: $resultArray = array('message' => $this->cli_help['name'] . LF . LF . $this->cli_help['description'], 'headers' => array('managedFiles' => array('Files related to TYPO3 records and managed by TCEmain', 'These files you definitely want to keep.', 0), 'ignoredFiles' => array('Ignored files (index.html, .htaccess etc.)', 'These files are allowed in uploads/ folder', 0), 'RTEmagicFiles' => array('RTE magic images - those found (and ignored)', 'These files are also allowed in some uploads/ folders as RTEmagic images.', 0), 'lostFiles' => array('Lost files - those you can delete', 'You can delete these files!', 3), 'warnings' => array('Warnings picked up', '', 2)), 'managedFiles' => array(), 'ignoredFiles' => array(), 'RTEmagicFiles' => array(), 'lostFiles' => array(), 'warnings' => array()); // Get all files: $fileArr = array(); $fileArr = t3lib_div::getAllFilesAndFoldersInPath($fileArr, PATH_site . 'uploads/'); $fileArr = t3lib_div::removePrefixPathFromList($fileArr, PATH_site); $excludePaths = t3lib_div::trimExplode(',', $this->cli_argValue('--excludePath', 0), 1); // Traverse files and for each, look up if its found in the reference index. foreach ($fileArr as $key => $value) { $include = TRUE; foreach ($excludePaths as $exclPath) { if (t3lib_div::isFirstPartOfStr($value, $exclPath)) { $include = FALSE; } } $shortKey = t3lib_div::shortmd5($value); if ($include) { // First, allow "index.html", ".htaccess" files since they are often used for good reasons if (substr($value, -11) == '/index.html' || substr($value, -10) == '/.htaccess') { unset($fileArr[$key]); $resultArray['ignoredFiles'][$shortKey] = $value; } else { // Looking for a reference from a field which is NOT a soft reference (thus, only fields with a proper TCA/Flexform configuration) $recs = $TYPO3_DB->exec_SELECTgetRows('*', 'sys_refindex', 'ref_table=' . $TYPO3_DB->fullQuoteStr('_FILE', 'sys_refindex') . ' AND ref_string=' . $TYPO3_DB->fullQuoteStr($value, 'sys_refindex') . ' AND softref_key=' . $TYPO3_DB->fullQuoteStr('', 'sys_refindex'), '', 'sorting DESC'); // If found, unset entry: if (count($recs)) { unset($fileArr[$key]); $resultArray['managedFiles'][$shortKey] = $value; if (count($recs) > 1) { $resultArray['warnings'][$shortKey] = 'Warning: File "' . $value . '" had ' . count($recs) . ' references from group-fields, should have only one!'; } } else { // When here it means the file was not found. So we test if it has a RTEmagic-image name and if so, we allow it: if (preg_match('/^RTEmagic[P|C]_/', basename($value))) { unset($fileArr[$key]); $resultArray['RTEmagicFiles'][$shortKey] = $value; } else { // We conclude that the file is lost...: unset($fileArr[$key]); $resultArray['lostFiles'][$shortKey] = $value; } } } } } asort($resultArray['ignoredFiles']); asort($resultArray['managedFiles']); asort($resultArray['RTEmagicFiles']); asort($resultArray['lostFiles']); asort($resultArray['warnings']); // $fileArr variable should now be empty with all contents transferred to the result array keys. return $resultArray; }
/** * Returns file-listing of an extension * * @param string Extension key * @param array Extension information array * @return string HTML table. */ function getFileListOfExtension($extKey, $conf) { $content = ''; $extPath = tx_em_Tools::getExtPath($extKey, $conf['type']); if ($extPath) { // Read files: $fileArr = array(); $fileArr = t3lib_div::getAllFilesAndFoldersInPath($fileArr, $extPath, '', 0, 99, $this->excludeForPackaging); // Start table: $lines = array(); $totalSize = 0; // Header: $lines[] = ' <tr class="t3-row-header"> <td>' . $GLOBALS['LANG']->getLL('extFileList_file') . '</td> <td>' . $GLOBALS['LANG']->getLL('extFileList_size') . '</td> <td>' . $GLOBALS['LANG']->getLL('extFileList_edit') . '</td> </tr>'; foreach ($fileArr as $file) { $fI = t3lib_div::split_fileref($file); $lines[] = ' <tr class="bgColor4"> <td><a href="' . htmlspecialchars(t3lib_div::linkThisScript(array('CMD[showExt]' => $extKey, 'CMD[downloadFile]' => rawurlencode($file)))) . '" title="' . $GLOBALS['LANG']->getLL('extFileList_download') . '">' . substr($file, strlen($extPath)) . '</a></td> <td>' . t3lib_div::formatSize(filesize($file)) . '</td> <td>' . (!in_array($extKey, $this->requiredExt) && t3lib_div::inList($this->editTextExtensions, $fI['fileext'] ? $fI['fileext'] : $fI['filebody']) ? '<a href="' . htmlspecialchars(t3lib_div::linkThisScript(array('CMD[showExt]' => $extKey, 'CMD[editFile]' => rawurlencode($file)))) . '">' . $GLOBALS['LANG']->getLL('extFileList_edit_file') . '</a>' : '') . '</td> </tr>'; $totalSize += filesize($file); } $lines[] = ' <tr class="bgColor6"> <td><strong>' . $GLOBALS['LANG']->getLL('extFileList_total') . '</strong></td> <td><strong>' . t3lib_div::formatSize($totalSize) . '</strong></td> <td> </td> </tr>'; $content = ' Path: ' . $extPath . '<br /><br /> <table border="0" cellpadding="1" cellspacing="2">' . implode('', $lines) . '</table>'; } return $content; }
function folderChange($startpath) { // config $subfolder = ''; // let's go $folderArray = $newArray = array(); // init empty array $folderArray = t3lib_div::getAllFilesAndFoldersInPath($folderArray, t3lib_div::getFileAbsFileName($startpath), 'wt_gallery', 1); // get all folders of the startpath in an array $folderArray = array_flip($folderArray); // flip array foreach ((array) $folderArray as $key => $value) { // one loop for every array content if (substr($key, -1) === '/') { // if last sign is '/' $key = substr($key, 0, -1); // delete last sign } if (t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST') . '/' != t3lib_div::getIndpEnv('TYPO3_SITE_URL')) { // if request_host is different to site_url (TYPO3 runs in a subfolder) $subfolder = str_replace(t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST') . '/', '', t3lib_div::getIndpEnv('TYPO3_SITE_URL')); // get the folder (like "subfolder/") } $newArray[str_replace(t3lib_div::getIndpEnv('TYPO3_DOCUMENT_ROOT') . '/' . $subfolder, '', $key)] = $this->hashCode(str_replace(t3lib_div::getIndpEnv('TYPO3_DOCUMENT_ROOT') . '/' . $subfolder, '', $key)); // rewrite array like 12345 => fileadmin/pics } if (!empty($newArray)) { return $newArray; } }
/** * Generate the $classNameToFileMapping for a given filePath. * * @param array $classNameToFileMapping (Reference to array) All values are appended to this array. * @param string $path Path which should be crawled * @param string $excludeRegularExpression Exclude regular expression, to exclude certain files from being processed * @param string $valueWrap Wrap for the file name * @param boolean $includeSubFolders Whether to include sub folders * @param string $fileExtensionList List of file extensions to consider * @return void */ protected function buildAutoloadRegistryForSinglePath(&$classNameToFileMapping, $path, $excludeRegularExpression = '', $valueWrap = '\'|\'', $includeSubFolders = TRUE, $fileExtensionList = 'php') { $recursivityLevels = $includeSubFolders ? 99 : 0; $extensionFileNames = t3lib_div::removePrefixPathFromList(t3lib_div::getAllFilesAndFoldersInPath(array(), $path, $fileExtensionList, FALSE, $recursivityLevels, $excludeRegularExpression), $path); foreach ($extensionFileNames as $extensionFileName) { $classNamesInFile = $this->extractClassNames($path . $extensionFileName); if (!count($classNamesInFile)) { continue; } foreach ($classNamesInFile as $className) { // Register processed classes and the accordant file name: if (!isset($this->processedClasses[strtolower($className)]) || !in_array($path . $extensionFileName, $this->processedClasses[strtolower($className)])) { $this->processedClasses[strtolower($className)][] = $path . $extensionFileName; } $classNameToFileMapping[strtolower($className)] = str_replace('|', $extensionFileName, $valueWrap); } } ksort($classNameToFileMapping); }
/** * Removes the extension directory (including content) * * @param string Extension directory to remove (with trailing slash) * @param boolean If set, will leave the extension directory * @return boolean False on success, otherwise error string. */ function removeExtDirectory($removePath, $removeContentOnly = 0) { $errors = array(); if (@is_dir($removePath) && substr($removePath, -1) == '/' && (t3lib_div::isFirstPartOfStr($removePath, tx_em_Tools::typePath('G')) || t3lib_div::isFirstPartOfStr($removePath, tx_em_Tools::typePath('L')) || t3lib_div::isFirstPartOfStr($removePath, tx_em_Tools::typePath('S')) && $this->systemInstall || t3lib_div::isFirstPartOfStr($removePath, PATH_site . $GLOBALS['TYPO3_CONF_VARS']['BE']['fileadminDir'] . '_temp_/'))) { // All files in extension directory: $fileArr = t3lib_div::getAllFilesAndFoldersInPath(array(), $removePath, '', 1); if (is_array($fileArr)) { // Remove files in dirs: foreach ($fileArr as $removeFile) { if (!@is_dir($removeFile)) { if (@is_file($removeFile) && t3lib_div::isFirstPartOfStr($removeFile, $removePath) && strcmp($removeFile, $removePath)) { // ... we are very paranoid, so we check what cannot go wrong: that the file is in fact within the prefix path! @unlink($removeFile); clearstatcache(); if (@is_file($removeFile)) { $errors[] = sprintf($GLOBALS['LANG']->getLL('rmExtDir_could_not_be_deleted'), $removeFile); } } else { $errors[] = sprintf($GLOBALS['LANG']->getLL('rmExtDir_error_file'), $removeFile, $removePath); } } } // Remove directories: $remDirs = tx_em_Tools::extractDirsFromFileList(t3lib_div::removePrefixPathFromList($fileArr, $removePath)); $remDirs = array_reverse($remDirs); // Must delete outer directories first... foreach ($remDirs as $removeRelDir) { $removeDir = $removePath . $removeRelDir; if (@is_dir($removeDir)) { @rmdir($removeDir); clearstatcache(); if (@is_dir($removeDir)) { $errors[] = sprintf($GLOBALS['LANG']->getLL('rmExtDir_error_files_left'), $removeDir); } } else { $errors[] = sprintf($GLOBALS['LANG']->getLL('rmExtDir_error_no_dir'), $removeDir); } } // If extension dir should also be removed: if (!$removeContentOnly) { @rmdir($removePath); clearstatcache(); if (@is_dir($removePath)) { $errors[] = sprintf($GLOBALS['LANG']->getLL('rmExtDir_error_folders_left'), $removePath); } } } else { $errors[] = $GLOBALS['LANG']->getLL('rmExtDir_error') . ' ' . $fileArr; } } else { $errors[] = $GLOBALS['LANG']->getLL('rmExtDir_error_unallowed_path') . ' ' . $removePath; } // Return errors if any: return implode(LF, $errors); }
function garbageCollector() { $iNow = time(); $iGCProbability = intval($GLOBALS["TYPO3_CONF_VARS"]["EXTCONF"]["ameos_formidable"]["ext_conf_template"]["gc_probability"]); $iGCMaxAge = intval($GLOBALS["TYPO3_CONF_VARS"]["EXTCONF"]["ameos_formidable"]["ext_conf_template"]["gc_jsmaxage"]); if ($iGCProbability <= 0 || $iGCMaxAge <= 0) { return; } if ($iNow % $iGCProbability !== 0) { return; } // executing garabage collector // on temporary JS files $sPath = PATH_site . "typo3temp/ameos_formidable/js/"; if (!file_exists($sPath)) { return; } $aFiles = t3lib_div::getAllFilesAndFoldersInPath(array(), $sPath, '', 0, 1); if (!empty($aFiles)) { reset($aFiles); while (list(, $sFile) = each($aFiles)) { if ($iNow - fileatime($sFile) > $iGCMaxAge) { @unlink($sFile); } } clearstatcache(); } }
/** * Finds all files that are named like test files in the directory $directory * and recursively all its subdirectories. * * @param string $directory * the absolute path of the directory in which to look for test cases * * @return array<string> * sorted file names of the test cases in the directory $directory relative * to $directory, will be empty if no test cases have been found * * @throws InvalidArgumentException */ public function findTestCaseFilesInDirectory($directory) { if ($directory === '') { throw new InvalidArgumentException('$directory must not be empty.', 1334439798); } if (!is_dir($directory)) { throw new InvalidArgumentException('The directory ' . $directory . ' does not exist.', 1334439804); } if (!is_readable($directory)) { throw new InvalidArgumentException('The directory ' . $directory . ' exists, but is not readable.', 1334439813); } $directoryLength = strlen($directory); $testFiles = array(); $allPhpFiles = t3lib_div::getAllFilesAndFoldersInPath(array(), $directory, 'php'); foreach ($allPhpFiles as $filePath) { if ($this->isNotFixturesPath($filePath) && $this->isTestCaseFileName($filePath)) { $testFiles[] = substr($filePath, $directoryLength); } } sort($testFiles, SORT_STRING); return $testFiles; }
/** * Find and check all templates within the template paths * * @return array all relevant templates */ protected function getTemplateFiles() { $paths = $this->getTemplatePaths(); $files = array(); foreach ($paths as $path) { $files = array_merge(t3lib_div::getAllFilesAndFoldersInPath(array(), $prefix . $path . ((substr($path, -1) != '/') ? '/' : ''), 'html,htm,tmpl', 0), $files); } return $files; }
/** * Indexing files from fileadmin * * @param array Indexing Configuration Record * @param array Session data for the indexing session spread over multiple instances of the script. Passed by reference so changes hereto will be saved for the next call! * @param array Parameters from the log queue. * @param object Parent object (from "crawler" extension!) * @return void */ function crawler_execute_type2($cfgRec, &$session_data, $params, &$pObj) { // Prepare path, making it absolute and checking: $readpath = $params['url']; if (!t3lib_div::isAbsPath($readpath)) { $readpath = t3lib_div::getFileAbsFileName($readpath); } if (t3lib_div::isAllowedAbsPath($readpath)) { if (@is_file($readpath)) { // If file, index it! // Get root line (need to provide this when indexing external files) $rl = $this->getUidRootLineForClosestTemplate($cfgRec['pid']); // Load indexer if not yet. $this->loadIndexerClass(); // (Re)-Indexing file on page. $indexerObj = t3lib_div::makeInstance('tx_indexedsearch_indexer'); $indexerObj->backend_initIndexer($cfgRec['pid'], 0, 0, '', $rl); $indexerObj->backend_setFreeIndexUid($cfgRec['uid'], $cfgRec['set_id']); $indexerObj->hash['phash'] = -1; // EXPERIMENT - but to avoid phash_t3 being written to file sections (otherwise they are removed when page is reindexed!!!) // Index document: $indexerObj->indexRegularDocument(substr($readpath, strlen(PATH_site)), TRUE); } elseif (@is_dir($readpath)) { // If dir, read content and create new pending items for log: // Select files and directories in path: $extList = implode(',', t3lib_div::trimExplode(',', $cfgRec['extensions'], 1)); $fileArr = array(); $files = t3lib_div::getAllFilesAndFoldersInPath($fileArr, $readpath, $extList, 0, 0); $directoryList = t3lib_div::get_dirs($readpath); if (is_array($directoryList) && $params['depth'] < $cfgRec['depth']) { foreach ($directoryList as $subdir) { if ((string) $subdir != '') { $files[] = $readpath . $subdir . '/'; } } } $files = t3lib_div::removePrefixPathFromList($files, PATH_site); // traverse the items and create log entries: foreach ($files as $path) { $this->instanceCounter++; if ($path !== $params['url']) { // Parameters: $nparams = array('indexConfigUid' => $cfgRec['uid'], 'url' => $path, 'procInstructions' => array('[Index Cfg UID#' . $cfgRec['uid'] . ']'), 'depth' => $params['depth'] + 1); $pObj->addQueueEntry_callBack($cfgRec['set_id'], $nparams, $this->callBack, $cfgRec['pid'], $GLOBALS['EXEC_TIME'] + $this->instanceCounter * $this->secondsPerExternalUrl); } } } } }
/** * Generate the $classNameToFileMapping for a given filePath. * * @param array $classNameToFileMapping (Reference to array) All values are appended to this array. * @param string $path Path which should be crawled * @param string $excludeRegularExpression Exclude regular expression, to exclude certain files from being processed * @param string $valueWrap Wrap for the file name * @return void */ protected function buildAutoloadRegistryForSinglePath(&$classNameToFileMapping, $path, $excludeRegularExpression = '', $valueWrap = '\'|\'') { // if (file_exists($path . 'Classes/')) { // return "<b>This appears to be a new-style extension which has its PHP classes inside the Classes/ subdirectory. It is not needed to generate the autoload registry for these extensions.</b>"; // } $extensionFileNames = t3lib_div::removePrefixPathFromList(t3lib_div::getAllFilesAndFoldersInPath(array(), $path, 'php', FALSE, 99, $excludeRegularExpression), $path); foreach ($extensionFileNames as $extensionFileName) { $classNamesInFile = $this->extractClassNames($path . $extensionFileName); if (!count($classNamesInFile)) { continue; } foreach ($classNamesInFile as $className) { $classNameToFileMapping[strtolower($className)] = str_replace('|', $extensionFileName, $valueWrap); } } }
/** * Recursively gather all files and folders of a path. * Usage: 5 * * @param array $fileArr: Empty input array (will have files added to it) * @param string $path: The path to read recursively from (absolute) (include trailing slash!) * @param string $extList: Comma list of file extensions: Only files with extensions in this list (if applicable) will be selected. * @param boolean $regDirs: If set, directories are also included in output. * @param integer $recursivityLevels: The number of levels to dig down... * @param string $excludePattern: regex pattern of files/directories to exclude * @return array An array with the found files/directories. */ public static function getAllFilesAndFoldersInPath(array $fileArr, $path, $extList = '', $regDirs = 0, $recursivityLevels = 99, $excludePattern = '') { if ($regDirs) { $fileArr[] = $path; } $fileArr = array_merge($fileArr, t3lib_div::getFilesInDir($path, $extList, 1, 1, $excludePattern)); $dirs = t3lib_div::get_dirs($path); if (is_array($dirs) && $recursivityLevels > 0) { foreach ($dirs as $subdirs) { if ((string) $subdirs != '' && (!strlen($excludePattern) || !preg_match('/^' . $excludePattern . '$/', $subdirs))) { $fileArr = t3lib_div::getAllFilesAndFoldersInPath($fileArr, $path . $subdirs . '/', $extList, $regDirs, $recursivityLevels - 1, $excludePattern); } } } return $fileArr; }
/** * Wizard Step 1: Selecting template file. * * @return void */ function wizard_step1() { if (@is_dir(PATH_site . $this->templatesDir)) { $this->wizardData = array(); $outputString .= nl2br('The first step is to select the HTML file you want to base the new website design on. Below you see a list of HTML files found in the folder "' . $this->templatesDir . '". Click the "Preview"-link to see what the file looks like and when the right template is found, just click the "Choose as template"-link in order to proceed. If the list of files is empty you must now copy the HTML file you want to use as a template into the template folder. When you have done that, press the refresh button to refresh the list.<br/>'); // Get all HTML files: $fileArr = t3lib_div::getAllFilesAndFoldersInPath(array(), PATH_site . $this->templatesDir, 'html,htm', 0, 1); $fileArr = t3lib_div::removePrefixPathFromList($fileArr, PATH_site); // Prepare header: $tRows = array(); $tRows[] = '<tr class="tableheader bgColor5"> <td>Path:</td> <td>Usage:</td> <td>Action:</td> </tr>'; // Traverse available template files: foreach ($fileArr as $file) { // Has been used: $tosForTemplate = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('uid', 'tx_templavoila_tmplobj', 'fileref=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($file, 'tx_templavoila_tmplobj') . t3lib_BEfunc::deleteClause('tx_templavoila_tmplobj')); // Preview link $onClick = 'vHWin=window.open(\'' . $this->doc->backPath . '../' . $file . '\',\'tvTemplatePreview\',\'status=1,menubar=1,scrollbars=1,location=1\');vHWin.focus();return false;'; // Make row: $tRows[] = '<tr class="bgColor4"> <td>' . htmlspecialchars($file) . '</td> <td>' . (count($tosForTemplate) ? 'Used ' . count($tosForTemplate) . ' times' : 'Not used yet') . '</td> <td>' . '<a href="#" onclick="' . htmlspecialchars($onClick) . '">[Preview first]</a> ' . '<a href="' . htmlspecialchars('index.php?SET[wiz_step]=2&CFG[file]=' . rawurlencode($file)) . '">[Choose as Template]</a> ' . '</td> </tr>'; } $outputString .= '<table border="0" cellpadding="1" cellspacing="1" class="lrPadding">' . implode('', $tRows) . '</table>'; // Refresh button: $outputString .= '<br/><input type="submit" value="Refresh" onclick="' . htmlspecialchars('document.location=\'index.php?SET[wiz_step]=1\'; return false;') . '" />'; // Add output: $this->content .= $this->doc->section('Step 1: Select the template HTML file', $outputString, 0, 1); } else { $this->content .= $this->doc->section('TemplaVoila wizard error', $this->templatesDir . ' is not a directory! Please, create it before starting this wizard.', 0, 1); } }