public static function generateLoadClass($realClazz, array $addOn, DevHelper_Config_Base $config) { $method = sprintf('load_class_%s', $realClazz); $existingContents = self::_getClassContents($addOn, $config); $existingMethods = DevHelper_Helper_Php::extractMethods($existingContents); if (in_array($method, $existingMethods, true)) { return false; } $ourClazz = sprintf('%s_%s', $config->getClassPrefix(), $realClazz); $methodCode = <<<EOF public static function {$method}(\$class, array &\$extend) { if (\$class === '{$realClazz}') { \$extend[] = '{$ourClazz}'; } } EOF; $contents = DevHelper_Helper_Php::appendMethod($existingContents, $methodCode); if (!self::_write($addOn, $config, $contents)) { return false; } if (!DevHelper_Helper_Xfcp::generateXfcpClass($ourClazz, $realClazz, $config)) { return false; } if (!DevHelper_Helper_Xfcp::generateOurClass($ourClazz, $config)) { return false; } return $method; }
public function actionFileExport() { $addOnId = $this->_input->filterSingle('addon_id', XenForo_Input::STRING); $addOn = $this->_getAddOnOrError($addOnId); $config = $this->_getConfigModel()->loadAddOnConfig($addOn); $exportPath = $config->getExportPath(); if ($exportPath === false) { return $this->responseNoPermission(); } DevHelper_Helper_Phrase::startLookingForPhraseTitles(); DevHelper_Helper_Xfcp::startLookingForXfcpClasses(); echo '<pre>'; DevHelper_Generator_File::fileExport($addOn, $config, $exportPath); /** @var XenForo_Model_Template $templateModel */ $templateModel = $this->getModelFromCache('XenForo_Model_Template'); $templates = $templateModel->getMasterTemplatesInAddOn($addOn['addon_id']); foreach ($templates as $template) { /** @var DevHelper_XenForo_DataWriter_Template $dw */ $dw = XenForo_DataWriter::create('XenForo_DataWriter_Template'); $dw->setExistingData($template, true); if ($dw->DevHelper_saveTemplate()) { echo "Saved template {$template['title']}\n"; } } /** @var XenForo_Model_Phrase $phraseModel */ $phraseModel = $this->getModelFromCache('XenForo_Model_Phrase'); $phrases = $phraseModel->getMasterPhrasesInAddOn($addOnId); DevHelper_Helper_Phrase::finishLookingForPhraseTitles($phrases, $phraseModel); DevHelper_Helper_Xfcp::finishLookingForXfcpClasses($addOn, $config); echo '</pre>'; DevHelper_Generator_Code_XenForoConfig::updateConfig('development.default_addon', $addOn['addon_id']); die('Done'); }
public static function startLookingForXfcpClasses() { self::$_lookingForXfcpClasses = true; self::$_foundXfcpClasses = array(); }
protected static function _fileExport($entry, &$exportPath, &$rootPath, $options) { if (empty($entry)) { return; } $relativePath = trim(str_replace($rootPath, '', $entry), '/'); if (in_array($relativePath, $options['excludes'])) { echo "<span style='color: #ddd'>Excluded {$relativePath}</span>\n"; return; } foreach ($options['excludeRegExs'] as $excludeRegEx) { if (preg_match($excludeRegEx, $relativePath)) { echo "<span style='color: #ddd'>RegExcluded {$relativePath}</span>\n"; return; } } if (is_dir($entry)) { echo "<span style='color: #ddd'>Browsing {$relativePath}</span>\n"; $children = array(); $dh = opendir($entry); while ($child = readdir($dh)) { if (substr($child, 0, 1) === '.') { // ignore . (current directory) // ignore .. (parent directory) // ignore hidden files (dot files/directories) continue; } $children[] = $child; } foreach ($children as $child) { if (!empty($options['force'])) { $options['force'] = false; } // reset `force` option for children self::_fileExport($entry . '/' . $child, $exportPath, $rootPath, $options); } } elseif (is_file($entry)) { $ext = XenForo_Helper_File::getFileExtension($entry); if (!empty($options['force']) || in_array($ext, $options['extensions']) && strpos(basename($entry), '.') !== 0 || in_array(strtolower(basename($entry)), $options['filenames_lowercase'])) { if ($options['addon_id'] == 'devHelper') { $isDevHelper = strpos($entry, 'DevHelper/DevHelper') !== false; } else { $isDevHelper = strpos($entry, 'DevHelper') !== false; } if (!$isDevHelper) { $entryExportPath = $exportPath . '/' . $relativePath; if ($ext === 'php') { DevHelper_Helper_ShippableHelper::checkForUpdate($entry); } $contents = self::fileGetContents($entry); if (!empty($contents)) { if ($ext === 'php') { DevHelper_Helper_Phrase::parsePhpForPhraseTracking($relativePath, $contents); DevHelper_Helper_Xfcp::parsePhpForXfcpClass($relativePath, $contents); } $result = self::writeFile($entryExportPath, $contents, false, false); if ($result === true) { echo "Exporting {$relativePath} OK\n"; } elseif ($result === 'skip') { echo "<span style='color: #ddd'>Exporting {$relativePath} SKIPPED</span>\n"; } } } } } }