コード例 #1
0
 /**
  * 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;
 }