Version 2.2.2

This commit is contained in:
Neo committed 2025-12-19 00:24:35 -08:00
1 parent 22f1b963ee
commit a3bb603c96
858 files changed
+479463 -188140

No files matched your search

+179 -129
View File
@@ -2,14 +2,24 @@
/*
+--------------------------------------------------------------------------
| Invision Power Board
| Invision Power Board 2.2.2
| =============================================
| by Matthew Mecham
| (c) 2001 - 2006 Invision Power Services, Inc.
| http://www.invisionpower.com
| =============================================
| Web: http://www.invisionboard.com
| http://www.ibresource.ru/products/invisionpowerboard/
| Time: Monday 05th of March 2007 10:10:54 PM
| Release: e3790216629e5a2aaf37070b32237f06
| Licence Info: http://www.invisionboard.com/?license
| http://www.ibresource.ru/license
+---------------------------------------------------------------------------
| INVISION POWER BOARD IS NOT FREE / OPEN SOURCE!
+---------------------------------------------------------------------------
| INVISION POWER BOARD ÍÅ ßÂËßÅÒÑß ÁÅÑÏËÀÒÍÛÌ ÏÐÎÃÐÀÌÌÍÛÌ ÎÁÅÑÏÅ×ÅÍÈÅÌ!
| Ïðàâà íà ÏÎ ïðèíàäëåæàò Invision Power Services
| Ïðàâà íà ïåðåâîä IBResource (http://www.ibresource.ru)
+---------------------------------------------------------------------------
| > $Date: 2006-05-25 10:15:22 -0400 (Thu, 25 May 2006) $
| > $Revision: 278 $
@@ -24,12 +34,12 @@
*/
/**
* API: Skins
* API: Ñòèëåé
*
* EXAMPLE USAGE
* ÏÐÈÌÅÐ ÈÑÏÎËÜÇÎÂÀÍÈß
* <code>
* $api = new api_skins();
* # Optional - if $ipsclass is not passed, it'll init
* # Îïöèîíàëüíî - åñëè $ipsclass íå ïåðåäàåòñÿ â îáúåêò, îí áóäåò èíèöèàëèçèðîâàí ñàìîñòîÿòåëüíî
* $api->ipsclass =& $this->ipsclass;
* $api->api_init();
* $api->skin_add_bits( $path_to_xml_file );
@@ -39,28 +49,36 @@
* $messages = $api->skin_rebuild_caches( $messages[0] );
* </code>
*
* Macros for use with this file can be exported via the ACP
* Skin Import/Export page
* Ïðèìåð XML-ôàéëà ìàêðîñîâ ìîæíî ïîëó÷èòü ýêñïîðòðîâàíèåì èç
* ÀÖÏ ñ ïîìîùüþ èíñòðóìåíòà "Èìïîðò è ýêñïîðò ñòèëåé"
*
* Templates for use with this file can be exported via the ACP
* Skin Sets Overview page when IN_DEV mode is enabled - it is
* recommended to add the name of your skin file under the
* "Developers: Export Module Skin Files" section to export
* all templates for your skin group.
* XML-ôàéë ñ øàáëîíàìè ìîæíî ïîëó÷èòü ýêñïîðòðîâàíèåì èç ÀÖÏ â
* IN_DEV ðåæèìå. Íåîáõîäèìî çàéòè â Óïðàâëåíèå ñòèëÿìè ->
* Ñïèñîê ñòèëåé è âîñïîëüçîâàòüñÿ èíñòðóìåíòàìè èç ðàçäåëà
* Ýêñïîðòèðîâàíèå äàííûõ.
*
* Example - if you make a skin_links skin template file, enter
* "links" in the form field and download the xml file.
* Òàê æå ìîæíî ýêñïîðòèðîâàòü øàáëîíû òîëüêî îïðåäåëåííîé ãðóïïû
* Ðåæèì ðàçðàáîò÷èêà: ýêñïîðòèðîâàíèå ôàéëîâ ñòèëÿ
* Íàïðèìåð åñëè âû õîòèòå âñå øàáëîíû ãðóïïû skin_links, òî
* ââåäèòå â ïîëå çíà÷åíèå 'links'
*
* Ìåòîä skin_rebuild_caches ïîçâîëÿåò ñîçäàòü íîâûå êåø ôàéëû (php
* ôàéëû ñòèëÿ íà äèñêå) äëÿ îäíîãî ñòèëÿ çà ðàç. Ìåòîä ïåðåñòðàèâàåò
* ñòèëü id êîòîðîãî âûøå, ÷åì id ïåðåäàííîãî â ôóíêöèþ.
* Ïðè ïåðâîì âûçîâå ìåòîäà, ïåðåäàâàéòå åìó íóëåâîé ïàðàìåòð íà âõîä.
* Âî âñåõ ïîñëåäóþùèõ âûçîâàõ ïîäàâàéòå íà âõîä 1-å çíà÷åíèå èç
* ìàññèâà (èíäåêñ 0), êîòîðûé áûë âîçâðàùåí ïðåäûäóùèì âûçîâîì ìåòîäà.
* Äàííûé ïîäõîä ïîçâîëÿåò ïåðåñòðàèâàòü âñå ñòèëè ôîðóìà è èçáåæàòü
* òàéì-àóòîâ ïðè âûïîëíåíèè ýòîé îïåðàöèè. Ñîâåòóåì èñïîëüçîâàòü ýòó
* îñîáåííîñòü â âàøèõ ñêðèïòàõ òàê - ñêðèïò äîëæåí äåëàòü ðèäåðåêò íà
* ñåáÿ ñàìîãî ïîñëå êàæäîãî ïåðåñòðîåíèÿ ñòèëÿ, ïðè ýòîì â ïàðàìåòðàõ
* ðåäèðåêòà íåîáõîäèìî ïåðåäàâàòü ðåçóëüòàò, êîòîðûé âåðíóë ìåòîä
* skin_rebuild_caches. Êîãäà ïåðâîå çíà÷åíèå â âåðíóâøåìñÿ ìàññèâå
* áóäåò èìåòü çíà÷åíèå 0 âñå øàáëîíû âñåõ ñòèëåé áóäóò ïåðåñòðîåíû,
* à çíà÷èò ìîæíî çàâåðøàòü ðàáîòó ñêðèïòà. Òàê æå âàæíî ïîìíèòü, ÷òî
* âòîðîå çíà÷åíèå â âîçâðàùàåìîì ìàññèâå (èíäåêñ 1) ñîäåðæèò ìàññèâ
* ñîîáùåíèé.
*
* The skin_rebuild_caches rebuilds one skin set at a time - it
* rebuilds the next skin set id higher than the id you pass it.
* On first function call, pass a 0. On subsequent function
* calls pass it the 1st array value (index 0) returned from
* the previous call. It rebuilds one skin set at a time to
* prevent time outs - it is recommended in your script that
* you redirect to a new page passing the appropriate skin id
* value after each rebuild - when this function returns a 0
* for index 0, all skin sets will be rebuild. Index 1 of the
array returned will be an array of messages.
*
* @package InvisionPowerBoard
* @subpackage APIs
@@ -83,9 +101,9 @@ if ( ! class_exists( 'api_core' ) )
}
/**
* API: Skins
* API: Ñòèëåé
*
* This class deals with all available skin insertion functions.
* Êëàññ ïðåäîñòàâëÿåò âñå ìåòîäû API äëÿ äîáàâëåíèÿ ñòèëåé.
*
* @package InvisionPowerBoard
* @subpackage APIs
@@ -101,20 +119,19 @@ class api_skins extends api_core
* @var object
*/
//var $ipsclass;
var $xml;
var $cache_func;
/*-------------------------------------------------------------------------*/
// Add skin templates to IPB
// Äîáàâëåíèå øàáëîíîâ ñòèëÿ IPB
/*-------------------------------------------------------------------------*/
/**
* Adds skin templates to IPB master template set which will filter down to child skins
* Äîáàâëÿåò øàáëîíû â ãëàâíûé ñòèëü IPB, øàáëîíû ïîòîì äîñòóïíû è ñòèëÿì-íàñëåäíèêàì
*
* @param string Path to xml file containing skin templates (Note: templates can
* be exported from ACP when IN_DEV mode is enabled with the
* Developer Export options at the bottom of the skin sets overview)
* @param string Ïóòü ê xml, ñîäåðæàùåìó øàáëîíû (Ïîäñêàçêà: ïðèìåð xml
* ìîæíî ïîëó÷èòü ýêñïîðòðîâàíèåì èç ÀÖÏ â IN_DEV ðåæèìå)
* @return void;
*/
function skin_add_bits( $xml_file_path )
@@ -122,33 +139,47 @@ class api_skins extends api_core
//-------------------------------
// Check?
//-------------------------------
if ( ! $xml_file_path )
{
$this->api_error[] = "input_missing_fields";
return;
}
require_once( KERNEL_PATH.'class_xml.php' );
$this->xml = new class_xml();
$this->xml->lite_parser = 1;
//-------------------------------
// Get file contents
//-------------------------------
//-------------------------------
$skin_content = implode( "", file($xml_file_path) );
//-------------------------------
// Unpack the datafile (TEMPLATES)
//-------------------------------
$this->xml->xml_parse_document( $skin_content );
$this->xml->xml_parse_document( $skin_content );
//-------------------------------
// (TEMPLATES)
//-------------------------------
if ( ! is_array( $this->xml->xml_array['templateexport']['templategroup']['template'][0] ) )
{
//-----------------------------------------
// Ensure [0] is populated
//-----------------------------------------
$tmp = $this->xml->xml_array['templateexport']['templategroup']['template'];
unset($this->xml->xml_array['templateexport']['templategroup']['template']);
$this->xml->xml_array['templateexport']['templategroup']['template'][0] = $tmp;
}
if ( ! is_array( $this->xml->xml_array['templateexport']['templategroup']['template'] ) )
{
$this->api_error[] = "xml_file_not_valid";
@@ -158,7 +189,7 @@ class api_skins extends api_core
foreach( $this->xml->xml_array['templateexport']['templategroup']['template'] as $id => $entry )
{
$this->ipsclass->DB->allow_sub_select = 1;
$row = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'suid',
'from' => 'skin_templates',
'where' => "group_name='{$entry['group_name']['VALUE']}' AND func_name='{$entry['func_name']['VALUE']}' and set_id=1"
@@ -167,7 +198,7 @@ class api_skins extends api_core
if ( $row['suid'] )
{
$this->ipsclass->DB->allow_sub_select = 1;
$this->ipsclass->DB->do_update( 'skin_templates', array( 'func_data' => $entry[ 'func_data' ]['VALUE'],
'section_content' => $entry[ 'section_content' ]['VALUE'],
'updated' => time()
@@ -177,7 +208,7 @@ class api_skins extends api_core
else
{
$this->ipsclass->DB->allow_sub_select = 1;
$this->ipsclass->DB->do_insert( 'skin_templates', array( 'func_data' => $entry[ 'func_data' ]['VALUE'],
'func_name' => $entry[ 'func_name' ]['VALUE'],
'section_content' => $entry[ 'section_content' ]['VALUE'],
@@ -188,16 +219,16 @@ class api_skins extends api_core
}
}
}
/*-------------------------------------------------------------------------*/
// Add macros to IPB
// Äîáàâëåíèå ìàêðîñîâ IPB
/*-------------------------------------------------------------------------*/
/**
* Adds macros to IPB master templates which will filter down to child skins
* Äîáàâëÿåò ìàêðîñû â ãëàâíûé ñòèëü IPB, ìàêðîñû ïîòîì äîñòóïíû è ñòèëÿì-íàñëåäíèêàì
*
* @param string Path to xml file containing macros (Note: macros can
* be exported from ACP when IN_DEV mode is enabled)
* @param string Ïóòü ê xml, ñîäåðæàùåìó ìàêðîñû (Ïîäñêàçêà: ïðèìåð xml
* ìîæíî ïîëó÷èòü ýêñïîðòðîâàíèåì èç ÀÖÏ â IN_DEV ðåæèìå)
* @return void;
*/
function skin_add_macros( $xml_file_path )
@@ -205,29 +236,44 @@ class api_skins extends api_core
//-------------------------------
// Check?
//-------------------------------
if ( !$xml_file_path )
{
$this->api_error[] = "input_missing_fields";
return;
}
require_once( KERNEL_PATH.'class_xml.php' );
$this->xml = new class_xml();
$this->xml->lite_parser = 1;
//-------------------------------
// Get file contents
//-------------------------------
$macro_content = implode( "", file($xml_file_path) );
//-------------------------------
// Unpack the datafile (TEMPLATES)
//-------------------------------
$this->xml->xml_parse_document( $macro_content );
$macro_content = implode( "", file($xml_file_path) );
//-------------------------------
// Unpack the datafile (MACROS)
//-------------------------------
$this->xml->xml_parse_document( $macro_content );
if ( ! is_array( $this->xml->xml_array['macroexport']['macrogroup']['macro'][0] ) )
{
//-----------------------------------------
// Ensure [0] is populated
//-----------------------------------------
$tmp = $this->xml->xml_array['macroexport']['macrogroup']['macro'];
unset($this->xml->xml_array['macroexport']['macrogroup']['macro']);
$this->xml->xml_array['macroexport']['macrogroup']['macro'][0] = $tmp;
}
//-------------------------------
// (MACRO)
//-------------------------------
@@ -241,7 +287,7 @@ class api_skins extends api_core
foreach( $this->xml->xml_array['macroexport']['macrogroup']['macro'] as $id => $entry )
{
$this->ipsclass->DB->allow_sub_select = 1;
$row = $this->ipsclass->DB->simple_exec_query( array( 'select' => 'macro_id',
'from' => 'skin_macro',
'where' => "macro_value='{$entry['macro_value']['VALUE']}' and macro_set=1"
@@ -249,35 +295,38 @@ class api_skins extends api_core
if ( $row['macro_id'] )
{
$this->ipsclass->DB->allow_sub_select = 1;
$this->ipsclass->DB->do_update( 'skin_macro', array( 'macro_replace' => $entry['macro_replace']['VALUE'] ), "macro_value='{$entry['macro_value']['VALUE']}' and macro_set=1" );
}
else
{
$this->ipsclass->DB->allow_sub_select = 1;
$this->ipsclass->DB->do_insert( 'skin_macro', array( 'macro_value' => $entry['macro_value']['VALUE'],
'macro_replace' => $entry['macro_replace']['VALUE'],
'macro_set' => 1 ) );
}
}
}
}
/*-------------------------------------------------------------------------*/
// Rebuild skin caches
// Ïåðåñîçäàíèå êåøà ñòèëåé
/*-------------------------------------------------------------------------*/
/**
* Rebuilds template caches to cache new skins to .php files
* Ñîçäàåò íîâûå .php ôàéëû êåøà äëÿ øàáëîíîâ ñòèëÿ.
*
* @param int Last skin id completed (returned upon completion of prior skin)
* @return array Returns: Skin id completed (which can be passed back to this
* function on next run) and an array of messages
* @param int id ïîñëåäíåãî ïåðåñîçäàííîãî ñòèëÿ
* @return array Âîçâðàùàåò ìàññèâ, ñîäåðæàùèé:
* - id îáðàáîòàííîãî ñòèëÿ (è ñíîâà ìîæåò áûòü ïåðåäàíî
* íà âõîä ýòîé ôóíêöèè äëÿ ïðîäîëæåíèÿ îáíîâëåíèÿ êåøåé äðóãèõ
* ñòèëåé)
* - ìàññèâ ñîîáùåíèé
*/
function skin_rebuild_caches( $completed=1 )
{
$this->ipsclass->DB->load_cache_file( ROOT_PATH.'sources/sql/'.SQL_DRIVER.'_api_queries.php', 'sql_api_queries' );
//-----------------------------------
// Get ACP library
//-----------------------------------
@@ -285,26 +334,26 @@ class api_skins extends api_core
require_once( ROOT_PATH.'sources/lib/admin_cache_functions.php' );
$this->cache_func = new admin_cache_functions();
$this->cache_func->ipsclass =& $this->ipsclass;
//-----------------------------------
// Image cache url
//-----------------------------------
//-----------------------------------
$row = $this->ipsclass->DB->simple_exec_query ( array ( 'select' => 'conf_value, conf_default', 'from' => 'conf_settings', 'where' => "conf_key='ipb_img_url'" ) );
$this->ipsclass->vars['ipb_img_url'] = $row['conf_value'] != "" ? $row['conf_value'] : $row['conf_default'];
if ( $this->ipsclass->vars['ipb_img_url'] == "{blank}" )
{
$this->ipsclass->vars['ipb_img_url'] = "";
}
//-------------------------------
// Next skin to do?
//-------------------------------
//-------------------------------
$completed = $completed > 0 ? intval($completed) : 1;
//-----------------------------------
// Get skins
//-----------------------------------
@@ -332,62 +381,62 @@ class api_skins extends api_core
}
else
{
return array( 'completed' => 0, 'messages' => array( 'No more skins to rebuild' ) );
return array( 'completed' => 0, 'messages' => array( 'Íåò áîëüøå ñòèëåé äëÿ ïåðåñîçäàíèÿ êåøà' ) );
}
}
}
/*-------------------------------------------------------------------------*/
// Rebuild update template bit
// Îáíîâëåíèå êåøà øàáëîíîâ äî íîâîé âåðñèè
/*-------------------------------------------------------------------------*/
/**
* Updates a template bit from a previous version to the current version
* NOTE: This only changes the format of the data and doesn't update the
* actual HTML.
* Îáíîâëÿåò øàáëîíû ïðåäûäóùåé âåðñèè äî òåêóùåé
* Ïðèìå÷àíèå: ìåòîä èçìåíÿåò òîëüêî ôîðìàò øàáëîíîâ, íî íå èçìåíÿåò ñàì HTML
* øàáëîíîâ
*
* @param string Template HTML
* @return string Template HTML
* @param string HTML-òåëî øàáëîíà
* @return string HTML-òåëî øàáëîíà ïîñëå îáðàáîòêè
*/
function skin_update_template_bit( $html='' )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$debug = 0;
$_html = $html;
//-----------------------------------------
// Fix up basic tags
//-----------------------------------------
$html = preg_replace( "/{ipb\.script_url}/i", '{$this->ipsclass->base_url}' , $html);
$html = preg_replace( "/{ipb\.session_id}/i", '{$this->ipsclass->session_id}', $html);
//-----------------------------------------
// Fix up the IF statements
//-----------------------------------------
# IF / ELSE IF / ELSE
$html = preg_replace_callback( "#(?:\s+?)?<(if=[\"'].+?[\"'])>(.+?)</if>\s+?<else (if=[\"'].+?[\"'])>(.+?)</if>\s+?<else>(.+?)</else>#is", array( $this, '_func_fix_if_elseif_else' ), $html );
$html = preg_replace_callback( "#(?:\s+?)?<(if=[\"'].+?[\"'])>(.+?)</if>\s+?<else (if=[\"'].+?[\"'])>(.+?)</if>\s+?<else>(.+?)</else>#is", array( &$this, '_func_fix_if_elseif_else' ), $html );
# IF / ELSE IF
$html = preg_replace_callback( "#(?:\s+?)?<(if=[\"'].+?[\"'])>(.+?)</if>\s+?<else (if=[\"'].+?[\"'])>(.+?)</if>#is", array( $this, '_func_fix_if_elseif_else' ), $html );
$html = preg_replace_callback( "#(?:\s+?)?<(if=[\"'].+?[\"'])>(.+?)</if>\s+?<else (if=[\"'].+?[\"'])>(.+?)</if>#is", array( &$this, '_func_fix_if_elseif_else' ), $html );
# IF / ELSE
$html = preg_replace_callback( "#(?:\s+?)?<(if=[\"'].+?[\"'])>(.+?)</if>\s+?<else>(.+?)</else>#is", array( $this, '_func_fix_if_elseif_else' ), $html );
$html = preg_replace_callback( "#(?:\s+?)?<(if=[\"'].+?[\"'])>(.+?)</if>\s+?<else>(.+?)</else>#is", array( &$this, '_func_fix_if_elseif_else' ), $html );
//-----------------------------------------
// Sort out the IF content
//-----------------------------------------
$html = preg_replace_callback( "#<if=([\"'])(.+?)[\"']>#is", array( $this, '_func_check_if_statement' ), $html );
$html = preg_replace_callback( "#<if=([\"'])(.+?)[\"']>#is", array( &$this, '_func_check_if_statement' ), $html );
//-----------------------------------------
// Sort out the rest of the tags...
//-----------------------------------------
$html = preg_replace( "#ipb\.(member|vars|skin|lang|input)#i", '$this->ipsclass->\\1', $html );
#print "<pre>". htmlspecialchars( $html ); exit();
if ( $debug )
{
$_string = "\n===================================================";
@@ -396,21 +445,21 @@ class api_skins extends api_core
$_string .= "\n".$_html;
$_string .= "\n---CONVERTED---------------------------------------";
$_string .= "\n".$html;
if ( $FH = @fopen( ROOT_PATH . 'cache/template_update_debug_log_'.date('m_d_y').'.cgi', 'a' ) )
{
@fwrite( $FH, $_string );
@fclose( $FH );
}
}
return $html;
}
/*-------------------------------------------------------------------------*/
// Fix up an if / else if / else statement
/*-------------------------------------------------------------------------*/
/*
* <if="">
* MAIN IF
@@ -427,18 +476,18 @@ class api_skins extends api_core
//-----------------------------------------
// INIT
//-----------------------------------------
$if = '';
$if_html = '';
$else_if = '';
$else_if_html = '';
$else_html = '';
$formatted = '';
//-----------------------------------------
// What are we doing?
//-----------------------------------------
if ( count( $matches ) == 6 )
{
$if = trim( $matches[1] );
@@ -460,11 +509,11 @@ class api_skins extends api_core
$if_html = trim( $matches[2] );
$else_html = trim( $matches[3] );
}
//-----------------------------------------
// OK...
//-----------------------------------------
if ( $if AND $else_if AND $else_html )
{
$formatted = "<".$if.">\n";
@@ -495,18 +544,18 @@ class api_skins extends api_core
$formatted .= $else_html."\n";
$formatted .= "</if>\n";
}
return $formatted;
}
//===================================================
// Sort out left bit of comparison
//===================================================
function _func_fix_if_statement($left, $andor="", $fs="", $ls="")
{
$left = trim($this->_trim_slashes($left));
if ( preg_match( "/^ipb\./", $left ) )
{
$left = preg_replace( "/^ipb\.(.+?)$/", '$this->ipsclass->'."\\1", $left );
@@ -515,41 +564,42 @@ class api_skins extends api_core
{
$left = '$'.$left;
}
return $andor.$fs.$left.$ls;
}
//===================================================
// Statement: Prep AND OR, etc
//===================================================
function _func_check_if_statement( $matches=array() )
{
//-----------------------------------------
// INIT
//-----------------------------------------
$quotes = $matches[1];
$code = $this->_trim_slashes( $matches[2] );
$code = preg_replace( "/(^|and|or)(\s+)(.+?)(\s|$)/ise", "\$this->_func_fix_if_statement('\\3', '\\1', '\\2', '\\4')", ' '.$code );
$code = preg_replace( '#\${1,}#i', '$', $code );
$code = str_replace( '$($', '($', $code );
return "<if=".$quotes.trim($code).$quotes.">";
}
//===================================================
// Remove leading and trailing newlines
//===================================================
function _trim_slashes($code)
{
$code = str_replace( '\"' , '"', $code );
$code = str_replace( "\\'", "'", $code );
return $code;
}
}
?>