0) { // Try to register the extension //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName().":ext_update=".$ext_update.",taskId=".$task.""); $test = registerExtension($ext_update, $task, getExtensionDryRun(), false); // Reset extension name setCurrentExtensionName($ext_name); //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()); print getCurrentExtensionName().':
'.print_r($test);
					} // END - if
				} elseif ($ext_ver != getCurrentExtensionVersion()) {
					// Ok, update this extension now
					//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName().",ext_update=".$ext_update.",ext_ver=".$ext_ver."/".getCurrentExtensionVersion()."");
					$GLOBALS['ext_backup'][$ext_update][$ext_ver] = getCurrentExtensionName();
					updateExtension($ext_update, $ext_ver, getExtensionDryRun());
					setCurrentExtensionName($GLOBALS['ext_backup'][$ext_update][$ext_ver]);
					unset($GLOBALS['ext_backup'][$ext_update][$ext_ver]);
					//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()."");

					// All okay!
					$test = true;
				} else {
					// Nothing to register / update before...
					$test = true;
				}
			} else {
				// Required file for update does not exists!
				$test = true;
				// But this is fine for the first time...
			}

			// Restore the current extension name
			setCurrentExtensionName($ext_name);
		} // END - for

		// Is there no update?
		if (countExtensionUpdateDependencies(getCurrentExtensionName()) == '0') {
			// Then test is passed!
			$test = true;
		} // END - if

		// Switch back to register mode
		setExtensionMode('register');

		// Remains true if extension registration reports no failures
		//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()); print getCurrentExtensionName().':
'.print_r($test, true).'
'; $test = (($test === true) && (getExtensionReportsFailure() === false)); //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()); print getCurrentExtensionName().':
'.print_r($test, true).'
'; // Does everthing before wents ok? if ($test === true) { // "Dry-run-mode" activated? if ((getExtensionDryRun() === false) && (!isExtensionOnRemovalList())) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "ext_name=".getCurrentExtensionName()); // Init SQLs and transfer ext->generic initSqls(); setSqlsArray(getExtensionSqls()); // Run installation pre-installation filters runFilterChain('pre_extension_installed', array('dry_run' => getExtensionDryRun())); // Register extension //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "insert=".getCurrentExtensionName().'/'.getCurrentExtensionVersion()." - INSERT!"); if (isExtensionInstalledAndNewer('sql_patches', '0.0.6')) { // New way, with CSS SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_extensions` (`ext_name`, `ext_active`, `ext_version`,`ext_has_css`) VALUES ('%s','%s','%s','%s')", array(getCurrentExtensionName(), getExtensionAlwaysActive(), getCurrentExtensionVersion(), getExtensionHasCss()), __FUNCTION__, __LINE__); } else { // Old way, no CSS SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_extensions` (`ext_name`, `ext_active`, `ext_version`) VALUES ('%s','%s','%s')", array(getCurrentExtensionName(), getExtensionAlwaysActive(), getCurrentExtensionVersion()), __FUNCTION__, __LINE__); } // Remove cache file(s) if extension is active runFilterChain('post_extension_installed', array( 'pool' => 'extension', 'ext_name' => getCurrentExtensionName(), 'task_id' => $task_id )); // Remove all SQL commands unsetSqls(); // Mark it as installed $GLOBALS['ext_is_installed'][getCurrentExtensionName()] = true; // In normal mode return a true on success $ret = true; } elseif (getExtensionDryRun() === true) { // In "dry-run" mode return array with all SQL commands $ret = getExtensionSqls(); // Remove all SQL commands unsetSqls(); } else { // Extension has been removed for updates, so all is fine! $ret = true; } } else { // No, an error occurs while registering extension :-( //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "".getCurrentExtensionName()); $ret = false; } } elseif (($task_id > 0) && (getCurrentExtensionName() != '')) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName().""); // Remove task from system when id and extension's name is valid SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_task_system` WHERE `id`=%s AND `status`='NEW' LIMIT 1", array(bigintval($task_id)), __FUNCTION__, __LINE__); } // Is this the sql_patches? //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ':'.getCurrentExtensionName()."/".getExtensionMode().""); if ((getCurrentExtensionName() == 'sql_patches') && ((getExtensionMode() == 'register') || (getExtensionMode() == 'remove')) && (!getExtensionDryRun()) && ($test)) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": LOAD!"); if ($logout === true) { // Then redirect to logout redirectToUrl('modules.php?module=admin&logout=1&' . getExtensionMode() . '=sql_patches'); } else { // Add temporary filter registerFilter('shutdown', 'REDIRECT_TO_LOGOUT_SQL_PATCHES', true, true); $GLOBALS['ext_load_mode'] = getExtensionMode(); } } // END - if // Return status code //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()." - LEFT!"); //* DEBUG: */ print getCurrentExtensionName().':
'.print_r($ret, true).'
'; return $ret; } // Run SQL queries for given extension id // @TODO Change from ext_id to ext_name (not just even the variable! ;-) ) function doExtensionSqls ($ext_id, $load_mode) { // This shall never do a non-admin user! if (!isAdmin()) return false; // Get extension's name $ext_name = getExtensionName($ext_id); // Set current SQL name setCurrentExtensionName($ext_name); // Init EXT_UPDATE_DEPENDS initExtensionUpdateDependencies(); // Init array initExtensionSqls(); // By default no SQL has been executed $sqlRan = false; // Load extension in detected mode //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ":ext_name[{$ext_id}]=".getCurrentExtensionName().""); loadExtension(getCurrentExtensionName(), $load_mode, '', false); // Init these SQLs initSqls(); setSqlsArray(getExtensionSqls()); //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ":SQLs::count=".countSqls().""); if (isSqlsValid()) { // Run SQL commands... runFilterChain('run_sqls'); } // END - if // Run any filters depending on the action here runFilterChain('extension_' . $load_mode); // Remove cache file(s) if extension is active if (((isExtensionActive('cache')) && ((SQL_AFFECTEDROWS() == 1)) || ($sqlRan === true) || ($load_mode == 'activate') || ($load_mode == 'deactivate'))) { // Run filters runFilterChain('post_extension_run_sql', getCurrentExtensionName()); } // END - if // Is this the sql_patches? //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": id=".$ext_id.",currName=".getCurrentExtensionName().",loadMode=".$load_mode); if ((getCurrentExtensionName() == 'sql_patches') && (($load_mode == 'register') || ($load_mode == 'remove'))) { // Then redirect to logout //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": LOAD!"); redirectToUrl('modules.php?module=admin&logout=1&' . $load_mode . '=sql_patches'); } // END - if } // Check wether the given extension is installed function isExtensionInstalled ($ext_name) { // We don't like empty extension names here if (empty($ext_name)) { // Please fix them all debug_report_bug(__FUNCTION__.': ext_name is empty.'); } // END - if // By default non is installed $isInstalled = false; // Check if there is a cache entry if (isset($GLOBALS['ext_is_installed'][$ext_name])) { // Use cache built from below queries $isInstalled = $GLOBALS['ext_is_installed'][$ext_name]; } elseif (isset($GLOBALS['cache_array']['extension']['ext_id'][$ext_name])) { // Found! $isInstalled = true; // Count cache hits incrementStatsEntry('cache_hits'); } elseif ((isInstallationPhase())) { // Extensions are all inactive/not installed during installation } else { // Look in database $ext_id = getExtensionId($ext_name); // Do we have a record? $isInstalled = ($ext_id > 0); // Is it installed, then cache the entry if ($isInstalled === true) { // Dummy call (get is okay here) getExtensionId($ext_name, true); } // END - if // Remember the status $GLOBALS['ext_is_installed'][$ext_name] = $isInstalled; } // Return status return $isInstalled; } // Check if given extension is active function isExtensionActive ($ext_name) { // Extensions are all inactive during installation if ((isInstallationPhase()) || (empty($ext_name))) return false; // Not active is the default $active = 'N'; // Check cache if (isset($GLOBALS['cache_array']['extension']['ext_active'][$ext_name])) { // Load from cache //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "CACHE! ext_name={$ext_name}"); $active = $GLOBALS['cache_array']['extension']['ext_active'][$ext_name]; // Count cache hits incrementStatsEntry('cache_hits'); } elseif (isset($GLOBALS['ext_loaded'][$ext_name])) { // @TODO Extension is loaded, what next? app_die(__FUNCTION__, __LINE__, "LOADED:$ext_name"); } elseif (($ext_name == 'cache') || (!isExtensionInstalled('cache'))) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "DB! ext_name={$ext_name}"); // Load from database $result = SQL_QUERY_ESC("SELECT `ext_active` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1", array($ext_name), __FUNCTION__, __LINE__); // Entry found? if (SQL_NUMROWS($result) == 1) { // Load entry list($active) = SQL_FETCHROW($result); } // END - if // Free result SQL_FREERESULT($result); // Write cache array //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "ext_name=".$ext_name."[DB]: {$active}"); $GLOBALS['cache_array']['extension']['ext_active'][$ext_name] = $active; } else { // Extension not active! //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "ext_name=".$ext_name.": Not active!"); $GLOBALS['cache_array']['extension']['ext_active'][$ext_name] = 'N'; } // Debug message //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "ext_name={$ext_name},active={$active}"); // Is this extension activated? (For admins we always have active extensions...) return ($active == 'Y'); } // Get version from extensions function getExtensionVersion ($ext_name, $force = false) { // By default no extension is found $ext_ver = 'false'; // Empty extension name should be fixed! if (empty($ext_name)) { // Please report this bug! debug_report_bug(__FUNCTION__ . ': ext_name is empty which is not allowed here.'); } // END - if // Extensions are all inactive during installation if (isInstallationPhase()) return ''; //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": ext_name={$ext_name}"); // Is the cache written? if (isset($GLOBALS['cache_array']['extension']['ext_version'][$ext_name])) { // Load data from cache //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": CACHE!"); $ext_ver = $GLOBALS['cache_array']['extension']['ext_version'][$ext_name]; // Count cache hits incrementStatsEntry('cache_hits'); } elseif ((!isCacheInstanceValid()) || (isset($GLOBALS['cache_array']['extension'])) || (getOutputMode() != 0)) { // Load from database $result = SQL_QUERY_ESC("SELECT `ext_version` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1", array($ext_name), __FUNCTION__, __LINE__); //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": DB - ".SQL_NUMROWS($result).""); // Is the extension there? if (SQL_NUMROWS($result) == 1) { // Load entry list($ext_ver) = SQL_FETCHROW($result); } elseif (isDebugModeEnabled()) { // Not found! logDebugMessage(__FUNCTION__, __LINE__, sprintf(": Cannot find extension %s in database!", $ext_name)); } // Free result SQL_FREERESULT($result); // Set cache $GLOBALS['cache_array']['extension']['ext_version'][$ext_name] = $ext_ver; } // Extension version should not be invalid if (($ext_ver == 'false') && ($force === false)) { // Please report this trouble debug_report_bug(sprintf("Extension %s has empty version!", $ext_name)); } // END - if // Return result //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ": ret={$ext_ver}"); return $ext_ver; } // Updates a given extension with current extension version to latest version function updateExtension ($ext_name, $ext_ver, $dry_run = false) { // Only admins are allowed to update extensions if ((!isAdmin()) || (empty($ext_name))) return false; // Set current SQL name setCurrentExtensionName($ext_name); // Init arrays initExtensionSqls(); initExtensionNotes(); initIncludePool('extension'); // Load extension in test mode loadExtension($ext_name, 'test', $ext_ver, getExtensionDryRun()); // Save version history $history = getExtensionVersionHistory(); // Remove old SQLs array to prevent possible bugs initExtensionSqls(); // Check if version is updated //* DEBUG: */ print getCurrentExtensionName().'/'.$ext_name.':'.getThisExtensionVersion().'/'.$ext_ver.'/'.intval(is_array($history)).'
'; if (((getThisExtensionVersion() != $ext_ver) || (getExtensionDryRun())) && (is_array($history))) { // Search for starting point $start = array_search($ext_ver, $history); // And load SQL queries in order of version history for ($idx = ($start + 1); $idx < count($history); $idx++) { // Set extension version $GLOBALS['update_ver'][getCurrentExtensionName()] = $history[$idx]; // Load again... loadExtension(getCurrentExtensionName(), 'update', $GLOBALS['update_ver'][getCurrentExtensionName()], getExtensionDryRun()); // Get all depencies $depencies = getExtensionUpdateDependencies(); // Nothing to apply? if (count($depencies) > 0) { // Apply all extension depencies foreach ($depencies as $ext_depend) { // Did we already update/register this? if (!isset($GLOBALS['ext_updated'][$ext_depend])) { // Set it as current setCurrentExtensionName($ext_depend); // Mark it as already updated before we update it $GLOBALS['ext_updated'][$ext_depend] = true; // Is the extension there? if (isExtensionInstalled($ext_depend)) { // Update another extension first! $test = updateExtension($ext_depend, getExtensionVersion($ext_depend), getExtensionDryRun()); } else { // Register new extension $test = registerExtension($ext_depend, 0, getExtensionDryRun(), false); } } // END - if } // END - foreach // Set name back setCurrentExtensionName($ext_name); } // END - if // Add notes addExtensionNotes($history[$idx]); } // END - for // In real-mode execute any existing includes if (getExtensionDryRun() === false) { $GLOBALS['ext_inc_pool'][getCurrentExtensionName()] = getIncludePool('extension'); runFilterChain('load_includes', 'extension'); setIncludePool('extension', $GLOBALS['ext_inc_pool'][getCurrentExtensionName()]); unset($GLOBALS['ext_inc_pool'][getCurrentExtensionName()]); } // END - if // Init these SQLs initSqls(); setSqlsArray(getExtensionSqls()); // Run SQLs runFilterChain('run_sqls', array('dry_run' => getExtensionDryRun())); if (getExtensionDryRun() === false) { // Run filters on success extension update runFilterChain('extension_update', getCurrentExtensionName()); } // END - if } // END - if } // Output verbose SQL table for extension function addExtensionVerboseSqlTable ($title = '', $dashed = '', $switch = false, $width = '100%') { // Empty title? if (empty($title)) { // Then fix it to default $title = getMessage('ADMIN_SQLS_EXECUTED_ON_REMOVAL'); } // END - if // Init variables $OUT = ''; // Do we have queries? if ((getExtensionVersion('sql_patches') >= '0.0.7') && (getConfig('verbose_sql') == 'Y')) { // Init switch color $SW = 2; // Get all SQLs foreach (getExtensionSqls() as $sqls) { // New array format is recursive foreach ($sqls as $idx => $sql) { // Trim out spaces $sql = trim($sql); // Output command if set if (!empty($sql)) { // Prepare output for template $content = array( 'sw' => $SW, 'i' => ($idx+1), 'sql' => $sql ); // Load row template $OUT .= loadTemplate('admin_ext_sql_row', true, $content); // Switch color $SW = 3 - $SW; } // END - if } // END - foreach } // END - foreach // Prepare content for template $content = array( 'width' => $width, 'dashed' => $dashed, 'title' => $title, 'rows' => $OUT ); // Load main template $OUT = loadTemplate('admin_ext_sql_table', true, $content); } elseif ((getExtensionVersion('sql_patches') >= '0.0.7') && (getConfig('verbose_sql') == 'Y')) { // No addional SQL commands to run $OUT = loadTemplate('admin_settings_saved', true, getMessage('ADMIN_NO_ADDITIONAL_SQLS')); } // END - if // Return output return $OUT; } // Get extension name from id function getExtensionName ($ext_id) { // Init extension name $ret = ''; // Is cache there? if (isset($GLOBALS['cache_array']['extension']['ext_name'][$ext_id])) { // Load from cache $ret = $GLOBALS['cache_array']['extension']['ext_name'][$ext_id]; // Count cache hits incrementStatsEntry('cache_hits'); } elseif (!isExtensionActive('cache')) { // Load from database $result = SQL_QUERY_ESC("SELECT `ext_name` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `id`=%s LIMIT 1", array(bigintval($ext_id)), __FUNCTION__, __LINE__); // Is the entry there? if (SQL_NUMROWS($result) == 1) { // Get the extension's name from database list($ret) = SQL_FETCHROW($result); } // END - if // Free result SQL_FREERESULT($result); } // Did we find some extension? if (empty($ret)) { // We should fix these all! debug_report_bug(__FUNCTION__ . ': ext_name is empty. ext_id=' . $ext_id); } // END - if // Return the extension name return $ret; } // Get extension id from name function getExtensionId ($ext_name) { // Init id number $ret = '0'; // Do we have cache? if (isset($GLOBALS['cache_array']['extension']['ext_id'][$ext_name])) { // Load from cache $ret = $GLOBALS['cache_array']['extension']['ext_id'][$ext_name]; // Count cache hits incrementStatsEntry('cache_hits'); } else { // Load from database $result = SQL_QUERY_ESC("SELECT `id` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1", array($ext_name), __FUNCTION__, __LINE__); // Is the entry there? if (SQL_NUMROWS($result) == 1) { // Get the extension's id from database list($ret) = SQL_FETCHROW($result); } // END - if // Free result SQL_FREERESULT($result); // Cache it $GLOBALS['cache_array']['extension']['ext_id'][$ext_name] = $ret; } // Return value return $ret; } // Determines wether the given extension name is valid function isExtensionNameValid ($ext_name) { // Do we have cache? if (!isset($GLOBALS['ext_name_valid'][$ext_name])) { // Generate include file name $INC = sprintf("inc/extensions/ext-%s.php", $ext_name); // Is there a file in inc/extensions/ ? $GLOBALS['ext_name_valid'][$ext_name] = isIncludeReadable($INC); } // END - if // Return result return $GLOBALS['ext_name_valid'][$ext_name]; } // Determines wether the given extension id is valid function isExtensionIdValid ($ext_id) { // Default is nothing valid $isValid = false; // Check in cache then in database if (isset($GLOBALS['cache_array']['extension']['ext_name'][$ext_id])) { // Valid! $isValid = true; // Count cache hits incrementStatsEntry('cache_hits'); } else { // Query database $isValid = (countSumTotalData($ext_id, 'extensions', 'id', 'id', true) == 1); } // Return result return $isValid; } // Activate given extension function doActivateExtension ($ext_name) { // Activate the extension SQL_QUERY_ESC("UPDATE `{?_MYSQL_PREFIX?}_extensions` SET `ext_active`='Y' WHERE `ext_name`='%s' LIMIT 1", array($ext_name), __FUNCTION__, __LINE__); // Extension has been activated? if (SQL_AFFECTEDROWS() == 1) { // Then run all queries doExtensionSqls(getExtensionId($ext_name), 'activate'); } // END - if } // Deactivate given extension function doDeactivateExtension($ext_name) { // Activate the extension SQL_QUERY_ESC("UPDATE `{?_MYSQL_PREFIX?}_extensions` SET `ext_active`='N' WHERE `ext_name`='%s' LIMIT 1", array($ext_name), __FUNCTION__, __LINE__); // Extension has been activated? if (SQL_AFFECTEDROWS() == 1) { // Then run all queries doExtensionSqls(getExtensionId($ext_name), 'deactivate'); // Create new task createExtensionDeactivationTask($ext_name); // Notify the admin sendAdminNotification( getMessage('ADMIN_SUBJECT_EXTENSION_DEACTIVATED'), 'admin_ext_deactivated', array('ext_name' => $ext_name) ); } // END - if } // Checks wether the extension is older than given function isExtensionOlder ($ext_name, $ext_ver) { // Get current extension version $currVersion = getExtensionVersion($ext_name); // Remove all dots from both versions $currVersion = str_replace('.', '', $currVersion); $ext_ver = str_replace('.', '', $ext_ver); // Now compare both and return the result return ($currVersion < $ext_ver); } // Creates a new task for updated extension function createExtensionUpdateTask ($adminId, $ext_name, $ext_ver, $notes) { // Create subject line $subject = '[UPDATE-' . $ext_name . '-' . $ext_ver . ':] {--ADMIN_UPDATE_EXT_SUBJ--}'; // Is the extension there? if (isExtensionInstalled($ext_name)) { // Check if task is not there if (determineTaskIdBySubject($subject) == '0') { // Create extension update-task createNewTask($subject, $notes, 'EXTENSION_UPDATE', 0, $adminId); } // END - if } else { // Extension not there! :-( debug_report_bug(sprintf("Extension %s not found but should be updated?", $ext_name)); } } // Creates a new task for newly installed extension function createNewExtensionTask ($adminId, $subject, $ext) { // Not installed and do we have created a task for the admin? if ((determineTaskIdBySubject($subject) == '0') && (!isExtensionInstalled($ext))) { // Set default message if ext-foo is missing $message = sprintf(getMessage('ADMIN_EXT_TEXT_FILE_MISSING'), $ext); // Template file $tpl = sprintf("%stemplates/%s/html/ext/ext_%s.tpl", getConfig('PATH'), getLanguage(), $ext ); // Load text for task if found if (isFileReadable($tpl)) { // Load extension's own text template (HTML!) $message = loadTemplate('ext_' . $ext, true); } else { // Write this in debug.log as well logDebugMessage(__FUNCTION__, __LINE__, $message); } // Task not created so it's a brand-new extension which we need to register and create a task for! createNewTask($subject, $message, 'EXTENSION', 0, $adminId, false); } // END - if } // Creates a task for automatically deactivated (deprecated) extension function createExtensionDeactivationTask ($ext) { // Create subject line $subject = sprintf("[%s:] %s", $ext, getMessage('TASK_SUBJ_EXTENSION_DEACTIVATED')); // Not installed and do we have created a task for the admin? if ((determineTaskIdBySubject($subject) == '0') && (getExtensionVersion($ext) != '')) { // Task not created so add it createNewTask($subject, SQL_ESCAPE(loadTemplate('task_ext_deactivated', true, $ext)), 'EXTENSION_DEACTIVATION'); } // END - if } // Checks if the module has a menu function ifModuleHasMenu ($mod, $forceDb = false) { // All is false by default $ret = false; //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "mod={$mod},cache=".getExtensionVersion('cache')); if (isExtensionInstalledAndNewer('cache', '0.1.2')) { // Cache version is okay, so let's check the cache! if (isset($GLOBALS['cache_array']['modules']['has_menu'][$mod])) { // Check module cache and count hit $ret = ($GLOBALS['cache_array']['modules']['has_menu'][$mod] == 'Y'); incrementStatsEntry('cache_hits'); } elseif (isset($GLOBALS['cache_array']['extension']['ext_menu'][$mod])) { // Check cache and count hit $ret = ($GLOBALS['cache_array']['extension']['ext_menu'][$mod] == 'Y'); incrementStatsEntry('cache_hits'); } elseif ($mod == 'admin') { // Admin module has always a menu! $ret = true; } } elseif ((isExtensionInstalled('sql_patches')) && (getExtensionVersion('sql_patches') >= '0.3.6') && ((!isExtensionActive('cache')) || ($forceDb === true))) { // Check database for entry $result = SQL_QUERY_ESC("SELECT `has_menu` FROM `{?_MYSQL_PREFIX?}_mod_reg` WHERE `module`='%s' LIMIT 1", array($mod), __FUNCTION__, __LINE__); // Entry found? if (SQL_NUMROWS($result) == 1) { // Load "has_menu" column list($has_menu) = SQL_FETCHROW($result); // Fake cache... ;-) $GLOBALS['cache_array']['extension']['ext_menu'][$mod] = $has_menu; // Does it have a menu? $ret = ($has_menu == 'Y'); } // END - if // Free memory SQL_FREERESULT($result); } elseif (!isExtensionInstalled('sql_patches')) { // No sql_patches installed, so maybe in admin area or no admin registered? $ret = (((isAdmin()) || (!isAdminRegistered())) && ($mod == 'admin')); // Then there is a menu! } // Return status //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName().intval($ret)); return $ret; } // Determines the task id for given extension function determineExtensionTaskId ($ext_name) { // Default is not found $task_id = '0'; // Search for extension task's id $result = SQL_QUERY_ESC("SELECT `id` FROM `{?_MYSQL_PREFIX?}_task_system` WHERE `task_type`='EXTENSION' AND `subject`='[%s:]' LIMIT 1", array($ext_name), __FUNCTION__, __LINE__); // Entry found? if (SQL_NUMROWS($result) == 1) { // Task found so load task's id and register extension... list($task_id) = SQL_FETCHROW($result); } // END - if // Free result SQL_FREERESULT($result); // Return it return $task_id; } // Determines the task id for given subject function determineTaskIdBySubject ($subject) { // Default is not found $task_id = '0'; // Search for task id $result = SQL_QUERY_ESC("SELECT `id` FROM `{?_MYSQL_PREFIX?}_task_system` WHERE `subject` LIKE '%s%%' LIMIT 1", array($subject), __FUNCTION__, __LINE__); // Entry found? if (SQL_NUMROWS($result) == 1) { // Task found so load task's id and register extension... list($task_id) = SQL_FETCHROW($result); } // END - if // Free result SQL_FREERESULT($result); // Return it return $task_id; } // Add updates notes for given version function addExtensionNotes ($ver) { // Init notes/content $out = ''; $content = array(); // Is do we have verbose output enabled? if ((!isExtensionActive('sql_patches')) || (getConfig('verbose_sql') == 'Y')) { // Update notes found? if (getExtensionUpdateNotes($ver) != '') { // Update notes found $content = array( 'ver' => $ver, 'notes' => getExtensionUpdateNotes($ver) ); // Reset them setExtensionUpdateNotes('', $ver); } elseif (($ver == '0.0') || ($ver == '0.0.0')) { // Initial release $content = array( 'ver' => $ver, 'notes' => getMessage('INITIAL_RELEASE') ); } else { // No update notes found! $content = array( 'ver' => $ver, 'notes' => getMessage('NO_UPDATE_NOTES') ); } // Load template $out = loadTemplate('admin_ext_notes', true, $content); } // END - if // Add the notes appendExtensionNotes($out); } // Getter for CSS files array function getExtensionCssFiles () { // By default no additional CSS files are found $cssFiles = array(); // Is the array there? if (isset($GLOBALS['css_files'])) { // Then use it $cssFiles = $GLOBALS['css_files']; } // END - if // Return array return $cssFiles; } // Init CSS files array function initExtensionCssFiles () { // Simply init it $GLOBALS['css_files'] = array(); } // Add new entry function addExtensionCssFile ($file) { // Is the array there? if (!isset($GLOBALS['css_files'])) { // Then auto-init them initExtensionCssFiles(); } // END - if // Add the entry $GLOBALS['css_files'][] = $file; } // Setter for EXT_ALWAYS_ACTIVE flag function setExtensionAlwaysActive ($active) { $GLOBALS['ext_always_active'][getCurrentExtensionName()] = (string) $active; } // Getter for EXT_ALWAYS_ACTIVE flag function getExtensionAlwaysActive () { return $GLOBALS['ext_always_active'][getCurrentExtensionName()]; } // Setter for EXT_VERSION flag function setThisExtensionVersion ($version) { $GLOBALS['ext_version'][getCurrentExtensionName()] = (string) $version; } // Getter for EXT_VERSION flag function getThisExtensionVersion () { return $GLOBALS['ext_version'][getCurrentExtensionName()]; } // Setter for EXT_DEPRECATED flag function setExtensionDeprecated ($deprecated) { $GLOBALS['ext_deprecated'][getCurrentExtensionName()] = (string) $deprecated; } // Getter for EXT_DEPRECATED flag function isExtensionDeprecated () { return ($GLOBALS['ext_deprecated'][getCurrentExtensionName()] == 'Y'); } // Setter for EXT_UPDATE_DEPENDS flag function addExtensionUpdateDependency ($updateDepends) { // Is the update depency empty? (NEED TO BE FIXED!) if (empty($updateDepends)) { // Please report this bug! debug_report_bug('updateDepends is left empty!'); } // END - if // Is it not yet added? if (!in_array($updateDepends, $GLOBALS['ext_running_updates'])) { //* DEBUG */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName().'/'.$updateDepends); // Add it to the list of extension update depencies map $GLOBALS['ext_update_depends'][getCurrentExtensionName()][] = (string) $updateDepends; // Remember it in the list of running updates $GLOBALS['ext_running_updates'][] = $updateDepends; } // END - if } // Checks wether the given extension registration is in progress function isExtensionRegisterRunning ($ext_name) { return ((isset($GLOBALS['ext_register_running'])) && (in_array($ext_name, $GLOBALS['ext_register_running']))); } // Init EXT_UPDATE_DEPENDS flag function initExtensionUpdateDependencies () { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()); // Init update depency map automatically if not found if (!isExtensionUpdateDependenciesInitialized()) { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()." - INIT!"); $GLOBALS['ext_update_depends'][getCurrentExtensionName()] = array(); } // END - if // Init running updates array initExtensionRuningUpdates(); } // Adds an extension as "registration in progress" function addExtensionRunningRegistration ($ext_name) { // Is it running? if (!isExtensionRegisterRunning($ext_name)) { // Then add it! $GLOBALS['ext_register_running'][] = $ext_name; } // END - if } // Checks wether EXT_UPDATE_DEPENDS is initialized function isExtensionUpdateDependenciesInitialized () { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()); return (isset($GLOBALS['ext_update_depends'][getCurrentExtensionName()])); } // Initializes the list of running updates function initExtensionRuningUpdates () { // Auto-init ext_running_updates if (!isset($GLOBALS['ext_running_updates'])) { $GLOBALS['ext_running_updates'] = array(); $GLOBALS['ext_register_running'] = array(); } // END - if } // Getter for EXT_UPDATE_DEPENDS flag function getExtensionUpdateDependencies () { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()); return $GLOBALS['ext_update_depends'][getCurrentExtensionName()]; } // Getter for next iterator depency function getExtensionUpdateDependenciesIterator () { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()); return ($GLOBALS['ext_update_depends'][getCurrentExtensionName()][getExtensionUpdateIterator()]); } // Counter for extension update depencies function countExtensionUpdateDependencies () { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()); return count($GLOBALS['ext_update_depends'][getCurrentExtensionName()]); } // Removes given extension from update denpency list function removeExtensionUpdateDependency ($ext_name) { // Look it up $key = array_search($ext_name, getExtensionUpdateDependencies()); // Is it valid? if ($key !== false) { // Then remove it unset($GLOBALS['ext_update_depends'][getCurrentExtensionName()][$key]); // And sort the array ksort($GLOBALS['ext_update_depends'][getCurrentExtensionName()]); } // END - if } // Init iterator for update depencies function initExtensionUpdateIterator () { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()); $GLOBALS['ext_depend_iterator'][getCurrentExtensionName()] = '0'; } // Getter for depency iterator function getExtensionUpdateIterator () { // Auto-init iterator if (!isset($GLOBALS['ext_depend_iterator'][getCurrentExtensionName()])) initExtensionUpdateIterator(); // Return it //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName().'/'.$GLOBALS['ext_depend_iterator'][getCurrentExtensionName()]); return $GLOBALS['ext_depend_iterator'][getCurrentExtensionName()]; } // Increments the update iterator function incrementExtensionUpdateIterator () { //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName()); $GLOBALS['ext_depend_iterator'][getCurrentExtensionName()]++; } // Setter for EXT_REPORTS_FAILURE flag function setExtensionReportsFailure ($reportsFailure) { $GLOBALS['ext_reports_failure'] = (bool) $reportsFailure; } // Getter for EXT_REPORTS_FAILURE flag function getExtensionReportsFailure () { return $GLOBALS['ext_reports_failure']; } // Setter for EXT_VER_HISTORY flag function setExtensionVersionHistory ($verHistory) { $GLOBALS['ext_ver_history'][getCurrentExtensionName()] = (array) $verHistory; } // Getter for EXT_VER_HISTORY array function getExtensionVersionHistory () { return $GLOBALS['ext_ver_history'][getCurrentExtensionName()]; } // Setter for EXT_UPDATE_NOTES function setExtensionUpdateNotes ($updateNotes, $ver='') { //* DEBUG: */ print __FUNCTION__.':'.getCurrentExtensionName().'/'.getCurrentExtensionVersion().'/'.$ver.'='.$updateNotes.'
'; if (empty($ver)) { $GLOBALS['ext_update_notes'][getCurrentExtensionName()][getCurrentExtensionVersion()] = (string) $updateNotes; } else { $GLOBALS['ext_update_notes'][getCurrentExtensionName()][$ver] = (string) $updateNotes; } } // Getter for EXT_UPDATE_NOTES function getExtensionUpdateNotes ($ver) { return $GLOBALS['ext_update_notes'][getCurrentExtensionName()][$ver]; } // Init extension notice function initExtensionNotes () { $GLOBALS['ext_notes'][getCurrentExtensionName()] = ''; } // Append extension notice function appendExtensionNotes ($notes) { $GLOBALS['ext_notes'][getCurrentExtensionName()] .= (string) trim($notes); } // Getter for extension notes function getExtensionNotes () { return $GLOBALS['ext_notes'][getCurrentExtensionName()]; } // Setter for current extension name function setCurrentExtensionName ($ext_name) { $GLOBALS['curr_ext_name'] = (string) trim($ext_name); } // Getter for current extension name function getCurrentExtensionName () { if (isset($GLOBALS['curr_ext_name'])) { return $GLOBALS['curr_ext_name']; } // END - if // Not set! debug_report_bug(__FUNCTION__.": curr_ext_name not initialized. Please execute initExtensionSqls() before calling this function."); } // Init SQLs array for current extension function initExtensionSqls () { // Auto-init the array now... if (!isset($GLOBALS['ext_sqls'][getCurrentExtensionName()])) { $GLOBALS['ext_sqls'][getCurrentExtensionName()] = array(); } // END - if } // Adds SQLs to the SQLs array but "assigns" it with current extension name function addExtensionSql ($sql) { // Add it $GLOBALS['ext_sqls'][getCurrentExtensionName()][getCurrentExtensionVersion()][] = $sql; } // Getter for SQLs array for current extension function getExtensionSqls () { // Output debug backtrace if not found (SHOULD NOT HAPPEN!) if (!isset($GLOBALS['ext_sqls'][getCurrentExtensionName()])) { // Not found, should not happen debug_report_bug(sprintf("ext_sqls is empty, current extension: %s", getCurrentExtensionName() )); } // END - if // Return the array return $GLOBALS['ext_sqls'][getCurrentExtensionName()]; } // Removes SQLs for current extension function unsetExtensionSqls () { unset($GLOBALS['ext_sqls'][getCurrentExtensionName()]); } // Auto-initializes the removal list function initExtensionRemovalList () { // Is the remove list there? if (!isset($GLOBALS['ext_update_remove'])) { // Then create it $GLOBALS['ext_update_remove'] = array(); } // END - if } // Checks wether the current extension is on the removal list function isExtensionOnRemovalList () { // Init removal list initExtensionRemovalList(); // Is it there? return (in_array(getCurrentExtensionName(), $GLOBALS['ext_update_remove'])); } // Adds the current extension to the removal list function addCurrentExtensionToRemovalList () { // Simply add it $GLOBALS['ext_update_remove'][] = getCurrentExtensionName(); } // Getter for removal list function getExtensionRemovalList () { // Return the removal list return $GLOBALS['ext_update_remove']; } // Redirects if the provided extension is not installed function redirectOnUninstalledExtension ($ext_name) { // So is the extension there? if ((!isExtensionInstalled($ext_name)) || (!isExtensionActive($ext_name))) { // Redirect to index redirectToUrl('modules.php?module=index&code=' . getCode('EXTENSION_PROBLEM') . '&ext=' . $ext_name); } // END - if } // Filter for initialization of all extensions by loading them in 'init' mode function FILTER_INIT_EXTENSIONS () { // Do we have some entries? //* DEBUG */ print __FUNCTION__.': ENTRY!
'; if (isset($GLOBALS['cache_array']['extension']['ext_name'])) { // Load all found extensions if found //* DEBUG */ print __FUNCTION__.': CACHE - START!
'; foreach ($GLOBALS['cache_array']['extension']['ext_name'] as $key => $ext_name) { // Load it //* DEBUG */ print __FUNCTION__.': '.$ext_name.' - START
'; loadExtension($ext_name, 'init'); //* DEBUG */ print __FUNCTION__.': '.$ext_name.' - END
'; } // END - foreach //* DEBUG */ print __FUNCTION__.': CACHE - END!
'; } // END - if //* DEBUG */ print __FUNCTION__.': EXIT!
'; } // Setter for extension mode function setExtensionMode ($ext_mode) { $GLOBALS['ext_mode'] = (string) $ext_mode; } // Getter for extension mode function getExtensionMode () { return $GLOBALS['ext_mode']; } // Setter for dry-run function enableExtensionDryRun ($dry_run = true) { //* DEBUG: */ print __FUNCTION__.': '.getCurrentExtensionName().'='.intval($dry_run).'
'; $GLOBALS['ext_dry_run'] = (bool) $dry_run; } // Getter for dry-run function getExtensionDryRun () { return $GLOBALS['ext_dry_run']; } // Setter for current extension version function setCurrentExtensionVersion ($ext_ver) { if (empty($ext_ver)) { // 0.0 is okay here $GLOBALS['ext_current_version'] = '0.0'; } else { // Add version $GLOBALS['ext_current_version'] = (string) $ext_ver; } } // Getter for current extension version function getCurrentExtensionVersion () { return $GLOBALS['ext_current_version']; } // Remove the extension from global cache array function removeExtensionFromArray () { // "Cache" this name $ext_name = getCurrentExtensionName(); // Now loop through the whole cache foreach ($GLOBALS['cache_array']['extension'] as $cacheName => $cacheArray) { // Is it an element? if (isset($cacheArray[$ext_name])) { // Array element unset($cacheArray[$ext_name]); $GLOBALS['cache_array']['extension'][$cacheName] = $cacheArray; } else { // Maybe in array? $key = array_search($ext_name, $cacheArray); // Is it there? if ($key !== false) { // Found, so remove it unset($cacheArray[$key]); $GLOBALS['cache_array']['extension'][$cacheName] = $cacheArray; } // END - if } } // END - foreach } // "Getter" for 'extension has a CSS file' (with same name, of course) function getExtensionHasCss () { // Default is no CSS $hasCss = 'N'; // Construct FQFN for check $FQFN = sprintf("%stheme/%s/css/%s.css", getConfig('PATH'), getCurrentTheme(), getCurrentExtensionName() ); // Is it there? if (isFileReadable($FQFN)) { // Readable, so it is there... $hasCss = 'Y'; } // END - if // Return it return $hasCss; } // Checks wether the given extension has a language file function ifExtensionHasLanguageFile ($ext_name) { // Default is no language file $hasLanguage = false; // Do we have cache? if (isset($GLOBALS['cache_array']['extension']['ext_lang'][$ext_name])) { // Then use it $hasLanguage = ($GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] == 'Y'); // Count cache hits incrementStatsEntry('cache_hits'); } else { // Not readable is default $readable = 'N'; // Is the language file readable for this extension? if (isLanguageIncludeReadable($ext_name)) { // Readable $readable = 'Y'; } // END - if // Put it in cache $GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] = 'Y'; } // Return result return ($GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] == 'Y'); } // Load an extension's include file function loadExtensionInclude () { // Is it readable? if (!isExtensionIncludeReadable()) { // Not readable debug_report_bug('Extension ' . getCurrentExtensionName() . ' should be loaded, but is not readable.'); } // END - if // Generate INC name $INC = sprintf("inc/extensions/ext-%s.php", getCurrentExtensionName()); // Load it loadInclude($INC); } // Checks wether an extension is readable function isExtensionIncludeReadable ($ext_name = '') { // If empty, use current if (empty($ext_name)) $ext_name = getCurrentExtensionName(); // Array found? if (!isset($GLOBALS['ext_inc_readable'][$ext_name])) { // Generate INC name $INC = sprintf("inc/extensions/ext-%s.php", getCurrentExtensionName()); // Is it readable? $GLOBALS['ext_inc_readable'][$ext_name] = isIncludeReadable($INC); } // END - if // Return result //* DEBUG: */ print __FUNCTION__.': '.$ext_name.'='.intval($GLOBALS['ext_inc_readable'][$ext_name]).'
'; return $GLOBALS['ext_inc_readable'][$ext_name]; } // Checks if an extension's function file is readable function isExtensionFunctionFileReadable ($ext_name) { if (isset($GLOBALS['cache_array']['extension']['ext_func'][$ext_name])) { // Just count cache hits incrementStatsEntry('cache_hits'); } else { // Construct FQFN for functions file $funcsInclude = sprintf("inc/libs/%s_functions.php", $ext_name); // Is this include there? if ((isFileReadable($funcsInclude)) && (!isset($GLOBALS['ext_loaded']['funcs'][$ext_name])) && (getExtensionMode() == 'test')) { // Cache it! $GLOBALS['cache_array']['extension']['ext_func'][$ext_name] = 'Y'; } else { // Cache it! $GLOBALS['cache_array']['extension']['ext_func'][$ext_name] = 'N'; } } // Return result return ($GLOBALS['cache_array']['extension']['ext_func'][$ext_name] == 'Y'); } // Adds an admin menu to the SQL queue of the menu entry is not found function addAdminMenuSql ($action, $what, $title, $descr, $sort) { // Now check if this menu is there if (!isMenuActionValid('admin', $action, $what)) { // Is what null? if (is_null($what)) { // Add main menu $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_admin_menu` (`action`,`what`,`title`,`descr`,`sort`) VALUES('%s',NULL,'%s','%s',%s)", $action, $title, $descr, bigintval($sort) ); } else { // Add sub menu $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_admin_menu` (`action`,`what`,`title`,`descr`,`sort`) VALUES('%s','%s','%s','%s',%s)", $action, $what, $title, $descr, bigintval($sort) ); } // Add it to the queue addExtensionSql($sql); } elseif (isDebugModeEnabled()) { // Double menus should be located and fixed! logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double admin menu action=%s, what=%s detected.", $action, $what)); } } // Adds a guest menu to the SQL queue if the menu entry is not found function addGuestMenuSql ($action, $what, $title, $visible, $locked, $sort) { // Now check if this menu is there if (!isMenuActionValid('guest', $action, $what)) { // Is what null? if (is_null($what)) { // Add main menu $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_guest_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES('%s',NULL,'%s','%s','%s',%s)", $action, $title, $visible, $locked, bigintval($sort) ); } else { // Add sub menu $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_guest_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES('%s','%s','%s','%s','%s',%s)", $action, $what, $title, $visible, $locked, bigintval($sort) ); } // Add it to the queue addExtensionSql($sql); } elseif (isDebugModeEnabled()) { // Double menus should be located and fixed! logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double guest menu action=%s, what=%s detected.", $action, $what)); } } // Adds a member menu to the SQL queue if the menu entry is not found function addMemberMenuSql ($action, $what, $title, $visible, $locked, $sort) { // Now check if this menu is there if (!isMenuActionValid('member', $action, $what)) { // Is what null? if (is_null($what)) { // Add main menu $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_member_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES('%s',NULL,'%s','%s','%s',%s)", $action, $title, $visible, $locked, bigintval($sort) ); } else { // Add sub menu $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_member_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES('%s','%s','%s','%s','%s',%s)", $action, $what, $title, $visible, $locked, bigintval($sort) ); } // Add it to the queue addExtensionSql($sql); } elseif (isDebugModeEnabled()) { // Double menus should be located and fixed! logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double member menu action=%s, what=%s detected.", $action, $what)); } } // Adds a sponsor menu to the SQL queue if the menu entry is not found function addSponsorMenuSql ($action, $what, $title, $active, $sort) { // Now check if this menu is there, if no ext-sponsor is installed all is not yet added if ((!isExtensionInstalled('sponsor')) || (!isMenuActionValid('sponsor', $action, $what))) { // Is what null? if (is_null($what)) { // Add main menu $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_sponsor_menu` (`action`,`what`,`title`,`active`,`sort`) VALUES('%s',NULL,'%s','%s',%s)", $action, $title, $active, bigintval($sort) ); } else { // Add sub menu $sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_sponsor_menu` (`action`,`what`,`title`,`active`,`sort`) VALUES('%s','%s','%s','%s',%s)", $action, $what, $title, $active, bigintval($sort) ); } // Add it to the queue addExtensionSql($sql); } elseif (isDebugModeEnabled()) { // Double menus should be located and fixed! logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double sponsor menu action=%s, what=%s detected.", $action, $what)); } } // Enables/disables productive mode for current extension (used only while // registration). function enableExtensionProductive ($isProductive = true) { $GLOBALS['ext_productive'][getCurrentExtensionName()] = (bool) $isProductive; } // Checks wether the extension is in productive phase. If not set, development // phase (=false) is assumed. function isExtensionProductive () { return ((isset($GLOBALS['ext_productive'][getCurrentExtensionName()])) && ($GLOBALS['ext_productive'][getCurrentExtensionName()] === true)); } // [EOF] ?>