Файл: admin/applications/core/modules_admin/applications/setup.php
Строк: 910
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.3.3
* Application Installation
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $Author: bfarber $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @subpackage Core
* @link http://www.invisionpower.com
* @version $Rev: 10721 $
*/
if ( ! defined( 'IN_ACP' ) )
{
print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded 'admin.php'.";
exit();
}
class admin_core_applications_setup extends ipsCommand
{
/**
* Skin object
*
* @var object Skin templates
*/
protected $html;
/**
* Shortcut for url
*
* @var string URL shortcut
*/
protected $form_code;
/**
* Shortcut for url (javascript)
*
* @var string JS URL shortcut
*/
protected $form_code_js;
/**
* Current app path
*
* @var object
*/
protected $app_full_path;
/**
* Product information
*
* @var array
*/
protected $product_information;
/**
* Main class entry point
*
* @param object ipsRegistry reference
* @return @e void [Outputs to screen]
*/
public function doExecute( ipsRegistry $registry )
{
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'app_install' );
/* Get Template and Language */
$this->html = $this->registry->output->loadTemplate( 'cp_skin_setup' );
$this->lang->loadLanguageFile( array( 'admin_setup', 'admin_system', 'admin_tools', 'admin_templates' ), 'core' );
/* URL Bits */
$this->form_code = $this->html->form_code = 'module=applications&section=setup';
$this->form_code_js = $this->html->form_code_js = 'module=applications§ion=setup';
/* Get the setup class */
require( IPS_ROOT_PATH . "setup/sources/base/setup.php" );/*noLibHook*/
/* Set the path */
$this->app_full_path = IPSLib::getAppDir( $this->request['app_directory'] ) . '/';
/* Set up product info from XML file */
$this->product_information = IPSSetUp::fetchXmlAppInformation( $this->request['app_directory'], $this->settings['gb_char_set'] );
if( ! $this->app_full_path OR ! $this->product_information['title'] )
{
$this->registry->output->global_message = $this->lang->words['error__cannot_init'];
$this->registry->output->silentRedirectWithMessage( $this->settings['base_url'] );
return;
}
/* Sequence of Events:
# SQL
# App Module
# Check for more modules
# Templates
# Languages
# Tasks
# Settings
# Template Cache
# Caches / Done
*/
switch( $this->request['do'] )
{
default:
case 'start':
$this->start();
break;
case 'sql':
$this->sqlBasics();
break;
case 'sql_steps':
$this->sqlSteps();
break;
case 'next_check':
$this->nextCheck();
break;
case 'templates':
$this->templates();
break;
case 'languages':
$this->languages();
break;
case 'tasks':
$this->tasks();
break;
case 'bbcode':
$this->bbcode();
break;
case 'help':
$this->help();
break;
case 'settings':
$this->settings();
break;
case 'hooks':
$this->hooks();
break;
case 'tplcache':
$this->recacheTemplates();
break;
case 'finish':
$this->finish();
break;
}
$this->registry->getClass('output')->html_main .= $this->registry->getClass('output')->global_template->global_frame_wrapper();
$this->registry->getClass('output')->sendOutput();
}
/**
* Rebuild PHP Templates Cache
*
* @return @e void
*/
public function recacheTemplates()
{
/* Flag skins for recache */
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinFunctions.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinCaching.php' );/*noLibHook*/
$skinCaching = new skinCaching( $this->registry );
/* Flag all for recache */
$skinCaching->flagSetForRecache();
$data = $this->getVars();
$this->showRedirectScreen( $data['app_directory'], array( $this->lang->words['install_skins_flag_recache'] ), '', $this->getNextURL( 'finish', $data ) );
}
/**
* Finalizes installation and rebuilds caches
*
* @return @e void
*/
public function finish()
{
/* INIT */
$vars = $this->getVars();
$output = array();
$errors = array();
/* Init Data */
$data = IPSSetUp::fetchXmlAppInformation( $vars['app_directory'], $this->settings['gb_char_set'] );
$_numbers = IPSSetUp::fetchAppVersionNumbers( $vars['app_directory'] );
/* Grab Data */
$data['app_directory'] = $vars['app_directory'];
$data['current_version'] = ( $_numbers['current'][0] ) ? $_numbers['current'][0] : $this->lang->words['cur_version_none'];
$data['latest_version'] = $_numbers['latest'][1];
$data['next_version'] = $_numbers['next'][0];
/* Rebuild applications and modules cache */
$this->cache->rebuildCache( 'app_cache', 'global' );
$this->cache->rebuildCache( 'module_cache', 'global' );
$this->cache->rebuildCache( 'app_menu_cache', 'global' );
$this->cache->rebuildCache( 'group_cache', 'global' );
$this->cache->rebuildCache( 'notifications', 'global' );
$this->cache->rebuildCache( 'report_plugins', 'global' );
/* Rebuild application specific caches */
$_file = $this->app_full_path . 'extensions/coreVariables.php';
if( is_file( $_file ) )
{
$CACHE = array();
require( $_file );/*noLibHook*/
if( is_array( $CACHE ) AND count( $CACHE ) )
{
foreach( $CACHE as $key => $cdata )
{
$this->cache->rebuildCache( $key, $vars['app_directory'] );
}
}
}
/* Rebuild GLOBAL CACHES! */
try
{
IPSLib::cacheGlobalCaches();
}
catch( Exception $e )
{
// Show an error?
}
/* Rebuild FURLs */
if( is_file( $this->app_full_path . 'extensions/furlTemplates.php' ) )
{
try
{
IPSLib::cacheFurlTemplates();
}
catch( Exception $e )
{
// Show an error?
}
}
/* Show completed screen... */
$this->registry->output->html .= $this->html->setup_completed_screen( $data, $vars['type'] );
}
/**
* Next Check
*
* @return @e void
*/
public function nextCheck()
{
/* INIT */
$vars = $this->getVars();
$output = array();
$errors = array();
/* Init Data */
$data = IPSSetUp::fetchXmlAppInformation( $vars['app_directory'], $this->settings['gb_char_set'] );
$_numbers = IPSSetUp::fetchAppVersionNumbers( $vars['app_directory'] );
$modules = IPSSetUp::fetchXmlAppModules( $vars['app_directory'], $this->settings['gb_char_set'] );
/* Grab Data */
$data['app_directory'] = $vars['app_directory'];
$data['current_version'] = ( $_numbers['current'][0] ) ? $_numbers['current'][0] : $this->lang->words['cur_version_none'];
$data['latest_version'] = $_numbers['latest'][1];
$data['next_version'] = $_numbers['next'][0];
/* Update the app DB */
if( $vars['type'] == 'install' )
{
/* Get current max position */
$pos = $this->DB->buildAndFetch( array( 'select' => 'MAX(app_position) as pos', 'from' => 'core_applications' ) );
$new_pos = intval( $pos['pos'] ) + 1;
/* Insert details into the DB */
$this->DB->insert( 'core_applications', array( 'app_title' => $this->product_information['name'],
'app_public_title' => $this->product_information['public_name'],
'app_author' => $this->product_information['author'],
'app_description' => $this->product_information['description'],
'app_hide_tab' => intval($this->product_information['hide_tab']),
'app_version' => $_numbers['latest'][1],
'app_long_version' => $_numbers['latest'][0],
'app_directory' => $vars['app_directory'],
'app_location' => $vars['app_location'],
'app_added' => time(),
'app_position' => $new_pos,
'app_protected' => 0,
'app_enabled' => $this->product_information['disabledatinstall'] ? 0 : 1,
'app_website' => trim($this->product_information['website']),
'app_update_check' => trim($this->product_information['update_check']),
'app_global_caches' => trim($this->product_information['global_caches']),
)
);
$this->DB->insert( 'upgrade_history', array(
'upgrade_version_id' => $_numbers['latest'][0],
'upgrade_version_human' => $_numbers['latest'][1],
'upgrade_date' => time(),
'upgrade_notes' => '',
'upgrade_mid' => $this->memberData['member_id'],
'upgrade_app' => $vars['app_directory'],
) );
/* Insert the modules */
foreach( $modules as $key => $module )
{
$this->DB->insert( 'core_sys_module', $module );
}
}
else
{
$this->DB->update( 'core_applications', array( 'app_title' => $this->product_information['name'],
'app_public_title' => $this->product_information['public_name'],
'app_author' => $this->product_information['author'],
'app_description' => $this->product_information['description'],
'app_hide_tab' => intval($this->product_information['hide_tab']),
'app_version' => $_numbers['current'][1],
'app_long_version' => $_numbers['current'][0],
'app_website' => trim($this->product_information['website']),
'app_update_check' => trim($this->product_information['update_check']),
'app_global_caches' => trim($this->product_information['global_caches']),
), "app_directory='" . $vars['app_directory'] . "'" );
/* Update the modules */
foreach( $modules as $key => $module )
{
$this->DB->update( 'core_sys_module', $module, "sys_module_application='{$module['sys_module_application']}' AND sys_module_key='{$module['sys_module_key']}'" );
}
}
/* Finish? */
if( $vars['type'] == 'install' OR $vars['version'] == $_numbers['latest'][0] )
{
/* Go back and start over with the new version */
$output[] = $this->lang->words['redir__nomore_modules'];
$this->showRedirectScreen( $vars['app_directory'], $output, $errors, $this->getNextURL( 'templates', $vars ) );
}
else
{
/* Go back and start over with the new version */
$output[] = sprintf( $this->lang->words['redir__upgraded_to'], $_numbers['current'][1] );
/* Work out the next step */
$vars['version'] = $_numbers['next'][0];
$this->showRedirectScreen( $vars['app_directory'], $output, $errors, $this->getNextURL( 'sql', $vars ) );
}
}
/**
* Import Hooks
*
* @return @e void
*/
public function hooks()
{
/* INIT */
$vars = $this->getVars();
$output = array();
$errors = array();
$knownSettings = array();
$this->registry->class_localization->loadLanguageFile( array( 'admin_tools' ) );
if( is_file( $this->app_full_path . 'xml/hooks.xml' ) )
{
/* Get the hooks class */
$classToLoad = IPSLib::loadActionOverloader( IPS_ROOT_PATH . 'applications/core/modules_admin/applications/hooks.php', 'admin_core_applications_hooks' );
$hooks = new $classToLoad();
$hooks->makeRegistryShortcuts( $this->registry );
$return = $hooks->installAppHooks( $vars['app_directory'] );
$this->cache->rebuildCache( 'hooks', 'global' );
$output[] = sprintf( $this->lang->words['redir__hooks'], $return['inserted'], $return['updated'] );
}
else
{
$this->registry->output->global_message = $this->lang->words['hooks_nofile'];
$output[] = $this->registry->output->global_message;
}
/* Clear main messaage */
$this->registry->output->global_message = '';
/* Show redirect... */
$this->showRedirectScreen( $vars['app_directory'], $output, $errors, $this->getNextURL( 'tplcache', $vars ) );
}
/**
* Import Settings
*
* @return @e void
*/
public function settings()
{
/* INIT */
$vars = $this->getVars();
$output = array();
$errors = array();
$knownSettings = array();
$this->registry->class_localization->loadLanguageFile( array( 'admin_tools' ), 'core' );
if( is_file( $this->app_full_path . 'xml/' . $vars['app_directory'] . '_settings.xml' ) )
{
/* Get the settings class */
$classToLoad = IPSLib::loadActionOverloader( IPS_ROOT_PATH . 'applications/core/modules_admin/settings/settings.php', 'admin_core_settings_settings' );
$settings = new $classToLoad();
$settings->makeRegistryShortcuts( $this->registry );
$this->request['app_dir'] = $vars['app_directory'];
//-----------------------------------------
// Known settings
//-----------------------------------------
if ( substr( $this->settings['_original_base_url'], -1 ) == '/' )
{
IPSSetUp::setSavedData('install_url', substr( $this->settings['_original_base_url'], 0, -1 ) );
}
if ( substr( $this->settings['base_dir'], -1 ) == '/' )
{
IPSSetUp::setSavedData('install_dir', substr( $this->settings['base_dir'], 0, -1 ) );
}
/* Fetch known settings */
if ( is_file( IPSLib::getAppDir( $vars['app_directory'] ) . '/setup/versions/install/knownSettings.php' ) )
{
require( IPSLib::getAppDir( $vars['app_directory'] ) . '/setup/versions/install/knownSettings.php' );/*noLibHook*/
}
$settings->importAllSettings( 1, 1, $knownSettings );
$settings->settingsRebuildCache();
}
else
{
$this->registry->output->global_message = $this->lang->words['settings_nofile'];
}
$output[] = $this->registry->output->global_message;
/* Clear main messaage */
$this->registry->output->global_message = '';
/* Show redirect... */
$this->showRedirectScreen( $vars['app_directory'], $output, $errors, $this->getNextURL( 'hooks', $vars ) );
}
/**
* Import tasks
*
* @return @e void
*/
public function tasks()
{
/* INIT */
$vars = $this->getVars();
$output = array();
$errors = array();
if( is_file( $this->app_full_path . 'xml/' . $vars['app_directory'] . '_tasks.xml' ) )
{
/* Get the language class */
$classToLoad = IPSLib::loadActionOverloader( IPS_ROOT_PATH . 'applications/core/modules_admin/system/taskmanager.php', 'admin_core_system_taskmanager' );
$task_obj = new $classToLoad();
$task_obj->makeRegistryShortcuts( $this->registry );
$task_obj->tasksImportFromXML( $this->app_full_path . 'xml/' . $vars['app_directory'] . '_tasks.xml', true );
}
$output[] = $this->registry->output->global_message ? $this->registry->output->global_message : $this->lang->words['no_tasks_for_import'];
/* Clear main msg */
$this->registry->output->global_message = '';
/* Show redirect... */
$this->showRedirectScreen( $vars['app_directory'], $output, $errors, $this->getNextURL( 'bbcode', $vars ) );
}
/**
* Import bbcode
*
* @return @e void
*/
public function bbcode()
{
/* INIT */
$vars = $this->getVars();
$output = array();
$errors = array();
if( is_file( $this->app_full_path . 'xml/' . $vars['app_directory'] . '_bbcode.xml' ) )
{
/* Get the language class */
$classToLoad = IPSLib::loadActionOverloader( IPS_ROOT_PATH . 'applications/core/modules_admin/posts/bbcode.php', 'admin_core_posts_bbcode' );
$bbcode = new $classToLoad();
$bbcode->makeRegistryShortcuts( $this->registry );
$bbcode->bbcodeImportDo( file_get_contents( $this->app_full_path . 'xml/' . $vars['app_directory'] . '_bbcode.xml' ) );
$output[] = $this->lang->words['bbcode_and_media'];
}
if( is_file( $this->app_full_path . 'xml/' . $vars['app_directory'] . '_mediatag.xml' ) )
{
/* Get the language class */
$classToLoad = IPSLib::loadActionOverloader( IPS_ROOT_PATH . 'applications/core/modules_admin/posts/media.php', 'admin_core_posts_media' );
$bbcode = new $classToLoad();
$bbcode->makeRegistryShortcuts( $this->registry );
$bbcode->doMediaImport( file_get_contents( $this->app_full_path . 'xml/' . $vars['app_directory'] . '_mediatag.xml' ) );
if( !count($output) )
{
$output[] = $this->lang->words['bbcode_and_media'];
}
}
if( !count($output) )
{
$output[] = $this->lang->words['no_bbcode_media'];
}
/* Show redirect... */
$this->showRedirectScreen( $vars['app_directory'], $output, $errors, $this->getNextURL( 'help', $vars ) );
}
/**
* Import help
*
* @return @e void
*/
public function help()
{
/* INIT */
$vars = $this->getVars();
$output = array();
$errors = array();
if( is_file( $this->app_full_path . 'xml/' . $vars['app_directory'] . '_help.xml' ) )
{
$classToLoad = IPSLib::loadActionOverloader( IPS_ROOT_PATH . 'applications/core/modules_admin/tools/help.php', 'admin_core_tools_help' );
$help = new $classToLoad();
$help->makeRegistryShortcuts( $this->registry );
$done = $help->helpFilesXMLImport_app( $vars['app_directory'] );
$output[] = sprintf( $this->lang->words['imported_x_help'], ($done['added'] + $done['updated']) );
}
else
{
$output[] = $this->lang->words['imported_no_help'];
}
/* Show redirect... */
$this->showRedirectScreen( $vars['app_directory'], $output, $errors, $this->getNextURL( 'settings', $vars ) );
}
/**
* Language Import
*
* @return @e void
*/
public function languages()
{
/* INIT */
$vars = $this->getVars();
$output = array();
$errors = array();
/* Load the language file */
$this->registry->class_localization->loadLanguageFile( array( 'admin_system' ) );
/* Get the language stuff */
$classToLoad = IPSLib::loadActionOverloader( IPS_ROOT_PATH . 'applications/core/modules_admin/languages/manage_languages.php', 'admin_core_languages_manage_languages' );
$lang = new $classToLoad();
$lang->makeRegistryShortcuts( $this->registry );
/* Loop through the xml directory and look for lang packs */
$_PATH = $this->app_full_path . '/xml/';
try
{
foreach( new DirectoryIterator( $_PATH ) as $f )
{
if( preg_match( "#(.+?)_language_pack.xml#", $f->getFileName() ) )
{
$this->request['file_location'] = $_PATH . $f->getFileName();
$lang->imprtFromXML( true, true, true, $vars['app_directory'], false, 1 );
}
}
} catch ( Exception $e ) {}
$output[] = $this->registry->output->global_message ? $this->registry->output->global_message : $this->lang->words['redir__nolanguages'];
/* Clear main msg */
$this->registry->output->global_message = '';
/* Show redirect... */
$this->showRedirectScreen( $vars['app_directory'], $output, $errors, $this->getNextURL( 'tasks', $vars ) );
}
/**
* Install templates
*
* @return @e void
*/
public function templates()
{
/* INIT */
$vars = $this->getVars();
$output = array();
$errors = array();
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinFunctions.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinCaching.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinImportExport.php' );/*noLibHook*/
$skinFunctions = new skinImportExport( $this->registry );
$skinCaching = new skinCaching( $this->registry );
/* Grab skin data */
$this->DB->build( array( 'select' => '*',
'from' => 'skin_collections' ) );
$this->DB->execute();
while( $row = $this->DB->fetch() )
{
/* Bit of jiggery pokery... */
if ( $row['set_key'] == 'default' )
{
$row['set_key'] = 'root';
$row['set_id'] = 0;
}
$skinSets[ $row['set_key'] ] = $row;
}
foreach( $skinSets as $skinKey => $skinData )
{
/* Skin files first */
if( is_file( $this->app_full_path . 'xml/' . $vars['app_directory'] . '_' . $skinKey . '_templates.xml' ) )
{
$return = $skinFunctions->importTemplateAppXML( $vars['app_directory'], $skinKey, $skinData['set_id'], TRUE );
$output[] = sprintf( $this->lang->words['redir__templates'], $return['insertCount'], $return['updateCount'], $skinData['set_name'] );
}
/* Then CSS files */
if ( is_file( $this->app_full_path . 'xml/' . $vars['app_directory'] . '_' . $skinKey . '_css.xml' ) )
{
//-----------------------------------------
// Install
//-----------------------------------------
$return = $skinFunctions->importCSSAppXML( $vars['app_directory'], $skinKey, $skinData['set_id'] );
$output[] = sprintf( $this->lang->words['redir__cssfiles'], $return['insertCount'], $return['updateCount'], $skinData['set_name'] );
}
/* And we can support replacements for good measure */
if ( is_file( $this->app_full_path . 'xml/' . $vars['app_directory'] . '_replacements.xml' ) )
{
//-----------------------------------------
// Install
//-----------------------------------------
$return = $skinFunctions->importReplacementsXMLArchive( file_get_contents( $this->app_full_path . 'xml/' . $vars['app_directory'] . '_replacements.xml' ), $skinKey );
$output[] = $this->lang->words['redir__replacements'];
}
}
/* Recache */
//$skinCaching->rebuildPHPTemplates( 0 );
//$skinCaching->rebuildCSS( 0 );
//$skinCaching->rebuildReplacementsCache( 0 );
/* No templates? Give some sort of feedback */
if ( !count( $output ) )
{
$output[] = $this->lang->words['redir__no_templates'];
}
/* Show redirect... */
$this->showRedirectScreen( $vars['app_directory'], $output, $errors, $this->getNextURL( 'languages', $vars ) );
}
/**
* Runs any additional sql files
*
* @return @e void
*/
public function sqlSteps()
{
/* INIT */
$vars = $this->getVars();
$output = array();
$errors = array();
$id = intval( $this->request['id'] );
$id = ( $id < 1 ) ? 1 : $id;
$sql_files = array();
/* Any "extra" configs required for this driver? */
if( is_file( IPS_ROOT_PATH . 'setup/sql/' . strtolower( $this->settings['sql_driver'] ) . '_install.php' ) )
{
require_once( IPS_ROOT_PATH . 'setup/sql/' . strtolower( $this->settings['sql_driver'] ) . '_install.php' );/*noLibHook*/
$extra_install = new install_extra( $this->registry );
}
/* Run any sql files we found */
if( is_file( $this->app_full_path . 'setup/versions/install/sql/' . $vars['app_directory']. '_' . strtolower( ips_DBRegistry::getDriverType() ) . '_sql_' . $id .'.php' ) )
{
/* INIT */
$new_id = $id + 1;
$count = 0;
$SQL = array();
/* Get the sql file */
require_once( $this->app_full_path . 'setup/versions/install/sql/' . $vars['app_directory']. '_' . strtolower( ips_DBRegistry::getDriverType() ) . '_sql_' . $id .'.php' );/*noLibHook*/
$this->DB->return_die = 1;
/* Run the queries */
foreach( $SQL as $query )
{
$this->DB->allow_sub_select = 1;
$this->DB->error = '';
$query = str_replace( "<%time%>", time(), $query );
if( $extra_install AND method_exists( $extra_install, 'process_query_insert' ) )
{
$query = $extra_install->process_query_insert( $query );
}
$this->DB->query( $query );
if ( $this->DB->error )
{
$errors[] = $query."<br /><br />".$this->DB->error;
}
else
{
$count++;
}
}
$output[] = sprintf( $this->lang->words['redir__sql_run'], $count );
/* Show redirect... */
$this->showRedirectScreen( $vars['app_directory'], $output, $errors, $this->getNextURL( 'sql_steps', $vars ) . '&id=' . $new_id );
}
else
{
$output[] = $this->lang->words['redir__nomore_sql'];
/* Show redirect... */
$this->showRedirectScreen( $vars['app_directory'], $output, $errors, $this->getNextURL( 'next_check', $vars ) );
}
}
/**
* Creates Tables, Runs Inserts, and Indexes
*
* @return @e void
*/
public function sqlBasics()
{
/* INIT */
$vars = $this->getVars();
$output = array();
$errors = array();
$skipped = 0;
$count = 0;
/* Any "extra" configs required for this driver? */
if( is_file( IPS_ROOT_PATH . 'setup/sql/' . strtolower( $this->settings['sql_driver'] ) . '_install.php' ) )
{
require_once( IPS_ROOT_PATH . 'setup/sql/' . strtolower( $this->settings['sql_driver'] ) . '_install.php' );/*noLibHook*/
$extra_install = new install_extra( $this->registry );
}
//-----------------------------------------
// Tables
//-----------------------------------------
$this->DB->return_die = 1;
if ( is_file( $this->app_full_path . 'setup/versions/install/sql/' . $vars['app_directory']. '_' . strtolower( ipsRegistry::dbFunctions()->getDriverType() ) . '_tables.php' ) )
{
$TABLE = array();
include( $this->app_full_path . 'setup/versions/install/sql/' . $vars['app_directory']. '_' . strtolower( ipsRegistry::dbFunctions()->getDriverType() ) . '_tables.php' );/*noLibHook*/
if ( is_array( $TABLE ) and count( $TABLE ) )
{
foreach( $TABLE as $q )
{
//-----------------------------------------
// Is this a create?
//-----------------------------------------
preg_match("/CREATE TABLEs+(S+)(s)?(/", str_ireplace( 'if not exists', '', $q ), $match);
if( $match[1] AND $vars['dupe_tables'] == 'drop' )
{
$this->DB->dropTable( str_replace( $this->settings['sql_tbl_prefix'], '', $match[1] ) );
}
else if( $match[1] )
{
if( $this->DB->getTableSchematic( $match[1] ) )
{
$skipped++;
continue;
}
}
//-----------------------------------------
// Is this an alter?
//-----------------------------------------
preg_match("/ALTERs+TABLEs+(S+)s+ADDs+(S+)s+/i", $q, $match);
if( $match[1] AND $match[2] AND $vars['dupe_tables'] == 'drop' )
{
$this->DB->dropField( str_replace( $this->settings['sql_tbl_prefix'], '', $match[1] ), $match[2] );
}
else if( $match[1] AND $match[2] )
{
if( $this->DB->checkForField( $match[2], $match[1] ) )
{
$skipped++;
continue;
}
}
if ( $extra_install AND method_exists( $extra_install, 'process_query_create' ) )
{
$q = $extra_install->process_query_create( $q );
}
$this->DB->error = '';
$this->DB->query( $q );
if ( $this->DB->error )
{
$errors[] = $q."<br /><br />".$this->DB->error;
}
else
{
$count++;
}
}
}
$output[] = sprintf( $this->lang->words['redir__sql_tables'], $count, $skipped );
}
//---------------------------------------------
// Create the fulltext index...
//---------------------------------------------
if ( $this->DB->checkFulltextSupport() )
{
if ( is_file( $this->app_full_path . 'setup/versions/install/sql/' . $vars['app_directory']. '_' . strtolower( ipsRegistry::dbFunctions()->getDriverType() ) . '_fulltext.php' ) )
{
$INDEX = array();
include( $this->app_full_path . 'setup/versions/install/sql/' . $vars['app_directory']. '_' . strtolower( ipsRegistry::dbFunctions()->getDriverType() ) . '_fulltext.php' );/*noLibHook*/
$count = 0;
foreach( $INDEX as $q )
{
//---------------------------------------------
// Pass to handler
//---------------------------------------------
if ( $extra_install AND method_exists( $extra_install, 'process_query_index' ) )
{
$q = $extra_install->process_query_index( $q );
}
//---------------------------------------------
// Pass query
//---------------------------------------------
$this->DB->error = '';
$this->DB->query( $q );
if ( $this->DB->error )
{
$errors[] = $q."<br /><br />".$this->DB->error;
}
else
{
$count++;
}
}
$output[] = sprintf( $this->lang->words['redir__sql_indexes'], $count );
}
}
/* INSERTS */
if ( is_file( $this->app_full_path . 'setup/versions/install/sql/' . $vars['app_directory']. '_' . strtolower( ipsRegistry::dbFunctions()->getDriverType() ) . '_inserts.php' ) )
{
$INSERT = array();
$count = 0;
/* Get the SQL File */
include( $this->app_full_path . 'setup/versions/install/sql/' . $vars['app_directory']. '_' . strtolower( ipsRegistry::dbFunctions()->getDriverType() ) . '_inserts.php' );/*noLibHook*/
foreach( $INSERT as $q )
{
/* Extra Handler */
if( $extra_install AND method_exists( $extra_install, 'process_query_insert' ) )
{
$q = $extra_install->process_query_insert( $q );
}
$q = str_replace( "<%time%>", time(), $q );
$this->DB->error = '';
$this->DB->query( $q );
if ( $this->DB->error )
{
$errors[] = $q."<br /><br />".$this->DB->error;
}
else
{
$count++;
}
}
$output[] = sprintf( $this->lang->words['redir__sql_inserts'], $count );
}
/* If we did no queries, show something here */
if ( !count( $output ) )
{
$output[] = sprintf( $this->lang->words['redir__sql_run'], 0 );
}
/* Show Redirect... */
$this->showRedirectScreen( $vars['app_directory'], $output, $errors, $this->getNextURL( 'sql_steps', $vars ) );
}
/**
* Begin installation
*
* @return @e void
*/
public function start()
{
/* INIT */
$app_directory = IPSText::alphanumericalClean( $this->request['app_directory'] );
$type = 'upgrade';
$data = array();
$ok = 1;
$errors = array();
$localfiles = array( DOC_IPS_ROOT_PATH . 'cache/skin_cache' );
$info = array();
/* Init Data */
$data = IPSSetUp::fetchXmlAppInformation( $app_directory, $this->settings['gb_char_set'] );
$_numbers = IPSSetUp::fetchAppVersionNumbers( $app_directory );
$_files = IPSSetUp::fetchXmlAppWriteableFiles( $app_directory );
/* Grab Data */
$data['app_directory'] = $app_directory;
$data['current_version'] = ( $_numbers['current'][0] ) ? $_numbers['current'][0] : $this->lang->words['cur_version_none'];
$data['latest_version'] = $_numbers['latest'][1];
$data['next_version'] = $_numbers['next'][0];
/* Install, or upgrade? */
if ( ! $_numbers['current'][0] )
{
$type = 'install';
}
//-----------------------------------------
// For upgrade, redirect
//-----------------------------------------
else
{
@header( "Location: {$this->settings['board_url']}/" . CP_DIRECTORY . "/upgrade/" );
exit;
}
/* Version Check */
if( $data['current_version'] > 0 AND $data['current_version'] == $data['latest_version'] )
{
$this->registry->output->global_message = $this->lang->words['error__up_to_date'];
$this->registry->output->silentRedirectWithMessage( $this->settings['base_url'] );
return;
}
/* Check local files */
foreach( $localfiles as $_path )
{
if ( ! file_exists( $_path ) )
{
if ( $data['dir'] )
{
if ( ! @mkdir( $_path, IPS_FOLDER_PERMISSION, TRUE ) )
{
$info['notexist'][] = $_path;
}
}
else
{
$info['notexist'][] = $_path;
}
}
else if ( ! is_writeable( $_path ) )
{
if ( ! @chmod( $_path, is_dir( $_path ) ? IPS_FOLDER_PERMISSION : IPS_FILE_PERMISSION ) )
{
$info['notwrite'][] = $_path;
}
}
}
/* Check files... */
if( is_array( $_files ) AND count( $_files ) )
{
$info = array_merge( $info, $_files );
}
if ( count( $info['notexist'] ) )
{
foreach( $info['notexist'] as $path )
{
$errors[] = sprintf( $this->lang->words['error__file_missing'], $path );
}
}
if ( count( $info['notwrite'] ) )
{
foreach( $info['notwrite'] as $path )
{
$errors[] = sprintf( $this->lang->words['error__file_chmod'], $path );
}
}
/**
* Custom errors
*/
if ( count( $info['other'] ) )
{
foreach( $info['other'] as $error )
{
$errors[] = $error;
}
}
/* Check for xml files */
$required_xml = array(
"information",
//"{$app_directory}_modules",
//"{$app_directory}_settings",
//"{$app_directory}_tasks",
//"{$app_directory}_templates",
);
foreach( $required_xml as $r )
{
if( ! is_file( $this->app_full_path . "xml/{$r}.xml" ) )
{
$errors[] = sprintf( $this->lang->words['error__file_needed'], $this->app_full_path . "xml/{$r}.xml" );
}
}
/* Show splash */
$this->registry->output->html .= $this->html->setup_splash_screen( $data, $errors, $type );
}
/**
* Get environment vars
*
* @return array
*/
protected function getVars()
{
/* INIT */
$env = array();
/* Get the infos */
$env['type'] = strtolower( $this->request['type'] );
$env['version'] = $this->request['version'];
$env['dupe_tables'] = $this->request['dupe_tables'];
$env['app_directory'] = $this->request['app_directory'];
$env['app_location'] = 'other';
if( $this->product_information['ipskey'] )
{
if ( strstr( $this->app_full_path, 'applications_addon/ips' ) or strstr( $this->app_full_path, 'applications/' ) )
{
if ( md5( 'ips_' . basename($this->app_full_path) ) == $this->product_information['ipskey'] )
{
$env['app_location'] = 'ips';
}
}
}
$env['path'] = ( $env['type'] == 'install' ) ? $this->app_full_path . 'setup/versions/install'
: $this->app_full_path . 'setup/versions/' . $env['version'];
return $env;
}
/**
* Get next action URL
*
* @param string $next_action
* @param array $env
* @return string
*/
protected function getNextURL( $next_action, $env )
{
return $this->settings['base_url'] . $this->form_code . '&do=' . $next_action . '&app_directory=' . $env['app_directory'] . '&type=' . $env['type'] . '&version=' . $env['version'];
}
/**
* Show the redirect screen
*
* @param string $app_directory
* @param string $output
* @param string $errors
* @param string $next_url
* @return @e void
*/
protected function showRedirectScreen( $app_directory, $output, $errors, $next_url )
{
/* Init Data */
$data = IPSSetUp::fetchXmlAppInformation( $app_directory, $this->settings['gb_char_set'] );
$_numbers = IPSSetUp::fetchAppVersionNumbers( $app_directory );
/* Grab Data */
$data['app_directory'] = $app_directory;
$data['current_version'] = ( $_numbers['current'][0] ) ? $_numbers['current'][0] : $this->lang->words['cur_version_none'];
$data['latest_version'] = $_numbers['latest'][1];
$data['next_version'] = $_numbers['next'][0];
/* Setup Redirect */
$this->registry->output->html .= $this->html->setup_redirectScreen( $output, $errors, $next_url );
}
}