array('self' => true), 'OnClosePopup' => array('self' => true), 'OnSaveSetting' => array('self' => true), // export/import permissions is checked within events 'OnExportCSV' => Array('self' => true), 'OnGetCSV' => Array('self' => true), 'OnCSVImportBegin' => Array('self' => true), 'OnCSVImportStep' => Array('self' => true), 'OnDropTempTablesByWID' => Array('self' => true), ); $this->permMapping = array_merge($this->permMapping, $permissions); } /** * Checks user permission to execute given $event * * @param kEvent $event * @return bool * @access public */ public function CheckPermission(&$event) { $perm_value = null; $system_events = Array ( 'OnResetModRwCache', 'OnResetSections', 'OnResetConfigsCache', 'OnResetParsedData', 'OnResetMemcache', 'OnDeleteCompiledTemplates', 'OnCompileTemplates', 'OnGenerateTableStructure', 'OnSynchronizeDBRevisions', 'OnDeploy', 'OnRebuildThemes', 'OnCheckPrefixConfig', 'OnMemoryCacheGet', 'OnMemoryCacheSet' ); if (in_array($event->Name, $system_events)) { // events from "Tools -> System Tools" section are controlled via that section "edit" permission $perm_value = /*$this->Application->isDebugMode() ||*/ $this->Application->CheckPermission($event->getSection() . '.edit'); } $tools_events = Array ( 'OnBackup' => 'in-portal:backup.view', 'OnBackupProgress' => 'in-portal:backup.view', 'OnDeleteBackup' => 'in-portal:backup.view', 'OnBackupCancel' => 'in-portal:backup.view', 'OnRestore' => 'in-portal:restore.view', 'OnRestoreProgress' => 'in-portal:restore.view', 'OnRestoreCancel' => 'in-portal:backup.view', 'OnSqlQuery' => 'in-portal:sql_query.view', ); if (array_key_exists($event->Name, $tools_events)) { $perm_value = $this->Application->CheckPermission($tools_events[$event->Name]); } if ($event->Name == 'OnSaveMenuFrameWidth') { $perm_value = $this->Application->isAdminUser; } if (isset($perm_value)) { $perm_helper =& $this->Application->recallObject('PermissionsHelper'); /* @var $perm_helper kPermissionsHelper */ return $perm_helper->finalizePermissionCheck($event, $perm_value); } return parent::CheckPermission($event); } /** * Enter description here... * * @param kEvent $event */ function OnResetModRwCache(&$event) { if ($this->Application->GetVar('ajax') == 'yes') { $event->status = kEvent::erSTOP; } $this->Conn->Query('DELETE FROM ' . TABLE_PREFIX . 'CachedUrls'); $event->SetRedirectParam('action_completed', 1); } /** * Resets tree section cache and refreshes admin section tree * * @param kEvent $event * @return void * @access protected */ protected function OnResetSections(&$event) { if ($this->Application->GetVar('ajax') == 'yes') { $event->status = kEvent::erSTOP; } if ($this->Application->isCachingType(CACHING_TYPE_MEMORY)) { $this->Application->rebuildCache('master:sections_parsed', kCache::REBUILD_LATER, CacheSettings::$sectionsParsedRebuildTime); } else { $this->Application->rebuildDBCache('sections_parsed', kCache::REBUILD_LATER, CacheSettings::$sectionsParsedRebuildTime); } $event->SetRedirectParam('refresh_tree', 1); $event->SetRedirectParam('action_completed', 1); } function OnResetConfigsCache(&$event) { if ($this->Application->GetVar('ajax') == 'yes') { $event->status = kEvent::erSTOP; } if ($this->Application->isCachingType(CACHING_TYPE_MEMORY)) { $this->Application->rebuildCache('master:config_files', kCache::REBUILD_LATER, CacheSettings::$unitCacheRebuildTime); } else { $this->Application->rebuildDBCache('config_files', kCache::REBUILD_LATER, CacheSettings::$unitCacheRebuildTime); } $this->OnResetParsedData($event); $skin_helper =& $this->Application->recallObject('SkinHelper'); /* @var $skin_helper SkinHelper */ $skin_helper->deleteCompiled(); } /** * Resets parsed data from unit configs * * @param kEvent $event */ function OnResetParsedData(&$event) { if ($this->Application->GetVar('ajax') == 'yes') { $event->status = kEvent::erSTOP; } $this->Application->DeleteUnitCache(); if ( $this->Application->GetVar('validate_configs') ) { $event->SetRedirectParam('validate_configs', 1); } $event->SetRedirectParam('action_completed', 1); } /** * Resets memory cache * * @param kEvent $event * @return void * @access protected */ protected function OnResetMemcache(kEvent &$event) { if ($this->Application->GetVar('ajax') == 'yes') { $event->status = kEvent::erSTOP; } $this->Application->resetCache(); $event->SetRedirectParam('action_completed', 1); } function OnCompileTemplates(&$event) { $compiler =& $this->Application->recallObject('NParserCompiler'); /* @var $compiler NParserCompiler */ $compiler->CompileTemplatesStep(); $event->status = kEvent::erSTOP; } /** * Deletes all compiled templates * * @param kEvent $event */ function OnDeleteCompiledTemplates(&$event) { if ( $this->Application->GetVar('ajax') == 'yes' ) { $event->status = kEvent::erSTOP; } $base_path = WRITEABLE . DIRECTORY_SEPARATOR . 'cache'; // delete debugger reports $debugger_reports = glob(RESTRICTED . '/debug_@*@.txt'); if ( $debugger_reports ) { foreach ($debugger_reports as $debugger_report) { unlink($debugger_report); } } $this->_deleteCompiledTemplates($base_path); $event->SetRedirectParam('action_completed', 1); } function _deleteCompiledTemplates($folder, $unlink_folder = false) { $sub_folders = glob($folder . '/*', GLOB_ONLYDIR); if ( is_array($sub_folders) ) { foreach ($sub_folders as $sub_folder) { $this->_deleteCompiledTemplates($sub_folder, true); } } $files = glob($folder . '/*.php'); if ( is_array($files) ) { foreach ($files as $file) { unlink($file); } } if ( $unlink_folder ) { rmdir($folder); } } /** * Generates sturcture for specified table * * @param kEvent $event * @author Alex */ function OnGenerateTableStructure(&$event) { $types_hash = Array( 'string' => 'varchar|text|mediumtext|longtext|date|datetime|time|timestamp|char|year|enum|set', 'int' => 'smallint|mediumint|int|bigint|tinyint', 'float' => 'float|double|decimal', ); $table_name = $this->Application->GetVar('table_name'); if (!$table_name) { echo 'error: no table name specified'; return ; } if (TABLE_PREFIX && !preg_match('/^'.preg_quote(TABLE_PREFIX, '/').'(.*)/', $table_name) && (strtolower($table_name) != $table_name)) { // table name without prefix, then add it (don't affect K3 tables named in lowercase) $table_name = TABLE_PREFIX.$table_name; } if (!$this->Conn->TableFound($table_name)) { // table with prefix doesn't exist, assume that just config prefix passed -> resolve table name from it $prefix = preg_replace('/^' . preg_quote(TABLE_PREFIX, '/') . '/', '', $table_name); if ($this->Application->prefixRegistred($prefix)) { // when prefix is found -> use it's table (don't affect K3 tables named in lowecase) $table_name = $this->Application->getUnitOption($prefix, 'TableName'); } } $table_info = $this->Conn->Query('DESCRIBE '.$table_name); // 1. prepare config keys $grids = Array ( 'Default' => Array ( 'Icons' => Array ('default' => 'icon16_item.png'), 'Fields' => Array (), ) ); $grid_fields = Array(); $id_field = ''; $fields = Array(); $float_types = Array ('float', 'double', 'numeric'); foreach ($table_info as $field_info) { if (preg_match('/l[\d]+_.*/', $field_info['Field'])) { // don't put multilingual fields in config continue; } $field_options = Array (); $grid_col_options = Array( 'title' => 'la_col_' . $field_info['Field'], 'filter_block' => 'grid_like_filter', ); // 1. get php field type by mysql field type foreach ($types_hash as $php_type => $db_types) { if (preg_match('/'.$db_types.'/', $field_info['Type'])) { $field_options['type'] = $php_type; break; } } // 2. get field default value $default_value = $field_info['Default']; $not_null = $field_info['Null'] != 'YES'; if (is_numeric($default_value)) { $default_value = preg_match('/[\.,]/', $default_value) ? (float)$default_value : (int)$default_value; } if ( is_null($default_value) && $not_null ) { $default_value = $field_options['type'] == 'string' ? '' : 0; } if ( in_array($php_type, $float_types) ) { // this is float number if (preg_match('/'.$db_types.'\([\d]+,([\d]+)\)/i', $field_info['Type'], $regs)) { // size is described in structure -> add formatter $field_options['formatter'] = 'kFormatter'; $field_options['format'] = '%01.'.$regs[1].'f'; if ($not_null) { // null fields, will most likely have NULL as default value $default_value = 0; } } elseif ($not_null) { // no size information, just convert to float // null fields, will most likely have NULL as default value $default_value = (float)$default_value; } } if (preg_match('/varchar\(([\d]+)\)/i', $field_info['Type'], $regs)) { $field_options['max_len'] = (int)$regs[1]; } if (preg_match('/tinyint\([\d]+\)/i', $field_info['Type'])) { $field_options['formatter'] = 'kOptionsFormatter'; $field_options['options'] = Array (1 => 'la_Yes', 0 => 'la_No'); $field_options['use_phrases'] = 1; $grid_col_options['filter_block'] = 'grid_options_filter'; } if ($not_null) { $field_options['not_null'] = 1; } if ($field_info['Key'] == 'PRI') { $default_value = 0; $id_field = $field_info['Field']; } if ($php_type == 'int' && !$not_null) { // numeric null field if (preg_match('/(On|Date)$/', $field_info['Field']) || $field_info['Field'] == 'Modified') { $field_options['formatter'] = 'kDateFormatter'; $grid_col_options['filter_block'] = 'grid_date_rage_filter'; } } if ($php_type == 'int' && ($not_null || is_numeric($default_value))) { // is integer field AND not null $field_options['default'] = (int)$default_value; } else { $field_options['default'] = $default_value; } $fields[ $field_info['Field'] ] = $field_options; $grids_fields[ $field_info['Field'] ] = $grid_col_options; } $grids['Default']['Fields'] = $grids_fields; $ret = Array ( 'IDField' => $id_field, 'Fields' => $fields, 'Grids' => $grids, ); $decorator = new UnitConfigDecorator(); $ret = $decorator->decorate($ret); $this->Application->InitParser(); ob_start(); echo $this->Application->ParseBlock(Array('name' => 'incs/header', 'body_properties' => 'style="background-color: #E7E7E7; margin: 8px;"')); ?> Close Window

highlightString($ret); ?>

Close Window
Application->ParseBlock(Array('name' => 'incs/footer')); echo ob_get_clean(); $event->status = kEvent::erSTOP; } /** * Refreshes ThemeFiles & Theme tables by actual content on HDD * * @param kEvent $event */ function OnRebuildThemes(&$event) { if ($this->Application->GetVar('ajax') == 'yes') { $event->status = kEvent::erSTOP; } $themes_helper =& $this->Application->recallObject('ThemesHelper'); /* @var $themes_helper kThemesHelper */ $themes_helper->refreshThemes(); $event->SetRedirectParam('action_completed', 1); } function OnSaveColumns(&$event) { $picker_helper =& $this->Application->recallObject('ColumnPickerHelper'); /* @var $picker_helper kColumnPickerHelper */ $picker_helper->SetGridName($this->Application->GetLinkedVar('grid_name')); $picked = trim($this->Application->GetVar('picked_str'), '|'); $hidden = trim($this->Application->GetVar('hidden_str'), '|'); $main_prefix = $this->Application->GetVar('main_prefix'); $picker_helper->SaveColumns($main_prefix, $picked, $hidden); $this->finalizePopup($event); } /** * Saves various admin settings via ajax * * @param kEvent $event */ function OnSaveSetting(&$event) { if ($this->Application->GetVar('ajax') != 'yes') { return ; } $var_name = $this->Application->GetVar('var_name'); $var_value = $this->Application->GetVar('var_value'); $this->Application->StorePersistentVar($var_name, $var_value); $event->status = kEvent::erSTOP; } /** * Just closes popup & deletes last_template & opener_stack if popup, that is closing * * @param kEvent $event */ function OnClosePopup(&$event) { $event->SetRedirectParam('opener', 'u'); } /** * Occurs right after initialization of the kernel, used mainly as hook-to event * * @param kEvent $event */ function OnStartup(&$event) { if ( $this->Application->isAdmin ) { return ; } $base_url = preg_quote($this->Application->BaseURL(), '/'); $referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; if ( $referrer && !preg_match('/^' . $base_url . '/', $referrer) ) { $this->Application->Session->SetCookie('original_referrer', $referrer); $this->Application->SetVar('original_referrer', $referrer); } } /** * Occurs right before echoing the output, in Done method of application, used mainly as hook-to event * * @param kEvent $event */ function OnBeforeShutdown(&$event) { } /** * Is called after tree was build (when not from cache) * * @param kEvent $event */ function OnAfterBuildTree(&$event) { } /** * Called by AJAX to perform CSV export * * @param kEvent $event */ function OnExportCSV(&$event) { $export_helper =& $this->Application->recallObject('CSVHelper'); /* @var $export_helper kCSVHelper */ $prefix_special = $this->Application->GetVar('PrefixSpecial'); if(!$prefix_special) { $prefix_special = $export_helper->ExportData('prefix'); } $prefix_elems = preg_split('/\.|_/', $prefix_special, 2); $perm_sections = $this->Application->getUnitOption($prefix_elems[0], 'PermSection'); if(!$this->Application->CheckPermission($perm_sections['main'].'.view')) { $event->status = kEvent::erPERM_FAIL; return ; } $export_helper->PrefixSpecial = $prefix_special; $export_helper->grid = $this->Application->GetVar('grid'); $export_helper->ExportStep(); $event->status = kEvent::erSTOP; } /** * Returning created by AJAX CSV file * * @param kEvent $event */ function OnGetCSV(&$event) { $export_helper =& $this->Application->recallObject('CSVHelper'); /* @var $export_helper kCSVHelper */ $prefix_special = $export_helper->ExportData('prefix'); $prefix_elems = preg_split('/\.|_/', $prefix_special, 2); $perm_sections = $this->Application->getUnitOption($prefix_elems[0], 'PermSection'); if(!$this->Application->CheckPermission($perm_sections['main'].'.view')) { $event->status = kEvent::erPERM_FAIL; return ; } $export_helper->GetCSV(); } /** * Enter description here... * * @param kEvent $event */ function OnCSVImportBegin(&$event) { $prefix_special = $this->Application->GetVar('PrefixSpecial'); $prefix_elems = preg_split('/\.|_/', $prefix_special, 2); $perm_sections = $this->Application->getUnitOption($prefix_elems[0], 'PermSection'); if(!$this->Application->CheckPermission($perm_sections['main'].'.add') && !$this->Application->CheckPermission($perm_sections['main'].'.edit')) { $event->status = kEvent::erPERM_FAIL; return ; } $object =& $event->getObject( Array('skip_autoload' => true) ); /* @var $object kDBItem */ $items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) ); $field_values = array_shift($items_info); $object->SetFieldsFromHash($field_values); $event->redirect = false; $result = 'required'; if($object->GetDBField('ImportFile')) { $import_helper =& $this->Application->recallObject('CSVHelper'); /* @var $import_helper kCSVHelper */ $import_helper->PrefixSpecial = $this->Application->GetVar('PrefixSpecial'); $import_helper->grid = $this->Application->GetVar('grid'); $result = $import_helper->ImportStart( $object->GetField('ImportFile', 'file_paths') ); if($result === true) { $event->redirect = $this->Application->GetVar('next_template'); $event->SetRedirectParam('PrefixSpecial', $this->Application->GetVar('PrefixSpecial')); $event->SetRedirectParam('grid', $this->Application->GetVar('grid')); } } if($event->redirect === false) { $object->SetError('ImportFile', $result); $event->status = kEvent::erFAIL; } } /** * Enter description here... * * @param kEvent $event */ function OnCSVImportStep(&$event) { $import_helper =& $this->Application->recallObject('CSVHelper'); /* @var $import_helper kCSVHelper */ $prefix_special = $import_helper->ImportData('prefix'); $prefix_elems = preg_split('/\.|_/', $prefix_special, 2); $perm_sections = $this->Application->getUnitOption($prefix_elems[0], 'PermSection'); if ( !$this->Application->CheckPermission($perm_sections['main'] . '.add') && !$this->Application->CheckPermission($perm_sections['main'] . '.edit') ) { $event->status = kEvent::erPERM_FAIL; return; } $import_helper->ImportStep(); $event->status = kEvent::erSTOP; } /** * Shows unit config filename, where requested prefix is defined * * @param kEvent $event */ function OnCheckPrefixConfig(&$event) { $prefix = $this->Application->GetVar('config_prefix'); $config_file = $this->Application->UnitConfigReader->prefixFiles[$prefix]; $this->Application->InitParser(); ob_start(); echo $this->Application->ParseBlock(Array('name' => 'incs/header', 'body_properties' => 'style="background-color: #E7E7E7; margin: 8px;"')); ?> Close Window

Prefix:
Unit Config: highlightString($config_file); ?>

Close Window
Application->ParseBlock(Array('name' => 'incs/footer')); echo ob_get_clean(); $event->status = kEvent::erSTOP; } function OnDropTempTablesByWID(&$event) { $sid = $this->Application->GetSID(); $wid = $this->Application->GetVar('m_wid'); $tables = $this->Conn->GetCol('SHOW TABLES'); $mask_edit_table = '/'.TABLE_PREFIX.'ses_'.$sid.'_'.$wid.'_edit_(.*)$/'; foreach($tables as $table) { if( preg_match($mask_edit_table,$table,$rets) ) { $this->Conn->Query('DROP TABLE IF EXISTS '.$table); } } echo 'OK'; $event->status = kEvent::erSTOP; return ; } /** * Backup all data * * @param kEvent $event */ function OnBackup(&$event) { $backup_helper =& $this->Application->recallObject('BackupHelper'); /* @var $backup_helper BackupHelper */ if ( !$backup_helper->initBackup() ) { $event->status = kEvent::erFAIL; } $event->redirect = 'tools/backup2'; } /** * Perform next backup step * * @param kEvent $event */ function OnBackupProgress(&$event) { $backup_helper =& $this->Application->recallObject('BackupHelper'); /* @var $backup_helper BackupHelper */ $done_percent = $backup_helper->performBackup(); if ( $done_percent == 100 ) { $event->redirect = 'tools/backup3'; return; } $event->status = kEvent::erSTOP; echo $done_percent; } /** * Stops Backup & redirect to Backup template * * @param kEvent $event */ function OnBackupCancel(&$event) { $event->redirect = 'tools/backup1'; } /** * Starts restore process * * @param kEvent $event */ function OnRestore(&$event) { $backup_helper =& $this->Application->recallObject('BackupHelper'); /* @var $backup_helper BackupHelper */ $backup_helper->initRestore(); $event->redirect = 'tools/restore3'; } function OnRestoreProgress(&$event) { $backup_helper =& $this->Application->recallObject('BackupHelper'); /* @var $backup_helper BackupHelper */ $done_percent = $backup_helper->performRestore(); if ( $done_percent == BackupHelper::SQL_ERROR_DURING_RESTORE ) { $event->redirect = 'tools/restore4'; } elseif ( $done_percent == BackupHelper::FAILED_READING_BACKUP_FILE ) { $this->Application->StoreVar('adm.restore_error', 'File read error'); $event->redirect = 'tools/restore4'; } elseif ( $done_percent == 100 ) { $backup_helper->replaceRestoredFiles(); $this->Application->StoreVar('adm.restore_success', 1); $event->redirect = 'tools/restore4'; } else { $event->status = kEvent::erSTOP; echo $done_percent; } } /** * Stops Restore & redirect to Restore template * * @param kEvent $event */ function OnRestoreCancel(&$event) { $event->redirect = 'tools/restore1'; } /** * Deletes one backup file * * @param kEvent $event */ function OnDeleteBackup(&$event) { $backup_helper =& $this->Application->recallObject('BackupHelper'); /* @var $backup_helper BackupHelper */ $backup_helper->delete(); } /** * Starts restore process * * @param kEvent $event */ function OnSqlQuery(&$event) { $sql = $this->Application->GetVar('sql'); if ($sql) { $start = microtime(true); $result = $this->Conn->Query($sql); $this->Application->SetVar('sql_time', round(microtime(true) - $start, 7)); if ($result) { if (is_array($result)) { $this->Application->SetVar('sql_has_rows', 1); $this->Application->SetVar('sql_rows', serialize($result)); } } $check_sql = trim(strtolower($sql)); if ( (substr($check_sql, 0, 6) == 'insert') || (substr($check_sql, 0, 6) == 'update') || (substr($check_sql, 0, 7) == 'replace') || (substr($check_sql, 0, 6) == 'delete') ) { $this->Application->SetVar('sql_has_affected', 1); $this->Application->SetVar('sql_affected', $this->Conn->getAffectedRows()); } } $this->Application->SetVar('query_status', 1); $event->status = kEvent::erFAIL; } /** * Occurs after unit config cache was successfully rebuilt * * @param kEvent $event */ function OnAfterCacheRebuild(&$event) { } /** * Removes "Community -> Groups" section when it is not allowed * * @param kEvent $event * @return void * @access protected */ protected function OnAfterConfigRead(kEvent &$event) { parent::OnAfterConfigRead($event); $section_adjustments = $this->Application->getUnitOption($event->Prefix, 'SectionAdjustments', Array()); if ( !$this->Application->ConfigValue('AdvancedUserManagement') ) { $section_adjustments['in-portal:user_groups'] = 'remove'; } $section_adjustments['in-portal:root'] = Array ( 'label' => $this->Application->ConfigValue('Site_Name') ); $this->Application->setUnitOption($event->Prefix, 'SectionAdjustments', $section_adjustments); } /** * Saves menu (tree) frame width * * @param kEvent $event */ function OnSaveMenuFrameWidth(&$event) { $event->status = kEvent::erSTOP; if (!$this->Application->ConfigValue('ResizableFrames')) { return ; } $this->Application->SetConfigValue('MenuFrameWidth', (int)$this->Application->GetVar('width')); } /** * Retrieves data from memory cache * * @param kEvent $event */ function OnMemoryCacheGet(&$event) { $event->status = kEvent::erSTOP; $ret = Array ('message' => '', 'code' => 0); // 0 - ok, > 0 - error $key = $this->Application->GetVar('key'); if (!$key) { $ret['code'] = 1; $ret['message'] = 'Key name missing'; } else { $value = $this->Application->getCache($key); $ret['value'] =& $value; $ret['size'] = is_string($value) ? kUtil::formatSize( strlen($value) ) : '?'; $ret['type'] = gettype($value); if (kUtil::IsSerialized($value)) { $value = unserialize($value); } if (is_array($value)) { $ret['value'] = print_r($value, true); } if ($ret['value'] === false) { $ret['code'] = 2; $ret['message'] = 'Key "' . $key . '" doesn\'t exist'; } } $json_helper =& $this->Application->recallObject('JSONHelper'); /* @var $json_helper JSONHelper */ echo $json_helper->encode($ret); } /** * Retrieves data from memory cache * * @param kEvent $event */ function OnMemoryCacheSet(&$event) { $event->status = kEvent::erSTOP; $ret = Array ('message' => '', 'code' => 0); // 0 - ok, > 0 - error $key = $this->Application->GetVar('key'); if (!$key) { $ret['code'] = 1; $ret['message'] = 'Key name missing'; } else { $value = $this->Application->GetVar('value'); $res = $this->Application->setCache($key, $value); $ret['result'] = $res ? 'OK' : 'FAILED'; } $json_helper =& $this->Application->recallObject('JSONHelper'); /* @var $json_helper JSONHelper */ echo $json_helper->encode($ret); } /** * Deploy changes * * Usage: "php tools/run_event.php adm:OnDeploy b674006f3edb1d9cd4d838c150b0567d" * * @param kEvent $event */ function OnDeploy(&$event) { if ( isset($GLOBALS['argv']) ) { // command line invocation -> don't perform redirect $event->status = kEvent::erSTOP; } $deployment_helper =& $this->Application->recallObject('DeploymentHelper'); /* @var $deployment_helper DeploymentHelper */ $deployment_helper->deployAll(); $event->SetRedirectParam('action_completed', 1); } /** * Synchronizes database revisions from "project_upgrades.sql" file * * @param kEvent $event */ function OnSynchronizeDBRevisions(&$event) { $deployment_helper =& $this->Application->recallObject('DeploymentHelper'); /* @var $deployment_helper DeploymentHelper */ if ( !$deployment_helper->deployAll(true) ) { $event->status = kEvent::erFAIL; } else { $event->SetRedirectParam('action_completed', 1); } } /** * [AGENT] * 1. Delete all Debug files from system/.restricted folder (format debug_@977827436@.txt) * 2. Run MySQL OPTIMIZE SQL one by one on all In-Portal tables (found by prefix). * * @param kEvent $event * @return void * @access protected */ protected function OnOptimizePerformance(&$event) { $start_time = adodb_mktime(); $sql = 'SELECT SessionKey FROM ' . TABLE_PREFIX . 'UserSession WHERE LastAccessed > ' . $start_time; $active_sessions = array_flip($this->Conn->GetCol($sql)); $files = scandir(RESTRICTED); $file_path = RESTRICTED . '/'; foreach ($files AS $file_name) { if ( !preg_match('#^debug_@([0-9]{9})@.txt$#', $file_name, $matches) ) { // not debug file continue; } $sid = $matches[1]; if ( isset($active_sessions[$sid]) || (filemtime($file_path . $file_name) > $start_time ) ) { // debug file belongs to an active session // debug file is recently created (after sessions snapshot) continue; } unlink($file_path . $file_name); } $system_tables = $this->Conn->GetCol('SHOW TABLES LIKE "' . TABLE_PREFIX . '%"'); foreach ($system_tables AS $table_name) { $this->Conn->Query('OPTIMIZE TABLE ' . $table_name); } } } class UnitConfigDecorator { var $parentPath = Array (); function decorate($var, $level = 0) { $ret = ''; $deep_level = count($this->parentPath); if ($deep_level && ($this->parentPath[0] == 'Fields')) { $expand = $level < 2; } elseif ($deep_level && ($this->parentPath[0] == 'Grids')) { if ($deep_level == 3 && $this->parentPath[2] == 'Icons') { $expand = false; } else { $expand = $level < 4; } } else { $expand = $level == 0; } if (is_array($var)) { $ret .= 'Array ('; $prepend = $expand ? "\n" . str_repeat("\t", $level + 1) : ''; foreach ($var as $key => $value) { array_push($this->parentPath, $key); $ret .= $prepend . (is_string($key) ? "'" . $key . "'" : $key) . ' => ' . $this->decorate($value, $level + 1) . ', '; array_pop($this->parentPath); } $prepend = $expand ? "\n" . str_repeat("\t", $level) : ''; $ret = rtrim($ret, ', ') . $prepend . ')'; } else { if (is_null($var)) { $ret = 'NULL'; } elseif (is_string($var)) { $ret = "'" . $var . "'"; } else { $ret = $var; } } return $ret; } }