Domyślna aplikacja w IP.Board
Na wstępie może napiszę czym tak naprawdę jest domyślna aplikacja w
IP.Board
. Otóż jest to nic innego jak domyślnie wyświetlana zawartość podczas wchodzenia na „czysty” adres forum. Czystym adresem jest np.
http://www.ipsbeyond.pl
– dla takiego adresu domyślnie jest używana aplikacja forum. Aby zmienić tą aplikację na dowolnie inną wystarczy wykonać kilka bardzo prostych czynności.
A mianowicie logujemy się na FTP i przechodzimy do katalogu głównego forum. Następnie edytujemy plik initdata.php i szukamy w nim takiego wpisu:
define( 'IPS_DEFAULT_PUBLIC_APP', 'forums' );
Aby zmienić domyślną aplikację np. na blog wystarczy zamienić słowo forums na blog . Zapisać zmiany i wgrać na serwer.
A co w przypadku gdy chcemy pozwolić np. użytkownikom decydować o tym, jakiego wyglądu chcą używać? Tutaj sprawa nie jest już niestety taka prosta, o czym przekonałem się sam niedawno. Wydawało by się, że to nie jest w cale trudne, bo wystarczy w bazie danych w tabeli ibf_members dodać nową kolumnę, która będzie decydować o wybranym wyglądzie i odpowiednio ją wykorzystać gdzieś w skrypcie. Podstawowe pytanie każdego użytkownika w tym momencie powinno brzmieć gdzie? Ja osobiście postanowiłem to zrobić w głównym pliku czyli ipsRegistry.php .
Trochę to trwało ale się udało tego dokonać. Przedstawię fragment zmian jakie dokonałem w core systemu aby to wszystko działało jak należy.
Zacznijmy od zmiany w initdata.php
Na wstępie szukamy:
if ( ! defined( 'IPS_DEFAULT_APP' ) )
{
define( 'IPS_DEFAULT_APP', ( IPS_AREA == 'public' ) ? IPS_DEFAULT_PUBLIC_APP : 'core' );
}
i zamieniamy to na:
if ( ! defined( 'IPS_DEFAULT_APP' ) && IN_ACP )
{
define( 'IPS_DEFAULT_APP', 'core' );
}
następnie w ipsRegistry.php
szukamy:
/* _manageIncomingURLs MUST be called first!!! */
self::_setUpAppData();
/* Load app / coreVariables.. must be called after app Data */
self::_loadAppCoreVariables( IPS_APP_COMPONENT );
/* Must be called after _manageIncomingURLs */
self::$handles['db']->getDB()->setDebugMode( ( IPS_SQL_DEBUG_MODE ) ? ( isset($_GET['debug']) ? intval($_GET['debug']) : 0 ) : 0 );
/* Get caches */
self::$handles['caches'] = ips_CacheRegistry::instance();
/* Make sure all is well before we proceed */
try
{
self::instance()->setUpSettings();
}
catch( Exception $e )
{
print file_get_contents( DOC_IPS_ROOT_PATH . 'cache/skin_cache/settingsEmpty.html' );
exit;
}
/* Bah, now let's go over any input cleaning routines that have settings *sighs* */
self::$request = IPSLib::postParseIncomingRecursively( self::$request );
/* Set up dummy member class to prevent errors if cache rebuild required */
self::$handles['member'] = ips_MemberRegistryDummy::instance();
/* Build module and application caches */
self::instance()->checkCaches();
/* Set up app specific redirects. Must be called before member/sessions setup */
self::_parseAppResets();
/* Re-assign member */
unset( self::$handles['member'] );
self::$handles['member'] = ips_MemberRegistry::instance();
/* Load other classes */
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/class_localization.php', 'class_localization' );
self::instance()->setClass( 'class_localization', new $classToLoad( self::instance() ) );
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/class_public_permissions.php', 'classPublicPermissions' );
self::instance()->setClass( 'permissions' , new $classToLoad( self::instance() ) );
/* Must be called before output initiated */
self::getAppClass( IPS_APP_COMPONENT );
if ( IPS_AREA == 'admin' )
{
require_once( IPS_ROOT_PATH . 'sources/classes/output/publicOutput.php' );/*noLibHook*/
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/output/adminOutput.php', 'adminOutput' );
self::instance()->setClass( 'output' , new $classToLoad( self::instance() ) );
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . "sources/classes/class_admin_functions.php", 'adminFunctions' );
self::instance()->setClass( 'adminFunctions' , new $classToLoad( self::instance() ) );
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/class_permissions.php', 'class_permissions' );
self::instance()->setClass( 'class_permissions', new $classToLoad( self::instance() ) );
}
else
{
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/output/publicOutput.php', 'output' );
self::instance()->setClass( 'output', new $classToLoad( self::instance(), TRUE ) );
register_shutdown_function( array( 'ipsRegistry', '__myDestruct' ) );
}
/* Post member processing */
self::$handles['member']->postOutput();
/* Add SEO templates to the output system */
self::instance()->getClass('output')->seoTemplates = self::$_seoTemplates;
//-----------------------------------------
// Sort out report center early, so counts
// and cache is right
//-----------------------------------------
$memberData =& self::$handles['member']->fetchMemberData();
$memberData['showReportCenter'] = false;
i zastępujemy to następującym kodem:
//Modify by SolutionDEVs
if( IPS_AREA == 'public' && self::$request[ 'do' ] == 'logout' )
{
if ( ! defined( 'IPS_DEFAULT_APP' ) )
{
if ( IN_ACP )
{
define( 'IPS_DEFAULT_APP', 'core' );
}
else
{
define( 'IPS_DEFAULT_APP', 'forums' );
}
}
/* _manageIncomingURLs MUST be called first!!! */
self::_setUpAppData();
/* Load app / coreVariables.. must be called after app Data */
self::_loadAppCoreVariables( IPS_APP_COMPONENT );
/* Set up app specific redirects. Must be called before member/sessions setup */
self::_parseAppResets();
}
/* Must be called after _manageIncomingURLs */
self::$handles['db']->getDB()->setDebugMode( ( IPS_SQL_DEBUG_MODE ) ? ( isset($_GET['debug']) ? intval($_GET['debug']) : 0 ) : 0 );
/* Get caches */
self::$handles['caches'] = ips_CacheRegistry::instance();
/* Make sure all is well before we proceed */
try
{
self::instance()->setUpSettings();
}
catch( Exception $e )
{
print file_get_contents( DOC_IPS_ROOT_PATH . 'cache/skin_cache/settingsEmpty.html' );
exit;
}
/* Bah, now let's go over any input cleaning routines that have settings *sighs* */
self::$request = IPSLib::postParseIncomingRecursively( self::$request );
/* Set up dummy member class to prevent errors if cache rebuild required */
self::$handles['member'] = ips_MemberRegistryDummy::instance();
/* Build module and application caches */
self::instance()->checkCaches();
/* Re-assign member */
unset( self::$handles['member'] );
self::$handles['member'] = ips_MemberRegistry::instance();
/* Load other classes */
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/class_localization.php', 'class_localization' );
self::instance()->setClass( 'class_localization', new $classToLoad( self::instance() ) );
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/class_public_permissions.php', 'classPublicPermissions' );
self::instance()->setClass( 'permissions' , new $classToLoad( self::instance() ) );
/* Post member processing */
self::$handles['member']->postOutput();
$memberData =& self::$handles['member']->fetchMemberData();
if ( ! defined( 'IPS_DEFAULT_APP' ) )
{
if ( IN_ACP )
{
define( 'IPS_DEFAULT_APP', 'core' );
}
else
{
if( ( $memberData[ 'member_id' ] == 0 ) || ( $memberData[ 'member_id' ] > 0 && $memberData[ 'sd32_type_view' ] != 1 ) )
{
define( 'IPS_DEFAULT_APP', 'forums' );
}
else
{
define( 'IPS_DEFAULT_APP', 'MOJA_APLIKACJA' );
}
}
}
/* _manageIncomingURLs MUST be called first!!! */
self::_setUpAppData();
/* Load app / coreVariables.. must be called after app Data */
self::_loadAppCoreVariables( IPS_APP_COMPONENT );
/* Set up app specific redirects. Must be called before member/sessions setup */
self::_parseAppResets();
/* Must be called before output initiated */
self::getAppClass( IPS_APP_COMPONENT );
if ( IPS_AREA == 'admin' )
{
require_once( IPS_ROOT_PATH . 'sources/classes/output/publicOutput.php' );/*noLibHook*/
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/output/adminOutput.php', 'adminOutput' );
self::instance()->setClass( 'output' , new $classToLoad( self::instance() ) );
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . "sources/classes/class_admin_functions.php", 'adminFunctions' );
self::instance()->setClass( 'adminFunctions' , new $classToLoad( self::instance() ) );
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/class_permissions.php', 'class_permissions' );
self::instance()->setClass( 'class_permissions', new $classToLoad( self::instance() ) );
}
else
{
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/output/publicOutput.php', 'output' );
self::instance()->setClass( 'output', new $classToLoad( self::instance(), TRUE ) );
register_shutdown_function( array( 'ipsRegistry', '__myDestruct' ) );
}
/* Add SEO templates to the output system */
self::instance()->getClass('output')->seoTemplates = self::$_seoTemplates;
//-----------------------------------------
// Sort out report center early, so counts
// and cache is right
//-----------------------------------------
$memberData =& self::$handles['member']->fetchMemberData();
$memberData['showReportCenter'] = false;
if( IPS_AREA == 'public' )
{
self::$handles['member']->sessionClass()->updateMySession( array( 'current_appcomponent' => IPS_APP_COMPONENT ) );
}
Następnie jedyne co jeszcze musimy zrobić, to wprowadzić jakieś ustawienie w panelu użytkownika, lub w popup’ie. Metodę wykonania zostawiam już Wam :)
Jako opcja decydująca o wyborze aplikacji decyduje pole sd32_type_view w tabeli ibf_members, które możemy dodać w następujący sposób:
ALTER TABLE ibf_members ADD COLUMN sd32_type_view TINYINT UNSIGNED NOT NULL DEFAULT 0;
Jeśli ustawimy to pole na wartość 1, wtedy będzie odpalana domyślnie nasza aplikacja, natomiast goście i użytkownicy, którzy mają inną wartość w tym polu będą widzieć forum.
Artykuł był pisany w oparciu o wersję IP.Board 3.2.3 i nie obiecuję, że w najnowszej wersji 3.3.3 coś się nie zmieniło w ipsRegistry we fragmencie, który poddaliśmy edycji.