Вход Регистрация
Файл: 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 doExecuteipsRegistry $registry 
    {
        
//-----------------------------------------
        // Load skin
        //-----------------------------------------
        
        
$this->html            $this->registry->output->loadTemplate('cp_skin_templates');
        
        
//-----------------------------------------
        // Set up stuff
        //-----------------------------------------
        
        
$this->form_code    $this->html->form_code    'module=templates&amp;section=importexport';
        
$this->form_code_js    $this->html->form_code_js    'module=templates&section=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&section=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&section=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);
                    
$_currentMajor substr$_version['long'], 0);
                    
                    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'] . '&amp;noVersionCheck=1&amp;' 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$content0$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&section=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->fetchErrorMessagesTRUE ) ) )
        {
            
$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->fetchErrorMessagesTRUE ) ) )
        {
            
$this->registry->output->global_error implode"<br />"$this->skinFunctions->fetchErrorMessages() );
            
$this->_showForm();
            return;
        }
        
        
$this->registry->output->showDownload$xmlIPSText::makeSeoTitle$setData['set_name'] ) . '.xml' );
    }
    
    
/**
     * Show the main form
     *
     * @return    @e void
     */
    
protected function _showForm()
    {
        
//-----------------------------------------
        // INIT
        //-----------------------------------------
        
        
$sets        $this->_fetchSetsDropDownintval$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->allSkinsarray_pop$_skinSetMap$dir ] ) ];
                
                if ( 
$_count )
                {
                    
$name $dir sprintf$this->lang->words['used_in_plus_others'], $_name['set_name'], $_count-);
                }
                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_writablertrim$this->skinFunctions->fetchImageDirectoryPath(''), '/' ) ) )
        {
            
$warnings['importImgDir'] = 1;
        }
        
        
# Main cache path writeable?
        
if ( ! is_writableIPS_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( => array( 'current'  $this->lang->words['ie_ex_skin'] ),
                                                                                                     
=> 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=)
    {
        
//-----------------------------------------
        // 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 == )
            {
                continue;
            }
            else if( 
$iteration 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 );
            }
        }
        
        return 
$output;
    }
}
Онлайн: 1
Реклама