<?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>Stuck Together With Tape &#187; PHP</title>
	<atom:link href="http://www.stucktogetherwithtape.com/blog/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.stucktogetherwithtape.com/blog</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Fri, 12 Nov 2010 22:38:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Bullet Proof CMS record ordering pattern</title>
		<link>http://www.stucktogetherwithtape.com/blog/2010/10/bullet-proof-cms-record-ordering-pattern/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=bullet-proof-cms-record-ordering-pattern</link>
		<comments>http://www.stucktogetherwithtape.com/blog/2010/10/bullet-proof-cms-record-ordering-pattern/#comments</comments>
		<pubDate>Thu, 07 Oct 2010 17:28:17 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.stucktogetherwithtape.com/blog/?p=137</guid>
		<description><![CDATA[When building a custom backend, quite often a client will ask for the ablilty to order records/posts/images&#8230; Here&#8217;s a tried and tested method i use to build this functionality. It will work with or without js. In this example we will order the traditional post records. 1. The Database Create a table to hold your [...]]]></description>
			<content:encoded><![CDATA[<p>When building a custom backend, quite often a client will ask for the ablilty to order records/posts/images&#8230;</p>
<p>Here&#8217;s a tried and tested method i use to build this functionality. It will work with or without js. In this example we will order the <em>traditional</em> post  records.</p>
<h3>1. The Database</h3>
<p>Create a table to hold your posts and include a column (int) called <strong>order</strong>.</p>
<h3>2. Adding a new record</h3>
<p>Each time a new post is saved, the order column is assigned the auto inc value of the rows <strong>id</strong>. This prevents records from ever having the same order value.</p>
<h3>3. The order view (HTML)</h3>
<p>To provide the user with a way to order posts records, i&#8217;ll start with the HTML. This process is designed to degrade gracefully when JS is disabled. Dont worry if this process seems a bit clunky to the user, chances are they&#8217;ll have js turned on. I have found by restricting yourself to develop for HTML first created better structured and semantic code. Quite often divining straight in there with the javascript will get the job done, but it&#8217;ll be a headache to maintain.<br />
<span id="more-137"></span><br />
We&#8217;ll present the records in a ordered list, <em>cause we roll semantically like that</em>. Each li represents a post in the database They are ordered by their current order value.</p>
<pre><code>form
	ol
		li
			select</code></pre>
<p>Inside each li element is a select dropdown form input to hold each records order value. The possible options of the selectbox should be <strong>limited</strong> to the order values in the current record subset.</p>
<p>Again, this is prevents records having the same order value. Name the select box something like order[record-&gt;id]. So the post array will contain an array of record id =&gt; order value.</p>
<p>Stick a submit button at the bottom of that form and we&#8217;re all set&#8230;</p>
<h3>4. The MySql/Post Process</h3>
<p>A user changes some order values and then submits the form. First thing we need to do is check for duplicate order values. Some bright spark could have set all the select boxes to the same value! A quick way to do this is to use the php <a href="http://php.net/manual/en/function.array-unique.php">array_unique</a> function.<br />
This will return all unique values in the order array, so if all values in the array are unique, we&#8217;re golden.</p>
<pre><code>$unique = array_unique($_POST['order']);
// if arrays are equal no dupicates posted
if($unique == $order_values)</code></pre>
<p>If the user has posted duplicate order values you can provide feedback and get em to try again. After we have added a lick of jquery however, hopefully this will rarely happen!.</p>
<p>Once unique order values have been validated, its just a simple case of updating the order values of each post row by the post array key with the posted order value. Code will vary depending on what frameworks your using. Below is an example of what my Codeigniter Code would look like</p>
<pre><code>foreach($this-&gt;input-&gt;post('order') as $id =&gt; $order)
{
	$post = new Post($id);
	$post-&gt;order = $order;
	$post-&gt;save();
}</code></pre>
<p>Simples.</p>
<h3>The Javascript</h3>
<p>We have a basic, fugly but solid solution working. Now the fun part. With a few lines of jquery we can turn this into a fancy, elegant AND solid solution! We will use the jqueryui sortable plugin so the user can drag and re-order the list items. There is no need to show the selectboxes now because we have visual feedback on the current order. We&#8217;ll hide the selectboxes and then update their value whenever the list is reordered.</p>
<p>Here&#8217;s the code, the ol has an id of record-order.</p>
<pre><code>// updates the order value of all items hidden
// selectbox to the current order after a drag has taken place
$("#record-order").sortable({
	update: function(event, ui){
		var options = new Array();

		// get an array of order option values
		$(this).find('li:first select option').each(
			function(i){
				options[i] = $(this).val();
			}
		);

		$(this).children('li').each(
			function(i){
				var v = $(this).find('select').val(options[i])
			}
		);
	}
});</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.stucktogetherwithtape.com/blog/2010/10/bullet-proof-cms-record-ordering-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Winters coming, WrapUp!</title>
		<link>http://www.stucktogetherwithtape.com/blog/2009/10/winters-coming-wrapup/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=winters-coming-wrapup</link>
		<comments>http://www.stucktogetherwithtape.com/blog/2009/10/winters-coming-wrapup/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 13:28:09 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[head]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[libraries]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[wrapup]]></category>

		<guid isPermaLink="false">http://www.stucktogetherwithtape.com/?p=20</guid>
		<description><![CDATA[I&#8217;ve been using this library, or iteration of, for about a year now and have finally had time to document it properly. WrapUp is a CodeIgniter Library to manage your sites &#60;head&#62; element. Defining the doctype Setting the page title Adding meta data Adding CSS Addming Javascript files This saves alot of time getting a [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using this library, or iteration of, for about a year now and have finally had time to document it properly. WrapUp is a CodeIgniter Library to manage your sites &lt;head&gt; element.</p>
<p>Defining the doctype<br />
Setting the page title<br />
Adding meta data<br />
Adding CSS<br />
Addming Javascript files</p>
<p>This saves alot of time getting a site up and running. Its also extremly handy for large sites as you can define your default meta data, css &amp; javascript in a __constructor so its is inhereted by all pages on the site.</p>
<p>A few examples of WrapUp can be found after the jump.</p>
<p><span id="more-20"></span></p>
<p>Load the library, you&#8217;ll probably want to autoload this if you are using it on the whole site.</p>
<p><code>$this−&gt;load−&gt;library('wrapup');</code></p>
<p>The WrapUp library enables you to quickly get an HTML page up and running.</p>
<p><code>$this-&gt;wrapup-&gt;head();</code></p>
<p>The <strong>head()</strong> function returns the basic html head structure as a string.</p>
<p>There&#8217;s not a lot to it but from here you can easily customise your head page, set up defaults and overide/add elements for specific pages.</p>
<p>I normally create a MY_Controller which all my classes inherit from. Then all my default head elements, css links, js files are added to the wrapup library in the MY_Controller constructor.</p>
<p><code>// set doctype to transistional<br />
$this-&gt;wrapup-&gt;set_doctype('t');<br />
// add charset meta tag<br />
$meta = array(<br />
'http-equiv' =&gt;'Content-type',<br />
'content' =&gt; 'text/html;charset=UTF-8'<br />
);<br />
$this-&gt;wrapup-&gt;add_meta(meta);<br />
// add default css stylesheet<br />
$this-&gt;wrapup-&gt;add_css('style.css');<br />
// add google jquery script<br />
$this-&gt;wrapup-&gt;add_js('jquery.min.js');<br />
// add a default page titles<br />
$this-&gt;wrapup-&gt;set_title('My Page Title');</code></p>
<p>This sets up our default page head element. I find it saves me a lot of time if I ever need to change the default style sheet for instance or the doctype. I only have to change it in one place!</p>
<p>Another feature of WrapUp is managing inline javascript and CSS. I try not to include any inline CSS due to the dreaded <a href="http://en.wikipedia.org/wiki/Flash_of_unstyled_content" target="_blank">FOUC</a> but its useful for debugging. Using WrapUp to manage you javascript enables you to generate javascript programatically (include server side variables) and group all off your javascript and send it to the browser at the bottom of the page right before closing your body tags.</p>
<p>You can add inline javascript by calling the add_js_inline() WrapUp method.</p>
<p><code>$js = 'function say_hello(){alert("hello");}';<br />
$this-&gt;wrapup-&gt;add_js_inline($js);</code></p>
<p>Inline code can then be returned in your view by calling inline() method</p>
<p><code>$this-&gt;wrapup-&gt;inline();</code></p>
<p>So that&#8217;s about it for an introduction to WrapUp, no doubt i&#8217;ll add/tweak it as I discover news needs. Checkout the full <a title="WrapUp Docs" href="http://www.stucktogetherwithtape.com/user_guide/wrapup">documentation</a> in the code vault to see other methods like add_rss()</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.stucktogetherwithtape.com/blog/2009/10/winters-coming-wrapup/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Oi, Mind your Messages</title>
		<link>http://www.stucktogetherwithtape.com/blog/2009/10/oi-mind-your-messages/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=oi-mind-your-messages</link>
		<comments>http://www.stucktogetherwithtape.com/blog/2009/10/oi-mind-your-messages/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 22:03:15 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[notifications]]></category>

		<guid isPermaLink="false">http://www.stucktogetherwithtape.com/blog/?p=78</guid>
		<description><![CDATA[Often, I find I need to send notifications to the user (webpage) during server code. This may be a warning, notification, or a message that an action has hapend. If you&#8217;re using a MVC framework it&#8217;s not practical to exit running code or echo out the message. From a User Interface perspective it is also imperative [...]]]></description>
			<content:encoded><![CDATA[<p>Often, I find I need to send notifications to the user (webpage) during server code. This may be a warning, notification, or a message that an action has hapend. If you&#8217;re using a MVC framework it&#8217;s not practical to exit running code or echo out the message. From a User Interface perspective it is also imperative that the user knows where to look for these notifications and what they mean.<br />
<span id="more-78"></span><br />
This all lead me to develop a re-usable solution to drop into any project. As all most all of the sites I work on use CodeIgniter now, once again a CI Library was the obvious choice. <strong>Oi</strong> is notifications management system that, when stripped to its basic behaviour, has two uses.</p>
<ul>
<li>Stores new notifications added by the application</li>
<li>Returns all unread notices added by the application</li>
</ul>
<p>Pretty Simple. Added to that it will also remember notices between page redirects. So if you add a notice and then reach some code that triggers a redirect the notice will be displayed on the next page.</p>
<p>The library is now in its second incarnation. My original version supported three types of notices</p>
<ol>
<li><strong>Success</strong> (Well done, something that was meant to happen has happened)</li>
<li><strong>Message</strong> (Nothings gone wrong, nothings gone right. Just wanted to say a little something)</li>
<li><strong>Error</strong> (Oh shit, what did you do? Now i&#8217;m gonna have to tidy up after you again!)</li>
</ol>
<p>Each message would be returned as separate elements with a relevant class representing the type. This was pretty sufficient for most applications but there were times when I wanted to add more attributes (classes, titles, ids) or just needed another &#8216;type&#8217;.</p>
<p>So the new version uses the magic php method __call to provide an unlimited number of &#8216;types&#8217; via the method $oi-&gt;add_{<strong>type</strong>}($string);</p>
<p>e.g.<br />
<code>$this-&gt;oi-&gt;add_message('Well Done');</code></p>
<p>or</p>
<p><code>$this-&gt;oi-&gt;add_reallylongandimpressivesupertype('Hello');</code></p>
<p>More examples and documentation available in the <a href="http://www.stucktogetherwithtape.com/code">code</a> section</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stucktogetherwithtape.com/blog/2009/10/oi-mind-your-messages/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Shortie v1.0 Released</title>
		<link>http://www.stucktogetherwithtape.com/blog/2009/10/shortie-v1-0-released/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=shortie-v1-0-released</link>
		<comments>http://www.stucktogetherwithtape.com/blog/2009/10/shortie-v1-0-released/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 21:37:51 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[shortie]]></category>
		<category><![CDATA[urls]]></category>

		<guid isPermaLink="false">http://www.stucktogetherwithtape.com/blog/?p=54</guid>
		<description><![CDATA[Recently I needed code to shorten URLS and tweet said url as a twitter update. This all needed to happen in their existing CMS built using Codeigniter. Turns out the twitter part was easy, thanks to simonmaddox&#8217;s nice twitter CI library. I got a few whiffs of a url shortening CI library around the web, [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I needed code to shorten URLS and tweet said url as a twitter update. This all needed to happen in their existing CMS built using Codeigniter.</p>
<p>Turns out the twitter part was easy, thanks to <a href="http://github.com/simonmaddox/codeigniter-twitter" target="_blank">simonmaddox&#8217;s nice twitter CI library</a>. I got a few <a href="http://codeigniter.com/forums/viewthread/113285/" target="_blank">whiffs</a> of a url shortening CI library around the web, but it looks like the code was no longer available. Oh well, a good excuse to knock up a new library!</p>
<p><span id="more-54"></span></p>
<p><a href="http://www.stucktogetherwithtape.com/code/shortie" target="_blank">Shortie</a> is a simple library that uses curl to generate short urls using a number of different services. At the moment I have added support for four services:</p>
<ul>
<li>tr.im</li>
<li>tinyurl</li>
<li>is.gd</li>
<li>u.nu</li>
</ul>
<p>Check out the <a href="http://www.stucktogetherwithtape.com/code/shortie" target="_blank">user guide</a>, which was created using an app-in-progress <strong>Dokument</strong>, for examples.</p>
<p>More about Dokument later&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stucktogetherwithtape.com/blog/2009/10/shortie-v1-0-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

