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.