Файл: admin/applications/core/modules_admin/templates/importexport.php
Строк: 475
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.3.3
* Import and export skin sets
* Last Updated: $Date: 2012-05-11 06:56:52 -0400 (Fri, 11 May 2012) $
* </pre>
*
* @author $Author: mmecham $
* @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
* @since Who knows...
* @version $Revision: 10725 $
*
*/
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_templates_importexport extends ipsCommand
{
/**
* Skin Functions Class
*
* @var object
*/
protected $skinFunctions;
/**
* Recursive depth guide
*
* @var array
*/
protected $_depthGuide = array();
/**
* Skin object
*
* @var object Skin templates
*/
protected $html;
/**#@+
* URL bits
*
* @var string
*/
public $form_code = '';
public $form_code_js = '';
/**#@-*/
/**
* Main class entry point
*
* @param object ipsRegistry reference
* @return @e void [Outputs to screen]
*/
public function doExecute( ipsRegistry $registry )
{
//-----------------------------------------
// Load skin
//-----------------------------------------
$this->html = $this->registry->output->loadTemplate('cp_skin_templates');
//-----------------------------------------
// Set up stuff
//-----------------------------------------
$this->form_code = $this->html->form_code = 'module=templates&section=importexport';
$this->form_code_js = $this->html->form_code_js = 'module=templates§ion=importexport';
//-----------------------------------------
// Load lang
//-----------------------------------------
$this->registry->getClass('class_localization')->loadLanguageFile( array( 'admin_templates' ) );
//-----------------------------------------
// Load functions and cache classes
//-----------------------------------------
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*/
$this->skinFunctions = new skinImportExport( $registry );
///----------------------------------------
// What to do...
//-----------------------------------------
switch( $this->request['do'] )
{
case 'overview':
default:
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'settemplates_manage' );
$this->_showForm();
break;
case 'exportSet':
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'settemplates_export' );
$this->_exportSet();
break;
case 'exportImages':
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'settemplates_export' );
$this->_exportImages();
break;
case 'exportReplacements':
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'settemplates_export' );
$this->_exportReplacements();
break;
case 'importSet':
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'settemplates_manage' );
$this->_importSet();
break;
case 'importImages':
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'settemplates_manage' );
$this->_importImages();
break;
case 'importReplacements':
$this->registry->getClass('class_permissions')->checkPermissionAutoMsg( 'settemplates_manage' );
$this->_importReplacements();
break;
}
/* Output */
$this->registry->output->html_main .= $this->registry->output->global_template->global_frame_wrapper();
$this->registry->output->sendOutput();
}
/**
* Import an XMLarchive skin set
*
* @return string HTML to show
*/
protected function _importReplacements()
{
$importLocation = trim( $this->request['importLocation'] );
$setID = intval( $this->request['setID'] );
//-----------------------------------------
// Attempt to get contents
//-----------------------------------------
try
{
$content = $this->registry->adminFunctions->importXml( $importLocation );
}
catch ( Exception $e )
{
$this->registry->output->showError( $e->getMessage() );
}
if ( $content )
{
$added = $this->skinFunctions->importReplacementsXMLArchive( $content, $setID );
if ( $added !== FALSE )
{
$this->registry->output->global_message = sprintf( $this->lang->words['ie_replace_added'], $added );
$this->registry->output->silentRedirectWithMessage( $this->settings['base_url'] . 'module=templates§ion=importexport&do=overview' );
}
else
{
$this->registry->output->global_error = $this->lang->words['ie_importfail'] . implode( "<br />", $this->skinFunctions->fetchErrorMessages() );
return $this->_showForm();
}
}
else
{
$this->registry->output->global_error = $this->lang->words['ie_importfail_no'];
return $this->_showForm();
}
}
/**
* Import an XMLarchive skin set
*
* @return string HTML to show
*/
protected function _importImages()
{
$importName = trim( $this->request['importName'] );
$importLocation = trim( $this->request['importLocation'] );
$setID = intval( $this->request['setID'] );
//-----------------------------------------
// Fix up import name
//-----------------------------------------
if( ! $importName )
{
$importName = !empty( $_FILES['FILE_UPLOAD']['name'] ) ? $_FILES['FILE_UPLOAD']['name'] : $this->request['importLocation'];
}
$importName = preg_replace( "/[^a-zA-Z0-9_]/", "_", str_ireplace( array( '.xml', '.gz', 'images-' ), '', $importName ) );
//-----------------------------------------
// Attempt to get contents
//-----------------------------------------
try
{
$content = $this->registry->adminFunctions->importXml( $importLocation );
}
catch ( Exception $e )
{
$this->registry->output->showError( $e->getMessage() );
}
if ( $content )
{
$added = $this->skinFunctions->importImagesXMLArchive( $content, $importName, $setID );
if ( $added !== FALSE )
{
$this->registry->output->global_message = sprintf( $this->lang->words['ie_images_added'], $added );
$this->registry->output->silentRedirectWithMessage( $this->settings['base_url'] . 'module=templates§ion=importexport&do=overview' );
}
else
{
$this->registry->output->global_error = $this->lang->words['ie_importfail'] . implode( "<br />", $this->skinFunctions->fetchErrorMessages() );
return $this->_showForm();
}
}
else
{
$this->registry->output->global_error = $this->lang->words['ie_importfail_no'];
return $this->_showForm();
}
}
/**
* Import an XMLarchive skin set
*
* @return string HTML to show
*/
protected function _importSet()
{
$importName = trim( $this->request['importName'] );
$importUpgrade = intval( $this->request['importUpgrade'] ) ? TRUE : FALSE;
$importLocation = trim( $this->request['importLocation'] );
$imageDir = trim( $this->request['importImgDirs'] );
$checkVersion = trim( $this->request['noVersionCheck'] ) ? FALSE : TRUE;
//-----------------------------------------
// Attempt to get contents
//-----------------------------------------
if ( $checkVersion )
{
try
{
$content = $this->registry->adminFunctions->importXml( $importLocation );
}
catch ( Exception $e )
{
$this->registry->output->showError( $e->getMessage() );
}
}
else
{
$_c = $this->DB->buildAndFetch( array( 'select' => 'cs_value', 'from' => 'cache_store', 'where' => 'cs_key='_importSkinContent_'' ) );
$content = $_c['cs_value'];
}
if ( $content )
{
/* Checking versions? */
if ( $checkVersion )
{
$this->DB->delete( 'cache_store', 'cs_key='_importSkinContent_'' );
preg_match( '#ipbLongVersion="(d+?)"s+?ipbHumanVersion="([d.-_]+?)"#i', $content, $matches );
if ( $matches[1] and $matches[2] )
{
$_version = IPSLib::fetchVersionNumber();
/* Long version is in format of 31001 (Major Minor X X X) we'll just check majorminor */
$_importMajor = substr( $matches[1] , 0, 2 );
$_currentMajor = substr( $_version['long'], 0, 2 );
if ( $_importMajor < $_currentMajor )
{
/* Store it */
$this->DB->insert( 'cache_store', array( 'cs_key' => '_importSkinContent_', 'cs_value' => $content ) );
/* Generate continue link */
$link = $this->settings['base_url'] . '&noVersionCheck=1&' . http_build_query( $this->request );
/* Show form */
$this->registry->output->global_error = sprintf( $this->lang->words['ie_importfail_old_version'], $matches[2], $_version['human'], $link );
return $this->_showForm();
}
}
}
$added = $this->skinFunctions->importSetXMLArchive( $content, 0, $imageDir, $importName, $importUpgrade );
$message = $added['upgrade'] ? $this->lang->words['ie_set_upgraded'] : $this->lang->words['ie_set_imported'];
$this->registry->output->global_message = sprintf( $message, $added['templates'], $added['replacements'], $added['css'] );
$this->registry->output->silentRedirectWithMessage( $this->settings['base_url'] . 'module=templates§ion=importexport&do=overview' );
}
else
{
$this->registry->output->global_error = $this->lang->words['ie_importfail_no'];
return $this->_showForm();
}
}
/**
* Export replacements to an XMLArchive
*
* @return @e void
*/
protected function _exportReplacements()
{
//-----------------------------------------
// INIT
//-----------------------------------------
$setID = intval( $this->request['setID'] );
$setData = $this->skinFunctions->fetchSkinData( $setID );
//-----------------------------------------
// Er.. that's it...
//-----------------------------------------
$this->registry->output->showDownload( $this->skinFunctions->generateReplacementsXML( $setID ), 'replacements-' . IPSText::makeSeoTitle( $setData['set_name'] ) . '.xml' );
}
/**
* Export an image set to an XMLArchive
*
* @return @e void
*/
protected function _exportImages()
{
//-----------------------------------------
// INIT
//-----------------------------------------
if ( is_string( $this->request['setID'] ) )
{
$imgDir = $this->request['setID'];
}
else
{
$setID = intval( $this->request['setID'] );
$setData = $this->skinFunctions->fetchSkinData( $setID );
$imgDir = $setData['set_image_dir'];
}
//-----------------------------------------
// Er.. that's it...
//-----------------------------------------
$xml = $this->skinFunctions->generateImagesXMLArchive( $imgDir );
if ( count( $this->skinFunctions->fetchErrorMessages( TRUE ) ) )
{
$this->registry->output->global_error = implode( "<br />", $this->skinFunctions->fetchErrorMessages() );
$this->_showForm();
return;
}
$this->registry->output->showDownload( $xml, 'images-' . IPSText::makeSeoTitle( $imgDir ) . '.xml' );
}
/**
* Export the entire set to an XMLArchive
*
* @return @e void
*/
protected function _exportSet()
{
//-----------------------------------------
// INIT
//-----------------------------------------
$setID = intval( $this->request['setID'] );
if ( !$setID )
{
return $this->_showForm();
}
$setOnly = ( $this->request['exportSetOptions'] == 'all' ) ? FALSE : TRUE;
$setData = $this->skinFunctions->fetchSkinData( $setID );
$apps = array();
/* Figure out which apps to export */
if ( is_array( $_POST['exportApps'] ) AND count( $_POST['exportApps'] ) )
{
foreach( $_POST['exportApps'] as $k => $v )
{
if ( $k == 'core' AND $v )
{
$apps[] = 'core';
$apps[] = 'forums';
$apps[] = 'members';
}
else if ( $v )
{
$apps[] = $k;
}
}
}
//-----------------------------------------
// Er.. that's it...
//-----------------------------------------
$xml = $this->skinFunctions->generateSetXMLArchive( $setID, $setOnly, $apps );
if ( count( $this->skinFunctions->fetchErrorMessages( TRUE ) ) )
{
$this->registry->output->global_error = implode( "<br />", $this->skinFunctions->fetchErrorMessages() );
$this->_showForm();
return;
}
$this->registry->output->showDownload( $xml, IPSText::makeSeoTitle( $setData['set_name'] ) . '.xml' );
}
/**
* Show the main form
*
* @return @e void
*/
protected function _showForm()
{
//-----------------------------------------
// INIT
//-----------------------------------------
$sets = $this->_fetchSetsDropDown( intval( $this->request['skinID'] ) );
$imageDirs = $this->skinFunctions->fetchImageDirectories();
$form = array();
$warnings = array();
$_imageDirs = array();
$_skinSetMap = array();
//-----------------------------------------
// Map skins to image dirs
//-----------------------------------------
foreach( $this->registry->output->allSkins as $_id => $data )
{
$_skinSetMap[ $data['set_image_dir'] ][] = $_id;
}
//-----------------------------------------
// Build image dir option list
//-----------------------------------------
foreach( $imageDirs as $dir )
{
$name = '';
/* Used in a skin set? */
if ( isset($_skinSetMap[$dir]) )
{
$_count = count( $_skinSetMap[ $dir ] );
$_name = $this->registry->output->allSkins[ array_pop( $_skinSetMap[ $dir ] ) ];
if ( $_count > 1 )
{
$name = $dir . sprintf( $this->lang->words['used_in_plus_others'], $_name['set_name'], $_count-1 );
}
else
{
$name = $dir . sprintf( $this->lang->words['used_in_no_others'], $_name['set_name'] );
}
}
$_imageDirs[] = array( $dir, ( $name ) ? $name : $dir );
}
//-----------------------------------------
// Warnings?
//-----------------------------------------
# Image directory writeable?
if ( ! is_writable( rtrim( $this->skinFunctions->fetchImageDirectoryPath(''), '/' ) ) )
{
$warnings['importImgDir'] = 1;
}
# Main cache path writeable?
if ( ! is_writable( IPS_CACHE_PATH . 'cache/skin_cache' ) )
{
$warnings['importSkinCacheDir'] = 1;
}
//-----------------------------------------
// Form elements
//-----------------------------------------
$form['uploadField'] = $this->registry->output->formUpload();
$form['importName'] = $this->registry->output->formInput( 'importName' , $_POST['importName'] );
$form['importUpgrade'] = $this->registry->output->formCheckbox( 'importUpgrade', $_POST['importUpgrade'] );
$form['importLocation'] = $this->registry->output->formInput( 'importLocation', $_POST['importLocation'] );
$form['exportImgDirs'] = $this->registry->output->formDropdown( 'setID', $_imageDirs, $_POST['exportImgDirs'] );
array_unshift( $_imageDirs, array( '0', ' ' . $this->lang->words['ie_none'] . ' ' ) );
$form['importImgDirs'] = $this->registry->output->formDropdown( 'importImgDirs', $_imageDirs, $_POST['importImgDirs'] );
$form['exportSetOptions'] = $this->registry->output->formDropdown("exportSetOptions", array( 0 => array( 'current' , $this->lang->words['ie_ex_skin'] ),
1 => array( 'all' , $this->lang->words['ie_ex_skin_p'] ) ) );
//-----------------------------------------
// Print it...
//-----------------------------------------
$this->registry->output->html .= $this->html->importexport_form( $sets, $form, $warnings );
}
/**
* This code is duplicated from output/formats/html
* I did debate moving it into a function elsewhere
* But it's only used here also, so...
*
* @param int Set ID to be 'selected'
* @param int Parent id
* @param int Iteration
* @return string HTML
*/
protected function _fetchSetsDropDown( $skinID=NULL, $parent=0, $iteration=0 )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$output = "";
$depthMarkers = "";
if( $iteration )
{
for( $i=0; $i<$iteration; $i++ )
{
$depthMarkers .= '--';
}
}
//-----------------------------------------
// Go get 'em
//-----------------------------------------
foreach( $this->registry->output->allSkins as $id => $data )
{
/* Allowed to use? */
/*if ( $data['_youCanUse'] !== TRUE )
{
continue;
}*/
/* Root skins? */
if ( count( $data['_parentTree'] ) AND $iteration == 0 )
{
continue;
}
else if( $iteration > 0 AND (!count( $data['_parentTree'] ) OR $data['_parentTree'][0] != $parent) )
{
continue;
}
$_selected = ( $skinID != NULL AND $skinID == $data['set_id'] ) ? 'selected="selected"' : '';
/* Ok to add... */
$output .= "n<option id='skinSetDD_" . $data['set_id'] . "' " . $_selected . " value="". $data['set_id'] . "">". $depthMarkers . $data['set_name'] . "</option>";
if ( is_array( $data['_childTree'] ) AND count( $data['_childTree'] ) )
{
$output .= $this->_fetchSetsDropDown( $skinID, $data['set_id'], $iteration + 1 );
}
}
return $output;
}
}