<?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>Monday By Noon &#187; Favorites</title>
	<atom:link href="http://mondaybynoon.com/category/favorites/feed/" rel="self" type="application/rss+xml" />
	<link>http://mondaybynoon.com</link>
	<description>A resource for Web designers and developers to read about and discuss their craft.</description>
	<lastBuildDate>Wed, 08 Feb 2012 13:49:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>&#8226; WordPress Custom Post Types &amp; PHPurchase: Best Cart Ever – Part 2</title>
		<link>http://mondaybynoon.com/feeder/?FeederAction=clicked&#038;feed=Posts+%28RSS2%29&#038;seed=http%3A%2F%2Fmondaybynoon.com%2F20100809%2Fwordpress-custom-post-types-phpurchase-cart-part-2%2F&#038;seed_title=%26%238226%3B+WordPress+Custom+Post+Types+%26amp%3B+PHPurchase%3A+Best+Cart+Ever+%E2%80%93+Part+2</link>
		<comments>http://mondaybynoon.com/20100809/wordpress-custom-post-types-phpurchase-cart-part-2/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 04:28:09 +0000</pubDate>
		<dc:creator>Jonathan Christopher</dc:creator>
				<category><![CDATA[Favorites]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Custom Post Types]]></category>
		<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[PHPurchase]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://mondaybynoon.com/?p=1197</guid>
		<description><![CDATA[After discussing the benefits of using WordPress 3.0+, Custom Post Types, and PHPurchase over other available e-commerce solutions, this article will walk you through the installation of PHPurchase and integration with Custom Post Types for your product listings.<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=1197&c=1551254234' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=1197&c=1551254234' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></description>
			<content:encoded><![CDATA[<p class="update">If you haven&#8217;t read <a href="/2010/08/09/wordpress-custom-post-types-phpurchase-cart-part-1/">part 1</a> I took some time to outline why I feel that the combination of PHPurchase and Custom Post Types can result in the best e-commerce solution for WordPress.</p>
<p>In <a href="/2010/08/09/wordpress-custom-post-types-phpurchase-cart-part-1/">part 1</a> I examined the current WordPress cart plugin landscape and outlined a number of reasons I feel that <a href="http://www.phpurchase.com/">PHPurchase</a> is currently the leading solution for an e-commerce solution, especially with the arrival of Custom Post Types. I&#8217;d like to share how and why using Custom Post Types works so well for a WordPress shopping cart.</p>
<h2>Setting up and prepping WordPress</h2>
<p>The first step will be to get your WordPress 3.0+ install up and running. That&#8217;s the extent of detail we&#8217;ll cover there. The next step will be to obtain and install a copy of <a href="http://www.phpurchase.com/">PHPurchase</a>. There are a number of purchase options available, but this walkthrough will cover functionality available under all licenses of PHPurchase.</p>
<p>The installation of PHPurchase is as straightforward as any other plugin. Once you&#8217;ve uploaded the plugin files and activated the plugin, you&#8217;ll need to enter your PHPurchase order number on the Settings screen:</p>
<p><img class="alignnone size-full wp-image-1198" title="cart.01.phpurchase.settings" src="/wp-content/uploads/2010/08/cart.01.phpurchase.settings.png" alt="Screenshot: PHPurchase settings" width="926" height="447" /></p>
<p>After validating your order number, the reminder to do so will disappear and you&#8217;ll be able to enter in your PayPal, Authorize.net, or Quantum Gateway payment settings. These details aren&#8217;t <em>required</em> at this point, but until that information is entered, the plugin won&#8217;t let you check out. For now, those are the only details we&#8217;ll cover as far as setup is concerned. Using the PHPurchase menu in the WordPress admin, you can begin adding products.</p>
<p><img class="alignnone size-full wp-image-1227" title="cart.02.phpurchase.add_.product.2" src="/wp-content/uploads/2010/08/cart.02.phpurchase.add_.product.2.png" alt="Screenshot: Adding a product to PHPurchase" width="926" height="724" /></p>
<p><img class="alignnone size-full wp-image-1200" title="cart.03.phpurchase.products" src="/wp-content/uploads/2010/08/cart.03.phpurchase.products.png" alt="Screenshot: PHPurchase product listing" width="953" height="245" /></p>
<p>As it stands PHPurchase will automatically implement a number of system Pages it will use to handle the cart view and checkout process for purchases.</p>
<p><img class="alignnone size-full wp-image-1202" title="cart.04.phpurchase.pages" src="/wp-content/uploads/2010/08/cart.04.phpurchase.pages_1.png" alt="Screenshot: PHPurchase default Pages" width="967" height="554" /></p>
<p>While these pages are an extremely important part of the overall e-commerce implementation, none of the products we just added are made available out of the box.</p>
<p><img class="alignnone size-full wp-image-1203" title="cart.05.store.no.products" src="/wp-content/uploads/2010/08/cart.05.store_.no_.products.png" alt="Screenshot: No products displayed in the WordPress theme" width="1128" height="842" /></p>
<p>By editing the Store page, you can quickly add a number of products using the PHPurchase icon in the editor toolbar:</p>
<p><img class="alignnone size-full wp-image-1204" title="cart.06.store.add.product.1" src="/wp-content/uploads/2010/08/cart.06.store_.add_.product.1.png" alt="Screenshot: Adding a product via PHPurchase, step 1" width="649" height="433" /></p>
<p><img class="alignnone size-full wp-image-1205" title="cart.07.store.add.product.2" src="/wp-content/uploads/2010/08/cart.07.store_.add_.product.2.png" alt="Screenshot: Adding a product via PHPurchase, step 2" width="582" height="347" /></p>
<p><img class="alignnone size-full wp-image-1206" title="cart.08.store.add.product.3" src="/wp-content/uploads/2010/08/cart.08.store_.add_.product.3.png" alt="Screenshot: Adding a product via PHPurchase, step 3" width="646" height="435" /></p>
<p><img class="alignnone size-full wp-image-1207" title="cart.09.store.one.product" src="/wp-content/uploads/2010/08/cart.09.store_.one_.product.png" alt="Screenshot: Product visible on Store page" width="1128" height="842" /></p>
<p>At this point, you can feel to proceed as normal. Using this Store page you could add every product you have available as well as apply some style and content using imagery, product copy, and links to relevant information. You could take it a step further and also create child pages with the Store as the parent and dedicate a product detail page to each of your products.</p>
<p>While helpful, you&#8217;ll quickly discover missing features that are very commonly found in other e-commerce platforms. Features such as browsing products by category and providing additional information about products in the form of multiple product shots and/or PDF downloads aren&#8217;t directly built into PHPurchase. The beauty lies in the fact that you can customize WordPress in all the usual ways to add these features as you see fit.</p>
<p>With the arrival of WordPress 3.0, however, there is an entire layer of additional functionality found in Custom Post Types that makes working with these features a breeze.</p>
<h2>Using Custom Post Types for your PHPurchase Store</h2>
<p><a href="http://codex.wordpress.org/Custom_Post_Types">Custom Post Types</a> are sometimes intimidating to more novice developers. Out of the box in WordPress 3.0 you need to manually register and set up your Custom Post Types. As with many developer-heavy tasks at hand, there is a plugin to make life easier when it comes to Custom Post Types; <a href="http://wordpress.org/extend/plugins/custom-post-type-ui/">Custom Post Type UI</a>.</p>
<p>Custom Post Type UI gives WordPress admins the ability to create, edit, and manage all of the Custom Post Types available within the WordPress Install:</p>
<p><img class="alignnone size-full wp-image-1210" title="cart.10.custom.post.type.add" src="/wp-content/uploads/2010/08/cart.10.custom.post_.type_.add_.png" alt="Screenshot: Adding a Custom Post via Custom Post Type UI" width="489" height="579" /></p>
<p>Using the plugin you can easily create a Custom Post Type to handle all of your product pages in PHPurchase. You&#8217;re able to customize the phrasing used throughout and viewing the Advanced Label Options gives you even more to work with. On top of these Custom Post Type Settings, you can also set up custom taxonomies which can be used in this specific case for a set of categories limited to your store products and separate from your Post categories.</p>
<p>Once you&#8217;ve created your Custom Post Type, a new menu item will be made available in the main navigation:</p>
<p><img class="alignnone size-full wp-image-1213" title="cart.11.custom.post.type.menu-1" src="/wp-content/uploads/2010/08/cart.11.custom.post_.type_.menu-1.png" alt="Screenshot: Custom Post Type Menu" width="156" height="334" /></p>
<p>Using the links available you can go ahead and set up your categories as well as add your products.</p>
<p><img class="alignnone size-full wp-image-1214" title="cart.12.custom.post.add.product" src="/wp-content/uploads/2010/08/cart.12.custom.post_.add_.product.png" alt="Screenshot: Adding a Custom Post Type product" width="949" height="775" /></p>
<p><img class="alignnone size-full wp-image-1215" title="cart.13.custom.post.products" src="/wp-content/uploads/2010/08/cart.13.custom.post_.products.png" alt="Screenshot: Products added to the Custom Post Type" width="953" height="457" /></p>
<p>Once your products have been added to your Custom Post Type, you can view the page on the front end:</p>
<p><img class="alignnone size-full wp-image-1216" title="cart.14.custom.product.in.theme" src="/wp-content/uploads/2010/08/cart.14.custom.product.in_.theme_.png" alt="Screenshot: Product page on website" width="1128" height="1745" /></p>
<h3>Integrating Custom Post Types into your Menu</h3>
<p>Now that your products have been added, you&#8217;ll want to make browsing your products as easy as possible. There are a number of things you can do, the primary two being including links to your product pages within your site navigation and using your Custom Post Type taxonomy (product categories).</p>
<p>Menus were also a big addition to WordPress in 3.0 and the update comes in handy at this point in our PHPurchase setup. The Menus are smart enough to recognize your Product Pages and allow you to integrate them directly within your site navigation:</p>
<p><img class="alignnone size-full wp-image-1217" title="cart.15.nav.menu" src="/wp-content/uploads/2010/08/cart.15.nav_.menu_.png" alt="Screenshot: Menus main screen" width="954" height="1054" /></p>
<p><img class="alignnone size-full wp-image-1218" title="cart.15.nav.menu.2" src="/wp-content/uploads/2010/08/cart.15.nav_.menu_.2.png" alt="Screenshot: Store navigation" width="647" height="695" /></p>
<p>Using the Menus you&#8217;re able to mix and match your Product Pages, your Product Categories, as well as your WordPress Pages themselves. You can custom build any structure you wish using the menus and the available entries. By default, linking to a Product Category will direct readers to pages resembling those of your other category pages, likely using category.php from your theme. You can customize this to any degree as you would normally when developing your custom WordPress theme.</p>
<p><img class="alignnone size-full wp-image-1219" title="cart.16.nav.menu.on.site" src="/wp-content/uploads/2010/08/cart.16.nav_.menu_.on_.site_.png" alt="Screenshot: Custom Store navigation" width="1128" height="783" /></p>
<h3>Integration with plugins</h3>
<p>Another significant advantage to using Custom Post Types and PHPurchase to power your WordPress based e-commerce website is the direct integration with many of your favorite plugins. One of the downfalls to a number of other WordPress store plugins is a lack of attention to search engine optimization. When working with product pages powered by Custom Post Types you can continue to use the SEO plugin working to optimize the rest of your website.</p>
<p>Additionally, you&#8217;ll be able to use plugins that enhance your ability to make additional product assets available to readers. Plugins like Attachments will let you add multiple product images for use in a product image viewer, PDFs including additional product details, as well as any available product details that may exist.</p>
<p><img class="alignnone size-full wp-image-1220" title="cart.17.plugins" src="/wp-content/uploads/2010/08/cart.17.plugins.png" alt="Screenshot: Product page integration with plugins" width="951" height="886" /></p>
<h4>This is just the beginning</h4>
<p>These are just the basics of getting up and running with WordPress 3.0+, Custom Post Types, and <a href="http://phpurchase.com">PHPurchase</a> in an effort to get the best possible e-commerce shop up and running quickly and easily. While it&#8217;s a bit more work to get a large volume of products added and available on your website, I really feel that PHPurchase is a great choice when considering available e-commerce solutions for WordPress.</p>
<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=1197&c=411325765' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=1197&c=411325765' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></content:encoded>
			<wfw:commentRss>http://mondaybynoon.com/20100809/wordpress-custom-post-types-phpurchase-cart-part-2/feed/</wfw:commentRss>
		<slash:comments>50</slash:comments>
		</item>
		<item>
		<title>&#8226; Is it Now Acceptable to Require JavaScript?</title>
		<link>http://mondaybynoon.com/feeder/?FeederAction=clicked&#038;feed=Posts+%28RSS2%29&#038;seed=http%3A%2F%2Fmondaybynoon.com%2F20100621%2Fis-it-now-acceptable-to-require-javascript%2F&#038;seed_title=%26%238226%3B+Is+it+Now+Acceptable+to+Require+JavaScript%3F</link>
		<comments>http://mondaybynoon.com/20100621/is-it-now-acceptable-to-require-javascript/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 12:40:32 +0000</pubDate>
		<dc:creator>Jonathan Christopher</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Favorites]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Standards]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Docs]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://mondaybynoon.com/?p=1142</guid>
		<description><![CDATA[It's not a new trend, but it's something I see more and more with bigger companies who pride themselves on building (upon) standards based, open platforms. Is it becoming increasingly acceptable to build Web applications that require JavaScript?<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=1142&c=2048399348' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=1142&c=2048399348' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></description>
			<content:encoded><![CDATA[<p>In this age of HTML5, CSS3, and anti-Flash it seems as though we may be slipping away from our roots. Or are we?</p>
<p>Back when standards were standards if you were building anything that didn&#8217;t have a fall back plan in place for a lack of JavaScript, you were doing it wrong. Yes it took more time and it took better planning but <em>that&#8217;s the point</em>. When you&#8217;re a professional you&#8217;re supposed to be doing it <em>right</em>, right?</p>
<h2>The rise of (my) Web standards</h2>
<p>Back when JavaScript was reborn, when its use began transforming into what we know and love today, the rules were still being written. I remember thinking about how I should approach learning this skill I knew would soon be essential. My first stop when teaching myself something is Google. Of course back in the day Google was still polluted with DHTML tutorial sites and wretched implementations. After reading countless tutorials comprised mostly of &#8220;copy and paste this snippet here and that snippet there&#8221; I knew it was time to hit the books.</p>
<p>It took about four seconds of poking around to realize that there was more than meets the eye when it came to JavaScript for me. I needed to learn about the <abbr title="Document Object Model">DOM</abbr> before I tried to manipulate it. If there&#8217;s one thing that drives me batty it&#8217;s the notion of &#8217;learning the framework instead of the language&#8217; and this is no exception. JavaScript though, has a completely new layer to work with.</p>
<p>I won&#8217;t detail the issues I have behind learning a framework or platform as opposed to the language here, but it can be applied to <em>every</em> programming language, <em>every</em> markup language, CSS, and JavaScript as well. To sum it up: learning the framework gives the language a bad name. We&#8217;ll leave it at that and the rest for another article.</p>
<p>I grabbed myself a copy of <a href="/2007/01/15/dom-scripting-book-review/">DOM Scripting</a> by Jeremy Keith and to this day I&#8217;m glad I did. DOM Scripting was instantaneously followed by <a href="/2007/03/05/bulletproof-ajax-book-review/">Bulletproof Ajax</a>, also published by Mr. Keith. If I had to choose two books as a suggestion to someone looking to learn <strong>proper</strong> JavaScript I think these two are it. There are of course subsequent, more advanced books that I&#8217;d also suggest, but these two works will help you to realize which blog posts are junk and which are gold.</p>
<p>The theory behind writing JavaScript, as I took it, can be taken from DOM Scripting:</p>
<blockquote><p>Separate behavior from structure using unobtrusive JavaScript. Add dynamic effects with progressive enhancement. Ensure backwards-compatibility through graceful degradation.</p>
</blockquote>
<p>I lived by those rules. I still do. But am I stuck in the past while everyone is moving forward?</p>
<h3>The new Web</h3>
<p>Has building a proper Web stack become old school? What I&#8217;ve been curious about lately surrounds the trend that <strong>requiring</strong> JavaScript for your Web app is something we hardly blink at. MobileMe has just recently relaunched with a new look:</p>
<p><a href="/wp-content/uploads/2010/06/01-mobile-me.png"><img class="alignnone size-full wp-image-1143" title="01-mobile-me" src="/wp-content/uploads/2010/06/01-mobile-me.png" alt="Screenshot of the MobileMe login screen with JavaScript enabled" width="1061" height="759" /></a></p>
<p>Looks really great, but if you hit the page with a JavaScript-incapable browser it&#8217;s a bit different:</p>
<p><a href="/wp-content/uploads/2010/06/02-mobile-me.png"><img class="alignnone size-full wp-image-1144" title="02-mobile-me" src="/wp-content/uploads/2010/06/02-mobile-me.png" alt="Screenshot of the MobileMe login screen with JavaScript disabled" width="1061" height="759" /></a></p>
<p>Back in the day we&#8217;d all have scoffed at such a thing, comparing it to a &#8220;This site looks best in IE6&#8243; badge straight out of the 1990s. What&#8217;s changed since then? Why is this now an acceptable practice? I understand that Apple is a progressive company, bringing the web in its best form to the largest population possible, and making it look great, but <strong>that&#8217;s my point</strong>. Is this new school of thought going to transform itself into common practice?</p>
<p>The <em>entire point</em> behind breaking away from closed platforms such as Flash (yes, it&#8217;s a closed platform no matter how much marketing gets put behind it) is to build a <em>universally accessible</em> Web. Devices are advancing, yes. Browsers are advancing, yes. But does that give us the liberty to put the fruits of our labor on a back burner now that we&#8217;ve reached some sort of plateau in the evolution of the browser?</p>
<h3>I&#8217;m not dogging Apple</h3>
<p>Apple isn&#8217;t the only one producing Web applications that show similar messages if you&#8217;re using a JavaScript incapable browser. In fact, other more popular platforms are doing it even worse:</p>
<p><a href="/wp-content/uploads/2010/06/03-google-docs1.png"><img class="alignnone size-full wp-image-1146" title="03-google-docs" src="/wp-content/uploads/2010/06/03-google-docs1.png" alt="Screenshot of Google Docs with JavaScript disabled" width="1061" height="759" /></a></p>
<p>There was a time, if I remember correctly, where Google Docs gave a notification similar to MobileMe as opposed to loading a non working pseudo interface that does nothing but confuse a visitor. Gmail still retains its fully functional JavaScript-less implementation, albeit behind a quick message notifying you what you&#8217;re in for:</p>
<p><a href="/wp-content/uploads/2010/06/04-gmail.png"><img class="alignnone size-full wp-image-1147" title="04-gmail" src="/wp-content/uploads/2010/06/04-gmail.png" alt="Screenshot of Gmail's notification of JavaScript being disabled" width="1061" height="759" /></a></p>
<p>Depending on your choice, you can end up at a really well put together version of Gmail:</p>
<p><a href="/wp-content/uploads/2010/06/05-gmail.png"><img class="alignnone size-full wp-image-1148" title="05-gmail" src="/wp-content/uploads/2010/06/05-gmail.png" alt="Screenshot of Gmail's HTML only version" width="1061" height="759" /></a></p>
<p>To me, Gmail remains to be one of the best implemented modern Web applications because of this very attribute.</p>
<h2>Where are we headed, really?</h2>
<p>I&#8217;ve tried to wrap my head around these poorly implemented Web applications to find out the real inspiration behind them. Are companies rushing JavaScript dependent platforms out the door simply to get things live before the competition? Are metrics showing that supporting JavaScript simply doesn&#8217;t make fiscal sense? Are we to a point where leading Web companies care more about dollars and cents than users?</p>
<p>What about the Web applications themselves? We&#8217;re working with the most rich implementations of JavaScript we&#8217;ve ever seen. Many times, it doesn&#8217;t even make sense to offer a degraded version of an application simply because the desired feature is built within JavaScript from the ground up; there&#8217;s nothing else to show. <strong>This is not a bad thing.</strong> I&#8217;m concerned in particular for those applications that <em>could</em> in fact have a decent degraded version. Does it change the opinion we have behind the modern Web though? I&#8217;m speaking from a front end developer point of view here, a conversation between us professionals, not as users.</p>
<p>Do we need to move beyond this self-imposed requirement of providing a <em>gracefully</em> degraded version of our application? If so, would it not be a (short) matter of time before that school of thought trickles all the way down to the Coda Slider we plan to implement? In essence, what&#8217;s the difference? We&#8217;d all be thrilled if we could just make that AJAX request and call it a day without having to first build an alternate version, but is it the right thing to do as professionals?</p>
<p>The groundwork has been laid by some of the best thinkers in our industry, and neglecting to build a proper stack, to me, pushes all of that hard work aside in favor of (too) rapid deployment. If your metrics show a 99% JavaScript enabled audience, are you willing to forsake that 1%?</p>
<p>I&#8217;m not only concerned about that 1%, I&#8217;m (perhaps) more concerned about how it affects the overall implementation. Working from your degraded version is going to result in a much more stable environment upon which to build your behavioral layer. Skipping that <strong>valuable</strong> step can and probably will result in a less structurally sound document.</p>
<p>I have a tendency to remain loyal to influential circumstances that have shaped me as a professional, but I&#8217;m curious how (if?) these events are affecting other designers and developers, if at all. Do you continue to be curious about degraded versions of modern Web applications? I could be way off base in even thinking about things to this level, and if that&#8217;s it by all means feel free to call me out on it, but there&#8217;s something under my skin about what&#8217;s going on. Thoughts?</p>
<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=1142&c=404958914' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=1142&c=404958914' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></content:encoded>
			<wfw:commentRss>http://mondaybynoon.com/20100621/is-it-now-acceptable-to-require-javascript/feed/</wfw:commentRss>
		<slash:comments>40</slash:comments>
		</item>
		<item>
		<title>&#8226; Building a Store Locator with WordPress and Pods</title>
		<link>http://mondaybynoon.com/feeder/?FeederAction=clicked&#038;feed=Posts+%28RSS2%29&#038;seed=http%3A%2F%2Fmondaybynoon.com%2F20100222%2Fstore-locator-wordpress-pods%2F&#038;seed_title=%26%238226%3B+Building+a+Store+Locator+with+WordPress+and+Pods</link>
		<comments>http://mondaybynoon.com/20100222/store-locator-wordpress-pods/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 16:43:08 +0000</pubDate>
		<dc:creator>Jonathan Christopher</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Favorites]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Workbench]]></category>
		<category><![CDATA[directory]]></category>
		<category><![CDATA[location]]></category>
		<category><![CDATA[Pods]]></category>
		<category><![CDATA[proximity]]></category>
		<category><![CDATA[search]]></category>

		<guid isPermaLink="false">http://mondaybynoon.com/?p=835</guid>
		<description><![CDATA[I've always been curious about adding a location based proximity search powered by ZIP code and desired radius. It's actually quite easy to do using WordPress, Pods, and some crazy MySQL queries. This walkthrough shows you how to add a PHP/MySQL based store finder powered by WordPress and Pods.<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=835&c=2124019616' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=835&c=2124019616' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></description>
			<content:encoded><![CDATA[<p>Truth be told I was always a bit intimidated by proximity searches. That is to say the &#8220;Find <strong>X</strong> within <strong>Y</strong> miles&#8221; implementations we see everywhere. There was always a bit of magic behind how that worked and I&#8217;ve had a long time itch to figure out exactly how it worked.</p>
<p>Luckily enough, a client need came through which included such a feature. What better time to teach yourself something? Other programmers at my company had implemented proximity searches in the past, but I wasn&#8217;t involved on the projects and didn&#8217;t want to simply peruse their code and see what I could pull from it. I sat down with one of the guys as I began working on the feature to discuss past implementations. There were two ways to go about it:</p>
<ol>
<li>Piggyback on Google Maps</li>
<li>Do things the hard way</li>
</ol>
<p>It took me about zero seconds to determine that I wanted to do things the hard way. It&#8217;s not that I don&#8217;t enjoy working with Google Maps. Quite the contrary in fact. I just don&#8217;t want to depend on it too much in the day to day, especially for something as generic as a proximity search. Additionally, it just adds another layer of complexity with remote calls, API limits, and the other issues associated with using any other third party service. Hard way it is.</p>
<h2>Pods setup</h2>
<p>The first thing we&#8217;ll do is create a &#8216;stores&#8217; Pod. If you&#8217;re not familiar with creating Pods, take a few minutes to read the beginner series, starting with <a href="/2010/01/04/pods-basics-installation-and-setup/">Pods Basics: Installation and Setup</a>. I&#8217;m going to use the following columns:</p>
<ul>
<li>name (txt)</li>
<li>slug (slug)</li>
<li>address (txt)</li>
<li>city (txt)</li>
<li>state (PICK state)</li>
<li>zipcode (txt)</li>
</ul>
<p>We&#8217;re also going to simply make this Pod a Top Level Menu. If you&#8217;re looking to make things even nicer, go ahead and <a href="/2010/01/04/pods-ui-intro/">include Pods UI</a> where applicable.</p>
<p><a href="/wp-content/uploads/2010/02/stores-pod-2.jpg"><img class="alignnone size-full wp-image-846" title="stores-pod-2" src="/wp-content/uploads/2010/02/stores-pod-2.jpg" alt="" width="462" height="380" /></a></p>
<p>I&#8217;ve made every column required data, as an address isn&#8217;t very useful without complete information. I segmented the addresses as such simply because the proximity search I&#8217;ll be implementing is based on ZIP code, and having that data in a separate column will help with server load. Lastly, I chose to use a txt column for the <code>zipcode</code> instead of a Number because many ZIP codes begin with one (or more) zeros, which would cause a bit of trouble.</p>
<p>As a last step, we&#8217;ll go ahead and add a few test store listings using various ZIP codes you&#8217;re familiar with. The more variance the better, as you&#8217;ll be able to see whether the proximity aspect of the search is working properly or not.</p>
<p><a href="/wp-content/uploads/2010/02/sample-single.jpg"><img class="alignnone size-full wp-image-840" title="sample-single" src="/wp-content/uploads/2010/02/sample-single.jpg" alt="" width="551" height="267" /></a></p>
<p><a href="/wp-content/uploads/2010/02/sample-listing.jpg"><img class="alignnone size-full wp-image-841" title="sample-listing" src="/wp-content/uploads/2010/02/sample-listing.jpg" alt="" width="337" height="410" /></a></p>
<p>Once you&#8217;ve added a few samples, it&#8217;s time to integrate.</p>
<h2>WordPress setup</h2>
<p>For the sake of brevity, this location based search will sit on its own WordPress Page, using a template we&#8217;ll put together. We&#8217;ll continue working with the WordPress default theme, and add a new template; <code>store-locator.php</code> which includes the following:</p>
<pre class="sh_php"><code>&lt;?php

/* Template Name: Store Locator */

get_header(); ?&gt;

  &lt;div id="content" class="narrowcolumn" role="main"&gt;

    &lt;?php the_post(); ?&gt;
    &lt;div class="post" id="post-&lt;?php the_ID(); ?&gt;"&gt;
    &lt;h2&gt;&lt;?php the_title(); ?&gt;&lt;/h2&gt;
      &lt;div class="entry"&gt;

        &lt;?php the_content(); ?&gt;

        &lt;form action="" method="post"&gt;

          &lt;p&gt;
            &lt;label for="mbn_zipcode"&gt;&lt;small&gt;Your ZIP&lt;/small&gt;&lt;/label&gt;
            &lt;input type="text" name="mbn_zipcode" id="mbn_zipcode" value="&lt;?php echo $_POST['mbn_zipcode']; ?&gt;" size="5" tabindex="1" /&gt;
          &lt;/p&gt;

          &lt;p&gt;
            &lt;label for="mbn_distance"&gt;&lt;small&gt;Within (miles)&lt;/small&gt;&lt;/label&gt;
            &lt;select name="mbn_distance" id="mbn_distance" tabindex="2"&gt;
              &lt;option value="5"&lt;?php if( empty( $_POST['mbn_distance'] ) || $_POST['mbn_distance'] == "5" ) : ?&gt; selected="selected"&lt;?php endif ?&gt;&gt;5&lt;/option&gt;
              &lt;option value="10"&lt;?php if( $_POST['mbn_distance'] == "10" ) : ?&gt; selected="selected"&lt;?php endif ?&gt;&gt;10&lt;/option&gt;
              &lt;option value="25"&lt;?php if( $_POST['mbn_distance'] == "25" ) : ?&gt; selected="selected"&lt;?php endif ?&gt;&gt;25&lt;/option&gt;
              &lt;option value="50"&lt;?php if( $_POST['mbn_distance'] == "50" ) : ?&gt; selected="selected"&lt;?php endif ?&gt;&gt;50&lt;/option&gt;
              &lt;option value="100"&lt;?php if( $_POST['mbn_distance'] == "100" ) : ?&gt; selected="selected"&lt;?php endif ?&gt;&gt;100&lt;/option&gt;
            &lt;/select&gt;
          &lt;/p&gt;

          &lt;p&gt;&lt;input name="submit" type="submit" id="submit" tabindex="3" value="Submit" /&gt;&lt;/p&gt;

        &lt;/form&gt;

      &lt;/div&gt;
    &lt;/div&gt;

  &lt;/div&gt;

&lt;?php get_sidebar(); ?&gt;

&lt;?php get_footer(); ?&gt;</code></pre>
<p>Nothing exciting happening here, we&#8217;re simply setting the stage with the basic form we&#8217;ll use to search our store directory by location.</p>
<p><a href="/wp-content/uploads/2010/02/basic-form.jpg"><img class="alignnone size-full wp-image-842" title="basic-form" src="/wp-content/uploads/2010/02/basic-form.jpg" alt="" width="497" height="182" /></a></p>
<p>Now that we&#8217;ve got our Page using our template, we&#8217;ll implement the location search functionality via Pods.</p>
<h2>Setting up the location search</h2>
<p>Our first step will be to add a conditional that checks to see if the form has been submitted. In this case, I&#8217;ll simply add a hidden <code>input</code> to track the current action:</p>
<pre class="sh_html"><code>&lt;input type="hidden" name="mbn_action" value="search" /&gt;</code></pre>
<p>With this action in place, we can include our conditional:</p>
<pre class="sh_php"><code>&lt;?php if( !empty( $_POST['mbn_action'] ) ) : ?&gt;
  &lt;p&gt;List our results&lt;/p&gt;
&lt;?php endif ?&gt;</code></pre>
<p>Here&#8217;s where everything happens. Once we find ourselves in the conditional, we&#8217;ll need to do a bit of work:</p>
<ol>
<li>Sanitize our data</li>
<li>Retrieve search results</li>
<li>Display data</li>
</ol>
<p>Our conditional will expand to be:</p>
<pre class="sh_php"><code>&lt;?php
  if( !empty( $_POST['mbn_action'] ) )
  {
    if( !is_numeric( $_POST['mbn_zipcode'] ) )
    {
      $the_zip = '0';
    }
    else
    {
      $the_zip = $_POST['mbn_zipcode'];
    }

    $the_distance = intval( $_POST['mbn_distance'] );

    $stores = mbn_get_stores_by_location( $the_zip, $the_distance );
    $stores_total = count( $stores );
  ?&gt;

    &lt;?php if( $stores_total &gt; 0 ) : ?&gt;
      &lt;h3&gt;Search Results&lt;/h3&gt;
      &lt;ol&gt;
        &lt;?php foreach( $stores as $store ) : ?&gt;
          &lt;?php $store_address = $store['address'] . ' ' . $store['city'] . ', ' . $store['state'][0]['name'] . ' ' . $store['zipcode'] ; ?&gt;
          &lt;li&gt;&lt;dl&gt;
            &lt;dt&gt;Name&lt;/dt&gt;&lt;dd&gt;&lt;?php echo $store['name']; ?&gt;&lt;/dd&gt;
            &lt;dt&gt;Address&lt;/dt&gt;&lt;dd&gt;&lt;?php echo $store_address; ?&gt;&lt;/dd&gt;
            &lt;dt&gt;Distance&lt;/dt&gt;&lt;dd&gt;&lt;?php echo $store['distance']; ?&gt; miles&lt;/dd&gt;
          &lt;/dl&gt;&lt;/li&gt;
        &lt;?php endforeach ?&gt;
      &lt;/ol&gt;
    &lt;?php endif ?&gt;

&lt;?php } ?&gt;</code></pre>
<p>You&#8217;ll notice that there&#8217;s no reference to Pods anywhere in that conditional, but there is a new function to take a look at; <code>mbn_get_stores_by_location()</code>.</p>
<h3>Implementing the proximity aspect</h3>
<p>This new function, <code>mbn_get_stores_by_location()</code>, will take care of all the work including:</p>
<ol>
<li>Determine the latitude and longitude of the source ZIP code</li>
<li>Use triginomitry to determine which additional ZIP codes fall within the chosen radius</li>
<li>Retrieve all Pods entries matching the pool of ZIP codes</li>
<li>Return an array of results, ordered by distance</li>
</ol>
<p>The quickest and easiest way to implement the function will be adding it to <code>functions.php</code> in your theme. Before we implement the function, however, you&#8217;ll need to add a new table to your database. This table is going to include a listing of all US-based ZIP codes and acts as an integral piece for this function. The table is used to determine the latitude and longitude of applicable ZIP codes, and is used with each search submission. There are a number of places to obtain a ZIP code database, the one I&#8217;ve used in the past is made available for free from <a href="http://www.populardata.com/zipcode_database.html">PopularData.com</a>. It&#8217;s made available as a <abbr title="Comma Separated Value">CSV</abbr> file weighing in at about 700k. There is a donation button available on the download page, and I&#8217;d suggest showing your appreciation to the provider should you use the database for any commercial work.</p>
<p>You&#8217;ll need to set up a new table in your WordPress database and be sure to name it something unique. You&#8217;ll need to remember both the table name and column names as you implement the location search. Once you&#8217;ve added the table and verified its integrity, we can go ahead and implement <code>mbn_get_stores_by_location()</code> in <code>functions.php</code>:</p>
<pre class="sh_php"><code>&lt;?php

function mbn_get_stores_by_location( $zip, $radius )
{
  global $wpdb;
  $radius = intval( $radius );

  // we first need to get the source coordinates
  $sql = "SELECT `latitude`, `longitude` FROM `mbn_zip_codes` WHERE `zipcode` = '$zip'";
  $coords = $wpdb-&gt;get_row( $sql );

  // now we'll get the other ZIP codes within the radius, ordered by distance
  $sql = "SELECT mbn_zip_codes.zipcode, ( 3959 * acos( cos( radians( $coords-&gt;latitude ) ) * cos( radians( mbn_zip_codes.latitude ) ) * cos( radians( mbn_zip_codes.longitude ) - radians( $coords-&gt;longitude ) ) + sin( radians( $coords-&gt;latitude ) ) * sin( radians( mbn_zip_codes.latitude ) ) ) )  AS distance FROM mbn_zip_codes HAVING distance &lt;= $radius OR distance IS NULL ORDER BY distance";

  $nearby_zips = $wpdb-&gt;get_results( $sql );

  // we need to store the zips in order to build the Pods query
  $target_zips = array();
  foreach ($nearby_zips as $nearby_zip)
  {
    array_push($target_zips, $nearby_zip-&gt;zipcode);
  }

  // we're going to store the results as we go
  $store_results = array();

  if( count( $target_zips &gt; 0 ) )
  {
    $final_target_zips = implode(',', $target_zips);

    if( strlen( $final_target_zips &gt; 0 ) )
    {
      // let's snag the data
      $stores = new Pod('stores');
      $stores-&gt;findRecords('id ASC', 9, 't.zipcode IN (' . $final_target_zips . ')');

      $store_data = array();

      while ( $stores-&gt;fetchRecord() )
      {
        $store_data['id']       = $stores-&gt;get_field('id');
        $store_data['name']     = $stores-&gt;get_field('name');
        $store_data['slug']     = $stores-&gt;get_field('slug');
        $store_data['address']  = $stores-&gt;get_field('address');
        $store_data['city']     = $stores-&gt;get_field('city');
        $store_data['state']    = $stores-&gt;get_field('state');
        $store_data['zipcode']  = $stores-&gt;get_field('zipcode');

        foreach ($nearby_zips as $nearby_zip)
        {
          if( $store_data['zipcode'] == $nearby_zip-&gt;zipcode )
          {
            $store_data['distance'] = intval( $nearby_zip-&gt;distance );
          }
        }

        array_push( $store_results, $store_data );
        unset( $store_data );
      }

      usort( $store_results, "mbn_cmp" );
    }

  }
    return $store_results;
}

?&gt;</code></pre>
<p>Quite a bit is going on in this function. Once our <code>globals</code> are set and our data sanitized, we&#8217;re going to query the new table we set up to retrieve the coordinates of the submitted ZIP code. Once we have those coordinates, we&#8217;re going to perform a lengthy query on that same table to determine what other ZIP codes fall within the submitted radius:</p>
<pre class="sh_sql"><code>SELECT mbn_zip_codes.zipcode, ( 3959 * acos( cos( radians( $coords-&gt;latitude ) ) * cos( radians( mbn_zip_codes.latitude ) ) * cos( radians( mbn_zip_codes.longitude ) - radians( $coords-&gt;longitude ) ) + sin( radians( $coords-&gt;latitude ) ) * sin( radians( mbn_zip_codes.latitude ) ) ) )  AS distance FROM mbn_zip_codes HAVING distance &lt;= $radius OR distance IS NULL ORDER BY distance</code></pre>
<p>You will need to be sure that table and column names are appropriately updated. There are a number of formulas which use trigonometry to solve proximity equations, but I&#8217;ve found the above to suit my needs well in this application.</p>
<p>Once we&#8217;ve got our nearby ZIP codes ordered by date, we query our Pod for any entries with ZIP codes that match our results. Instead of using <code>get_field()</code> to echo the display directly, we&#8217;ll instead use it to store the data in an <code>array</code> consisting of all returned results.</p>
<p>Once we&#8217;ve processed the results, our last step will be to use <a href="http://www.php.net/usort"><code>usort</code></a> to ensure our results are actually sorted by distance:</p>
<pre class="sh_php"><code>usort( $store_results, "mbn_cmp" );</code></pre>
<p><code>usort</code> uses a custom function to determine the comparison result, and we&#8217;ll need to add that to <code>functions.php</code> as well:</p>
<pre class="sh_php"><code>function mbn_cmp($a, $b)
{
  $a = intval( $a['distance'] );
  $b = intval( $b['distance'] );
  if( $a &lt; $b )
  {
    return -1;
  }
  elseif( $a &gt; $b )
  {
    return 1;
  }
  else
  {
    return 0;
  }
}</code></pre>
<p>Note that the comparison function uses a specific array key to generate a result. If you change the distance key, you&#8217;ll need to update this function as well.</p>
<p>That takes all the magic out of it. If we return to our submission form and search for a ZIP code that is known to produce results, we&#8217;ll see the functionality at work:</p>
<p><a href="/wp-content/uploads/2010/02/results.jpg"><img class="alignnone size-full wp-image-843" title="results" src="/wp-content/uploads/2010/02/results.jpg" alt="" width="445" height="540" /></a></p>
<p>I realize the explanation is a bit lengthy, but I hope it helps to explain how a proximity search can work on a smaller scale.</p>
<h3>Alternative implementations</h3>
<p>As I researched location based proximity searches, I found a number of alternative solutions using PHP and MySQL. Some of which included stored procedures, and other advanced uses of MySQL. I&#8217;m nearly positive other implementations would require less computing power and run a bit faster, but I chose not to take that path because I wanted to keep the functionality as lightweight and portable as possible.</p>
<p>The queries used in the search function are performing quite a bit of math, and probably won&#8217;t scale extremely well. If you&#8217;re only looking to implement a location search on a smaller set of data (under 10,000 or so) I think using something like this will work for you as well.</p>
<h3>Other uses</h3>
<p>With Pods making a location based ZIP code search so easy, I&#8217;m hoping to implement it on more client projects since it won&#8217;t affect the budget very much. Some initial use cases that come to mind are:</p>
<ul>
<li>Member directory searches</li>
<li>Service area searches</li>
<li>Geographic zone searches</li>
<li>Event listings</li>
</ul>
<p>The next step I&#8217;d take with an implementation such as this would be to remove the requirement of entering your ZIP code manually altogether and instead use <a href="http://en.wikipedia.org/wiki/Geoip">geolocation</a> to automatically generate a starting point for the visitor.</p>
<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=835&c=1826700529' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=835&c=1826700529' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></content:encoded>
			<wfw:commentRss>http://mondaybynoon.com/20100222/store-locator-wordpress-pods/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>&#8226; We&#8217;re Ready for CSS3, but are we Ready for CSS3?</title>
		<link>http://mondaybynoon.com/feeder/?FeederAction=clicked&#038;feed=Posts+%28RSS2%29&#038;seed=http%3A%2F%2Fmondaybynoon.com%2F20100208%2Fwere-ready-for-css3-but-are-we-ready-for-css3%2F&#038;seed_title=%26%238226%3B+We%26%238217%3Bre+Ready+for+CSS3%2C+but+are+we+Ready+for+CSS3%3F</link>
		<comments>http://mondaybynoon.com/20100208/were-ready-for-css3-but-are-we-ready-for-css3/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 13:06:28 +0000</pubDate>
		<dc:creator>Jonathan Christopher</dc:creator>
				<category><![CDATA[Clients]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Favorites]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[CSS3]]></category>

		<guid isPermaLink="false">http://mondaybynoon.com/?p=776</guid>
		<description><![CDATA[We're all smitten with CSS3. It's reinvigorated that sense of newness that CSS and Web Standards brought our way just a few years ago. We're able to more easily replicate the set of design standards that has become nearly universal much faster than before with just a few CSS declarations. There are a number of CSS3 rules I'd be writing for each and every project, but I'm just not sure it's as ready for prime time as many designers are making it out to be.<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=776&c=787301301' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=776&c=787301301' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re all smitten with CSS3. It&#8217;s reinvigorated that sense of newness that CSS and Web Standards brought our way just a few years ago. We&#8217;re able to more easily replicate the set of design standards that has become nearly universal much faster than before with just a few CSS declarations. There are a number of CSS3 rules I&#8217;d be writing for every project, but I&#8217;m just not sure it&#8217;s as ready for prime time as many designers are making it out to be.</p>
<p>I&#8217;m having an honest-to-goodness back and forth with myself on this issue because I sympathize with two opposing sides to the same issue. I&#8217;ve thought about it so much that I&#8217;m not sure it&#8217;s as much of an issue I&#8217;m making it out to be, but would definitely love to have a targeted conversation about it.</p>
<p>I&#8217;d like to review the four rules I&#8217;d more than love to use without a second thought on every project I work on for the rest of my life, and explain the issues I&#8217;ve come up with (so far) regarding each.</p>
<p>Before (and after) I get to the list, however, I&#8217;d like to make my stance on CSS3 clear. I love the fact that it directly helps us as designers make a project go that much more smoothly. It helps us reduce the time we take to engineer the front end, allowing us to spend more time designing. I understand that if people are not able to, or choose not to upgrade their browser, it&#8217;s something they&#8217;ll have to deal with as the Web continues to mature and grow. It makes perfect sense that the faster we all adopt these &#8220;bleeding edge&#8221; technologies, it puts that much more pressure on the browser makers to implement things properly.</p>
<p>There&#8217;s an element of realism, however, that I feel sometimes takes a back seat to the wonderful things CSS3 (and HTML5) are currently offering us.</p>
<h2>Border radius</h2>
<p>By far the most popular design treatment you&#8217;ll find on the Web is rounded corners. I&#8217;d be willing to bet that there are more (completely different) ways to achieve rounded corners on the Web than any other design treatment, if such a statistic existed. The creativeness that has gone into the dozens of ways to best round the corners of a <code>div</code> blows my mind. The point here, though, is that it shouldn&#8217;t be such a pain to accomplish. With such a popular and generally accepted design treatment, there should be an easier way. Many designers have taken comfort (and a sigh of relief) through <code>border-radius</code>.</p>
<p>As a quick review, <a href="http://www.w3.org/TR/css3-background/#the-border-radius"><code>border-radius</code></a> will automatically provide rounded corners on the referenced element. You have independent control over each corner, giving you a wide range of possibilities when adjusting your borders.</p>
<p>Being able to round the corners of a design element using a quick CSS3 rule is inspirational as it stands on it&#8217;s own. Combine that with my arguably favorite ability for <code>border-radius</code> to easily round the corners of images as well as elements with <code>background-images</code> and I&#8217;m head over heels.</p>
<p>Taking a step back and examining it, I don&#8217;t see a tremendously huge problem with using <code>border-radius</code> today on a production website. I&#8217;m not able to take advantage of it on client work, however, because no matter how hard I try to convince a client that visitors with less capable browsers won&#8217;t know any different, they&#8217;re still going to see a less elegant design. And that&#8217;s something I <strong><em>completely</em> agree with</strong>.</p>
<p>I am not yet comfortable with putting a client site out there that degrades to the point, although completely accessible and usable, it looks unfinished and utilitarian.</p>
<h2>Text shadow</h2>
<p>The rise of <a href="http://en.wikipedia.org/wiki/Mac_OS_X_Leopard">OS X Leopard</a> brought us the wildly popular text inlay effect achieved through a clever drop-shadow treatment to text. Tons of <a href="http://veerle.duoh.com/blog/comments/apple_leopard_text_effects/">tutorials</a> cropped up rather quickly with instructions to replicate the effect, and it&#8217;s something we see fairly consistently in new designs from both big names and small. We can all understand why, it&#8217;s a nice looking, elegant treatment that can improve things both aesthetically as well as improve readability when used properly.</p>
<p>Moreover, <code>text-shadow</code> can help on many levels when it comes to readability, and that&#8217;s one of the major reasons I&#8217;d like to start using it consistently today. It&#8217;s something that can be implemented on a very subtle level, and at the same time return some really excellent results without many people noticing.</p>
<p>Truth be told, unless the absence of <code>text-shadow</code> will morph type into something more difficult to read, I think using it is just fine on a client production site.</p>
<h2>Multiple background images</h2>
<p>If there are any two opportunities CSS3 brings that I would most like to use, it&#8217;s <code>border-radius</code> and <a href="http://www.w3.org/TR/css3-background/#layering">multiple background images</a>. I can&#8217;t begin to fathom the number of <code>div</code>s I could have saved over the past year alone.</p>
<p>CSS3 gives us the ability to layer multiple background images on a single element which can build upon any existing <code>background</code> properties. It&#8217;s useful on so many levels, I can&#8217;t begin to explain how excited I&#8217;ll be when it becomes standard practice to use.</p>
<p>Unfortunately, this is a property I only use on a select few personal projects simply because the degraded result produced is far too different to deem acceptable in my opinion. That is of course unless you&#8217;re simply adding just another layer of very subtle refinement. While some intentional results can be put in place with a clever combination of cascading <code>background</code> properties, in my opinion (at this stage) your time is better spent accomplishing your goal the &#8220;old fashioned&#8221; way.</p>
<h2>Pseudo selectors</h2>
<p>Pseudo selectors <em>rock</em>. It&#8217;s great that they&#8217;re so old, many have been implemented in modern browsers, but you can&#8217;t become too comfortable with them quite yet. Of anything CSS3 has to offer, <a href="http://www.w3.org/TR/css3-selectors/#pseudo-classes">pseudo selectors</a> are something I use on nearly every project.</p>
<p>When it comes to pseudo-selectors, I still think of them as a method of progressive enhancement. The way I use them, the selectors provide that extra level of detail to a design that brings it to the next level. Using that approach, I think using pseudo-selectors is absolutely acceptable, and I&#8217;d even go so far as to fully recommend that they be used to tighten up the front end on any project. The changes they provide will definitely not be missed by viewers with non-supporting browsers unless you&#8217;re so aggressive with implementation, the render is drastically altered by their absence.</p>
<p>While I do tend to use pseudo-selectors, I find myself only relying on a few for the fine details I&#8217;m looking to apply.</p>
<h3>When it comes to clients</h3>
<p>Again, just to reiterate my stance here; these observations should be taken with a grain of salt. I&#8217;m only looking at the big picture, not taking into account the nearly endless variables and circumstances that come with every project that graces our monitors.</p>
<p>The biggest hill to climb by far, in my opinion, is <em>getting the blessing of your client</em> to go ahead with this more aggressive approach. After all, we were hired to produce a certain caliber of work. Unless your client is extremely Web savvy, and is somehow opinionated on the topic of how limited we are when it comes to CSS, their main concern will be that the investment they&#8217;re making with you will reach the widest audience possible.</p>
<p>The latest argument to skirt this issue is to simply present your comps after you&#8217;ve already began front end development. That is to say, some designers feel that presentation of a static comp is no longer applicable directly as a result of wanting to use progressive features such as CSS3. The idea behind it is this: if your client is using a substandard browser, the production site will look exactly like the approved comps simply because they&#8217;re using the same underpowered browser the whole time. Meanwhile, visitors with modern browsers will be graced with the much more pleasant version. As the client upgrades their browser, they&#8217;ll be elated that this new browser made their website look that much better! Although I&#8217;ve never tried that approach, I can&#8217;t quite stand behind it.</p>
<p>In my experience, clients are extremely detail oriented. They&#8217;re going to ask for more should they see the design in IE6, even if you took the time to beautifully degrade. At that point you have two choices; you can revert to the old school, or you can trek down the path of explaining CSS3 and why they <strong>need</strong> to trust you on this one. All the while eating those hours.</p>
<p>As I mentioned, this is something I&#8217;ve been going back and forth with for some time now, and I think having a conversation on the subject using <em>realistic</em> circumstances and case studies would be superb. What&#8217;s your stance on the issue, specifically when dealing with clients and not your personal projects? Do you think CSS3 is simply ready for prime time given the many repercussions involved? At what point will it be acceptable to implement CSS3 and not have to focus on fallbacks and graceful degradation?</p>
<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=776&c=198850347' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=776&c=198850347' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></content:encoded>
			<wfw:commentRss>http://mondaybynoon.com/20100208/were-ready-for-css3-but-are-we-ready-for-css3/feed/</wfw:commentRss>
		<slash:comments>63</slash:comments>
		</item>
		<item>
		<title>&#8226; An Overview of and Introduction to Pods CMS for WordPress</title>
		<link>http://mondaybynoon.com/feeder/?FeederAction=clicked&#038;feed=Posts+%28RSS2%29&#038;seed=http%3A%2F%2Fmondaybynoon.com%2F20100104%2Fintroduction-to-pods-cms-wordpress%2F&#038;seed_title=%26%238226%3B+An+Overview+of+and+Introduction+to+Pods+CMS+for+WordPress</link>
		<comments>http://mondaybynoon.com/20100104/introduction-to-pods-cms-wordpress/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 07:13:13 +0000</pubDate>
		<dc:creator>Jonathan Christopher</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Favorites]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Workbench]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[Pods]]></category>

		<guid isPermaLink="false">http://mondaybynoon.com/?p=672</guid>
		<description><![CDATA[Pods is a fantastic plugin for WordPress that helps you bring content management to the next level on your favorite platform. If you follow me on Twitter, you know that I talk about Pods a lot. It's time that I showed you what I've learned so far in hopes that it helps you get up and running with Pods as well.<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=672&c=1207140881' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=672&c=1207140881' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></description>
			<content:encoded><![CDATA[<p>If you <a href="http://twitter.com/jchristopher">follow me on Twitter</a> you know that I mention <a href="http://pods.uproot.us/">Pods</a> <strong>a lot</strong>. As defined by its creators:</p>
<blockquote cite="http://pods.uproot.us/">
<p>Pods is a CMS framework for WordPress. It&#8217;s a plugin that sits on top of WordPress, allowing you to add and display your own content types.</p>
</blockquote>
<p>Calling Pods a &#8216;plugin&#8217; <strong>is an understatement</strong>. It&#8217;s one of those WordPress plugins that does so much more than provide some functionality to work with that makes your life a bit easier or makes WordPress that much more useful. <em>Pods has changed the way I work with WordPress</em>. Pods has allowed me to truly use WordPress as the content management system it was born to be. While a ton of great stuff is happening in the core, Pods is giving us what we need to work with today, and it&#8217;s spectacular.</p>
<p>Over the next few months, I plan to divulge all I know about Pods in a series of tutorials and articles meant to act as my own personal user guide for Pods. Pods is a big enough system where you can actually work with it in your own style, and I think I&#8217;ve done that to an extent. Pods has an entire level of author features that I don&#8217;t particularly make use of simply because I prefer to get my hands even dirtier than Pods requires.</p>
<h2>An introduction to Pods</h2>
<p class="article-image"><a href="http://pods.uproot.us"><img src="/images/pods-logo.png" alt="Pods Logo" /></a></p>
<p>As it is defined, <a href="http://pods.uproot.us">Pods</a> is a content management plugin for <a href="http://wordpress.org">WordPress</a>. Many people may wonder why a plugin is needed to make WordPress a content management system, doesn&#8217;t it do that already? <strong>Absolutely</strong>, but out of the box, WordPress specifically caters to a few types of content; <a href="http://codex.wordpress.org/Writing_Posts">Posts</a>, <a href="http://codex.wordpress.org/Pages">Pages</a>, <a href="http://codex.wordpress.org/Working_with_WordPress#WordPress_Media">Media</a>, <a href="http://codex.wordpress.org/Working_with_WordPress#Fighting_Comment_Spam">Comments</a>, and <a href="http://codex.wordpress.org/Links_Manager">Links</a>. WordPress does <strong>a ton</strong> more (such as categories, tags, users, etc.), but as far as the average user is concerned, those are the major content types you&#8217;re able to work with. Themes bring all that managed content together to share with the world, and plugins build on top of that even more.</p>
<p>Many plugins exist to provide you with a new type of content to manage, most often a specific type of content aimed at achieving a specific goal. That&#8217;s awesome, and helps tons of people to make that change they&#8217;re looking to update on their site. Pods, however, thinks about things in a different way.</p>
<p><a href="http://pods.uproot.us/">Pods</a> provides a platform on which to <em>build your own content types</em> to manage, all the while providing some really advanced functionality having to do with that content. From the <cite><a href="http://pods.uproot.us/codex/how_pods_works">User Guide</a></cite>, a Pod is a group of input fields. You can add and arrange any number of the various available input fields to any number of Pods, essentially creating your own custom CMS for each website you build in WordPress.</p>
<h3>Finding the happy medium between WordPress core and Pods</h3>
<p>So if WordPress is a CMS, and Pods is a plugin that acts as a CMS framework for WordPress, how (and why) can you use them at the same time?</p>
<p>While you can technically accomplish the same functionality with an out-of-the-box copy of WordPress using a crazy blend of nested Pages, categorized Posts, and a ton of <a href="http://codex.wordpress.org/Custom_Fields">Custom Fields</a>, Pods helps abstract that desired &#8216;next level&#8217; of functionality you&#8217;re looking for as a WordPress developer.</p>
<p>Trying to explain what Custom Fields are and how to use them to a client isn&#8217;t something I look fondly upon. While it&#8217;s super for developers, to the rest of the world it&#8217;s terribly bulky and unintuitive. I think Custom Fields are <strong>an awesome</strong> available resource for plugin developers, but they&#8217;re one of those things better left unseen to the novice user. Pods brings the ability to work with custom <em>pieces</em> of data to the client, all the while giving developers a terrific extended platform to build upon. If you find yourself repeatedly using custom fields within your WordPress sites, especially for clients, you&#8217;re probably ready for <a href="http://pods.uproot.us/">Pods</a>.</p>
<h4>The Pods CMS Series on <abbr title="Monday By Noon">MBN</abbr></h4>
<p>This article is the <strong>first</strong> in a series for Monday By Noon dedicated to <a href="http://pods.uproot.us/">Pods CMS</a>.</p>
<ol>
<li><a href="/2010/01/04/introduction-to-pods-cms-wordpress/">An Overview of and Introduction to Pods CMS for WordPress</a></li>
<li><a href="/2010/01/04/pods-basics-installation-and-setup/">Pods Basics: Installation and Setup</a></li>
<li><a href="/2010/01/04/pulling-pods-data/">Pods Basics: Pulling Pods Data to your Theme</a></li>
<li><a href="/2010/01/04/pods-ui-intro/">Pods UI: The Latest and Greatest Addition to Pods</a></li>
<li><a href="/2010/01/11/how-to-use-pick-columns-relationships-in-pods/">How to use Pick Columns (Relationships) in Pods</a></li>
<li><a href="/2010/01/25/pods-pagination-sorting/">The Last of the Pods Basics: Pagination and Sorting</a></li>
</ol>
<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=672&c=752815684' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=672&c=752815684' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></content:encoded>
			<wfw:commentRss>http://mondaybynoon.com/20100104/introduction-to-pods-cms-wordpress/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>&#8226; The Underlying Meaning of Content Management Systems</title>
		<link>http://mondaybynoon.com/feeder/?FeederAction=clicked&#038;feed=Posts+%28RSS2%29&#038;seed=http%3A%2F%2Fmondaybynoon.com%2F20091123%2Fthe-underlying-meaning-of-content-management-systems%2F&#038;seed_title=%26%238226%3B+The+Underlying+Meaning+of+Content+Management+Systems</link>
		<comments>http://mondaybynoon.com/20091123/the-underlying-meaning-of-content-management-systems/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 13:57:27 +0000</pubDate>
		<dc:creator>Jonathan Christopher</dc:creator>
				<category><![CDATA[Favorites]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[content management]]></category>
		<category><![CDATA[EE]]></category>
		<category><![CDATA[ExpressionEngine]]></category>

		<guid isPermaLink="false">http://mondaybynoon.com/?p=628</guid>
		<description><![CDATA[WordPress recently came under fire regarding its presence as a CMS<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=628&c=814008369' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=628&c=814008369' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></description>
			<content:encoded><![CDATA[<p>A spontaneous flash fire burst into flames this past weekend surrounding content management. Scratch that; <em>it focused on <a href="http://wordpress.org">WordPress</a></em>. Like many of these debates, it was sparked by a seemingly unrelated Tweet, this time by <a href="http://twitter.com/nathansmith/status/5927498193">Nathan Smith</a>. My personal reaction to the post was to let it be. I appreciate knowing that a designer knows how to work with WordPress, not so much Dreamweaver, but can understand referencing WordPress as a skill, albeit an outlying skill. Could the designer list PHP as a skill? Sure, but when a lead comes through asking for <a href="http://drupal.org/">Drupal</a> development, the designer is worse off and faced with a dead end.</p>
<p><img src="/images/tweet-nathan-smith.jpg" alt="I always get a chuckle when designers list 'WordPress' amongst their skill-set, or say 'I use Dreamweaver' with a straight face." /></p>
<p>I&#8217;m going to infer that what resulted was not Nathan&#8217;s intention, but a small powder keg went up in flames. He was hit with instant recoil from the massive troll population plaguing both our community and the rest of the Internet. Without taking the time to find out his true intention, people instantly felt Nathan was bashing both WordPress and Dreamweaver, and felt the need to express a targeted response. I&#8217;m all for debate, but there are certain ways of going about it. The odd part about this occurrence, however, was that people on <em>both sides</em> of the fence were being quite overzealous about their home turf.</p>
<h2>The philosophy of content management</h2>
<p>I think a major talking point throughout this conversation needs to be the premise of content management itself. How is content management defined? To me, a content management system is something that <strong>manages content</strong>. It can be &#8220;enterprise level&#8221; content management (whatever that may mean), <em>blogging</em>, or the one page site your aunt asked you to put together for her.</p>
<p>Much of the support &#8220;in favor&#8221; of Nathan&#8217;s opinion surrounded the stigma WordPress has as a blogging platform. <a href="http://www.nateklaiber.com/">Nate Klaiber</a> made a great point throughout the back and forth; that <a href="http://twitter.com/nathansmith/status/5931463560">custom fields != CMS</a>. That&#8217;s more than true. I absolutely 100% agree with that sentiment. It was at this point I learned that what we&#8217;re dealing with is again the mass adoption issue with WordPress. More on that later.</p>
<p>WordPress has its roots in blogging, that is the founding purpose without a doubt. The continuation of the story, however, is that WordPress has essentially conquered blogging. WordPress moved beyond blogging on the order of years ago. Since then, WordPress has begun to accommodate a nearly endless combination of site types it can handle. Not to toot any horns, and not that it&#8217;s the end all be all, but over the past years WordPress has worked its way up the <a href="http://www.packtpub.com/award">Open Source CMS Award</a> rankings to take it home this year.</p>
<h3>How WordPress fits in</h3>
<p>Nathan&#8217;s primary argument regarding WordPress was the fact that to him, while it makes a decent blogging platform, to call <abbr title="WordPress">WP</abbr> a proper content management system would be pigeonholing. Many rejoiced, many took offense. Surprising to me, a number of designers I&#8217;ve come to respect went so far as to say that if you use WordPress as a CMS <strong>you&#8217;re doing your client a disservice</strong>. That was tough to hear, not because I&#8217;m defensive of WordPress, but because that&#8217;s quite a dig to take at a large population of what I feel are talented people.</p>
<p>I&#8217;m a huge fan of WordPress. I use it for 98% of my projects and it&#8217;s worked out swimmingly. I&#8217;m not dumping dozens of custom fields into every Post and Page though, I&#8217;m using a set of plugins I&#8217;ve come to know, trust, and work with for an extensive amount of time that helps me provide <em>terrific content management platforms</em> for my clients.</p>
<p>That&#8217;s where a light bulb went off for me through this back and forth amongst my peers. The people supporting WordPress know it on a higher level than those who were bashing it. I then continued to process the discussion by justifying some comments by realigning them to target an out of the box installation of WordPress, sans plugins. But then I went on to think about some of the content management systems suggested as alternatives to WordPress. The primary of which being <a href="http://expressionengine.com/">ExpressionEngine</a> and <a href="http://drupal.org">Drupal</a>.</p>
<p>That&#8217;s where it got interesting to me, and where I felt zealotry was taking over a bit. I respect both ExpressionEngine and Drupal, and although I&#8217;ve never used either beyond a basic installation and run through, I can see that lots of time and effort has gone into both. I also know and respect the large, talented, and knowledgeable communities surrounding both platforms, but I also know that I&#8217;m turned off by both systems for daily use. I&#8217;m not here to start another flame war, but my trials with both ExpressionEngine and Drupal have shown that they&#8217;re not the system for me, not at this time. I say &#8216;at this time&#8217; because I fully intend to explore both systems in full detail for an extended amount of time before officially signing either off as incompatible with the way I want to present a CMS to my client. Drupal also won big this year in the unofficial CMS Awards; it took home the Hall of Fame Award, and has a long standing streak of winning Best Overall Open Source CMS in past years.</p>
<p>I continued on with my thought process to realize that many of the people who know and love ExpressionEngine and Drupal also have their secret weapons in the form of plugins or mods that make the CMS work the way they want. For example, I can&#8217;t count the number of times I&#8217;ve heard people say that they&#8217;d never build an <abbr title="ExpressionEngine">EE</abbr> site without <a href="http://buildwithstructure.com/">Structure</a>. I&#8217;ve also heard that Structure completely changes the way you work with EE. I use <a href="http://pods.uproot.us">Pods</a> for every WordPress project I build. <strong>It completely changes the way you work with WordPress.</strong></p>
<p>What does that say about each respective platform? What does that say about the plugin architecture? What does it say about the people using the systems?</p>
<h3>My final remarks on the issue</h3>
<p>As I mentioned previously, I feel that a major aspect of the WordPress vs. &#8220;CMS&#8221; ordeal is mass adoption. As with PHP in general, <strong><em>people do lots of stupid crap with WordPress</em></strong>. I admit that fully. When it&#8217;s so readily accessible and open, it&#8217;s an impossible thing to avoid. There are also, however, people doing some amazing things with WordPress, and it&#8217;s got nothing to do with shoehorning or pigeonholing.</p>
<p>I also feel that the minor aspect of the debate is (for lack of a better term) ignorance tied in with a touch of overzealousness. It&#8217;s hard to become intimately involved with every CMS in an effort to find a fully encompassing opinion on it. That takes quite a bit of time and even more effort, a resource everyone in the world ran out of long ago. If your initial experience with a CMS didn&#8217;t work out in the way you had hoped, you&#8217;re going to move on to the next until you find something that does. Once that project goes smoothly and you&#8217;ve covered the basics, you&#8217;re going to learn even more on the next project, so on and so forth. Before you know it, even considering the original CMS was a laughing matter as you&#8217;ve become so accustomed to <em>what worked for you</em>. Why, if that original experience was so lacking, would you keep up with development, keep up with new plugins, or even bother reading up on the system at all? You&#8217;ve got <strong>work to do</strong> and you want to get it done with the system you know to be effective.</p>
<p>In the end, I&#8217;d just like to conclude this opinionated piece by reminding everyone that it&#8217;s not always the tools you use to get the job done, it&#8217;s the end product itself. While content management is a unique case in that your client will see the tool you&#8217;ve chosen, it&#8217;s about education. Instead of talking bad about one system or another, how about we build some websites? Let&#8217;s tout the good things we&#8217;ve come to know and love about our choice content management system, and leave the rest to the wayside.</p>
<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=628&c=1477240662' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=628&c=1477240662' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></content:encoded>
			<wfw:commentRss>http://mondaybynoon.com/20091123/the-underlying-meaning-of-content-management-systems/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>&#8226; Inspiration is Something to Have and to Hold</title>
		<link>http://mondaybynoon.com/feeder/?FeederAction=clicked&#038;feed=Posts+%28RSS2%29&#038;seed=http%3A%2F%2Fmondaybynoon.com%2F20091116%2Finspiration-is-something-to-have-and-to-hold%2F&#038;seed_title=%26%238226%3B+Inspiration+is+Something+to+Have+and+to+Hold</link>
		<comments>http://mondaybynoon.com/20091116/inspiration-is-something-to-have-and-to-hold/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 13:55:25 +0000</pubDate>
		<dc:creator>Jonathan Christopher</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Favorites]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[burnout]]></category>
		<category><![CDATA[Inspiration]]></category>

		<guid isPermaLink="false">http://mondaybynoon.com/?p=618</guid>
		<description><![CDATA[Inspiration is very important to Web designers, it's important to cultivate and care for it.<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=618&c=994297098' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=618&c=994297098' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></description>
			<content:encoded><![CDATA[<p>One of the things I enjoy most about being a Web designer is my peers. I&#8217;ve thought about it quite a bit, and I&#8217;m hard pressed to find another industry in which you find such consistent inspiration. I don&#8217;t mean inspiration in the form of design galleries or blog posts, I mean inspiration from within the people I talk to every day.</p>
<p>I sincerely doubt that you&#8217;ve come across a fellow [Web] designer who talks about his job as though it only pays the bills. I find that extremely endearing about our industry. We&#8217;re all here by choice, and apart from unavoidable frustrations found in everything, <em>we love what we do</em>.</p>
<p>People in our industry are often overly inspired to a fault, resulting in <a href="/2008/05/05/improving-your-process-combating-burnout/">becoming burnt out</a>. <em>The trouble lies with inspiration.</em> We&#8217;re often so inspired in the daily goings on, we&#8217;ll become burnt out before knowing it. I can&#8217;t count the number of times I&#8217;ve been super excited to work on a project, only to be itching to work on anything else by the time a push to launch comes about. It&#8217;s not because the project became less interesting, not because the client <em>bipolar&#8217;d himself</em> on to my &#8220;Ugh&#8221; list, but because I put everything I&#8217;ve got into it for weeks on end and <strong><em>it</em> eventually runs out,</strong> no matter how devoted you are.</p>
<h2>Retain your inspiration</h2>
<p>I&#8217;ve thought a lot about my inspiration lately. I can&#8217;t say for sure that I&#8217;ve got any solid, noteworthy results for myself, but I can say that both <a href="http://suggestrss.com">SuggestRSS</a> and <a href="http://jchristopher.me">jchristopher.me</a> are a direct result. I&#8217;d like to chat a bit about how I&#8217;ve approached things lately, in hopes that it strikes a chord somewhere.</p>
<p>When I speak about inspiration here, I won&#8217;t be focusing on <em>design</em> inspiration per se, I mean the inspiration to have fun with your work and enjoy it. That is to say, I won&#8217;t touch on having design block on a current project and give a list of the <strong>Top 10 Sites and Galleries I Use for Inspiration</strong>. In fact, that note right there brings up my first suggestion.</p>
<h3>Look in new places</h3>
<p>There&#8217;s plenty of inspiration flooding the Web at any given time. Whether it&#8217;s a design article from the people you look up to, or something you randomly stumbled upon, it&#8217;s almost trivial to find a new article that gets you thinking about Web design in a slightly different way.</p>
<p>That&#8217;s all well and good, but lately I&#8217;ve started to get inspiration from different sources, and it&#8217;s downright addictive. If you&#8217;ve got creative interests outside of Web design, <strong><em>focus on them</em> and keep the Web out of it</strong>.</p>
<p>I&#8217;ve been devoting a lot more time to studying photography over the past year or so. I&#8217;ve been studying not only the art of shooting a photo, but the science behind it as well. On top of that I&#8217;ve made an active effort to talk to other photographers (<a href="http://encourageothers.com">Kevin</a> and <a href="http://somerandomdude.com">P.J.</a>) specifically about photography and <strong>photography only</strong>, without the conversation turning to the Web, with both being designers themselves. Not only because they know more than me and that&#8217;s one of the best ways I like to learn, but also because it inspires me to go out and take more photos, to try to better what skill I have.</p>
<p>Another place I&#8217;ve been gathering inspiration is Xbox. <strong>That&#8217;s right, Xbox!</strong> There is some really slick design work in video games, tie that in with the experience of playing and your creative can go into overdrive. If you <a href="http://twitter.com/jchristopher">follow me on Twitter</a> you&#8217;ll already know that I&#8217;m a <em>huge fan</em> of <a href="http://www.dirt2game.com/">DiRT 2</a>. Not only is the game itself (rally racing) wicked fun, everything right down to the menus look great. On top of that, Codemasters integrated the soundtrack in a really neat way that gets you excited to race. The menus in that game, for one reason or another (and hard as it is to see) actually had a bit of an effect on the design of <a href="http://jchristopher.me">jchristopher.me</a>.</p>
<p>The final outlet I&#8217;d like to touch on is super generic and probably obvious, but the other place I&#8217;ve been gathering much of my inspiration is <em>away from the computer</em>. As a result of an entire series of circumstances in my personal life, work and design took a huge back seat for nearly two months. There were events both good and bad that helped provide an entirely new perspective on things for me personally, and that became inspirational over time. I think what I mean to say is that one of the most inspirational things you can do is get out and live life, as clich&eacute; as that sounds. People, circumstances, situations, and surroundings can be tremendously inspirational in the strangest of ways. The point to the anecdote, though, is that I found inspiration through prevention. <strong>Not</strong> living and breathing Web design helped me to enjoy it more once things settled down and got back on track.</p>
<p>Outside unconventional outlets for inspiration, there are some that remain more tied to the industry itself.</p>
<h3>Actively ignore the junk, because there&#8217;s lots</h3>
<p>Quit looking at &#8220;CSS&#8221; design galleries. Seriously. Take other designs for what they&#8217;re worth, but unless you want to get away with blending in and at the same time do nothing for your personal growth, peruse them in your free time, not to jump start your creative. I do feel there can be inspiration gathered from these sites, but little more than checking out what trends and novelties have filtered through the entire spectrum of Web designers.</p>
<p>Along those lines: push the linkbait, &#8220;Top 13&#8243;, design trend, monetary-inspired articles as far away as possible. Those pieces exist for little more than click-through percentage boosts and hitting the front page of Digg. What good is that to you? There&#8217;s a very fine line between <strong>information</strong> and <strong>linkbait</strong>, and it&#8217;s very important that you&#8217;re <em>critical of everything you read.</em> In my opinion, there&#8217;s quite a bit of junk out there, all backed by a lot of &#8220;leading&#8221; design sources. That&#8217;s not the place to find inspiration.</p>
<p>As closure to this section, one of the most important things to do is surround yourself with the proper people all the while doing what you can to remove yourself from The Others. I mean in person, not virtually. I&#8217;m also not speaking about strictly other Web designers either, I mean <strong>in general</strong>. People are extremely influential, and it doesn&#8217;t take much for the Human Factor to completely throw you off. I don&#8217;t mean to suggest playing favorites, being outwardly rude, or anything along those lines. I just mean to say that the people around you directly effect you, no matter how focused or introverted you may be.</p>
<p>If you&#8217;re surrounded by those with an equal interest and investment in Web design, you won&#8217;t be able to help yourself from becoming inspired. Not only are you provided valuable insight, you&#8217;re provided a new angle, which is super important.</p>
<h3>Don&#8217;t sweat the small stuff</h3>
<p>Stress and anxiety are by far the quickest inspiration killers for me. Do what you can to let as much slide off your back as possible, especially if you&#8217;re in a position where there&#8217;s a lot going on outside design work itself. If you&#8217;re a freelancer, this may not apply as much, but if you work within a company of people, it&#8217;s probably a different story.</p>
<p>I&#8217;m not saying stop caring. I&#8217;m not saying that at all. What I am saying is that everything is not an emergency, don&#8217;t make rash decisions on the spot because you&#8217;ve got a lot on your plate.</p>
<p>When working within a company there&#8217;s not only the general day-to-day activity going on, but there&#8217;s also company strategy, client issues, deadlines, concurrent projects, and email to deal with. Even if your company is well structured and you&#8217;re low in the ranks, things will absolutely come up at some point, no matter how big the company is.</p>
<h3>Inspiration can be delicate, so be nice</h3>
<p>I think the big Take Home lesson I&#8217;ve learned throughout the past few months is that my inspiration can be fragile; it doesn&#8217;t take a whole lot to throw everything off track for the day. There are things, however, that can be done to ensure that inspiration-destroying bits of life can be pushed the wayside until it&#8217;s appropriate to handle. There&#8217;s nothing wrong with that; hop in low gear and ride it out.</p>
<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=618&c=1275398958' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=618&c=1275398958' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></content:encoded>
			<wfw:commentRss>http://mondaybynoon.com/20091116/inspiration-is-something-to-have-and-to-hold/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>&#8226; The Trouble with Lightbox (and its Variants)</title>
		<link>http://mondaybynoon.com/feeder/?FeederAction=clicked&#038;feed=Posts+%28RSS2%29&#038;seed=http%3A%2F%2Fmondaybynoon.com%2F20091012%2Fthe-trouble-with-lightbox-and-its-variants%2F&#038;seed_title=%26%238226%3B+The+Trouble+with+Lightbox+%28and+its+Variants%29</link>
		<comments>http://mondaybynoon.com/20091012/the-trouble-with-lightbox-and-its-variants/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 13:53:15 +0000</pubDate>
		<dc:creator>Jonathan Christopher</dc:creator>
				<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Favorites]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[lightbox]]></category>
		<category><![CDATA[SWFAddress]]></category>

		<guid isPermaLink="false">http://mondaybynoon.com/?p=587</guid>
		<description><![CDATA[Lightbox is a great image display technique for the modern Web, just be sure it's still usable!<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=587&c=1934246689' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=587&c=1934246689' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></description>
			<content:encoded><![CDATA[<p>Lokesh Dhakar changed things with the original <a href="http://www.huddletogether.com/projects/lightbox/">Lightbox JS</a>. He designed and produced an interactive functionality that made nearly every Web designer slap his own forehead in amazement that it hadn&#8217;t been thought of before. Those are the best ideas, aren&#8217;t they? More often than not, it&#8217;s because those ideas solve a problem so simple and common place, we hardly see it as a &#8220;problem&#8221; any more.</p>
<p>In the case of lightboxing, it came down to displaying images either by using <code>target="_BLANK"</code> or simply dealing with a full page refresh. For what? Clearly both the latency and resources involved were too taxing both for the user and her experience, even if she didn&#8217;t know it.</p>
<p>Lokesh recognized the problem and developed a <em>very</em> elegant solution that took the Web by storm. As with all great things on the Web, his implementation was first widely accepted, and then widely <del>copied</del> <ins>forked</ins>. The technique was applied to every JavaScript library and/or framework under the sun, in multiple cases, and the technique of lightboxing really took hold.</p>
<h2>So what&#8217;s the problem with lightboxes, gramps?</h2>
<p>Don&#8217;t get me wrong, <strong>I&#8217;m a <em>huge</em> fan of lightbox!</strong> To me, the trouble isn&#8217;t with lightbox as an entity or technique, the trouble surfaces when it&#8217;s put into production. I can&#8217;t remember a client project in which a lightbox variant was used where we didn&#8217;t need to take time to explain what it is and how it works.</p>
<p>That&#8217;s not to say that the lightbox used odd controls or was modified beyond recognition, no. It was simply because the average Web user doesn&#8217;t understand what&#8217;s going on. At all. Here&#8217;s where the problem comes up, and it&#8217;s a <strong>deal breaker</strong>. <em>(Most) lightboxes break the Back button</em>.</p>
<p>In <strong>every</strong> case of showing a client a development site using a lightbox, he would examine an image and disregard the controls put in place to return to the page, and <em>always</em> go for the Back button in his browser. Even after explaining the reasons we implemented lightbox for image viewing (user experience improvement, etc.) it was very apparent that the client was turned off by the technology.</p>
<h3>A proposed fix</h3>
<p>To our benefit, such technology exists to assist us with such problems. <a href="http://www.asual.com/swfaddress/">SWFAddress</a> was written to tackle this problem specifically. Originally written for the benefit of full Flash websites, <a href="http://www.asual.com/swfaddress/">SWFAddress</a> works wonders with JavaScript implementations as well.</p>
<p>Combining SWFAddress with your favorite lightbox variant would solve this very common problem with its use. A potential issue arises on a couple fronts. First, you&#8217;ll need to teach yourself how to use and implement SWFAddress. Beyond that, you&#8217;ll need to learn how to integrate SWFAddress with your lightbox.</p>
<p>As an example, I&#8217;ve taken those very steps and combined my choice lightbox implementation <a href="http://www.shadowbox-js.com/">Shadowbox.js</a> with <a href="http://www.asual.com/swfaddress/">SWFAddress</a> and used <a href="http://jQuery.com">jQuery</a> to bridge the two.</p>
<p><a class="viewDemo" href="/examples/lightbox-swfaddress/">Lightbox (Shadowbox) and SWFAddress integration demo</a></p>
<p>Please view the source for documentation.</p>
<p>You&#8217;ll notice that the Back/Forward browser buttons should retain expected functionality. Additionally, if you were to bookmark a SWFAddressed URL, hitting that URL should automatically invoke the Shadowbox and display the image. Users without JavaScript wouldn&#8217;t see the SWFAddress URLs at all, so it&#8217;s important to remember your alternative version for those users. But that was already in place, <em>right</em>?</p>
<h3>Mind your audience, <em>that&#8217;s</em> the deciding factor</h3>
<p>As per usual, the important thing here to consider when determining what technologies to use on your current project is to remember the target audience. Are they going to accept lightbox as an acceptable image display technique? Are you better off just doing things the old school way and firing a page refresh? Just be sure you&#8217;ve got reasoning (and fallbacks in place) when opting to go with such technologies.</p>
<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=587&c=540498417' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=587&c=540498417' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></content:encoded>
			<wfw:commentRss>http://mondaybynoon.com/20091012/the-trouble-with-lightbox-and-its-variants/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>&#8226; How to Handle IE6: Aggressive Graceful Degradation</title>
		<link>http://mondaybynoon.com/feeder/?FeederAction=clicked&#038;feed=Posts+%28RSS2%29&#038;seed=http%3A%2F%2Fmondaybynoon.com%2F20090921%2Faggressive-graceful-degradation%2F&#038;seed_title=%26%238226%3B+How+to+Handle+IE6%3A+Aggressive+Graceful+Degradation</link>
		<comments>http://mondaybynoon.com/20090921/aggressive-graceful-degradation/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 13:00:35 +0000</pubDate>
		<dc:creator>Jonathan Christopher</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Favorites]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[graceful-degradation]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[Internet-Explorer]]></category>

		<guid isPermaLink="false">http://mondaybynoon.com/?p=576</guid>
		<description><![CDATA[I'd like to propose an Internet Explorer contract addendum in which we notify clients that their project will gracefully degrade for IE.<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=576&c=1694279008' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=576&c=1694279008' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></description>
			<content:encoded><![CDATA[<p>No matter how much it may bother us, IE6 is still quite a hot topic around our little community. Two camps have recruited their groups and each seems quite comfortable with the accepted stance on their side of the fence. To one segment, IE6 is literally a bane of existence, and taking active aggressive measures against IE is daily practice. The other side, however, <strong>sucks it up and deals</strong>.</p>
<p>I often challenge my own stance on handling IE6, and have found what I consider to be a happy medium between both sides of this argument. I can&#8217;t in good faith stand behind the abrasive method of completely blocking (or severely limiting) access to a site based on user agent. Another way of handling things is to serve a completely alternate stylesheet, or remove the styles altogether. I prefer that solution over a roadblock.</p>
<p>At the other end of the spectrum, designers will do anything and everything to make the best of the situation, including tracking and billing time specifically for IE6 support. These designers seem to be most irritable when it comes to IE6, and understandably so. There&#8217;s a better solution. There is middle ground.</p>
<h2>Support IE6, but don&#8217;t cater to it</h2>
<p>I (and my company) <strong>support IE6</strong>. We do it because we have a strong feeling about accessibility, and supporting IE6 is really not a big deal.</p>
<p>The biggest calling to roadblock IE6 is by far its CSS &#8220;support&#8221; &mdash; that&#8217;s what gives the biggest headaches and leaves everyone running for the hills. The thing to remember, though, is that you&#8217;re a professional. With each project, <em>working with IE6 is going to get easier</em>. You&#8217;ll remember the disaster happened last time, and you&#8217;re going to remember <strong>how you fixed it</strong>. You&#8217;re not going to be faced with that problem this time around, or ever again. Get a couple years of that under your belt and you&#8217;re on Easy Street.</p>
<p>I&#8217;m not saying that your fixes need to go above and beyond a level of reason for the sake of IE6. The markup and style we&#8217;re writing is solid, right? There&#8217;s no reason we can&#8217;t quickly gracefully degrade a document either out of the box or by force. If that drop shadow is giving you trouble, <em><strong>tell IE6 it&#8217;s not there</strong></em> and continue with the next task. This design uses a series of PNGs to bring it to the next level? Don&#8217;t bother with PNG fixes; use a choppy GIF or nothing at all. Next.</p>
<p>Another major reason for roadblocking IE6 is JavaScript support. Even though we&#8217;re working with superb JavaScript libraries, things sometimes just don&#8217;t work out the way we expect. Here&#8217;s the answer for that:</p>
<p>JavaScript enhances the document viewing experience by adding an additional behavioral level, right? We&#8217;re talented professionals who have already built a fallback version of this document to directly compensate for the absence of JavaScript, right? Our problem is solved: <strong>IE6? Don&#8217;t fire our JavaScript.</strong> If it&#8217;s going to be a headache, why bother? We have a perfectly good version of the document that was only progressively enhanced by the JavaScript. IE6 can&#8217;t hack it, so just shut it off. Deliver the reduced experience because your viewer, for one reason or another (it doesn&#8217;t really matter, does it?) is using a terrible browser.</p>
<p>My point is, that the frustration regarding IE6 comes from forgetting about the medium in which we work. Pixel perfection is a lost cause, and that not only deals with off-by-one-pixel situations, that expands to include the bigger picture including both design assets and behavior enhancements. Don&#8217;t try to replicate the beauty of the original design in IE6, just make it accessible and move on.</p>
<h3>Aggressive Graceful Degradation</h3>
<p>I&#8217;ve come to call this view of IE6 support Aggressive Graceful Degradation. Instead of relying on your implementation to fall back to a working version of something, you instead <em>force the changes</em> through gateways provided by IE6 itself.</p>
<p>My experience has taught me how to avoid any catastrophic issues as far as the box model (and therefore main document structure) is concerned, so the IE6 issues I deal with on every project are minimal at best. My IE6-specific stylesheets are mostly just a few declarations replacing PNGs with GIFs (or removing the image entirely) and <code>li</code> fixes that I already expected to implement.</p>
<p>There are a number of other tips that I&#8217;ve come to learn in my career that make IE6 less than a bleep on the radar on any project. I documented a number of these tips in <a href="/2009/01/12/fear-not-i-have-conquered-ie6-and-you-can-too/">Fear not. I have Conquered IE6, and You Can Too</a>, hopefully there are some things that will help you out if you&#8217;re having a bit of trouble tackling IE6.</p>
<p>The other main factor to which I can attribute the success of Aggressive Graceful Degradation is that <a href="/2006/05/15/i-vote-conditional-comments/">I employ conditional comments</a> to target each version of Internet Explorer in such a way that my fixes are implemented quickly and directly with no side effect other than a few extra bytes of bandwidth for standards-based browsers.</p>
<p>Conditional comments is a subject by itself, one that has been discussed up down left and right, and I&#8217;m hard pressed to find a negative stance that really takes hold with me. I&#8217;m more than thankful that Microsoft implemented conditional comments so long ago, as it is the single most important enabling feature of Aggressive Graceful Degradation.</p>
<h3>Preparing your clients</h3>
<p>Taking an Aggressive Graceful Degradation stance is the easy part, the hardest part by far is conveying both the cause and effect of this decision to your client and what it means for his project. To tackle this issue directly, my company has started <a href="/internet-explorer-contract-addendum/">including an additional document</a> with our contracts, explicitly stating our stance when it comes to Internet Explorer.</p>
<p>We try to teach our clients as much as we can from the kickoff meeting through (and beyond) a site launch. More often than not, a client will appreciate the fact that you&#8217;ve taken the time to share your knowledge, and explain it in such a way that the information is useful.</p>
<p>This <a href="/internet-explorer-contract-addendum/">extra document</a> is referenced in the contract copy and the client is required to sign, acknowledging that he knows his website may in fact render in a very different way, but retain full accessibility. I&#8217;d like to extend this document to the community, in hopes that it helps you to take a stance of Aggressive Graceful Degradation when it comes to IE6 as opposed to taking on an abrasive solution such as roadblocking the project.</p>
<p>If you&#8217;d like to find out more information regarding the <a href="/internet-explorer-contract-addendum/">Internet Explorer Contract Addendum</a> please feel free to review and use the addendum in your own contracts, it is released under a <a href="http://creativecommons.org/licenses/by-sa/3.0/us/">Creative Commons Attribution-Share Alike 3.0 United States License</a>. Suggested revisions are encouraged. A formal area for suggestions has not yet been established, but please feel free to <a href="/contact">contact me directly</a> and we can all work together to make the addendum commonplace in project contracts.</p>
<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=576&c=2039427280' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=576&c=2039427280' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></content:encoded>
			<wfw:commentRss>http://mondaybynoon.com/20090921/aggressive-graceful-degradation/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
		<item>
		<title>&#8226; The Art of zen-coding: Bringing Snippets to a New Level</title>
		<link>http://mondaybynoon.com/feeder/?FeederAction=clicked&#038;feed=Posts+%28RSS2%29&#038;seed=http%3A%2F%2Fmondaybynoon.com%2F20090817%2Fthe-art-of-zen-coding-bringing-snippets-to-a-new-level%2F&#038;seed_title=%26%238226%3B+The+Art+of+zen-coding%3A+Bringing+Snippets+to+a+New+Level</link>
		<comments>http://mondaybynoon.com/20090817/the-art-of-zen-coding-bringing-snippets-to-a-new-level/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 12:32:58 +0000</pubDate>
		<dc:creator>Jonathan Christopher</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Favorites]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Aptana]]></category>
		<category><![CDATA[Coda]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Espresso]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[Snippets]]></category>
		<category><![CDATA[TextMate]]></category>
		<category><![CDATA[zen-coding]]></category>

		<guid isPermaLink="false">http://mondaybynoon.com/?p=535</guid>
		<description><![CDATA[zen-coding is a new plugin for Web designers and developers, letting them write their code at high speed.<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=535&c=2040623746' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=535&c=2040623746' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></description>
			<content:encoded><![CDATA[<p>If I had to single out one thing that most significantly changed the way I write markup, code, and style, it would without a doubt be snippets. To get even more specific, it would be the snippet implementation of <a href="http://macromates.com/">TextMate</a>. When I first saw the feature at work via screencast, I was literally flabbergasted. I can&#8217;t explain how much it changed the way I thought about writing code, productivity, and overall quality of work. I was currently running Linux at the time, so I spent day and night trying to find replicate functionality in a native editor for myself.</p>
<p>This was before the days of the <a href="http://live.gnome.org/Gedit/Plugins/Snippets">Gedit implementation of snippets</a> so I did my best to <a href="/2007/03/12/using-scite-with-textmate-style-snippets/">replicate TextMate in SciTE</a>. <em>It was <strong>awesome</strong></em>. Incorporating snippets changed the way I worked by orders of magnitude, and the implementation found in TextMate is the bar to which I compare every other editor I&#8217;ve tried.</p>
<p>What&#8217;s great is that snippets seem to have hit the mainstream. Besides OS X specific editors such as <a href="http://panic.com/coda">Panic&#8217;s Coda</a> and <a href="http://macrabbit.com/espresso">MacRabbit&#8217;s Espresso</a>, platform independent editors and <abbr title="Integrated Development Environment">IDE</abbr>s have their own implementations as well. Apart from <a href="http://www.e-texteditor.com/">E TextEditor</a> on Windows, however, I haven&#8217;t seen an editor implement snippets to the full effect of TextMate.</p>
<h2>The big deal about snippets</h2>
<p>The deciding factor for me is the ability to have multiple stops per snippet. This gives you the ability to not only share snippets (through Bundles or otherwise) but also <em>very easily</em> write your own. Every designer/developer has his or her own set of tricks, and a generic bundle isn&#8217;t going to cover you 100%. The great thing about a solid implementation of snippets puts the power in your hand to finish the job and add the final touch of customization you need.</p>
<p>I&#8217;m always on the hunt for a newer, better editor. It&#8217;s a curse I&#8217;ve had for years and one that will never go away. To be brutally honest, snippets are the only thing holding me to TextMate at this point, as there are a number of strong contenders on the market now, targeted specifically toward Web developers. They&#8217;re also gorgeous to boot.</p>
<p>I was to the point where I was simply waiting for the various editors to publish a few dot releases including a solid snippets implementation a la TextMate. That is until I discovered <a href="http://code.google.com/p/zen-coding/">zen-coding</a>. My mind was blown all over again.</p>
<h2>zen-coding takes snippets to a new level</h2>
<p><a href="http://code.google.com/p/zen-coding/">zen-coding</a> touts itself as a &#8220;set of plugins for HTML and CSS hi-speed coding&#8221; and my gosh it lives up to the name. The snippets implementation provided by zen-coding are based on specification drafts, and a heck of a lot has been included by default.</p>
<ul>
<li><a href="http://code.google.com/p/zen-coding/wiki/ZenHTMLElementsEn">HTML elements (based on the HTML5 draft spec)</a></li>
<li><a href="http://code.google.com/p/zen-coding/wiki/ZenHTMLSelectorsEn">HTML selectors</a></li>
<li><a href="http://code.google.com/p/zen-coding/wiki/ZenCSSPropertiesEn">CSS properties (based on the CSS3 draft spec)</a></li>
</ul>
<p>Instead of going over the documentation here, I&#8217;d just like to call a bit of attention to the <a href="http://code.google.com/p/zen-coding/wiki/ZenHTMLSelectorsEn">HTML selectors</a> linked above. This is truly what made my jaw drop.</p>
<p>The biggest calling point for zen-coding for me is its implementation of HTML selectors as snippet triggers. zen-coding includes an entirely new angle to writing markup, and it facilitates the feature by letting you write HTML based on CSS selectors. It&#8217;s so simple it&#8217;s confusing at first. I think it&#8217;s best explained by doing a quick before and after. If you were to type:</p>
<pre class="sh_css"><code>div#name.one.two</code></pre>
<p>and follow that with the zen-coding plugin keystroke (CMD+E in TextMate), the plugin will reformat the line as:</p>
<pre class="sh_html"><code>&lt;div id=&quot;name&quot; class=&quot;one two&quot;&gt;&lt;/div&gt;</code></pre>
<p>Let&#8217;s get a bit more advanced, typing:</p>
<pre class="sh_css"><code>ul#name>li.item</code></pre>
<p>will result in:</p>
<pre class="sh_html"><code>&lt;ul id=&quot;name&quot;&gt;
    &lt;li class=&quot;item&quot;&gt;&lt;/li&gt;
&lt;/ul&gt;</code></pre>
<p>Last, but not least:</p>
<pre class="sh_css"><code>p.one+p.two</code></pre>
<p>will result in:</p>
<pre class="sh_html"><code>&lt;p class=&quot;one&quot;&gt;&lt;/p&gt;
&lt;p class=&quot;two&quot;&gt;&lt;/p&gt;</code></pre>
<p>It doesn&#8217;t stop there. zen-coding has included an even more elaborate set of possibilities on top of valid CSS selectors.</p>
<h3>Element multiplication and variables</h3>
<p>A really fascinating feature of the CSS selector abilities comes from element multiplication. Perhaps one of the most tedious things to mark up (when not working from existing copy) is a list (or eight). zen-coding does its part to lighten the load, quite a bit:</p>
<pre class="sh_css"><code>ul#name>li.item*3</code></pre>
<p>provides:</p>
<pre class="sh_html"><code>&lt;ul id=&quot;name&quot;&gt;
    &lt;li class=&quot;item&quot;&gt;&lt;/li&gt;
    &lt;li class=&quot;item&quot;&gt;&lt;/li&gt;
    &lt;li class=&quot;item&quot;&gt;&lt;/li&gt;
&lt;/ul&gt;</code></pre>
<p>By including a multiplication modifier, you can control <strong>how many</strong> child elements are included in the snippet!</p>
<p>The other really interesting implementation deals with variables in snippet output, which is neat:</p>
<pre class="sh_css"><code>select>option#item-$*3</code></pre>
<p>gives you:</p>
<pre class="sh_html"><code>&lt;select&gt;
    &lt;option id=&quot;item-1&quot;&gt;&lt;/option&gt;
    &lt;option id=&quot;item-2&quot;&gt;&lt;/option&gt;
    &lt;option id=&quot;item-3&quot;&gt;&lt;/option&gt;
&lt;/select&gt;</code></pre>
<p>By including the dollar sign, you can include a reference to the index of the element you&#8217;re multiplying. Although really specific, it could (and probably will) come in <em>very</em> handy from time to time.</p>
<p>I mean if you&#8217;re not impressed yet, I just give up!</p>
<h4>See it in action</h4>
<p>There are a few screencasts referenced on the <a href="http://code.google.com/p/zen-coding/">Google Code page for zen-coding</a> which illustrate the above really well:</p>
<ul>
<li><a href="http://pepelsbey.net/pro/2008/08/zen-html/">Zen HTML features, 1.х branch, screencast</a></li>
<li><a href="http://pepelsbey.net/pro/2008/10/zen-css/">Zen CSS features, 1.х branch, screencast</a></li>
<li><a href="http://chikuyonok.ru/2009/04/aptana-zen-coding-v01-beta/">Aptana Zen HTML features, 2.х branch, screencast</a></li>
</ul>
<p>Definitely check them out if my explanation is still a bit foggy, as the screencast really helps display what this plugin is capable of.</p>
<h4>Compatibility</h4>
<p>One of the finer points of zen-coding is the fact that the developer(s) are taking the time and effort to publish this genius for <strong>multiple editors</strong> both for OS X and cross-platform. Currently, according to the Google Code page, the plugin has versions for:</p>
<ul>
<li><a href="http://macromates.com/">TextMate</a></li>
<li><a href="http://www.aptana.com/">Aptana</a></li>
<li><a href="http://panic.com/coda/">Coda</a></li>
<li><a href="http://www.netbeans.org/">NetBeans</a></li>
<li><a href="http://macrabbit.com/espresso/">Espresso</a></li>
</ul>
<p><del>Unfortunately, I didn&#8217;t find a download link to the Espresso Sugar, but I will keep my eyes open for that as well.</del> <ins><strong>Update:</strong> the lead developer, in <a href="/2009/08/17/the-art-of-zen-coding-bringing-snippets-to-a-new-level/#comment-12886">his comment below</a>, let us know that the Sugar is included by default in Espresso releases.</ins> I&#8217;ve checked out the plugin both in TextMate and Coda and I can say that this plugin alone makes Coda a true contender for more advanced developers looking for a better implementation of Clips (until Coda natively supports snippets (fingers crossed for 2.0 bigtime)).</p>
<p><strong>Note:</strong> to fully install in TextMate, you&#8217;ll need to download three bundles. At the time of this writing, the three download links are titled as:</p>
<ul>
<li>Zen.Coding-TextMate.v0.3.zip (implements zen-coding)</li>
<li>TextMate.Zen.HTML.1.3.zip (implements HTML functionality)</li>
<li>TextMate.Zen.CSS.1.3.zip (implements CSS functionality)</li>
</ul>
<p>Be sure to install each bundle you need!</p>
<p>Non OS X users may find a bit of luck in that the plugin is released for both Aptana and NetBeans, two very popular IDEs as of late. Windows users should be able to use the TextMate bundles in E as you&#8217;re accustomed. While there is definitely activity on the Google Code page, I&#8217;m not positive that other editors will be supported in future releases.</p>
<h4>I love Web design.</h4>
<p>This is the line of thinking that really gets me excited about what I do. zen-coding has again completely changed the way I approach writing code, and has raised the bar to a new height. What else is great is that this functionality was provided out of someone else&#8217;s love for the industry as well. Their great idea is now making my life even easier, and that cycle will definitely continue in the Web design community.</p>
<br /><p><a href='http://rss.buysellads.com/click.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=535&c=1981200674' target='_blank' rel='nofollow'>
				<img src='http://rss.buysellads.com/img.php?z=1269068&k=2ee344414ac81fbb0f9de6ab08e9831e&a=535&c=1981200674' border='0' alt='' /></a></p><p><a href='http://buysellads.com/buy/sitedetails/pubkey/2ee344414ac81fbb0f9de6ab08e9831e/zone/1269068' target='_blank'>Advertise here with BSA</a></p>]]></content:encoded>
			<wfw:commentRss>http://mondaybynoon.com/20090817/the-art-of-zen-coding-bringing-snippets-to-a-new-level/feed/</wfw:commentRss>
		<slash:comments>66</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Database Caching 1/121 queries in 0.123 seconds using apc
Object Caching 1739/1938 objects using apc

Served from: www.mondaybynoon.com @ 2012-02-11 09:54:00 -->
