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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

HTML tags are not allowed.