/** * generates a general information array * * @param string reference language * @param array language key array * @param object file object * @return array general information array * @see outputGeneral() */ public static function genGeneralInfoArray($refLang, $languages, $fileObj) { // reference language data informations $localRefLangData = $fileObj->getLocalLangData($refLang); // generate needed data foreach ($languages as $langKey) { // get origin data and meta informations $origin = $fileObj->getOriginLangData($langKey); $infos['default']['meta'] = $fileObj->getMetaData(); // language data $localLangData = $fileObj->getLocalLangData($langKey); // detailed constants informations $infos[$langKey]['numUntranslated'] = count(array_diff_key($localRefLangData, $localLangData)); $infos[$langKey]['numUnknown'] = count(array_diff_key($localLangData, $localRefLangData)); $infos[$langKey]['numTranslated'] = count(array_intersect_key($localLangData, $localRefLangData)); // get location type if ($fileObj->getVar('workspace') != 'xll') { $locType = typo3Lib::checkFileLocation($origin); if ($locType == 'local') { $infos[$langKey]['type'] = $GLOBALS['LANG']->getLL('ext.local'); } elseif ($locType == 'global') { $infos[$langKey]['type'] = $GLOBALS['LANG']->getLL('ext.global'); } elseif ($locType == 'system') { $infos[$langKey]['type'] = $GLOBALS['LANG']->getLL('ext.system'); } elseif ($locType == 'l10n') { $infos[$langKey]['type'] = $GLOBALS['LANG']->getLL('lang.file.l10n'); $infos[$langKey]['type2'] = 'l10n'; } else { $infos[$langKey]['type'] = $GLOBALS['LANG']->getLL('ext.unknown'); } if ($infos[$langKey]['type2'] != 'l10n') { if ($fileObj->checkLocalizedFile(basename($origin), $langKey)) { $infos[$langKey]['type2'] = 'splitted'; } else { $infos[$langKey]['type2'] = 'merged'; } } } else { $infos[$langKey]['type'] = 'xll'; $infos[$langKey]['type2'] = 'merged'; } // set origin try { $infos[$langKey]['origin'] = '[-]'; if (!empty($origin)) { $infos[$langKey]['origin'] = typo3Lib::transTypo3File($origin, false); } } catch (Exception $e) { $infos[$langKey]['origin'] = sgLib::trimPath(PATH_site, $origin); } } return $infos; }
/** * creates a full path (all nonexistent directories will be created) * * @throws Exception raised if some path token cant be created * @param string full path * @param string protected path (i.e. /var/www -- needed for basedir restrictions) * @return void */ public static function createDir($path, $protectArea) { unset($tmp); if (!is_dir($path)) { $path = explode('/', sgLib::trimPath($protectArea, $path)); foreach ($path as $dir) { $tmp .= $dir . '/'; if (is_dir($protectArea . $tmp)) { continue; } if (!mkdir($protectArea . $tmp)) { throw new Exception('path "' . $protectArea . $tmp . '" cant be deleted'); } } } }
/** * converts an absolute or relative typo3 style (EXT:) file path * * @throws Exception raised, if the conversion fails * @param string absolute file or an typo3 relative file (EXT:) * @param boolean generate to relative(false) or absolute file * @return string converted file path */ public static function transTypo3File($file, $mode) { $extType['local'] = typo3Lib::pathLocalExt; $extType['global'] = typo3Lib::pathGlobalExt; $extType['system'] = typo3Lib::pathSysExt; // relative to absolute if ($mode) { if (strpos($file, 'EXT:') === false) { throw new Exception('no typo3 relative path "' . $file . '"'); } $cleanFile = sgLib::trimPath('EXT:', $file); foreach ($extType as $type) { $path = typo3Lib::fixFilePath(PATH_site . '/' . $type . '/' . $cleanFile); if (is_dir(dirname($path))) { return $path; } } throw new Exception('cant convert typo3 relative file "' . $file . '"'); } else { foreach ($extType as $type) { if (strpos($file, $type) === false) { continue; } return 'EXT:' . sgLib::trimPath($type, sgLib::trimPath(PATH_site, $file)); } throw new Exception('cant convert absolute file "' . $file . '"'); } }
/** * generates the module content * * @throws LFException raised if any output failure occured * @return void at failure */ private function moduleContent() { // generate menus try { // generate extension and workspace list $name = 'select.extensionAndWorkspace'; $name = tx_lfeditor_mod1_functions::prepareSectionName($name); $this->content .= $this->doc->section($name, '', 0, 1); $this->menuExtList(); $extList = $this->getFuncMenu('extList'); $this->menuWorkspaceList(); $this->content .= $this->doc->funcMenu($extList, $this->getFuncMenu('wsList')); // generate language file list if ($this->MOD_SETTINGS['function'] != 'backupMgr') { $name = tx_lfeditor_mod1_functions::prepareSectionName('select.langfile'); $this->content .= $this->doc->section($name, '', 0, 1); $this->menuLangFileList(); $this->content .= $this->doc->funcMenu($this->getFuncMenu('langFileList'), ''); } } catch (LFException $e) { throw $e; } // init language file object try { if ($this->MOD_SETTINGS['function'] != 'backupMgr') { $this->initFileObject($this->MOD_SETTINGS['langFileList'], $this->MOD_SETTINGS['extList'], $this->MOD_SETTINGS['wsList']); } } catch (LFException $e) { throw $e; } // init backup object try { if ($this->MOD_SETTINGS['function'] == 'backupMgr') { $informations = array('extPath' => sgLib::trimPath(PATH_site, $this->MOD_SETTINGS['extList']), 'langFile' => t3lib_div::_POST('langFile')); $this->initBackupObject($this->MOD_SETTINGS['wsList'], $informations); } } catch (LFException $e) { throw $e; } // generate general output switch ($this->MOD_SETTINGS['function']) { case 'general': // exec action specific part of function try { $submit = t3lib_div::_POST('submitted'); $sendMail = t3lib_div::_POST('sendMail'); if ($submit) { if ($this->actionFuncGeneral()) { if (!$sendMail) { $preContent = '<p class="tx-lfeditor-success">' . $GLOBALS['LANG']->getLL('lang.file.write.success') . '</p>'; } else { $preContent = '<p class="tx-lfeditor-success">' . $GLOBALS['LANG']->getLL('function.general.mail.success') . '</p>'; } } } } catch (LFException $e) { $preContent = $e->getMessage(); } // get language data $langData = $this->fileObj->getLocalLangData(); // draw the language reference list $this->menuLangList($langData, 'patternList'); $refMenu = $this->doc->funcMenu($this->getFuncMenu('patternList'), ''); $sectName = 'select.referenceLanguage'; $name = tx_lfeditor_mod1_functions::prepareSectionName($sectName); $this->content .= $this->doc->section($name, $refMenu, 0, 1); // get main content $content = $this->outputFuncGeneral(); $sectName = 'function.general.general'; $sectName = tx_lfeditor_mod1_functions::prepareSectionName($sectName); break; case 'langfile.edit': // start session session_start(); // exec action specific part of function try { $submit = t3lib_div::_POST('submitted'); $session = t3lib_div::_POST('session'); if ($submit) { $this->actionFuncLangfileEdit(); if (!$session) { $preContent = '<p class="tx-lfeditor-success">' . $GLOBALS['LANG']->getLL('lang.file.write.success') . '</p>'; } } } catch (LFException $e) { $preContent = $e->getMessage(); } // get language data $langData = $this->fileObj->getLocalLangData(); // draw the language- and patternlist $this->menuLangList($langData, 'langList'); $langList = $this->getFuncMenu('langList'); $this->menuLangList($langData, 'langfileEditPatternList', $GLOBALS['LANG']->getLL('select.nothing')); $patternList = $this->getFuncMenu('langfileEditPatternList'); $languageMenu = $this->doc->funcMenu($langList, $patternList); $name = 'select.languageAndPattern'; $name = tx_lfeditor_mod1_functions::prepareSectionName($name); $this->content .= $this->doc->section($name, $languageMenu, 0, 1); // draw type selector $this->menuConstantType(); $typeList = $this->getFuncMenu('constTypeList'); $typeMenu = $this->doc->funcMenu($typeList, ''); $name = 'select.constantType'; $name = tx_lfeditor_mod1_functions::prepareSectionName($name); $this->content .= $this->doc->section($name, $typeMenu, 0, 1); // get main content try { $content = $this->outputFuncLangfileEdit($langData); } catch (LFException $e) { $content = $e->getMessage(); } $sectName = 'function.langfile.edit'; $sectName = tx_lfeditor_mod1_functions::prepareSectionName($sectName); break; case 'const.edit': // exec action specific part of function try { $submit = t3lib_div::_POST('submit'); if ($submit) { $this->actionFuncConstEdit(); $preContent = '<p class="tx-lfeditor-success">' . $GLOBALS['LANG']->getLL('lang.file.write.success') . '</p>'; } } catch (LFException $e) { $preContent = $e->getMessage(); } // get language data $langData = $this->fileObj->getLocalLangData(); // draw the constant list menu $this->menuConstList($langData, $GLOBALS['LANG']->getLL('select.nothing')); $constList = $this->doc->funcMenu($this->getFuncMenu('constList'), ''); $name = tx_lfeditor_mod1_functions::prepareSectionName('select.constant'); $this->content .= $this->doc->section($name, $constList, 0, 1); // get main content try { $content = $this->outputFuncConstEdit($langData); } catch (LFException $e) { $content = $e->getMessage(); } $sectName = 'function.const.edit.edit'; $sectName = tx_lfeditor_mod1_functions::prepareSectionName($sectName); break; case 'const.add': $constant = t3lib_div::_POST('nameOfConst'); $newLang = t3lib_div::_POST('newLang'); $langData = $this->fileObj->getLocalLangData(); // exec action specific part of function $submit = t3lib_div::_POST('submit'); try { if ($submit) { $this->actionFuncConstAdd($langData, $newLang, $constant); $preContent = '<p class="tx-lfeditor-success">' . $GLOBALS['LANG']->getLL('lang.file.write.success') . '</p>'; } } catch (LFException $e) { $preContent = $e->getMessage(); } // get main content try { $content = $this->outputFuncConstAdd($constant, $newLang); } catch (LFException $e) { $content = $e->getMessage(); } $sectName = 'function.const.add.add'; $sectName = tx_lfeditor_mod1_functions::prepareSectionName($sectName); break; case 'const.delete': // exec action specific part of function try { $submit = t3lib_div::_POST('submit'); if ($submit) { $this->actionFuncConstDelete(); $preContent = '<p class="tx-lfeditor-success">' . $GLOBALS['LANG']->getLL('lang.file.write.success') . '</p>'; } } catch (LFException $e) { $preContent = $e->getMessage(); } // get language data $langData = $this->fileObj->getLocalLangData(); // draw the constant list menu $this->menuConstList($langData, $GLOBALS['LANG']->getLL('select.nothing')); $constList = $this->doc->funcMenu($this->getFuncMenu('constList'), ''); $name = tx_lfeditor_mod1_functions::prepareSectionName('select.constant'); $this->content .= $this->doc->section($name, $constList, 0, 1); // get main content try { $content = $this->outputFuncConstDelete(); } catch (LFException $e) { $content = $e->getMessage(); } $sectName = 'function.const.delete.delete'; $sectName = tx_lfeditor_mod1_functions::prepareSectionName($sectName); break; case 'const.rename': // exec action specific part of function try { $submit = t3lib_div::_POST('submit'); if ($submit) { $langData = $this->fileObj->getLocalLangData(); $this->actionFuncConstRename($langData); $preContent = '<p class="tx-lfeditor-success">' . $GLOBALS['LANG']->getLL('lang.file.write.success') . '</p>'; } } catch (LFException $e) { $preContent = $e->getMessage(); } // get language data $langData = $this->fileObj->getLocalLangData(); // draw the constant list menu $this->menuConstList($langData, $GLOBALS['LANG']->getLL('select.nothing')); $constList = $this->doc->funcMenu($this->getFuncMenu('constList'), ''); $name = tx_lfeditor_mod1_functions::prepareSectionName('select.constant'); $this->content .= $this->doc->section($name, $constList, 0, 1); // get main content try { $content = $this->outputFuncConstRename(); } catch (LFException $e) { $content = $e->getMessage(); } $sectName = 'function.const.rename.rename'; $sectName = tx_lfeditor_mod1_functions::prepareSectionName($sectName); break; case 'const.search': // exec action specific part of function $submit = t3lib_div::_POST('submitted'); if ($submit) { $this->actionFuncConstSearch(); } // get language data $langData = $this->fileObj->getLocalLangData(); // get main content try { $content = $this->outputFuncConstSearch($langData); } catch (LFException $e) { $content = $e->getMessage(); } $sectName = 'function.const.search.search'; $sectName = tx_lfeditor_mod1_functions::prepareSectionName($sectName); break; case 'const.treeview': $curToken = t3lib_div::_POST('usedToken'); // exec action specific part of function $submit = t3lib_div::_POST('submitted'); if ($submit) { $this->actionFuncConstTreeview(); } // get language data $langData = $this->fileObj->getLocalLangData(); // draw the language and reference list $this->menuLangList($langData, 'langList'); $langList = $this->getFuncMenu('langList'); $this->menuLangList($langData, 'patternList'); $refList = $this->getFuncMenu('patternList'); $name = 'select.languageAndPattern'; $name = tx_lfeditor_mod1_functions::prepareSectionName($name); $langMenu = $this->doc->funcMenu($langList, $refList); $this->content .= $this->doc->section($name, $langMenu, 0, 1); // draw explode token menu $curToken = tx_lfeditor_mod1_functions::getExplodeToken($curToken, $langData[$this->MOD_SETTINGS['patternList']]); $selToken = tx_lfeditor_mod1_template::fieldSetToken($curToken); $treeMenu = $this->doc->funcMenu($selToken, ''); $name = 'select.explodeToken'; $name = tx_lfeditor_mod1_functions::prepareSectionName($name); $this->content .= $this->doc->section($name, $treeMenu, 0, 1); // get main content try { $content = $this->outputFuncConstTreeview($langData, $curToken); } catch (LFException $e) { $content = $e->getMessage(); } $sectName = 'function.const.treeview.treeview'; $sectName = tx_lfeditor_mod1_functions::prepareSectionName($sectName); break; case 'backupMgr': // exec action specific part of function try { $origDiff = t3lib_div::_POST('origDiff'); $submit = t3lib_div::_POST('submitted'); if ($submit) { $this->actionFuncBackupMgr(); if (!$origDiff) { $preContent = '<p class="tx-lfeditor-success">' . $GLOBALS['LANG']->getLL('function.backupMgr.success') . '</p>'; } } } catch (LFException $e) { $preContent = $e->getMessage(); } // get main content try { $content = $this->outputFuncBackupMgr(); } catch (LFException $e) { $content = $e->getMessage(); } $sectName = 'function.backupMgr.backupMgr'; $sectName = tx_lfeditor_mod1_functions::prepareSectionName($sectName); break; } // save generated content $this->content .= $this->doc->section($sectName, $preContent . $content, 0, 1); }
/** * extends writing of language files for xll * * @throws LFException raised if parent method fails or the xll file cant be created * @return boolean always true */ public function writeFile() { // create xll directory try { sgLib::createDir($this->absPath, PATH_site); } catch (Exception $e) { throw new LFException('failure.failure', 0, '(' . $e->getMessage() . ')'); } // write xll file try { parent::writeFile(); } catch (LFException $e) { throw $e; } // set only new values in localconf if something changed $relXLLFile = sgLib::trimPath(PATH_site, $this->absFile); if ($GLOBALS['TYPO3_CONF_VARS']['BE']['XLLfile'][$this->typo3RelFile] == $relXLLFile) { return true; } try { $fileRef = substr($this->typo3RelFile, 0, strrpos($this->typo3RelFile, '.')); $addLine = '$TYPO3_CONF_VARS[\'BE\'][\'XLLfile\'][\'' . $fileRef . '.xml\']'; typo3Lib::writeLocalconf($addLine, $relXLLFile); $GLOBALS['TYPO3_CONF_VARS']['BE']['XLLfile'][$fileRef . '.xml'] = $relXLLFile; // create alternative $addLine = '$TYPO3_CONF_VARS[\'BE\'][\'XLLfile\'][\'' . $fileRef . '.php\']'; typo3Lib::writeLocalconf($addLine, $relXLLFile); $GLOBALS['TYPO3_CONF_VARS']['BE']['XLLfile'][$fileRef . '.php'] = $relXLLFile; } catch (Exception $e) { throw new LFException('failure.failure', 0, '(' . $e->getMessage() . ')'); } return true; }