<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Matt Mecham&#039;s Blog &#187; IPB</title>
	<atom:link href="http://blog.mattmecham.com/category/ipb/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mattmecham.com</link>
	<description>A utopia of randomness from a bloke who develops internet software and is also a dad</description>
	<lastBuildDate>Mon, 12 Dec 2011 16:27:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Thinking of switching from vBulletin?</title>
		<link>http://blog.mattmecham.com/2010/04/13/thinking-of-switching-from-vbulletin/</link>
		<comments>http://blog.mattmecham.com/2010/04/13/thinking-of-switching-from-vbulletin/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 10:20:35 +0000</pubDate>
		<dc:creator>Matt Mecham</dc:creator>
				<category><![CDATA[IPB]]></category>

		<guid isPermaLink="false">http://blog.mattmecham.com/?p=526</guid>
		<description><![CDATA[Part of my daily routine is reading our company forums, my Twitter timeline and other forum-centric forums. There is a growing buzz of interest from vBulletin customers unhappy with the direction Internet Brands is taking the product. It seems that with each incremental &#8216;maintenance&#8217; release we get an influx of new switchers and topics enquiring [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Part of my daily routine is reading our company forums, my Twitter timeline and other forum-centric forums. There is a growing buzz of interest from vBulletin customers unhappy with the direction Internet Brands is taking the product. It seems that with each incremental &#8216;maintenance&#8217; release we get an influx of new switchers and topics enquiring about switching.</p>
<p>This blog entry will attempt to consolidate some experiences from recent switchers. Those considering the move may find this information useful. It&#8217;s one thing for us (IPS) to tell you how good we think our product is, but it&#8217;s another to hear directly from those who have done what you are contemplating.</p>
<p>Bob Schwarz writes how he&#8217;s seen an increase in traffic since switching from vBulletin + vBSEO<br />
<a href="http://bobschwarz.com/forum-seo-vbulletinvbseo-vs-ipb-with-seo-urls">http://bobschwarz.com/forum-seo-vbulletinvbseo-vs-ipb-with-seo-urls</a></p>
<p>Bob also writes his &#8220;Goodbye&#8221; to vBulletin<br />
<a href="http://forum.ipbsetup.com/blog/2/entry-13-aws-blog/">http://forum.ipbsetup.com/blog/2/entry-13-aws-blog/</a></p>
<p>Cheyne Wallace writes about his experience with vBulletin and IP.Board<br />
<a href="http://gazeek.com/articles/vbulletin-to-ip-board-a-short-journey/">http://gazeek.com/articles/vbulletin-to-ip-board-a-short-journey/</a></p>
<p>Jamie writes about his experience moving from vBulletin to IP.Board<br />
<a href="http://community.invisionpower.com/blog/3003/entry-4821-the-move-from-vbulletin-to-ipb/">http://community.invisionpower.com/blog/3003/entry-4821-the-move-from-vbulletin-to-ipb/</a></p>
<p>Mike switched from vBulletin a few months ago and writes about his experience:<br />
<a href="http://www.ipb-webmaster.com/blog/2/entry-29-i-can-finally-say-it/">http://www.ipb-webmaster.com/blog/2/entry-29-i-can-finally-say-it/</a></p>
<p>SonicEffect, Shuvo and Glorify switched recently and write about their experience:<br />
<a href="http://community.invisionpower.com/topic/308554-from-internet-brands-to-invision-power-services/">http://community.invisionpower.com/topic/308554-from-internet-brands-to-invision-power-services/</a></p>
<p>Genesis writes about his experience with both vBulletin and IP.Board:<br />
<a href="http://zack.cncfps.com/post/146-ip-board-vs-vbulletin/">http://zack.cncfps.com/post/146-ip-board-vs-vbulletin/</a></p>
<p>Zocker-Foren writes about his experience switching:<br />
<a href="http://community.invisionpower.com/topic/308731-my-5-cents-for-switching-to-ips-from-jelsoft-or-internet-brands/">http://community.invisionpower.com/topic/308731-my-5-cents-for-switching-to-ips-from-jelsoft-or-internet-brands/</a></p>
<p>Bob Schwarz also writes up a converting guide:<br />
<a href="http://bobschwarz.com/howto-converting-from-vbulletin-to-ip-board">http://bobschwarz.com/howto-converting-from-vbulletin-to-ip-board</a></p>
<p>A topic containing links to recently switched sites:<br />
<a href="http://community.invisionpower.com/topic/308385-latest-vb-to-ipb-converts-list/">http://community.invisionpower.com/topic/308385-latest-vb-to-ipb-converts-list/</a></p>
<p>A topic containing many different viewpoints of switching:<br />
<a href="http://community.invisionpower.com/topic/304977-ex-vb-users-how-you-finding-ipb/">http://community.invisionpower.com/topic/304977-ex-vb-users-how-you-finding-ipb/</a></p>
<p>A list of &#8220;FAQs&#8221; written to help vBulletin users adjust:<br />
<a href="http://community.invisionpower.com/topic/296787-vbulletin-owners-handy-faqs/">http://community.invisionpower.com/topic/296787-vbulletin-owners-handy-faqs/</a></p>
<p>Please let me know if you find any more resources or topics and I&#8217;ll update the list. Thank you to everyone who has left feedback recently. We truly appreciate it.</p>
<p>(Updated 16th April with new links)</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://blog.mattmecham.com/2010/04/13/thinking-of-switching-from-vbulletin/' addthis:title='Thinking of switching from vBulletin? '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.mattmecham.com/2010/04/13/thinking-of-switching-from-vbulletin/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Why social networking is not the end for forums</title>
		<link>http://blog.mattmecham.com/2009/11/30/why-social-networking-is-not-the-end-for-forums/</link>
		<comments>http://blog.mattmecham.com/2009/11/30/why-social-networking-is-not-the-end-for-forums/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 10:30:18 +0000</pubDate>
		<dc:creator>Matt Mecham</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[IPB]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.mattmecham.com/?p=486</guid>
		<description><![CDATA[I see a lot of questions centred around social networking sites like Twitter and Facebook and how it will affect forums. I also see a lot of people saying that we should focus on social networking for IP.Board to stay competitive. This crops up every few days. It&#8217;s regular enough for me to try and [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I see a lot of questions centred around social networking sites like Twitter and Facebook and how it will affect forums. I also see a lot of people saying that we should focus on social networking for IP.Board to stay competitive. This crops up every few days. It&#8217;s regular enough for me to try and encapsulate my thoughts in a single easy-to-link-to blog entry.</p>
<p>Before I get into the real meat of the debate, let&#8217;s first take a look at social networking sites like Twitter and Facebook.</p>
<p>You&#8217;d be a fool to ignore the speed at which these sites have grown in popularity. I joined Facebook several years ago before the boom. Back then it was very US-centric and was literally a profile page with a few tools to communicate to other Facebook users. Twitter started life many years ago as &#8220;Twittr&#8221;; a simple service to allow remotely scattered developers working for a single company to keep up-to-date. Both of these sites have grown rapidly and evolved into hugely influential websites boasting trillions of page views and millions of users.</p>
<p>So, it&#8217;s natural to point to these sites and ask &#8220;Why can&#8217;t I have that?&#8221;.</p>
<p>The reason you can&#8217;t replicate Facebook on your own site is that <strong>forums are little islands of content</strong>. Your site is in a great and vast sea with many other islands all competing for the same tourism. Facebook and Twitter is a giant metropolis of users generating user-focused content. These users are well connected with new friends just a short click away.</p>
<p>The humble forum hasn&#8217;t changed much over the past decade. Sure, they look a bit cooler. They have a few more widgets and offer more interactivity but essentially they are the same as when I started hacking up BoardMaster ten long years ago. Back in the dark days of the internet forums were &#8216;bulletin boards&#8217;. Very simple programs in which you &#8220;logged on&#8221; and left a message. This evolved along with &#8220;<a href="http://en.wikipedia.org/wiki/LISTSERV">listserv</a>&#8221; another simple program to consolidate email conversations into a threaded discussion. The only real revolution came when <a href="http://en.wikipedia.org/wiki/Infopop">Infopop</a> (now amusingly named &#8216;Groupee&#8217;) created the flat view board that we&#8217;re all familiar with now.</p>
<p>The first question we should ask is why hasn&#8217;t the core functionality changed?</p>
<p>The answer is quite simple. The way we interact with forums hasn&#8217;t changed. Forums are <strong>content-centric</strong> by nature. This is a very important point to make. Very early bulletin boards cared little for the user apart from their email address or name so that one knew who authored the content. Think about the forums you regularly visit. Do you visit them to catch up with your buddies or do you visit them to join in a themed conversation? To get support on a product you own maybe? Or perhaps to catch up with the gossip after last nights X Factor? Whatever your reason, it&#8217;s almost certainly because of the <strong>content</strong>, not the <em>members</em>. </p>
<p>Forums haven&#8217;t changed because we still need strongly organised and categorised discussion. Facebook may have &#8220;discussion boards&#8221; on its group pages but it is a weak system. There have been a few stabs at changing forum software, but in most cases they are not successful because they miss the point.</p>
<p>I don&#8217;t wish to single out a single application, but <a href="http://vanillaforums.org/discussions">Vanilla</a> springs to mind. At first glance, it&#8217;s a nice clean board with minimal clutter that will surely appeal to many. But could you run a support community with that software? Can you imagine if you had five software products, how would you categorise the conversations? With Vanilla you couldn&#8217;t. And it&#8217;s the same with the Facebook discussion plug-in.</p>
<p>Successful forums have a purpose. I&#8217;ve seen hundreds of &#8220;My Chat Site&#8221; forums appear and vanish as quickly because they offer nothing unique. There are thousands of active forums that focus on a single interest, such as fitness, movies or cars. If these forums continue to market themselves correctly and generate a good deal of unique content each day they will be under no threat from Facebook or Twitter.</p>
<p><em>So, nothing&#8217;s changed in ten years?</em></p>
<p>Not quite. We, at IPS, have made a subtle change in our verbiage. We sell community building software, not forums. This is not just marketing mumbo-jumbo. It underlines that our software has features and tools to build a community. IP.Board is still content-centric but it has greatly expanded the amount of user-centric functionality. We have extended profiles, such as the user-photos, the about-me box, as well as blogs and gallery. These tools add value to your members and give them a <em>secondary</em> reason to come back to your island regularly.</p>
<p><em>So, why can&#8217;t I have a slice of Facebook for my Twilight fan site?</em></p>
<p>Facebook works because it&#8217;s a single site. If Facebook was downloadable software that you had to install then it wouldn&#8217;t work. You would need to create different log ins for each site and update each status update individually. Quite clearly that&#8217;s not going to set the world on fire.<br />
Twitter works because you make a status update and it&#8217;s immediately available to millions of people who can click a button and follow me, or reply to me, or RT my tweet. If you had to copy the tweet to your own Twitter site and paste it, or you had to sign up to my Twitter site to reply, it wouldn&#8217;t work.<br />
You can distill this into a simple statement: Facebook and Twitter is centred squarely on its members talking about <strong>themselves</strong>. A bewildering and expansive array of random subjects.</p>
<p>We, at IP.Board, could easily replicate Facebook&#8217;s tools and indeed we have started to see a few creep in, like status updates. But no matter how many &#8220;social networking&#8221; tools we add, I&#8217;m not going to join a Twilight Fan site just to update my status so I can tell its users about my day. Why would I? A Twilight Fan site is full of Twilight fans talking about Twilight. I have no interest in that, and they surely have no interest in me.</p>
<p>I&#8217;m sure many Twilight fans are interested in PHP coding, but you wouldn&#8217;t add a PHP coding forum to a Twilight fan site and expect it to generate hundreds of new members.</p>
<p><em>But Facebook is killing me and stealing all my users!</em></p>
<p>I don&#8217;t wish to be obtuse, but if Facebook really is stealing your users, then you need to take a good hard look at your forum and its place in the world. If you don&#8217;t have a strong theme or compelling content then your users won&#8217;t have a reason to come back and the few friendships that your users develop on your forum will be moved onto Facebook because Facebook is a much better at developing online friendships.</p>
<p>Take a look at any popular site. How about <a href="http://idolforums.com/">Idol Forums</a>; a forum for American Idol fans. Could you run that 21,000,000 post community from Facebook or Twitter and have it continue to thrive? Of course not.</p>
<p><em>So you&#8217;re saying that IP.Board will eschew social networking as if its some kind of pariah?</em></p>
<p>Not at all. This is the problem with stating your point of view, it&#8217;s instantly assumed that you oppose the other. This is not true. I see value in adding secondary reasons to get your members to come back. Whether that&#8217;s to check their personal conversations, or to write up their blogs, or to add their holiday snaps to their gallery. This is what makes your forum a community.</p>
<p>IP.Board 3 already uses Facebook Connect to allow you to syphon off a good slice of Facebook traffic into your community. Don&#8217;t expect people to join up just to chat. But if you have a unique reason to visit, people will. Especially as you can effectively log right into the board with your Facebook account.</p>
<p>You can use Facebook and Twitter to generate traffic to your site. We have an <a href="http://www.twitter.com/invisionps">official twitter account</a> and an <a href="http://www.facebook.com/pages/Forest-VA/Invision-Power-Services/138687025825">official Facebook page</a>. We use both of these mediums to drive traffic back to our site.</p>
<p>Keep marketing yourself well, compliment your site with social networking, keep your members happy and generating good content and you will continue to thrive.</p>
<p>I&#8217;ll leave you with this final thought, Jerry Springer style: If social networking is an unstoppable juggernaut that will devour the forum format then why have forward thinking companies such as <a href="https://forum.vodafone.ie/">Vodafone</a> and <a href="http://broadcast.oreilly.com/2009/11/announcing-oreilly-answers.html">O&#8217;Reilly</a> just commissioned new communities built with IP.Board?</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://blog.mattmecham.com/2009/11/30/why-social-networking-is-not-the-end-for-forums/' addthis:title='Why social networking is not the end for forums '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.mattmecham.com/2009/11/30/why-social-networking-is-not-the-end-for-forums/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>PHP 5 Will Make You A Better PHP Programmer</title>
		<link>http://blog.mattmecham.com/2008/10/03/php-5-will-make-you-a-better-php-programmer/</link>
		<comments>http://blog.mattmecham.com/2008/10/03/php-5-will-make-you-a-better-php-programmer/#comments</comments>
		<pubDate>Fri, 03 Oct 2008 11:37:26 +0000</pubDate>
		<dc:creator>Matt Mecham</dc:creator>
				<category><![CDATA[IPB]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.mattmecham.com/?p=221</guid>
		<description><![CDATA[My apologies for the overly verbose title of this blog entry. But it&#8217;s true. Embracing PHP 5 will make you a better programmer. At least, it has for me. This minor epiphany revealed itself during yesterday&#8217;s Captcha Crisis over at IPS HeadQuarters. In a nut shell, some naughty spammer defeated our CAPTCHA and registered thousands [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>My apologies for the overly verbose title of this blog entry. But it&#8217;s true. Embracing PHP 5 will make you a better programmer. At least, it has for me.</p>
<p>This minor epiphany revealed itself during yesterday&#8217;s <a href="http://forums.invisionpower.com/index.php?showtopic=277487">Captcha Crisis</a> over at IPS HeadQuarters. In a nut shell, some naughty spammer defeated our CAPTCHA and registered thousands of member accounts across hundreds of IP.Boards.</p>
<p>We had to react fast and <a href="http://forums.invisionpower.com/index.php?showtopic=277604&#038;view=getnewpost">release an update</a> that not only fixes our CAPTCHA but also integrated <a href="http://www.recaptcha.net">reCAPTCHA</a> which Brandon had already done for IP.Board 3.0.0.</p>
<p>Now, I&#8217;ve had my head stuck in IP.Board 3.0.0 since February. We made the decision to use PHP 5 so that we can take advantage of all the new &#8220;stuff&#8221; such as improved XML handling, public/private/protected methods and properties and magic methods to name a few. I started from scratch and wrote a brand new framework from the ground up using several PHP 5 tricks along the way. In short, it&#8217;s the classic MCV pattern using static utility classes and a singleton registery. I&#8217;ve blogged about it <a href="http://forums.invisionpower.com/blog/ips_news/index.php?showentry=2536">here</a> although that&#8217;s a touch out-of-date but still fairly representative of the new framework.</p>
<p>So. With many customers asking us for a fix, the pressure was on. Josh, Brandon and I down-tooled and went to work on IP.Board 2.3.6. And what a minor shock that was! After nearly 8 months of using the new framework, it seemed backward to use $this->ipsclass for everything. Worse, I was limited to using PHP 4. Worse still was that all the captcha calls were de-centralized. Ouch.</p>
<p>Captcha code was copied through many files. This is a natural progression for stable code that gets developed over time. You start off with the captcha in one place. You then want to add it elsewhere, so you copy the code and paste it in place. Rinse and repeat. You do this because there is a real fear of changing too much code for minor releases. Even though you know it&#8217;s bad.</p>
<p>I decided to write a micro-framework to handle all captcha challenges; to centralize it into one public facing class which calls on little plug-in classes which provide the functionality. Performing this routine task is when it I discovered just how much better PHP 5 is.</p>
<p>Without the ability to set methods and properties to private, the code seemed harder to departmentalize. Without magic methods to offload method requests, I had to make do with pointless functions to do the same. Without the ability to chain functions together, I had to fudge something that does the same job. Any desire to write nice and tight code goes out of the window with PHP 4. It doesn&#8217;t try very hard to do things properly, so you don&#8217;t.</p>
<p>Once the mini-framework was complete, I set about updating IP.Board 3.0.0 to use the same methods. Thankfully, we had already decentralized CAPTCHA creation to a single class. The ability to drop in new plugins and have new CAPTCHA methods seemed useful, so I re-wrote the framework for PHP 5 and it was much more pleasurable experience!</p>
<p>To compare, here&#8217;s the mini-framework in PHP 4:</p>
<pre><code>/**
	* Constructor bah to PHP 4
	*
	* @param	object		IPSClass object
	* @param	string		Captcha plug-in to use
	*/
	function class_captcha( $ipsclass, $plugin )
	{
		$this->ipsclass =&#038; $ipsclass;
		$plugin         = $this->ipsclass->txt_alphanumerical_clean( $plugin );</code>
		<code>
		if ( ! file_exists( KERNEL_PATH . 'class_captcha_plugin/' . $plugin . '.php' ) )
		{
			$plugin = 'default';
		}
		</code><code>
		require_once( KERNEL_PATH . 'class_captcha_plugin/' . $plugin . '.php' );
		$this->_plugInClass = new captchaPlugIn( $ipsclass );
	}
	</code><code>
	/**
	* Returns template bit
	*
	* @return string	HTML Template bit
	*/
	function getTemplate()
	{
		return $this->_plugInClass->getTemplate();
	}
</code><code>
	/**
	* Validate challenge
	*
	* @return	boolean
	* @since	1.0
	*/

	function validate()
	{
		return $this->_plugInClass->validate();
	}
</code><code>
	/**
	* Fetch Plug In Class Handle
	*
	* If you need it...
	*/
	function fetchPlugInClassHandle()
	{
		return $this->_plugInClass;
	}</code></pre>
<p>And here&#8217;s the same functionality, but in PHP 5:</p>
<pre><code>/**
	* Constructor
	*/
	function __construct( ipsRegistry $registry )
	{
		$this->registry = $registry;
		$this->DB       = $this->registry->DB();
		$this->settings = $this->registry->settings();
		$this->request  = $this->registry->request();
		$this->lang     = $this->registry->getClass('class_localization');
		$this->member   = $this->registry->member();
		</code><code>
		$plugin = $this->settings['bot_antispam_type'];
		</code><code>
		if ( ! file_exists( IPS_KERNEL_PATH . 'classCaptchaPlugin/' . $plugin . '.php' ) )
		{
			$plugin = 'default';
		}
	</code><code>
		require_once( IPS_KERNEL_PATH . 'classCaptchaPlugin/' . $plugin . '.php' );
		$this->_plugInClass = new captchaPlugIn( $registry );
	}
	</code><code>
	/**
	* Magic Call method
	*
	* @param	string	Method Name
	* @param	mixed	Method arguments
	* @return   mixed
	*/
	public function __call( $method, $arguments )
	{
		if ( method_exists( $this->_plugInClass, $method ) )
		{
			return $this->_plugInClass->$method( $arguments );
		}
		else
		{
			trigger_error( $method . " does not exist", E_USER_ERROR );
		}
	}
	</code><code>
	/**
	* Magic __get method
	*
	* @access	public
	* @param	mixed
	* @return	mixed
	*/
	public function __get( $name )
	{
		if ( property_exists( $this->_plugInClass, $name ) )
		{
			return $this->_plugInClass->$name;
		}
		else
		{
			trigger_error( $name . " does not exist", E_USER_ERROR );
		}
	}</code></pre>
<p>Now, isn&#8217;t that much nicer!</p>
<p>Take advantage of all PHP 5 offers and your code will improve. Just looking at the difference between IP.Board 2.3&#8242;s and IP.Board 3.0.0 proves that PHP 5 has helped me become a much better programmer.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://blog.mattmecham.com/2008/10/03/php-5-will-make-you-a-better-php-programmer/' addthis:title='PHP 5 Will Make You A Better PHP Programmer '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.mattmecham.com/2008/10/03/php-5-will-make-you-a-better-php-programmer/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>IPB 3: Creating a new framework using PHP 5</title>
		<link>http://blog.mattmecham.com/2008/05/14/ipb-3-creating-a-new-framework-using-php-5/</link>
		<comments>http://blog.mattmecham.com/2008/05/14/ipb-3-creating-a-new-framework-using-php-5/#comments</comments>
		<pubDate>Wed, 14 May 2008 20:11:05 +0000</pubDate>
		<dc:creator>Matt Mecham</dc:creator>
				<category><![CDATA[IPB]]></category>

		<guid isPermaLink="false">http://blog.mattmecham.com/?p=214</guid>
		<description><![CDATA[Originally posted at IPS: One of the biggest discussions we had during Invision Power Board 3.0&#8242;s planning was whether or not to drop support for PHP 4 and require a minimum of PHP 5. The advantages of using only PHP 5 were numerous and we really felt like we could increase security and efficiency by [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><strong>Originally posted at IPS:</strong><br />
One of the biggest discussions we had during Invision Power Board 3.0&#8242;s planning was whether or not to drop support for PHP 4 and require a minimum of PHP 5. The advantages of using only PHP 5 were numerous and we really felt like we could increase security and efficiency by taking advantage of the new PHP 5 features. This decision became much easier when we learned that PHP 4 was no longer being developed.</p>
<p>To really see the benefit of using PHP 5, one must first consider how Invision Power Board&#8217;s new framework is made possible by PHP 5.</p>
<p>Although Invision Power Board 1 and 2 were loosely based on the &#8216;front controller&#8217; design pattern, it had no real framework to hang the code on. The closest it had to one was the &#8216;ipsclass&#8217; super-class.</p>
<p>&#8216;ipsclass&#8217; was a convenient method of transporting various classes and functions around Invision Power Board. Convenient, but not ideal. One had to pass this &#8216;super-class&#8217; from class to class forcing PHP 4 to use a reference (and being severely punished when forgetting!). This super-class contained almost all the &#8216;core&#8217; functionality of Invision Power Board. Member, input and database objects were attached along with numerous other classes and functions. None of which was ordered in any logical format.</p>
<p>We have recoded Invision Power Board 3.0&#8242;s framework from the ground up. We have done away with the &#8216;ipsclass&#8217; super-class and employed the &#8216;Controller -> Command -> View&#8217; pattern. This allows us to quickly add new code and to allow fast refactoring of our existing code. This pattern is built upon the &#8216;IPS Registry&#8217;. This is a singleton class which maintains interfaces to several other registry objects (database, request, settings and member). Each of these objects maintains a clear place within the registry. This allows us to pass core data through the different levels of our pattern. Other functions from &#8216;ipsclass&#8217; are moved into singtons: &#8220;IPSLib&#8221;; disparate functions that do not belong elsewhere, &#8220;IPSText&#8221;; functions for parsing and cleaning text, &#8220;IPSCookie&#8221;; functions to handle cookie management and &#8220;IPSMember&#8221;; functions that deal with loading, saving and parsing members. This offers a clear structure with clear boundries for each singleton class. Being singletons, you do not need to pass or reference the class in other files.</p>
<p>Here&#8217;s an example:</p>
<p>IPB 2.3 Code<br />
<code>print $this->ipsclass->input['name'];<br />
$value = $this->ipsclass->settings['board_name']<br />
$id    = $this->ipsclass->member['id'];<br />
$this->ipsclass->input['f'] = 2;</code></p>
<p><code>print $this->ipsclass->get_cookie('foo');<br />
$text = $this->ipsclass->txt_alphanumerical_clean( $text );<br />
print $this->ipsclass->class_forums->build_info();</code></p>
<p>IPB 3.0 Code<br />
<code>print $this->request->getField('name');<br />
$value = $this->settings->getSetting('board_name');<br />
$id = $this->member->getProperty('member_id');<br />
$this->request->setField( 'f', 2 );</code></p>
<p><code>print IPSCookie::get('foo');<br />
$text = IPSText::alphanumerical_clean( $text );<br />
print $this->registry->getClass('class_forums')->build_info();</code></p>
<p>It&#8217;s worth noting that we have also applied the ArrayAccess interface to the registry, so you may access them like so:<br />
<code>print $this->request['name'];<br />
$this->settings['board_name'];</code></p>
<p>Although the code examples use $this->request, $this->member, etc, these are set up in a constructor. You would pass the IPS Registry singleton into the class. Here&#8217;s a typical constructor:<br />
<code>function __construct( ipsRegistry $registry )<br />
{<br />
    $this->registry = $registry;<br />
    $this->member   = $registry->member();<br />
    $this->request  = $registry->request();<br />
    $this->settings = $registry->settings();<br />
    $this->DB        = $registry->DB();<br />
}</code></p>
<p>You could also access the ipsRegistry class directly, although this is strongly discouraged:<br />
[code]print ipsRegistry::instance()->request()->getField('name');[/code]<br />
PHP 5 offers a much better OOP (object orientated programming) environment where references are assigned automatically. You can also chain along functions, which we make great use of. This allows us to do some neat trickery, like so:</p>
<p>IPB 2.3 Code<br />
<code>$this->ipsclass->load_template('skin_boards');<br />
print $this->ipsclass->compiled_templates['skin_boards']->board_index( $data );</code></p>
<p>IPB 3.0 Code<br />
<code>print $this->registry->getClass('output')->getTemplate('boards')->board_index($data);</code></p>
<p>You&#8217;ll note that you no longer have to implicitly load the template anymore. This is handled within the &#8216;getTemplate&#8217; function if it&#8217;s not already loaded. This object is then returned for use to chain onto &#8216;board_index()&#8217;. This simple adjustment of code makes for less manual code and less room for error.</p>
<p>We are also making great use of PHP 5 abstract classes and interfaces to define extensible classes. This will make it much easier and clearer for others writing their own additions to Invision Power Board. Having a clear interface to work with will reduce errors in development and formalize how you may access Invision Power Boards class structures.</p>
<p>The &#8216;controller -> command&#8217; structure is built so that you may add new modules and sections dynamically without the need to change a single line of code elsewhere in the script. Modification authors can just drop in new folders and Invision Power Board will run them when called correctly via a URL. The controller makes use of variables in a URL and safely loads a command file if a matching command file is located. For example: &#8220;appcomponent=core&#038;module=global&#038;section=login&#8221; is mapped to &#8220;applications/core/modules_public/global/login.php&#8221;. We make use of the Reflection class functions to ensure that any potential command file is a sub-class of the controller to prevent the risk of tampering.</p>
<p>We&#8217;ve barely scratched the surface, but it&#8217;s clear that Invision Power Board 3&#8242;s framework is very powerful and code-efficient. This is only made possible by the advancements in PHP 5 that we&#8217;ve taken full advantage of. </p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://blog.mattmecham.com/2008/05/14/ipb-3-creating-a-new-framework-using-php-5/' addthis:title='IPB 3: Creating a new framework using PHP 5 '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.mattmecham.com/2008/05/14/ipb-3-creating-a-new-framework-using-php-5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>My Name Is IPB</title>
		<link>http://blog.mattmecham.com/2007/01/23/my-name-is-ipb/</link>
		<comments>http://blog.mattmecham.com/2007/01/23/my-name-is-ipb/#comments</comments>
		<pubDate>Tue, 23 Jan 2007 20:39:44 +0000</pubDate>
		<dc:creator>Matt Mecham</dc:creator>
				<category><![CDATA[IPB]]></category>

		<guid isPermaLink="false">http://www.mattmecham.com/blog1/2007/01/23/my-name-is-ipb/</guid>
		<description><![CDATA[I got this via Josh and I think it&#8217;s pretty cool. One of our customers, TelevisionWithoutPity.com was recently mentioned in a My Name is Earl episode. Television Without Pity has been lucky enough to have its fair share of “shout-outs” and references from TV shows but the one on this week’s My Name is Earl [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>I got this via Josh and I think it&#8217;s pretty cool.</p>
<p>One of our customers, <a href="http://www.televisionwithoutpity.com">TelevisionWithoutPity.com</a> was recently mentioned in a My Name is Earl episode.</p>
<blockquote><p>Television Without Pity has been lucky enough to have its fair share of “shout-outs” and references from TV shows but the one on this week’s My Name is Earl really takes the cake.</p>
<p>The writing staff really planned ahead on this one. The TWoP user “whojackie” — who has been a member on the TWoP forums since 2005 — appeared as a character on the show and made a reference to the posters on the TWoP forums. That alone would be cool enough but that’s not the whole story here. </p></blockquote>
<p>Read the full story <a href="http://glark.org/?p=187">here</a>.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://blog.mattmecham.com/2007/01/23/my-name-is-ipb/' addthis:title='My Name Is IPB '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.mattmecham.com/2007/01/23/my-name-is-ipb/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Security, 53cu417y, &amp;#115ecurity</title>
		<link>http://blog.mattmecham.com/2006/07/20/security-53cu417y-115ecurity/</link>
		<comments>http://blog.mattmecham.com/2006/07/20/security-53cu417y-115ecurity/#comments</comments>
		<pubDate>Thu, 20 Jul 2006 16:15:36 +0000</pubDate>
		<dc:creator>Matt Mecham</dc:creator>
				<category><![CDATA[IPB]]></category>

		<guid isPermaLink="false">http://www.mattmecham.com/blog1/2006/07/20/security-53cu417y-115ecurity/</guid>
		<description><![CDATA[Well, what a month. It seems that just about every hacking group under the sun has been having a pop at Invision Power Board over the last few months. I remember back in the good old days an email was sent to you informing of any potential vulnerability before it was made public allowing you [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Well, what a month.</p>
<p>It seems that just about every hacking group under the sun has been having a pop at Invision Power Board over the last few months.</p>
<p>I remember back in the good old days an email was sent to you informing of any potential vulnerability before it was made public allowing you to fix the problem and send out patches to your customers and users. Now that&#8217;s extremely rare and more often than not the exploit is automated via a perl or PHP script which is then distributed to all the underground hacking groups which is posted on their forums for any moronic script kiddie to download and take down soccor mom boards for their own amusement.</p>
<p>With the risk of sounding like a whiny computer nerd, it&#8217;s tough being a web programmer these days. The dangerous balance of features versus security is very tough to maintain. A small mistake in your regex can potentially allow shell access to your server and a badly formed SQL query can allow your admin sessions to be taken. We&#8217;re seeing stuff that simply wasn&#8217;t possible a few years back thanks to the changes and developments in PHP and MySQL. &#8220;UNION SELECT&#8221; allows queries to be joined making a missing INTVAL() another notch on a hackers mouse cord.</p>
<p>IPB has become a very high profile target. Our customers include some of the biggest brands in the world (AMD, Sony, EMI, Warner Bros, etc) so it&#8217;s an obvious target for hackers. Also, our code is sold as readable source and not compiled which allows everyone to see the inner workings and work out possible weaknesses.</p>
<p>Of course, the responsibility lays firmly at the feet of the developers<br />
writing the code. It&#8217;s our job to make hacker&#8217;s lives as difficult as<br />
possible and with that in mind, we&#8217;ve made some huge changes to the IPB<br />
2.2.0 codebase. I don&#8217;t want to say too much other than every single<br />
exploit type that IPB has suffered with recently will no longer be<br />
possible. These changes have been made at the very core of the program so we&#8217;re not simply papering over the cracks.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://blog.mattmecham.com/2006/07/20/security-53cu417y-115ecurity/' addthis:title='Security, 53cu417y, &amp;#115ecurity '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.mattmecham.com/2006/07/20/security-53cu417y-115ecurity/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>Mac Format Magazine Reviews IPB</title>
		<link>http://blog.mattmecham.com/2006/05/03/mac-format-magazine-reviews-ipb/</link>
		<comments>http://blog.mattmecham.com/2006/05/03/mac-format-magazine-reviews-ipb/#comments</comments>
		<pubDate>Wed, 03 May 2006 16:39:36 +0000</pubDate>
		<dc:creator>Matt Mecham</dc:creator>
				<category><![CDATA[IPB]]></category>

		<guid isPermaLink="false">http://www.mattmecham.com/blog1/2006/05/03/mac-format-magazine-reviews-ipb/</guid>
		<description><![CDATA[Mac Format (UK) magazine reviewed Invision Power Board 2.1.5 for their June &#8217;06 issue and awards it 4.5 stars (out of 5). There are several features that really make Invision Power Board 2 stand out from other pre-built forums which you&#8217;ll appreciate if problems occur. People may start leaving unwanted or libellous posts, which can [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Mac Format (UK) magazine reviewed Invision Power Board 2.1.5 for their June &#8217;06 issue and awards it 4.5 stars (out of 5).</p>
<blockquote><p>There are several features that really make Invision Power Board 2 stand out from other pre-built forums which you&#8217;ll appreciate if problems occur. People may start leaving unwanted or libellous posts, which can lead the discussion away from the original subject or get you, as the administrator, in trouble. This is where the protective administrative features of the Invision Power Board win out over the bare bones forums every time.</p>
</blockquote>
<p><a href="http://www.invisionpower.com/press/ipb_review_mac_format_june0.jpg">Scanned Article</a> (400k JPEG)</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://blog.mattmecham.com/2006/05/03/mac-format-magazine-reviews-ipb/' addthis:title='Mac Format Magazine Reviews IPB '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.mattmecham.com/2006/05/03/mac-format-magazine-reviews-ipb/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>IPB, IPC and IPD</title>
		<link>http://blog.mattmecham.com/2006/03/22/ipb-ipc-and-ipd/</link>
		<comments>http://blog.mattmecham.com/2006/03/22/ipb-ipc-and-ipd/#comments</comments>
		<pubDate>Wed, 22 Mar 2006 20:59:42 +0000</pubDate>
		<dc:creator>Matt Mecham</dc:creator>
				<category><![CDATA[IPB]]></category>

		<guid isPermaLink="false">http://www.mattmecham.com/blog1/2006/03/22/ipb-ipc-and-ipd/</guid>
		<description><![CDATA[So far this week I&#8217;ve managed a little bit of everything. The biggest achievement being adding the IP.Converge installer. Rikki designed and Josh wrote a fairly generic IPS installer framework which I&#8217;ve tweaked for IP.Converge. It&#8217;s a really nice system that will be used for IPB and IPD to give a familiar look and feel [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>So far this week I&#8217;ve managed a little bit of everything.</p>
<p>The biggest achievement being adding the IP.Converge installer. Rikki designed and Josh wrote a fairly generic IPS installer framework which I&#8217;ve tweaked for IP.Converge. It&#8217;s a really nice system that will be used for IPB and IPD to give a familiar look and feel to our products.</p>
<p>I&#8217;ve adjusted it so that most of the database population is done via XML files to reduce the amount of &#8220;raw&#8221; SQL commands in an insert.php file. Manual inserts can be tricky when database schematics change, etc. IP.Converge only has one such manual insert SQL command which makes things much easier to maintain.</p>
<p>IPB 2.2 continues nicely. IP.Converge integration is totally finished and the new ACP in place. IP.Dynamic rolls on well, too. I&#8217;ve added a few &#8220;system&#8221; type tools to make maintenance easier. IP.Dynamic has certain &#8216;system&#8217; pages (log in form, registration form, etc) and these can now be  updated from a single XML file.</p>
<p>Keep an eye out for some announcements next week.</p>
<p><a href='http://blog.mattmecham.com/blogimages/ips_installer.jpg'>IP.Converge Installer</a></p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://blog.mattmecham.com/2006/03/22/ipb-ipc-and-ipd/' addthis:title='IPB, IPC and IPD '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.mattmecham.com/2006/03/22/ipb-ipc-and-ipd/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>IPB 2.2 Development Green Light</title>
		<link>http://blog.mattmecham.com/2006/03/20/ipb-22-development-green-light/</link>
		<comments>http://blog.mattmecham.com/2006/03/20/ipb-22-development-green-light/#comments</comments>
		<pubDate>Mon, 20 Mar 2006 20:33:33 +0000</pubDate>
		<dc:creator>Matt Mecham</dc:creator>
				<category><![CDATA[IPB]]></category>

		<guid isPermaLink="false">http://www.mattmecham.com/blog1/2006/03/20/ipb-22-development-green-light/</guid>
		<description><![CDATA[Invision Power Board (IPB) 2.2 has been in spec form for a few months. We paused IPB 2.2 when we worked on IP.Converge. This wasn&#8217;t done for lack of manpower &#8211; quite contrary, we have four full time developers and two part time developers &#8211; it was done so that we could see how much [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Invision Power Board (IPB) 2.2 has been in spec form for a few months. We paused IPB 2.2 when we worked on IP.Converge. This wasn&#8217;t done for lack of manpower &#8211; quite contrary, we have four full time developers and two part time developers &#8211; it was done so that we could see how much needed to be changed to enabled IP.Converge.</p>
<p>Now that IP.Converge is due to go into beta testing stages this week, IPB 2.2 development has continued. Naturally, it&#8217;s already IP.Converge-ready and the log in modules framework has been extended to allow IP.Converve to be used without the need for special IPB-Converge hacks which makes the code nice and clean.</p>
<p>The first thing I wanted to do is update the IPB 2.2 ACP to use the new IPS style (Nexus, Dynamic, Converge). Although we don&#8217;t intended to radically change the front-end skin, we felt the ACP skin needed to be updated so that our products retain some continuity.</p>
<p>Here&#8217;s a <a href="http://blog.mattmecham.com/blogimages/ipb22acp.jpg">screenshot of the IPB 2.2 ACP</a> as it stands today.</p>
<p>Expect more IPB 2.2 news over the coming weeks.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://blog.mattmecham.com/2006/03/20/ipb-22-development-green-light/' addthis:title='IPB 2.2 Development Green Light '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.mattmecham.com/2006/03/20/ipb-22-development-green-light/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>[IPB 2.1] Portal Plug-ins</title>
		<link>http://blog.mattmecham.com/2005/08/02/ipb-21-portal-plug-ins/</link>
		<comments>http://blog.mattmecham.com/2005/08/02/ipb-21-portal-plug-ins/#comments</comments>
		<pubDate>Tue, 02 Aug 2005 21:50:27 +0000</pubDate>
		<dc:creator>Matt Mecham</dc:creator>
				<category><![CDATA[IPB]]></category>

		<guid isPermaLink="false">http://www.mattmecham.com/blog1/2005/08/02/ipb-21-portal-plug-ins/</guid>
		<description><![CDATA[So, the final piece of the IPB 2.1.0 puzzle has been dropped into place: the portal overhaul. There are two major changes. One being that it&#8217;s now just another run-time module within the IPB framework. This means that there&#8217;s no separate index.php file for it and there&#8217;s no way for it to be run as [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>
So, the final piece of the IPB 2.1.0 puzzle has been dropped into place: the portal overhaul.
</p>
<p>
There are two major changes. One being that it&#8217;s now just another run-time module within the IPB framework. This means that there&#8217;s no separate index.php file for it and there&#8217;s no way for it to be run as a separate entity. This makes IPB -&gt; IP.Dynamic integration much easier. For those who don&#8217;t wish to run IP.Dynamic but still want a front page in other folder other than their forum&#8217;s directory, then the supplied index.php file which contains a simple header redirect to the forum&#8217;s installation will suffice.
</p>
<p>
The other change is the removal of hard-coded features and the introduction of a simple plug-in system. Basically, you can now specifiy special tags which correspond with a particular portal plug in. A portal plug in is a run-time file and a configuration file. This means that blog owners will be able to show recently updated blogs on their portal and gallery owners random images and such &#8211; all without touching a line of code. It&#8217;s a simple case of &#8220;drop in and forget&#8221;. Mod authors can write their own modules to add functionality without needing to edit any IPB code.
</p>
<p>
Hurrah.
</p>
<p>
<a href="'http://blog.mattmecham.com/blogimages/acp-portalplugins.jpg'">acp-portalplugins.jpg</a></p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://blog.mattmecham.com/2005/08/02/ipb-21-portal-plug-ins/' addthis:title='[IPB 2.1] Portal Plug-ins '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://blog.mattmecham.com/2005/08/02/ipb-21-portal-plug-ins/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>

