Файл: admin/applications/core/modules_admin/ajax/hooks.php
Строк: 869
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.3.3
* Hooks (AJAX)
* Last Updated: $Date: 2012-06-01 17:10:16 -0400 (Fri, 01 Jun 2012) $
* </pre>
*
* @author $Author: ips_terabyte $
* @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 1st march 2002
* @version $Revision: 10857 $
*/
if ( ! defined( 'IN_IPB' ) )
{
print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files.";
exit();
}
class admin_core_ajax_hooks extends ipsAjaxCommand
{
/**
* Cache object
*
* @var object
*/
public $cache;
/**
* Hook ID
*
* @var integer
*/
public $hookId;
/**
* Hook data
*
* @var array
*/
public $hook;
/**
* Hook's export settings
*
* @var array
*/
public $data;
/**
* Hooks library
*
* @var object Hooks library
*/
protected $hooksFunctions;
/**
* Main class entry point
*
* @param object ipsRegistry reference
* @return @e void [Outputs to screen]
*/
public function doExecute( ipsRegistry $registry )
{
//-----------------------------------------
// Load skin
//-----------------------------------------
$this->html = ipsRegistry::getClass('output')->loadTemplate( 'cp_skin_hooks_export', 'core' );
//-----------------------------------------
// Load hooks library
//-----------------------------------------
$classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir('core') . '/sources/classes/hooksFunctions.php', 'hooksFunctions' );
$this->hooksFunctions = new $classToLoad( $registry );
//-----------------------------------------
// Load lang
//-----------------------------------------
ipsRegistry::getClass('class_localization')->loadLanguageFile( array( 'admin_hooks' ) );
switch( $this->request['do'] )
{
case 'getStrings':
$this->_getAjaxStrings();
break;
case 'getLangFiles':
$this->_getAjaxFiles();
break;
case 'getTemplates':
$this->_getAjaxTemplates();
break;
case 'getSkinFiles':
$this->_getAjaxSkins();
break;
// These are for the add file form
case 'getGroupsForAdd':
$this->_getGroupsForAdd();
break;
case 'getTemplatesForAdd':
$this->_getTemplatesForAdd();
break;
case 'getHookIds':
$this->_getHookIds();
break;
case 'getDataLocationsForAdd':
$this->_getDataLocationsForAdd();
break;
case 'getApplications':
$this->_getApplications();
break;
case 'getAppVersions':
$this->_getAppVersions();
break;
case 'save':
$this->save();
break;
case 'show':
default:
$this->show();
break;
}
}
/**
* Get applications
*
* @return @e void [Outputs to screen]
*/
protected function _getApplications()
{
/* Init vars */
$i = intval($this->request['i']);
$name = empty($this->request['name']) ? 'libApplication' : trim($this->request['name']);
$js = '';
$apps = array();
foreach( ipsRegistry::$applications as $dir => $appdata )
{
$apps[] = array( $dir, $appdata['app_title'] );
}
sort($apps);
/* A bit hackish.. */
if ( $name != 'libApplication' )
{
array_unshift( $apps, array( 0, $this->lang->words['a_selectone'] ) );
$js = "onchange='getAppVersions({$i})'";
}
$output = $this->registry->output->formDropdown( "{$name}[{$i}]", $apps, '', '', $js );
$this->returnHtml( $output );
}
/**
* Get application versions
*
* @return @e void [Outputs to screen]
*/
protected function _getAppVersions()
{
/* Init vars */
$i = intval($this->request['i']);
$app = trim($this->request['chosenApp']);
$versions = array();
/* Load setup library & get versions */
require_once( IPS_ROOT_PATH . 'setup/sources/base/setup.php' );/*noLibHook*/
$_versions = IPSSetUp::fetchXmlAppVersions( $app );
krsort($_versions);
/* Setup our default 'no version' value */
$versions[] = array( 0, $this->lang->words['h_any_version'] );
foreach( $_versions as $long => $human )
{
if ( $long < 30000 && in_array( $app, array( 'core', 'forums', 'members' ) ) )
{
continue;
}
$versions[] = array( $long, $human );
}
/* Return data ;o */
$minVersions = $this->registry->output->formDropdown( "minVersion[{$i}]", $versions );
$maxVersions = $this->registry->output->formDropdown( "minVersion[{$i}]", $versions );
$this->returnHtml( "{$this->lang->words['a_min']}: {$minVersions}<br /><br />{$this->lang->words['a_max']}: {$maxVersions}" );
}
/**
* Get data hook locations
*
* @return @e void [Outputs to screen]
*/
protected function _getDataLocationsForAdd()
{
$i = intval( $this->request['i'] );
$_locations = IPSLib::getDataHookLocations();
$output = $this->registry->output->formDropdown( "dataLocation[{$i}]", $_locations );
$this->returnHtml( $output );
}
/**
* Get all hook ids for a template/type
*
* @return @e void [Outputs to screen]
*/
protected function _getHookIds()
{
$i = intval( $this->request['i'] );
$group = IPSText::alphanumericalClean( $this->request['group'] );
$template = IPSText::alphanumericalClean( $this->request['template'] );
$type = IPSText::alphanumericalClean( $this->request['type'] );
$return = $this->hooksFunctions->getHookIds( $template, $type, $group );
$output = ( count($return) > 1 ) ? $this->registry->output->formDropdown( "id[{$i}]", $return, '', "id[{$i}]", "onchange='getHookEntryPoints({$i});'" ) : $this->lang->words['hook_no_hook_ids_found'];
$this->returnHtml( $output );
}
/**
* Get all skin files
*
* @return @e void [Outputs to screen]
*/
protected function _getGroupsForAdd()
{
$i = intval( $this->request['i'] );
$_skinFiles = $this->hooksFunctions->getSkinGroups();
$output = $this->registry->output->formDropdown( "skinGroup[{$i}]", $_skinFiles, null, "skinGroup[{$i}]", "onchange='getTemplatesForAdd({$i});'" );
$this->returnHtml( $output );
}
/**
* Get all skin templates
*
* @return @e void [Outputs to screen]
*/
protected function _getTemplatesForAdd()
{
$i = intval( $this->request['i'] );
$group = IPSText::alphanumericalClean( $this->request['group'] );
$_strings = $this->hooksFunctions->getSkinMethods( $group, true );
$output = $this->registry->output->formDropdown( "skinFunction[{$i}]", $_strings, null, "skinFunction[{$i}]", "onchange='getTypeOfHook({$i});'" );
$this->returnHtml( $output );
}
/**
* Get language strings in a given file
*
* @return @e void [Outputs to screen]
*/
protected function _getAjaxStrings()
{
$group = IPSText::alphanumericalClean( $this->request['group'] );
$i = intval( $this->request['i'] );
$hook = intval( $this->request['id'] );
$this->hookId = intval( $this->request['id'] );
$this->hook = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'core_hooks', 'where' => 'hook_id=' . $this->hookId ) );
$this->data = unserialize($this->hook['hook_extra_data']);
$_strings = $this->hooksFunctions->getStrings( $group );
$output = $this->registry->output->formMultiDropdown( "strings_{$i}[]", $_strings, $this->data['language'][ $group ], 5, "strings_{$i}", "", "' style='width: 100%'" );
$this->returnHtml( $output );
}
/**
* Get all language files
*
* @return @e void [Outputs to screen]
*/
protected function _getAjaxFiles()
{
$i = intval( $this->request['i'] );
$hook = intval( $this->request['id'] );
$this->hookId = intval( $this->request['id'] );
$this->hook = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'core_hooks', 'where' => 'hook_id=' . $this->hookId ) );
$this->data = unserialize($this->hook['hook_extra_data']);
$_langFiles = $this->hooksFunctions->getLanguageFiles();
$output = $this->registry->output->formDropdown( "language_{$i}", $_langFiles, null, "language_{$i}", "onchange='acp.hooks.generateStrings({$i});'" );
$this->returnHtml( $output );
}
/**
* Get skin templates in a given file
*
* @return @e void [Outputs to screen]
*/
protected function _getAjaxTemplates()
{
$group = IPSText::alphanumericalClean( $this->request['group'] );
$i = intval( $this->request['i'] );
$hook = intval( $this->request['id'] );
$this->hookId = intval( $this->request['id'] );
$this->hook = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'core_hooks', 'where' => 'hook_id=' . $this->hookId ) );
$this->data = unserialize($this->hook['hook_extra_data']);
$_strings = $this->hooksFunctions->getSkinMethods( $group );
$output = $this->registry->output->formMultiDropdown( "templates_{$i}[]", $_strings, $this->data['templates'][ $group ], 5, "templates_{$i}", "", "' style='width: 100%'" );
$this->returnHtml( $output );
}
/**
* Get all skin files
*
* @return @e void [Outputs to screen]
*/
protected function _getAjaxSkins()
{
$i = intval( $this->request['i'] );
$hook = intval( $this->request['id'] );
$this->hookId = intval( $this->request['id'] );
$this->hook = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'core_hooks', 'where' => 'hook_id=' . $this->hookId ) );
$this->data = unserialize($this->hook['hook_extra_data']);
$_skinFiles = $this->hooksFunctions->getSkinGroups();
$output = $this->registry->output->formDropdown( "skin_{$i}", $_skinFiles, null, "skin_{$i}", "onchange='acp.hooks.generateTemplates({$i});'" );
$this->returnHtml( $output );
}
/**
* Save the form
*
* @return @e void [Outputs to screen]
*/
protected function save()
{
//-----------------------------------------
// INIT
//-----------------------------------------
$name = trim( IPSText::alphanumericalClean( $this->request['name'] ) );
$this->hookId = intval( $this->request['id'] );
$this->hook = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'core_hooks', 'where' => 'hook_id=' . $this->hookId ) );
$this->data = IPSLib::isSerialized($this->hook['hook_extra_data']) ? unserialize($this->hook['hook_extra_data']) : array( 'display' => array() );
$output = '';
//-----------------------------------------
// Got a hook?
//-----------------------------------------
if ( ! $this->hook['hook_id'] )
{
$this->returnJsonError( $this->lang->words['hook_cannot_load'] );
}
//-----------------------------------------
// Run the proper operation
//-----------------------------------------
switch( $name )
{
case 'settings':
$_settingGroups = $this->hooksFunctions->getSettingGroups();
$_settings = $this->hooksFunctions->getSettings();
$toSave = array();
$toDisplay = array();
$toSave['settingGroups'] = array();
$toSave['settings'] = array();
if( is_array($this->request['setting_groups']) AND count($this->request['setting_groups']) )
{
$toSave['settingGroups'] = $this->request['setting_groups'];
foreach( $_settingGroups as $data )
{
if( in_array( $data[0], $toSave['settingGroups'] ) )
{
$toDisplay['settingGroups'][] = $data[1];
}
}
}
if( is_array($this->request['settings']) AND count($this->request['settings']) )
{
$toSave['settings'] = $this->request['settings'];
foreach( $_settings as $data )
{
if( in_array( $data[0], $toSave['settings'] ) )
{
$toDisplay['settings'][] = $data[1];
}
}
}
if( count($toSave['settingGroups']) )
{
$this->data['settingGroups'] = $toSave['settingGroups'];
}
else
{
unset($this->data['settingGroups']);
}
if( count($toSave['settings']) )
{
$this->data['settings'] = $toSave['settings'];
}
else
{
unset($this->data['settings']);
}
if( count($toDisplay['settingGroups']) )
{
$output .= "{$this->lang->words['hook_setting_groups']} " . implode( ', ', $toDisplay['settingGroups'] );
}
if( count($toDisplay['settings']) )
{
if( count($toDisplay['settingGroups']) )
{
$output .= '<br />';
}
$output .= "{$this->lang->words['hook_settings']} " . implode( ', ', $toDisplay['settings'] );
}
if( $output )
{
$this->data['display']['settings'] = $output;
}
else
{
$output = $this->lang->words['hook_no_settings'];
if ( isset($this->data['display']['settings']) )
{
unset($this->data['display']['settings']);
}
}
break;
case 'language':
$_langFiles = $this->hooksFunctions->getLanguageFiles();
$ids = array();
$files = array();
$strings = array();
$toDisplay = array();
$this->data['language'] = array();
foreach( $_POST as $k => $v )
{
if( preg_match( "/^language_(d+)$/", $k, $matches ) )
{
$files[ $matches[1] ] = $v;
$strings[ $matches[1] ] = $this->request[ 'strings_' . $matches[1] ];
$ids[ $matches[1] ] = $matches[1];
}
}
foreach( $ids as $id )
{
if( $files[ $id ] AND $strings[ $id ] )
{
$this->data['language'][ $files[ $id ] ] = $strings[ $id ];
$toDisplay[] = "{$this->lang->words['hook_from']} {$files[ $id ]}: " . implode( ', ', $strings[ $id ] );
}
}
if( ! count($this->data['language']) )
{
unset($this->data['language']);
}
if( count($toDisplay) )
{
$output .= implode( '<br />', $toDisplay );
}
if( $output )
{
$this->data['display']['language'] = $output;
}
else
{
$output = $this->lang->words['hook_no_language'];
if ( isset($this->data['display']['language']) )
{
unset($this->data['display']['language']);
}
}
break;
case 'modules':
$_modules = $this->hooksFunctions->getModules();
$toSave = array();
$toDisplay = array();
if( is_array($this->request['modules']) AND count($this->request['modules']) )
{
$toSave = $this->request['modules'];
}
foreach( $_modules as $data )
{
if( in_array( $data[0], $toSave ) )
{
$toDisplay[] = $data[1];
}
}
if( count($toDisplay) )
{
$output .= "{$this->lang->words['hook_modules']} " . implode( ', ', $toDisplay );
}
if( count($toSave) )
{
$this->data['modules'] = $toSave;
}
else
{
unset($this->data['modules']);
}
if( $output )
{
$this->data['display']['modules'] = $output;
}
else
{
$output = $this->lang->words['hook_no_modules'];
if ( isset($this->data['display']['modules']) )
{
unset($this->data['display']['modules']);
}
}
break;
case 'help':
$_help = $this->hooksFunctions->getHelpFiles();
$toSave = array();
$toDisplay = array();
if( is_array($this->request['help']) AND count($this->request['help']) )
{
$toSave = $this->request['help'];
}
foreach( $_help as $data )
{
if( in_array( $data[0], $toSave ) )
{
$toDisplay[] = $data[1];
}
}
if( count($toDisplay) )
{
$output .= "{$this->lang->words['hook_help']} " . implode( ', ', $toDisplay );
}
if( count($toSave) )
{
$this->data['help'] = $toSave;
}
else
{
unset($this->data['help']);
}
if( $output )
{
$this->data['display']['help'] = $output;
}
else
{
$output = $this->lang->words['hook_no_help'];
if ( isset($this->data['display']['help']) )
{
unset($this->data['display']['help']);
}
}
break;
case 'skins':
$_skinFiles = $this->hooksFunctions->getSkinGroups();
$ids = array();
$files = array();
$templates = array();
$toDisplay = array();
$this->data['templates'] = array();
foreach( $_POST as $k => $v )
{
if( preg_match( "/^skin_(d+)$/", $k, $matches ) )
{
$files[ $matches[1] ] = $v;
$_templates = array();
foreach( $this->request[ 'templates_' . $matches[1] ] as $v )
{
if( $v )
{
$templates[ $matches[1] ][] = $v;
}
}
$ids[ $matches[1] ] = $matches[1];
}
}
foreach( $ids as $id )
{
if( $files[ $id ] AND $templates[ $id ] )
{
$this->data['templates'][ $files[ $id ] ] = $templates[ $id ];
$toDisplay[] = "{$this->lang->words['hook_from']} {$files[ $id ]}: " . implode( ', ', $templates[ $id ] );
}
}
if( !count($this->data['templates']) )
{
unset($this->data['templates']);
}
if( count($toDisplay) )
{
$output .= implode( '<br />', $toDisplay );
}
if( $output )
{
$this->data['display']['templates'] = $output;
}
else
{
$output = $this->lang->words['hook_no_skin'];
if ( isset($this->data['display']['templates']) )
{
unset($this->data['display']['templates']);
}
}
break;
case 'css':
/* INIT */
$_cssFiles = $this->hooksFunctions->getCSSFiles();
$toSave = array();
$toDisplay = array();
/* Check to see if any were selected */
if( is_array( $this->request['css'] ) && count( $this->request['css'] ) )
{
$toSave = $this->request['css'];
}
/* Output */
foreach( $_cssFiles as $data )
{
if( in_array( $data[0], $toSave ) )
{
$toDisplay[] = $data[1];
}
}
if( count( $toDisplay ) )
{
$output .= "{$this->lang->words['hook_css']} " . implode( ', ', $toDisplay );
}
/* Save */
if( count($toSave) )
{
$this->data['css'] = $toSave;
}
else
{
unset($this->data['css']);
}
if( $output )
{
$this->data['display']['css'] = $output;
}
else
{
$output = $this->lang->words['hook_no_css'];
if ( isset($this->data['display']['css']) )
{
unset($this->data['display']['css']);
}
}
break;
case 'replacements':
/* INIT */
$_replacements = $this->hooksFunctions->getSkinReplacements();
$toSave = array();
$toDisplay = array();
/* Check to see if any were selected */
if( is_array( $this->request['replacements'] ) && count( $this->request['replacements'] ) )
{
$toSave = $this->request['replacements'];
}
/* Output */
foreach( $_replacements as $data )
{
if( in_array( $data[0], $toSave ) )
{
$toDisplay[] = $data[1];
}
}
if( count( $toDisplay ) )
{
$output .= "{$this->lang->words['hook_replacements']} " . implode( ', ', $toDisplay );
}
/* Save */
if( count($toSave) )
{
$this->data['replacements'] = $toSave;
}
else
{
unset($this->data['replacements']);
}
if( $output )
{
$this->data['display']['replacements'] = $output;
}
else
{
$output = $this->lang->words['hook_no_replacements'];
if ( isset($this->data['display']['replacements']) )
{
unset($this->data['display']['replacements']);
}
}
break;
case 'tasks':
$_tasks = $this->hooksFunctions->getTasks();
$toSave = array();
$toDisplay = array();
if( is_array($this->request['tasks']) AND count($this->request['tasks']) )
{
$toSave = $this->request['tasks'];
}
foreach( $_tasks as $data )
{
if( in_array( $data[0], $toSave ) )
{
$toDisplay[] = $data[1];
}
}
if( count($toDisplay) )
{
$output .= "{$this->lang->words['hook_tasks']} " . implode( ', ', $toDisplay );
}
if( count($toSave) )
{
$this->data['tasks'] = $toSave;
}
else
{
unset($this->data['tasks']);
}
if( $output )
{
$this->data['display']['tasks'] = $output;
}
else
{
$output = $this->lang->words['hook_no_tasks'];
if ( isset($this->data['display']['tasks']) )
{
unset($this->data['display']['tasks']);
}
}
break;
case 'database':
$types = array(
array( '0', $this->lang->words['hook_db_select'] ),
array( 'create', $this->lang->words['hook_db_create'] ),
array( 'alter', $this->lang->words['hook_db_alter'] ),
array( 'update', $this->lang->words['hook_db_update'] ),
array( 'insert', $this->lang->words['hook_db_insert'] ),
);
$alters = array(
array( 'add', $this->lang->words['hook_db_addnew'] ),
array( 'change', $this->lang->words['hook_db_change'] ),
array( 'remove', $this->lang->words['hook_db_drop'] ),
);
$ids = array();
$toDisplay = array();
$this->data['database'] = array();
/* Since this is more complicated, just get ids for now... */
foreach( $_POST as $k => $v )
{
if( preg_match( "/^type_(d+)$/", $k, $matches ) )
{
$ids[ $matches[1] ] = $matches[1];
}
}
/* Now loop through and set stuff properly.. */
foreach( $ids as $id )
{
$type = $this->request[ 'type_' . $id ];
if( !$type )
{
continue;
}
switch( $type )
{
case 'create':
$name = $this->request[ 'name_' . $id ];
$fields = IPSText::br2nl( $_POST[ 'fields_' . $id ] );
$tabletype = $this->request[ 'tabletype_' . $id ];
if( !$name OR !$fields )
{
continue;
}
$this->data['database']['create'][] = array(
'name' => $name,
'fields' => $fields,
'tabletype' => $tabletype
);
$text = "CREATE TABLE {$name} (
{$fields}
)";
if( $tabletype )
{
$text .= " ENGINE=" . $tabletype;
}
$toDisplay[] = nl2br($text);
break;
case 'alter':
$altertype = $this->request[ 'altertype_' . $id ];
$table = $this->request[ 'table_' . $id ];
$field = $this->request[ 'field_' . $id ];
$newfield = $this->request[ 'newfield_' . $id ];
$fieldtype = $this->request[ 'fieldtype_' . $id ];
$default = $_POST[ 'default_' . $id ];
if( !$altertype OR !$table OR !$field )
{
continue;
}
$this->data['database']['alter'][] = array(
'altertype' => $altertype,
'table' => $table,
'field' => $field,
'newfield' => $newfield,
'fieldtype' => $fieldtype,
'default' => $default,
);
$text = "ALTER TABLE {$table}";
switch( $altertype )
{
case 'add':
$text .= " ADD {$field} {$fieldtype}";
if( $default !== '' )
{
$text .= " DEFAULT {$default}";
}
break;
case 'change':
$text .= " CHANGE {$field} {$newfield} {$fieldtype}";
if( $default !== '' )
{
$text .= " DEFAULT {$default}";
}
break;
case 'remove':
$text .= " DROP {$field}";
break;
}
$toDisplay[] = nl2br($text);
break;
case 'update':
$table = $this->request[ 'table_' . $id ];
$field = $this->request[ 'field_' . $id ];
$newvalue = $_POST[ 'newvalue_' . $id ];
$oldvalue = $_POST[ 'oldvalue_' . $id ];
$where = $_POST[ 'where_' . $id ];
if( !$table OR !$field OR !$newvalue )
{
continue;
}
$this->data['database']['update'][] = array(
'table' => $table,
'field' => $field,
'newvalue' => $newvalue,
'oldvalue' => $oldvalue,
'where' => $where
);
$text = "UPDATE {$table} SET {$field}='{$newvalue}'";
if( $where )
{
$text .= " WHERE " . $where;
}
$toDisplay[] = nl2br($text);
break;
case 'insert':
$table = $this->request[ 'table_' . $id ];
$updates = $_POST[ 'updates_' . $id ];
$fordelete = $_POST[ 'fordelete_' . $id ];
if( !$table OR !$updates )
{
continue;
}
$this->data['database']['insert'][] = array(
'table' => $table,
'updates' => $updates,
'fordelete' => $fordelete,
);
$cols = array();
$vals = array();
$index = 0;
$toins = explode( ',', $updates );
foreach( $toins as $insertQuery )
{
$piece = explode( '=', $insertQuery );
$cols[ $index ] = $piece[0];
$vals[ $index ] = $piece[1];
$index++;
}
$text = "INSERT INTO {$table} (";
$text .= implode( ', ', $cols );
$text .= ") VALUES ('";
$text .= implode( "', '", $vals );
$text .= "')";
$toDisplay[] = nl2br($text);
break;
}
}
if( ! count($this->data['database']) )
{
unset($this->data['database']);
}
if( count($toDisplay) )
{
$output .= implode( '<br />', $toDisplay );
}
if( $output )
{
$this->data['display']['database'] = $output;
}
else
{
$output = $this->lang->words['hook_no_db'];
if ( isset($this->data['display']['database']) )
{
unset($this->data['display']['database']);
}
}
break;
case 'custom':
$toSave = '';
$toDisplay = '';
if( $this->request['custom'] )
{
$toSave = $this->request['custom'];
$toDisplay = $this->request['custom'];
}
if( $toDisplay )
{
$output .= "install_" . $toDisplay;
}
if( $toSave )
{
$this->data['custom'] = $toSave;
}
else
{
unset($this->data['custom']);
}
if( $output )
{
$this->data['display']['custom'] = $output;
}
else
{
$output = $this->lang->words['hook_no_custom'];
if ( isset($this->data['display']['custom']) )
{
unset($this->data['display']['custom']);
}
}
break;
}
/* Handle array data and save to DB */
if ( empty($this->data['display']) )
{
unset($this->data['display']);
}
$this->DB->update( 'core_hooks', array( 'hook_extra_data' => count($this->data) ? serialize($this->data) : '' ), 'hook_id=' . $this->hookId );
//-----------------------------------------
// Print...
//-----------------------------------------
$return = array( 'success' => true, 'message' => $output );
$this->returnJsonArray( $return );
}
/**
* Show the form
*
* @return @e void [Outputs to screen]
*/
protected function show()
{
//-----------------------------------------
// INIT
//-----------------------------------------
$name = trim( IPSText::alphanumericalClean( $this->request['name'] ) );
$this->hookId = intval( $this->request['id'] );
$this->hook = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'core_hooks', 'where' => 'hook_id=' . $this->hookId ) );
$this->data = unserialize($this->hook['hook_extra_data']);
$output = '';
//-----------------------------------------
// Got a member?
//-----------------------------------------
if ( ! $this->hook['hook_id'] )
{
$this->returnJsonError( $this->lang->words['hook_cannot_load'] );
}
//-----------------------------------------
// Run the proper operation
//-----------------------------------------
switch( $name )
{
case 'settings':
$_settingGroups = $this->hooksFunctions->getSettingGroups();
$_settings = $this->hooksFunctions->getSettings();
$form = array();
$form['groups'] = $this->registry->output->formMultiDropdown( "setting_groups[]", $_settingGroups, $this->data['settingGroups'], 5, "setting_groups" );
$form['settings'] = $this->registry->output->formMultiDropdown( "settings[]", $_settings, $this->data['settings'], 5, "settings" );
$output = $this->html->inline_settings( $this->hook, $form );
break;
case 'languages':
// We'll show the lang files and let them select lang file, then select strings, then they can repeat
$_langFiles = $this->hooksFunctions->getLanguageFiles();
$i = 1;
$form = array();
if( count($this->data['language']) )
{
foreach( $this->data['language'] as $file => $strings )
{
$form["language_file_{$i}"] = $this->registry->output->formDropdown( "language_{$i}", $_langFiles, $file, "language_{$i}", "onchange='acp.hooks.generateStrings({$i});'" );
$_strings = $this->hooksFunctions->getStrings( $file );
$form["language_strings_{$i}"] = $this->registry->output->formMultiDropdown( "strings_{$i}[]", $_strings, $strings, 5, "strings_{$i}", "", "' style='width: 100%'" );
$i++;
}
}
$form["language_file_{$i}"] = $this->registry->output->formDropdown( "language_{$i}", $_langFiles, null, "language_{$i}", "onchange='acp.hooks.generateStrings({$i});'" );
$output = $this->html->inline_languages( $this->hook, $form, $i );
break;
case 'modules':
$_modules = $this->hooksFunctions->getModules();
$form = array();
$form['modules'] = $this->registry->output->formMultiDropdown( "modules[]", $_modules, $this->data['modules'], 5, "modules" );
$output = $this->html->inline_modules( $this->hook, $form );
break;
case 'help':
$_help = $this->hooksFunctions->getHelpFiles();
$form = array();
$form['help'] = $this->registry->output->formMultiDropdown( "help[]", $_help, $this->data['help'], 5, "help" );
$output = $this->html->inline_help( $this->hook, $form );
break;
case 'skins':
// We'll show the skin groups and let them select skin file, then select templates, then they can repeat
$_skinFiles = $this->hooksFunctions->getSkinGroups();
$i = 1;
$form = array();
if( count($this->data['templates']) )
{
foreach( $this->data['templates'] as $file => $methods )
{
$form["skin_file_{$i}"] = $this->registry->output->formDropdown( "skin_{$i}", $_skinFiles, $file, "skin_{$i}", "onchange='acp.hooks.generateTemplates({$i});'" );
$_methods = $this->hooksFunctions->getSkinMethods( $file );
$form["skin_method_{$i}"] = $this->registry->output->formMultiDropdown( "templates_{$i}[]", $_methods, $methods, 5, "templates_{$i}", "", "' style='width: 100%'" );
$i++;
}
}
$form["skin_file_{$i}"] = $this->registry->output->formDropdown( "skin_{$i}", $_skinFiles, null, "skin_{$i}", "onchange='acp.hooks.generateTemplates({$i});'" );
$output = $this->html->inline_skins( $this->hook, $form, $i );
break;
case 'css':
$_cssFiles = $this->hooksFunctions->getCSSFiles();
$form = array();
$form['css'] = $this->registry->output->formMultiDropdown( "css[]", $_cssFiles, $this->data['css'], 5, "css" );
$output = $this->html->inline_css( $this->hook, $form );
break;
case 'replacements':
$_replacements = $this->hooksFunctions->getSkinReplacements();
$form = array();
$form['replacements'] = $this->registry->output->formMultiDropdown( "replacements[]", $_replacements, $this->data['replacements'], 5, "replacements" );
$output = $this->html->inline_replacements( $this->hook, $form );
break;
case 'tasks':
$_tasks = $this->hooksFunctions->getTasks();
$form = array();
$form['tasks'] = $this->registry->output->formMultiDropdown( "tasks[]", $_tasks, $this->data['tasks'], 5, "tasks" );
$output = $this->html->inline_tasks( $this->hook, $form );
break;
case 'database':
// First we'll show their current DB changes, then give them a dropdown to add another
$i = 1;
$form = array();
$types = array(
array( '0', $this->lang->words['hook_db_select'] ),
array( 'create', $this->lang->words['hook_db_create'] ),
array( 'alter', $this->lang->words['hook_db_alter'] ),
array( 'update', $this->lang->words['hook_db_update'] ),
array( 'insert', $this->lang->words['hook_db_insert'] ),
);
$alters = array(
array( 'add', $this->lang->words['hook_db_addnew'] ),
array( 'change', $this->lang->words['hook_db_change'] ),
array( 'remove', $this->lang->words['hook_db_drop'] ),
);
if( count($this->data['database']) )
{
foreach( $this->data['database'] as $type => $data )
{
foreach( $data as $change )
{
$form["type_{$i}"] = $this->registry->output->formDropdown( "type_{$i}", $types, $type, "type_{$i}", "onchange='acp.hooks.generateFields({$i});'" );
switch( $type )
{
case 'create':
$form['field_1_' . $i ] = $this->registry->output->formInput( "name_{$i}", $change['name'] );
$form['description_1_' . $i ] = $this->lang->words['desc_newtable'];
$form['field_2_' . $i ] = $this->registry->output->formTextarea( "fields_{$i}", htmlspecialchars( $change['fields'], ENT_QUOTES ) );
$form['description_2_' . $i ] = $this->lang->words['desc_fieldnames'];
$form['field_3_' . $i ] = $this->registry->output->formInput( "tabletype_{$i}", $change['tabletype'] );
$form['description_4_' . $i ] = $this->lang->words['desc_tabletype'];
break;
case 'alter':
$form['field_1_' . $i ] = $this->registry->output->formDropdown( "altertype_{$i}", $alters, $change['altertype'] );
$form['description_1_' . $i ] = $this->lang->words['desc_altertype'];
$form['field_2_' . $i ] = $this->registry->output->formInput( "table_{$i}", $change['table'] );
$form['description_2_' . $i ] = $this->lang->words['desc_newtable'];
$form['field_3_' . $i ] = $this->registry->output->formInput( "field_{$i}", $change['field'] );
$form['description_3_' . $i ] = $this->lang->words['desc_field'];
$form['field_4_' . $i ] = $this->registry->output->formInput( "newfield_{$i}", $change['newfield'] );
$form['description_4_' . $i ] = $this->lang->words['desc_changefield'];
$form['field_5_' . $i ] = $this->registry->output->formInput( "fieldtype_{$i}", $change['fieldtype'] );
$form['description_5_' . $i ] = $this->lang->words['desc_definition'];
$form['field_6_' . $i ] = $this->registry->output->formInput( "default_{$i}", htmlspecialchars( $change['default'], ENT_QUOTES ) );
$form['description_6_' . $i ] = $this->lang->words['desc_defaultvalue'];
break;
case 'update':
$form['field_1_' . $i ] = $this->registry->output->formInput( "table_{$i}", $change['table'] );
$form['description_1_' . $i ] = $this->lang->words['desc_newtable'];
$form['field_2_' . $i ] = $this->registry->output->formInput( "field_{$i}", $change['field'] );
$form['description_2_' . $i ] = $this->lang->words['desc_field'];
$form['field_3_' . $i ] = $this->registry->output->formInput( "newvalue_{$i}", htmlspecialchars( $change['newvalue'], ENT_QUOTES ) );
$form['description_3_' . $i ] = $this->lang->words['desc_newvalue'];
$form['field_4_' . $i ] = $this->registry->output->formInput( "oldvalue_{$i}", htmlspecialchars( $change['oldvalue'], ENT_QUOTES ) );
$form['description_4_' . $i ] = $this->lang->words['desc_oldvalue'];
$form['field_5_' . $i ] = $this->registry->output->formInput( "where_{$i}", htmlspecialchars( $change['where'], ENT_QUOTES ) );
$form['description_5_' . $i ] = $this->lang->words['desc_where'];
break;
case 'insert':
$form['field_1_' . $i ] = $this->registry->output->formInput( "table_{$i}", $change['table'] );
$form['description_1_' . $i ] = $this->lang->words['desc_newtable'];
$form['field_2_' . $i ] = $this->registry->output->formTextarea( "updates_{$i}", htmlspecialchars( $change['updates'], ENT_QUOTES ) );
$form['description_2_' . $i ] = $this->lang->words['desc_data'];
$form['field_3_' . $i ] = $this->registry->output->formInput( "fordelete_{$i}", htmlspecialchars( $change['fordelete'], ENT_QUOTES ) );
$form['description_3_' . $i ] = $this->lang->words['desc_revert'];
break;
}
$i++;
}
}
}
$form["type_{$i}"] = $this->registry->output->formDropdown( "type_{$i}", $types, null, "type_{$i}", "onchange='acp.hooks.generateFields({$i});'" );
$output = $this->html->inline_database( $this->hook, $form, $i );
break;
case 'custom':
$form = array();
$form['custom'] = $this->registry->output->formInput( "custom", $this->data['custom'] );
$output = $this->html->inline_custom( $this->hook, $form );
break;
}
//-----------------------------------------
// Print...
//-----------------------------------------
$this->returnHtml( $output );
}
}