Input your search keywords and press Enter.

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

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' ) )<br />
{<br />
	define( 'IPS_DEFAULT_APP', ( IPS_AREA == 'public' ) ? IPS_DEFAULT_PUBLIC_APP : 'core' );<br />
}

i zamieniamy to na:

if ( ! defined( 'IPS_DEFAULT_APP' ) &amp;amp;&amp;amp; IN_ACP )<br />
{<br />
	define( 'IPS_DEFAULT_APP', 'core' );<br />
}

następnie w ipsRegistry.php

szukamy:

/* _manageIncomingURLs MUST be called first!!! */<br />
		self::_setUpAppData();</p>
<p>		/* Load app / coreVariables.. must be called after app Data */<br />
		self::_loadAppCoreVariables( IPS_APP_COMPONENT );</p>
<p>		/* Must be called after _manageIncomingURLs */<br />
		self::$handles['db']-&amp;gt;getDB()-&amp;gt;setDebugMode( ( IPS_SQL_DEBUG_MODE ) ? ( isset($_GET['debug']) ? intval($_GET['debug']) : 0 ) : 0 );</p>
<p>		/* Get caches */<br />
		self::$handles['caches']   = ips_CacheRegistry::instance();</p>
<p>		/* Make sure all is well before we proceed */<br />
		try<br />
		{<br />
			self::instance()-&amp;gt;setUpSettings();<br />
		}<br />
		catch( Exception $e )<br />
		{<br />
			print file_get_contents( DOC_IPS_ROOT_PATH . 'cache/skin_cache/settingsEmpty.html' );<br />
			exit;<br />
		}</p>
<p>		/* Bah, now let's go over any input cleaning routines that have settings *sighs* */<br />
		self::$request = IPSLib::postParseIncomingRecursively( self::$request );</p>
<p>		/* Set up dummy member class to prevent errors if cache rebuild required */<br />
		self::$handles['member']   = ips_MemberRegistryDummy::instance();</p>
<p>		/* Build module and application caches */<br />
		self::instance()-&amp;gt;checkCaches();</p>
<p>		/* Set up app specific redirects. Must be called before member/sessions setup */<br />
		self::_parseAppResets();</p>
<p>		/* Re-assign member */<br />
		unset( self::$handles['member'] );<br />
		self::$handles['member']   = ips_MemberRegistry::instance();</p>
<p>		/* Load other classes */<br />
		$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/class_localization.php', 'class_localization' );<br />
		self::instance()-&amp;gt;setClass( 'class_localization', new $classToLoad( self::instance() ) );</p>
<p>		$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/class_public_permissions.php', 'classPublicPermissions' );<br />
		self::instance()-&amp;gt;setClass( 'permissions'       , new $classToLoad( self::instance() ) );</p>
<p>		/* Must be called before output initiated */<br />
		self::getAppClass( IPS_APP_COMPONENT );</p>
<p>		if ( IPS_AREA == 'admin' )<br />
		{<br />
			require_once( IPS_ROOT_PATH . 'sources/classes/output/publicOutput.php' );/*noLibHook*/<br />
			$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/output/adminOutput.php', 'adminOutput' );<br />
			self::instance()-&amp;gt;setClass( 'output'           , new $classToLoad( self::instance() ) );</p>
<p>			$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . &quot;sources/classes/class_admin_functions.php&quot;, 'adminFunctions' );<br />
			self::instance()-&amp;gt;setClass( 'adminFunctions'   , new $classToLoad( self::instance() ) );</p>
<p>			$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/class_permissions.php', 'class_permissions' );<br />
			self::instance()-&amp;gt;setClass( 'class_permissions', new $classToLoad( self::instance() ) );<br />
		}<br />
		else<br />
		{<br />
			$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH  . 'sources/classes/output/publicOutput.php', 'output' );<br />
			self::instance()-&amp;gt;setClass( 'output', new $classToLoad( self::instance(), TRUE ) );</p>
<p>			register_shutdown_function( array( 'ipsRegistry', '__myDestruct' ) );<br />
		}</p>
<p>		/* Post member processing */<br />
		self::$handles['member']-&amp;gt;postOutput();</p>
<p>		/* Add SEO templates to the output system */<br />
		self::instance()-&amp;gt;getClass('output')-&amp;gt;seoTemplates = self::$_seoTemplates;</p>
<p>		//-----------------------------------------<br />
		// Sort out report center early, so counts<br />
		// and cache is right<br />
		//-----------------------------------------</p>
<p>		$memberData	=&amp;amp; self::$handles['member']-&amp;gt;fetchMemberData();<br />
		$memberData['showReportCenter']	= false;

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

//Modify by SolutionDEVs</p>
<p>	    if( IPS_AREA == 'public' &amp;amp;&amp;amp; self::$request[ 'do' ] == 'logout' )<br />
	    {<br />
	        if ( ! defined( 'IPS_DEFAULT_APP' ) )<br />
		    {<br />
        		if ( IN_ACP )<br />
                {<br />
                	define( 'IPS_DEFAULT_APP', 'core' );<br />
                }<br />
                else<br />
                {<br />
                    define( 'IPS_DEFAULT_APP', 'forums' );<br />
                }<br />
		    }</p>
<p>	        /* _manageIncomingURLs MUST be called first!!! */<br />
		    self::_setUpAppData();   </p>
<p>		    /* Load app / coreVariables.. must be called after app Data */<br />
		    self::_loadAppCoreVariables( IPS_APP_COMPONENT );</p>
<p>		    /* Set up app specific redirects. Must be called before member/sessions setup */<br />
		    self::_parseAppResets();<br />
	    }</p>
<p>		/* Must be called after _manageIncomingURLs */<br />
		self::$handles['db']-&amp;gt;getDB()-&amp;gt;setDebugMode( ( IPS_SQL_DEBUG_MODE ) ? ( isset($_GET['debug']) ? intval($_GET['debug']) : 0 ) : 0 );</p>
<p>		/* Get caches */<br />
		self::$handles['caches']   = ips_CacheRegistry::instance();</p>
<p>		/* Make sure all is well before we proceed */<br />
		try<br />
		{<br />
			self::instance()-&amp;gt;setUpSettings();<br />
		}<br />
		catch( Exception $e )<br />
		{<br />
			print file_get_contents( DOC_IPS_ROOT_PATH . 'cache/skin_cache/settingsEmpty.html' );<br />
			exit;<br />
		}</p>
<p>		/* Bah, now let's go over any input cleaning routines that have settings *sighs* */<br />
		self::$request = IPSLib::postParseIncomingRecursively( self::$request );</p>
<p>		/* Set up dummy member class to prevent errors if cache rebuild required */<br />
		self::$handles['member']   = ips_MemberRegistryDummy::instance();</p>
<p>		/* Build module and application caches */<br />
		self::instance()-&amp;gt;checkCaches();</p>
<p>		/* Re-assign member */<br />
		unset( self::$handles['member'] );<br />
		self::$handles['member']   = ips_MemberRegistry::instance();</p>
<p>		/* Load other classes */<br />
		$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/class_localization.php', 'class_localization' );<br />
		self::instance()-&amp;gt;setClass( 'class_localization', new $classToLoad( self::instance() ) );</p>
<p>		$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/class_public_permissions.php', 'classPublicPermissions' );<br />
		self::instance()-&amp;gt;setClass( 'permissions'       , new $classToLoad( self::instance() ) );</p>
<p>		/* Post member processing */<br />
		self::$handles['member']-&amp;gt;postOutput();</p>
<p>		$memberData	=&amp;amp; self::$handles['member']-&amp;gt;fetchMemberData();</p>
<p>		if ( ! defined( 'IPS_DEFAULT_APP' ) )<br />
		{<br />
    		if ( IN_ACP )<br />
            {<br />
            	define( 'IPS_DEFAULT_APP', 'core' );<br />
            }<br />
            else<br />
            {<br />
                if( ( $memberData[ 'member_id' ] == 0 ) || ( $memberData[  'member_id' ] &amp;gt; 0 &amp;amp;&amp;amp; $memberData[  'sd32_type_view' ] != 1 ) )<br />
                {<br />
                    define( 'IPS_DEFAULT_APP', 'forums' );<br />
                }<br />
                else<br />
                {<br />
                    define( 'IPS_DEFAULT_APP', 'MOJA_APLIKACJA' );</p>
<p>                }<br />
            }<br />
		}</p>
<p>		/* _manageIncomingURLs MUST be called first!!! */<br />
		self::_setUpAppData();</p>
<p>		/* Load app / coreVariables.. must be called after app Data */<br />
		self::_loadAppCoreVariables( IPS_APP_COMPONENT );</p>
<p>		/* Set up app specific redirects. Must be called before member/sessions setup */<br />
		self::_parseAppResets();</p>
<p>		/* Must be called before output initiated */<br />
		self::getAppClass( IPS_APP_COMPONENT );</p>
<p>		if ( IPS_AREA == 'admin' )<br />
		{<br />
			require_once( IPS_ROOT_PATH . 'sources/classes/output/publicOutput.php' );/*noLibHook*/<br />
			$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/output/adminOutput.php', 'adminOutput' );<br />
			self::instance()-&amp;gt;setClass( 'output'           , new $classToLoad( self::instance() ) );</p>
<p>			$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . &quot;sources/classes/class_admin_functions.php&quot;, 'adminFunctions' );<br />
			self::instance()-&amp;gt;setClass( 'adminFunctions'   , new $classToLoad( self::instance() ) );</p>
<p>			$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/class_permissions.php', 'class_permissions' );<br />
			self::instance()-&amp;gt;setClass( 'class_permissions', new $classToLoad( self::instance() ) );<br />
		}<br />
		else<br />
		{<br />
			$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH  . 'sources/classes/output/publicOutput.php', 'output' );<br />
			self::instance()-&amp;gt;setClass( 'output', new $classToLoad( self::instance(), TRUE ) );</p>
<p>			register_shutdown_function( array( 'ipsRegistry', '__myDestruct' ) );<br />
		}</p>
<p>		/* Add SEO templates to the output system */<br />
		self::instance()-&amp;gt;getClass('output')-&amp;gt;seoTemplates = self::$_seoTemplates;</p>
<p>		//-----------------------------------------<br />
		// Sort out report center early, so counts<br />
		// and cache is right<br />
		//-----------------------------------------</p>
<p>		$memberData	=&amp;amp; self::$handles['member']-&amp;gt;fetchMemberData();<br />
		$memberData['showReportCenter']	= false;</p>
<p>		if( IPS_AREA == 'public' )<br />
		{<br />
    		self::$handles['member']-&amp;gt;sessionClass()-&amp;gt;updateMySession( array( 'current_appcomponent' =&amp;gt; IPS_APP_COMPONENT ) );<br />
		}

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 email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

 

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

Przeczytaj poprzedni wpis:
vRocking – skin dla IP.Board 3.3.x

Ostatnim ciemnym skinem jaki wykonałem jest vRocking, który został wykonany także w tonacji ciemnej.

Zamknij