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