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. https://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:

[php]define( ‚IPS_DEFAULT_PUBLIC_APP’, ‚forums’ );[/php]

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:

[php]if ( ! defined( ‚IPS_DEFAULT_APP’ ) )
{
define( ‚IPS_DEFAULT_APP’, ( IPS_AREA == ‚public’ ) ? IPS_DEFAULT_PUBLIC_APP : ‚core’ );
}[/php]

i zamieniamy to na:

[php]if ( ! defined( ‚IPS_DEFAULT_APP’ ) && IN_ACP )
{
define( ‚IPS_DEFAULT_APP’, ‚core’ );
}[/php]

następnie w ipsRegistry.php

szukamy:

[php]/* _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;[/php]

i zastępujemy to następującym kodem:

[php]//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 ) );
}[/php]

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:

[sql]ALTER TABLE ibf_members ADD COLUMN sd32_type_view TINYINT UNSIGNED NOT NULL DEFAULT 0;[/sql]

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.

Write A Comment

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.