PageSourceSearch

http://eeinsider.com/articles/how-to.html

html eeinsider.com collected 2026-10-07 22:25:41 UTC 59,686 bytes, 653 lines download raw bytes

1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4
5<html lang="en">
6<head>
7	
7<script type="text/javascript">var _sf_startpt=(new Date()).getTime()</script>
7
8	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
9	<!-- Date: 2008-11-14 -->
10	<title>ExpressionEngine How-To | EE Insider</title>
11<meta name='keywords' content='learning expression engine, learning expressionengine, expressionengine, expression engine, ellislab, learning expression engine, learning expressionengine, ' />
12<meta name='description' content='News, tutorials and how-tos on learning ExpressionEngine.' />
13<link rel='canonical' href='how-to.html' />
14<!-- generated by seo_lite -->
15	<link rel="stylesheet" href="../css/main-v=20120810080200.css" type="text/css" media="screen" title="no title" charset="utf-8">
16	<!--[if lt IE 7]>
17	<link rel="stylesheet" href="/css/patches/win-ie-old.css?v=20111027080000" type="text/css" media="screen, projection" />
18	<![endif]-->
19	<!--[if gte IE 7]>
20	<link rel="stylesheet" href="/css/patches/win-ie7-up.css?v=20111027080000" type="text/css" media="screen, projection" />
21	<![endif]-->
22	<link rel="stylesheet" href="../css/print-v=20120716080000.css" type="text/css" media="print" />
23	<link rel="alternate" type="application/rss+xml" title="RSS feed for EE Insider" href="http://feeds.feedburner.com/eeinsider" />
24	<link rel="alternate" type="application/rss+xml" title="RSS feed for EE Insider Tips" href="../tips/rss.html" />
25	<link rel="icon" href="../favicon.ico" type="image/x-icon">
26	
26<script src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" type="text/javascript"></script>
26
27	
27<script src="../js/custom-v=20111027080000.js" type="text/javascript"></script>
27
28	
28<script src="../js/jquery.overlay-1.0.1.min.js" type="text/javascript" charset="utf-8"></script>
28
29	
29<script type="text/javascript" src="../js/flowplayer-3.1.4.min.js"></script>
29
30	
30<script type="text/javascript" src="../js/jquery.placeholder.min.js"></script>
30
31	
31<script src="../js/video-js/video.js" type="text/javascript" charset="utf-8"></script>
31
32
33	
33<script type="text/javascript" charset="utf-8">
34		VideoJS.setupAllWhenReady();
35	</script>
35
36	
36<script src="../js/imgbox/jquery.imgbox.pack.js" type="text/javascript" charset="utf-8"></script>
36
37	<link rel="stylesheet" href="../js/imgbox/imgbox.css" type="text/css" media="screen" title="no title" charset="utf-8">
38
39	
39<script type="text/javascript" charset="utf-8">
40	$(document).ready(function() {$('.lightbox').imgbox();});
41	</script>
41
42	
42<script type='text/javascript'>
43	var googletag = googletag || {};
44	googletag.cmd = googletag.cmd || [];
45	(function() {
46	var gads = document.createElement('script');
47	gads.async = true;
48	gads.type = 'text/javascript';
49	var useSSL = 'https:' == document.location.protocol;
50	gads.src = (useSSL ? 'https:' : 'http:') +
51	'//www.googletagservices.com/tag/js/gpt.js';
52	var node = document.getElementsByTagName('script')[0];
53	node.parentNode.insertBefore(gads, node);
54	})();
55	</script>
55
56
57	
57<script type='text/javascript'>
58	googletag.cmd.push(function() {
59	googletag.defineSlot('/1064724/Content_Middle_300x250', [300, 250], 'div-gpt-ad-1322358240113-0').addService(googletag.pubads());
60	googletag.defineSlot('/1064724/Masthead_300x250', [300, 250], 'div-gpt-ad-1322358240113-1').addService(googletag.pubads());
61	googletag.defineSlot('/1064724/Sidebar_160x600_Top', [160, 600], 'div-gpt-ad-1322358240113-2').addService(googletag.pubads());
62	googletag.defineSlot('/1064724/Sidebar_Bottom_160x600', [160, 600], 'div-gpt-ad-1322358240113-3').addService(googletag.pubads());
63	googletag.pubads().enableSingleRequest();
64	googletag.enableServices();
65	});
66	</script>
66
67	
67<script src="http://load.sumome.com/" data-sumo-site-id="0cca6c88f3d446e132e4df82c860f44d9a9001a9b86e48218ec6267936720051" async></script>
67
68</head>
69
70<body>
71	<div id="network">
72	<a href="http://mijingo.com">
73		<div id="network-content">
74			<p id="published-by">Published by Mijingo</p>
75		</div>
76	</a>
77</div>
78
79<div id="masthead">
80	<a id="masthead-logo" href="../index.html"><h1>EE Insider</h1></a>
81  <div id="featured-links">
82		<h2>ExpressionEngine Training Videos</h2>
83			<ul>
84				
85					<li><a href="../videos/show/creating-an-rss-feed.html">&raquo; Creating an RSS Feed</a></li>
86				
87					<li><a href="../videos/show/removing-index.php-from-expressionengine.html">&raquo; Removing index.php from ExpressionEngine</a></li>
88				
89					<li><a href="../videos/show/changing-users-in-the-control-panel.html">&raquo; Changing Users in the Control Panel</a></li>
90				
91					<li><a href="../videos/show/better-404s-with-the-require_entry-parameter.html">&raquo; Better 404s with the require_entry Parameter</a></li>
92				
93			</ul>
94	</div>
95	<div id="ad">
96		<div id='div-gpt-ad-1322358240113-1' style='width:300px; height:250px;'>
97		
97<script type='text/javascript'>
98		googletag.cmd.push(function() {googletag.display('div-gpt-ad-1322358240113-1');});
99		</script>
99
100		</div>
101	</div>
102	<div id="main-nav">
103		<ul id="primary">
104			<li ><a href="../index.html">News</a></li>
105			<li class="current"><a href="how-to.html">Articles</a></li>
106			<li ><a href="../videos.html">Videos</a></li>
107			<li ><a href="../about.html">About</a></li>
108	 </ul>
109	</div>
110</div>
111	
112	<div id="content">
113		<div id="primary-content">
114
115			<div id="intro">
116			 <img src="../img/icn-howto-large.png" alt="movie icon image" style="float:left; margin-right:10px;"/>
117			 <h4>ExpressionEngine How-to Articles</h4>
118			<p>Topics range from beginner to advanced, but are all born out of real world, professional, day-to-day use of ExpressionEngine. Need more information? <a href="http://mijingo.com">Get training videos and ebooks on ExpressionEngine from Mijingo</a>.</p>
119			</div>
120			
121			<div class="content-entry">
122			<h1><a href="how-to-connect-expressionengine-to-a-third-party-email-delivery-service.html">How to Connect ExpressionEngine to a Third Party Email Delivery Service</a></h1>
123			<p>Has a client ever said to you, “Why didn’t I get that reset password email?” Have you ever had to wait patiently <em>for like ten minutes</em> to get a new member activation email? Ever lose sleep wondering if your contact form is really working? If so, let me introduce you to the wonderful world of transactional email delivery services.</p>
124
125			<p><a href="how-to-connect-expressionengine-to-a-third-party-email-delivery-service.html">Read entire article &rarr;</a></p>
126			</div>
127      
128			<div class="content-entry">
129			<h1><a href="review-content-elements-by-krea.html">Review: Content Elements by Krea</a></h1>
130			<p>Here&#8217;s the problem: Rich Text Editors (RTEs) are not always the best solution for a creating a diverse block of content for news post or longer, more complicated blog articles. Now don&#8217;t get me wrong, I love RTEs for many reasons; they let my clients update content for themselves with (usually) minimal fuss and effort on my part. So by and large they are a standard for every CMS in this day and age. And thanks to a recent ExpressionEngine update, a RTE is finally standard on my favorite platform.</p>
131
132<p>However I&#8217;ve always felt that despite all the good that RTEs bring, they come with a decent amount of bad. Simply put, clients often mistakenly break a site&#8217;s design with RTEs. You can limit the damage through toolbar configurations that prune non-essential buttons and features, but I find myself often leaving out a more complex function such as table control. The table creation interface on most RTEs is lacking or easily misused by clients. The same goes for any kind of image use other than the very basic</p>
133			<p><a href="review-content-elements-by-krea.html">Read entire article &rarr;</a></p>
134			</div>
135      
136			<div class="content-entry">
137			<h1><a href="template-partials-using-stash.html">Template Partials using Stash</a></h1>
138			<p>The standard approach to EE templates has been to have a rough equivalence between a template and a page, or a template and a content type. Templates include a header and footer, which are usually done as snippets or embeds, and some content (possibly inline, possibly using more snippets and/or embeds).</p>
139
140<p>The language of &#8220;template partials&#8221; is from the Ruby on Rails world, but the concept is solid for any framework in any language. In a nutshell, the idea is this: you have one <em>wrapper template</em> that has <em>containers</em> in it, and then you fill in those containers later. The wrapper template doesn&#8217;t care what&#8217;s in the containers, and the containers don&#8217;t care about the wrapper.</p>
141
142<p>&#8220;But,&#8221; you may say, &#8220;my templates are <em>all</em> wrappers with containers for stuff! The stuff is all different, that&#8217;s why we have to have different templates!&#8221; It&#8217;s true that the &#8220;stuff&#8221; is all different&#8211;but are the <em>containers</em> all different? Take a look at a typical site you&#8217;ve built&#8211;I bet that you have at most two or three markup patterns for the whole thing.</p>
143
144<p>If you&#8217;re used to the typical way of working with ExpressionEngine templates, you&#8217;ll see as we go on that the template partials pattern requires thinking &#8220;inside-out&#8221; for a while. However, there are some <em>huge</em> benefits to switching to this way of thinking.</p>
145
146			<p><a href="template-partials-using-stash.html">Read entire article &rarr;</a></p>
147			</div>
148      
149			<div class="content-entry">
150			<h1><a href="reusable-form-templates-with-proform.html">Reusable Form Templates with ProForm</a></h1>
151			<p><em>Editor Note: In this how-to article, ProForm developer Isaac Raway shows how to create reusable form templates with his ProForm module.</em></p>
152
153<p>One of the features of <a href="http://devot-ee.com/add-ons/proform-drag-and-drop-form-builder">ProForm</a> is the ability to create a single template capable of rendering any form that is designed in the module. Creating a reusable form template is simple and it can provide the same consistent UI to all of your forms, reducing the amount of work it takes to create a new form.</p>
154
155<h5>Goals</h5>
156
157<p>The basic goals for this setup is to be as flexible as possible. To this end, the essential design for this system is intended to allow multiple ways of using the same base template:</p>
158
159<ol>
160<li>As a full form URL - this allows us to simply link to forms that have been created in ProForm, without having to hook up anything else</li>
161<li>As an embedded template - allows placing the form inside of another custom template that might also do other things</li>
162</ol>
163
164<p>Let&#8217;s get started.</p>
165
166			<p><a href="reusable-form-templates-with-proform.html">Read entire article &rarr;</a></p>
167			</div>
168      
169			<div class="content-entry">
170			<h1><a href="automatic-add-on-builds-powered-by-source-control.html">Automatic Add-on Builds Powered by Source Control</a></h1>
171			<p><img src="../static/images/automatic-add-on-builds-powered-by-source-control/add-on-build-script.png" alt="Add-on Builds Powered by Source Control Article Image" /></p>
172
173<p>For the last two years I&#8217;ve been involved in the development and maintenance of large, feature rich add-ons for E
173xpressionEngine. These started out as primarily being internal projects for individual clients, but have since moved into my own work in the form of add-ons such as [ProForm][proform]. During this process of managing add-ons that have a rich set of features, I&#8217;ve run into a number of issues.</p>
174
175<p>The add-ons that were developed internally at work were in use by multiple developers for multiple clients at the same time. Thus, each of these developers had competing and slightly incompatible goals and feature requests&#8212;features which all had to be done now, features that I had no reason (or ability) to say no to. This situation is the same that most add-on developers go through&#8212;we want to be able to say yes to all reasonable feature requests in a timely manner. Especially when first starting out as an add-on developer, one of the most important things you can do (aside from being generally helpful) is to say &#8220;yes&#8221; as often as possible.</p>
176
177<p>This behavior can lead to a lot of stress. In my early experience with this kind of complexity, I was managing the same code base in multiple code bases then manually moving changes for each version between these separate projects. For most add-on developers the situation would be slightly different, but you can indeed end up with multiple versions of the same add-on. One for important client A, one for your own site, one for the default buyers.</p>
178
179<p>The time scheduling issues aside (how exactly do you get two 100 hour features done in a week?) there was, at first, no way that I could manage the competing requests.</p>
180
181<p>Implementing support for one critical feature would break an older feature, which had to be rewritten to use the new API provided by the first feature and so forth. At one point, things had gotten even worse with a separate developer implementing additions and changes directly to their own copy of an add-on, while I was receiving the same requests from other projects. So I&#8217;d then have to take the time to figure out how to merge those features back into the main version, while not taking other features along that those separate projects did not need.</p>
182
183<p>Add-ons top of this that projects might still be running a very old version for weeks (the same is true for typical external customers), and then suddenly discover a bug that needs to be fixed in a very old version of the code. Is it easier to fix the old version, manually merge the changes into the current version, and move on? Or would it be better for them to upgrade to the latest version?</p>
184
185<p>This whole situation was extremely unpleasant, and clearly unsustainable. It also wasn&#8217;t something I wanted to repeat with my own projects.</p>
186
187			<p><a href="automatic-add-on-builds-powered-by-source-control.html">Read entire article &rarr;</a></p>
188			</div>
189      
190			<div class="content-entry">
191			<h1><a href="a-review-and-overview-of-helpdesk-by-krea.html">A Review and Overview of HelpDesk by Krea</a></h1>
192			<p><img src="../static/images/a-review-and-overview-of-helpdesk-by-krea/helpdesk-ticket-listing.png" alt="Listing view of tickets" /></p>
193
194<p>I&#8217;ve been working with the new add-on <a href="http://devot-ee.com/add-ons/helpdesk">HelpDesk</a> from <a href="http://www.krea.com/">Krea</a> and I want to share my experiences so far.</p>
195
196<p>This review is based on my own effort to create an integrated, single location for supporting my own ExpressionEngine add-ons. I&#8217;ve considered using a number of other existing packages, most of which do not have any integration with ExpressionEngine, as well as the possibility to build my own support add-on. I also considered building a support section on top of an existing tool such as my <a href="http://devot-ee.com/add-ons/proform-drag-and-drop-form-builder">ProForm module</a>. I even considered building something from scratch using ExpressionEngine&#8217;s core capabilities. While I do think that these other options could certainly do the job, HelpDesk has given be a huge head start on the job and because of it I&#8217;m nearly finished with this new section of the site after only a few days of concentrated work with HelpDesk.<
196/p>
197
198<p><strong>If you&#8217;re looking for my one line recommendation, it is this: buy a copy of HelpDesk.</strong></p>
199
200<p>Now let&#8217;s get into some specifics.</p>
201
202			<p><a href="a-review-and-overview-of-helpdesk-by-krea.html">Read entire article &rarr;</a></p>
203			</div>
204      
205			<div class="content-entry">
206			<h1><a href="a-comparison-of-wysiwyg-editors-for-expressionengine.html">A Comparison of WYSIWYG Editors for ExpressionEngine</a></h1>
207			<p><img src="../static/images/a-look-at-wysiwyg-editors-in-expressionengine/lead-image.jpg" /></p>
208
209<p>
210The state of add-ons in ExpressionEngine as an embarrassment of riches. Since the launch of <a href="http://devot-ee.com">Devot-ee</a>, EE users now have thousands of add-ons to browse through. As new add-ons appear which duplicate the functionality of already existing add-ons, deciding which one is the right fit for your project has become more and more complicated.</p>
211
212<p>When it comes to WYSIWYG editors this is especially true. I want to do my small part to help you find the add-on for the job. In this article, I don&#8217;t pick a winner of the bunch. Instead, I want to see for myself how the most popular editors stacked up and to share what I&#8217;ve found so you can pick the right add-on for each job.
213</p>
214
215<p>
216I&#8217;m reviewing the following editors, focusing on for-pay editors since I expect a different level of support when I&#8217;m paying for software.
217</p>
218
219<ul>
220<li><a href="http://pixelandtonic.com/wygwam">Wygwam</a> by <a href="http://pixelandtonic.com/">Pixel & Tonic</a></li>
221<li><a href="http://boldminded.com/add-ons/wyvern/">Wyvern</a> by <a href="http://boldminded.com/">BoldMinded</a></li>
222<li><a href="http://www.putyourlightson.net/expresso/support">Expresso</a> by <a href="http://www.putyourlightson.net/">PutYourLightsOn</a></li>
223</ul>
224
225<p>
226Wygwam is probably the market-leading commercial editor for EE, with a solid history of improvements and updates. Wyvern and Expresso are newer kids on the block, with Wyvern taking a feature rich approach while Expresso seems to be aiming for a simpler and more lightweight tool set.
227</p>
228
229<p>
230Before I begin I want to note that with version 2.5 of ExpressionEngine due out soon with its own WYSIWYG editor and constant updates from the developers of each of the above add-ons, I will try to keep this article as up-to-date as possible. If any errors or omissions are present, please leave a comment.
231</p>
232
233			<p><a href="a-comparison-of-wysiwyg-editors-for-expressionengine.html">Read entire article &rarr;</a></p>
234			</div>
235      
236			<div class="content-entry">
237			<h1><a href="review-and-overview-of-forms-20.html">Review and Overview of Forms 2.0 by DevDemon</a></h1>
238			<p><img src="http://static.eeinsider.com/images/review-and-overview-of-forms-20/forms-lead-image.png" alt="Forms 2.0 by DevDemon" /></p>
239
240<p>Creating and managing website forms is tricky at best and downright painful at worst. Several years ago when I jumped into ExpressionEngine development, I had become spoiled from years of using Wufoo, but in this particular project, Wufoo was no longer an option.</p>
241
242<p>At the time, I found only one add-on for EE forms management, but it didn</p>
243
244			<p><a href="review-and-overview-of-forms-20.html">Read entire article &rarr;</a></p>
245			</div>
246      
247			<div class="content-entry">
248			<h1><a href="using-cache-wisely-with-expressionengine.html">Using Cache Wisely with ExpressionEngine</a></h1>
249			<p>Whenever ExpressionEngine renders a page, a variety of things happen.&nbsp; A parsing engine runs through the code, database calls are made, variables are replaced, conditional statements are evaluated, third party add-on scripts are run and more.&nbsp; While servers are amazingly fast at doing all of this, sometimes all of these processes can make a page take too many valuable seconds to load.</p>
250
251<p>
251While it is always best practice to write your code so that the page loads as fast as possible, there are times where caching can come in and save the day by providing lighting-fast load times even for pages with a lot of processing needs.&nbsp; However, there are also times where caching can work against you and actually make the page slower than loading the page without it. I&#8217;ll cover the basics of caching in ExpressionEngine, including when not to do it.</p>
252
253
254			<p><a href="using-cache-wisely-with-expressionengine.html">Read entire article &rarr;</a></p>
255			</div>
256      
257			<div class="content-entry">
258			<h1><a href="how-to-find-an-expressionengine-freelancer.html">How to Find an ExpressionEngine Freelancer</a></h1>
259			<p>Recently on Twitter someone wondered aloud how he could find freelancers that do ExpressionEngine work. It&#8217;s really not that hard and there are a few different ways to go about it. Let&#8217;s run through them quickly so you can be on your way to finding the person you need.</p>
260
261<p>These tips will help you find an ExpressionEngine <em>professional</em>, not just a freelancer. Some of the professionals you&#8217;ll find are agencies (larger and small), not individuals.</p>
262
263			<p><a href="how-to-find-an-expressionengine-freelancer.html">Read entire article &rarr;</a></p>
264			</div>
265      
266			<div class="content-entry">
267			<h1><a href="multi-language-solutions-for-expressionengine.html">Multi-language Solutions for ExpressionEngine</a></h1>
268			<p>At <a href="http://www.republic.se/en/">Republic Factory</a> we&#8217;ve been working with ExpressionEngine for quite a few years now. We have more or less been lurking on Twitter and searching the forums now and then. Since being to <a href="http://www.eeciconf.com">EECI</a> in Leiden the last two years and, as I write this, looking forward to going to NY in a few weeks we thought that this would be a good time to share a few tips with the community. Over the last few years we&#8217;ve gained a lot of experience building multi lingual sites with ExpressionEngine and that we feel hopefully could lend a hand to people starting out.</p>
269
270<p>Being situated in Sweden we don&#8217;t have English as our first language, so most things we develop will be in Swedish and/or English. A lot of our projects also get translated to Norwegian, Danish, or Finnish. Recently, when working with a couple of bigger clients, we&#8217;ve also worked with languages like Russian, Spanish, Italian and Turkish. In this article we&#8217;ll give a few tips based on our experience of building multi lingual websites in ExpressionEngine, and introduce a couple of things to think about when starting out.</p>
271
272			<p><a href="multi-language-solutions-for-expressionengine.html">Read entire article &rarr;</a></p>
273			</div>
274      
275			<div class="content-entry">
276			<h1><a href="simpler-expressionengine-urls-with-a-simple-template.html">Simpler URLs with a Single Template</a></h1>
277			<p>One of the greatest strengths of ExpressionEngine is its flexibility, so it&#8217;s no surprise that there are usually multiple ways of accomplishing the same task. But as you continue to work more and more with EE, you sometimes find better ways of doing things, whether it&#8217;s getting something done more efficiently or with less code (or hey, maybe both!).</p>
278
279<p>A good place to start when you&#8217;re new has always been with the optional Agile Records site that can be set up with a new installation. EllisLab put together the channels, custom fields and templates in there to help beginners understand how EE works and allow them to become familiar with the template language. But like anything else, you need to be able to run before you can walk, so while the Agile Records site is great for starters and allows you to build a quite capable EE site, there&#8217;s certainly room for optimization.</p>
280			<p><a href="simpler-expressionengine-urls-with-a-simple-template.html">Read entire article &rarr;</a></p>
281			</div>
282      
283			<div class="content-entry">
284			<h1><a href="the-dreaded-documentation.html">The Dreaded Documentation</a></h1>
285			<p>Last year I gave a talk at the <a href="http://environmentsforhumans.com/2010/engine-summit/">EngineSummit 2</a> on documenting EE projects. I&#8217;
285ve learned a lot the hard way in the past and I want to share the ideas and approaches with you. Hopefully you can avoid the mistakes I made.</p>
286
287<p>While it&#8217;s important to supply your clients or content editors with some form of documentation&mdash;that&#8217;s not the form of documentation we&#8217;re talking about right now. We&#8217;re talking about documentation for you, the developer. Documentation for <em>other developers</em> who aren&#8217;t inside your head 24/7. It&#8217;s important (<a href="http://rickellis.com/journal/the-secret-to-great-code.html" title="Rick Ellis on documentation">and I&#8217;m not the only one that thinks so</a>) and we&#8217;ll talk about why.</p>
288			<p><a href="the-dreaded-documentation.html">Read entire article &rarr;</a></p>
289			</div>
290      
291			<div class="content-entry">
292			<h1><a href="edit-saef-in-ee-2.html">Edit SAEF in EE 2</a></h1>
293			<p>Earlier this year, Ty Wangsness wrote <a href="../blog/enabling-saef-edit-functionality-in-ee-2/index.html">a great article</a> over at EMarketSouth which established the basics for enabling members of a site to edit channel entries outside the EE 2 control panel. While it was an excellent primer, his article only included instructions for enabling text input and text area fields, which left a lot of us wondering how to make richer fieldtypes work. Additionally, there were some sections which might have been unfamiliar for those of us who don</p>
294			<p><a href="edit-saef-in-ee-2.html">Read entire article &rarr;</a></p>
295			</div>
296      
297			<div class="content-entry">
298			<h1><a href="building-an-accessory.html">Building an Accessory, Part I</a></h1>
299			<p>In this two part tutorial we&#8217;re going to walk you through building an accessory. The first part will cover creating a very simple HTML-based accessory with your contact information. The second part will build on the first using ExpressionEngine&#8217;s native code to create a fully functional contact form. Part I assumes you understand HTML, while part II will assume you know some PHP.</p>
300
301<p>Let&#8217;s get started.</p>
302			<p><a href="building-an-accessory.html">Read entire article &rarr;</a></p>
303			</div>
304      
305			<div class="content-entry">
306			<h1><a href="multi-server-setup-for-ee-2.html">Multi-server Setup for EE 2</a></h1>
307			<p>Now that ExpressionEngine 2 is growing closer to a non-beta release, and EllisLab has published a timeline for phasing out new distributions of ExpressionEngine 1, our <a href="http://www.VectorMediaGroup.com">Vector Media Group</a> team has been choosing EE2 for more and more client projects. One of the first difficulties we ran into when we started using EE2 was the same one we ran into when we started using EE1 many years ago&#8212;how to handle our multiple server environments gracefully.</p>
308
309<p>At Vector (like many other development shops) we&#8217;re typically concerned with three primary servers: the local machines we use for day-to-day coding, the staging site where we deploy releases for the client to see and build new features, and the production server where the live site actually exists. These machines all typically have completely different URLs and file paths. While one common approach is to keep different <code>config.php</code> files on each server, we&#8217;ve found a single dynamic configuration file works better for our workflow.</p>
310			<p><a href="multi-server-setup-for-ee-2.html">Read entire article &rarr;</a></p>
311			</div>
312      
313			<div class="content-entry">
314			<h1><a href="a-primer-on-relationships-with-expressionengine.html">A Primer on Relationships (with EE)</a></h1>
315			<p>It&#8217;s about time we got serious and defined this relationship.&nbsp; You know the one where we pair a couple of ExpressionEngine entries together like an eHarmony match made in nerd heaven.&nbsp; If you&#8217;ve never dabbled in the ways of Cupid, then it&#8217;s time you learn.&nbsp; Relationships or Related Entries in ExpressionEngine are a simple and powerful way to reuse existing data and avoid the ultimate no-no: duplicate data. </p>
316
317<p>One of the best bits of advice that I received as a young developer was to make sure that my data was only in the database once.&nbsp; Database optimization, only editing data in one place, the reasons go on and on, and are perhaps best saved for an article in _DBA&#8217;s Rule The World_ magazine.&nbsp; What about us EE users though?&nbsp; How can we be cautious about duplicate data by taking advantage of EE Relationships? How does it benef
317it us, and more importantly our end users?</p>
318			<p><a href="a-primer-on-relationships-with-expressionengine.html">Read entire article &rarr;</a></p>
319			</div>
320      
321			<div class="content-entry">
322			<h1><a href="simplifying-how-content-works.html">Simplifying How Content Works</a></h1>
323			<p>When building a website it&#8217;s easy to get focused on the stuff that&#8217;s under the hood. You want to minimize database queries and find smart ways to use your markup and styles. Those things are absolutely important, but what&#8217;s also important is to make sure the site makes sense for those running it. With this article, I&#8217;m going to dive into one way to simplify how content works in ExpressionEngine by expanding the use of the Pages module to contain not just static content on a site, but a centralized hub for all those other bits of content that one might need to edit.</p>
324
325<p>When I first started using the Pages module, I looked at it as a handy way to gather &#8220;static&#8221; pages in their own separate area in the Control Panel. This was an excellent solution for About pages, Privacy Policies and the like. The Pages module filled a gaping hole in how ExpressionEngine works. </p>
326
327<p>Then I started using it for some slightly more non-traditional ways and the usefulness of the Pages module for me elevated to a new level.</p>
328			<p><a href="simplifying-how-content-works.html">Read entire article &rarr;</a></p>
329			</div>
330      
331			<div class="content-entry">
332			<h1><a href="securing-expressionengine-2.html">Securing ExpressionEngine 2</a></h1>
333			<p>Last month EE Insider <a href="../blog/ask-the-readers-simple-or-complicated-system-directory-name/index.html">asked the readers</a> &#8220;What do you rename your system folder to?&#8221; The responses ranged from common dictionary words to random strings and everything in between. The responders are obviously concerned about security and doing what they can to ensure malicious users or bots cannot attack their Control Panel. Let&#8217;s take a look at a simple way to secure your ExpressionEngine 2 (EE2) installation.</p>
334			<p><a href="securing-expressionengine-2.html">Read entire article &rarr;</a></p>
335			</div>
336      
337			<div class="content-entry">
338			<h1><a href="extending-default-member-templates.html">Extending Default Member Templates</a></h1>
339			<p>ExpressionEngine is often used to manage membership sites, something it excels at. To help you manage member functions on the front end EE includes a comprehensive set of member templates that can be themed. You can of course choose to not use them at all and there are at least a couple of <a href="http://www.solspace.com/software/detail/user/">3rd</a> <a href="http://barrettnewton.com/site/products/member_template_freedom/">party</a> member function options.</p>
340
341<p>I want to show you how you can extend the functionality of the membership templates and/or change their default behaviour. We&#8217;re going to do that with a very simple extension. This type of extension will work in both EE 1.5.2+ and EE 2.x. The examples will use EE 1.x and the default site but you can find extensions for both EE versions at the end of this article.</p>
342			<p><a href="extending-default-member-templates.html">Read entire article &rarr;</a></p>
343			</div>
344      
345			<div class="content-entry">
346			<h1><a href="cartthrob-a-closer-look.html">Cartthrob: A Closer Look</a></h1>
347			<p>A couple of weeks ago the latest attempt at e-commerce on ExpressionEngine&mdash;Cartthrob&mdash;was released. Anyone that has been using ExpressionEngine long enough knows that flexible e-commerce inside of EE has always been an elusive, slippery goal. Cartthrob is trying to change that.</p>
348
349<p>I took a closer, hands-on look at the new add-on and how it impacts doing e-commerce with ExpressionEngine.</p>
350			<p><a href="cartthrob-a-closer-look.html">Read entire article &rarr;</a></p>
351			</div>
352      
353			<div class="content-entry">
354			<h1><a href="password-protected-content-made-simple.html">Password Protected Content Made Simple</a></h1>
355			<p>Every so often I come across a project where part of the spec involves a private area of content accessible via a password. ExpressionEngine gives us a number of ways to protect content out of the box. </p>
356
357<p>One of the basic approaches is to restrict content to member groups thus requiring a member account for each person. If your content is not member-specific another approach is to create a generic user account and supply each individual with the username and password with which to log in. </p>
358
359<p>Each approach would work in numerous scenarios. However, today I want to look at how we can utilize weblogs on a very basic level to manage password protected content very easily. Our goal is to result in a process that uses default EE functionality and that the &#8220;average client&#8221; can manage with little difficulty or confusion.</p>
360
361<p>We will be using a single weblog to manage the password-protected content. The type of content is irrelevant at this point so let&#8217;
361s focus on how we can achieve this.</p>
362			<p><a href="password-protected-content-made-simple.html">Read entire article &rarr;</a></p>
363			</div>
364      
365			<div class="content-entry">
366			<h1><a href="creating-aside-content.html">Creating Aside Content</a></h1>
367			<p>Say you&#8217;re building a site for a small business with the following sections: Home, News, About Us and Contact. Each of these sections contains its own static content, blog or a combination of both. But each section also contains so-called &#8220;aside&#8221; content, with things like quotes, testimonials, call to actions and so on. Aside content is so ubiquitous nowadays, HTML5 has even given it <a href="http://dev.w3.org/html5/spec/Overview.html#the-aside-element">its own HTML tag</a>! </p>
368
369<p>But how do you manage aside content in ExpressionEngine? Here&#8217;s one way of doing it using categories and the Low Seg2Cat extension.</p>
370			<p><a href="creating-aside-content.html">Read entire article &rarr;</a></p>
371			</div>
372      
373			<div class="content-entry">
374			<h1><a href="ask-the-pro-shopping-cart-solutions-for-ee.html">Ask the Pro: Shopping Cart Solutions for EE</a></h1>
375			<p><img src="http://static.eeinsider.com/images/askthepro_final.png" class="thumb_left" />So here we are, our first entry on this new journey we&#8217;re calling &#8220;Ask the Pro&#8221;. For those of you that don&#8217;t know me I&#8217;m Fred Boyle, the Digital Chef at <a href="http://ngenworks.com">nGen Works</a> in Jacksonville, FL. I take care of all things EE among other geeky tasks. </p>
376
377<p>Don&#8217;t forget to email <a href="mailto:[email protected]">[email protected]</a> to ask your question. But what you&#8217;ve really come here for are the answers to the questions, so let&#8217;s get on with the show!</p>
378			<p><a href="ask-the-pro-shopping-cart-solutions-for-ee.html">Read entire article &rarr;</a></p>
379			</div>
380      
381			<div class="content-entry">
382			<h1><a href="travis-schmeisser-on-structure.html">Travis Schmeisser on Structure</a></h1>
383			<p><em>Editor&#8217;s Note: <a href="http://rockthenroll.com/">Travis Schmeisser</a> is one of the creators of the popular <a href="http://www.buildwithstructure.com">Structure module</a>. Travis kindly agreed to write an article explaining how Structure came about and how it&#8217;s used.</em></p>
384
385<p>Structure is an alternate method for building <a href="http://www.expressionengine.com/index.php?affiliate=ryanirelan" title="ExpressionEngine">ExpressionEngine</a> sites which focuses on pages to create hierarchy for your content. We recently released version 2.0, which is now a commercial module ($65 per site license) and includes several of the most highly requested features to date. There are tutorials and code samples for how to actually setup Structure at both <a href="http://jambor-ee.com/tutorials/structure/">Jambor-EE</a> and the <a href="http://buildwithstructure.com">Structure site</a>, but with this article I hope to explain some of the thinking behind the add-on and reveal why it can not only speed up your development, but make your client&#8217;s lives a lot easier.</p>
386			<p><a href="travis-schmeisser-on-structure.html">Read entire article &rarr;</a></p>
387			</div>
388      
389			<div class="content-entry">
390			<h1><a href="yearly-archive-with-yearlist.html">Yearly Archive with YearList</a></h1>
391			<p>A few years ago, a client needed to list out all of the years in which there were articles on the site and allow people to click on the years and get a list of all of the articles in that year; the result being an archive of the entries by year. For those of you that have tried, you probably know that ExpressionEngine does not handle this out-of-the-box. But it does help us about half-way.</p>
392
393<p>My solution was very simple. I wanted to create a list of years and make them clickable so I can access a results page with all of the articles from that year.</p>
394			<p><a href="yearly-archive-with-yearlist.html">Read entire article &rarr;</a></p>
395			</div>
396      
397			<div class="content-entry">
398			<h1><a href="improving-cp-comments-view-without-code.html">
398Improving CP Comments View without Code</a></h1>
399			<p>Recently, I found myself needing to tweak how the ExpressionEngine Control Panel displays the list of comments for an entry. The editors of a website I help maintain wanted to get a more complete overview of the comments on an entry, so they could quickly tell which are spam comments and mark them to be deleted.</p>
400
401<p>In the Control Panel, there is the View Comments/Trackbacks page, which you can access by clicking the &#8220;View&#8221; in the &#8220;Comments&#8221; column of the Edit entry listing. But in order to see the entire comment, you have to click on the comment link, view the complete comment text and then go back to mark the comment as spam or delete it. When each entry receives dozens of comments, this quickly becomes a lot of clicking and tremendous wasted effort.</p>
402
403<p>Learn how, through a process of discovery, I found a solution to my problem that required no code, but just a couple of <code>config.php</code> settings.</p>
404			<p><a href="improving-cp-comments-view-without-code.html">Read entire article &rarr;</a></p>
405			</div>
406      
407			<div class="content-entry">
408			<h1><a href="building-with-codeigniter-codeigniter-libraries.html">Building with CodeIgniter: Using Libraries</a></h1>
409			<p>So now that we have <a href="building-with-codeigniter-adding-the-blog/index.html" title="built our blog">Building a blog with CodeIgniter</a>, in order to make it lifestreamy, to make it tumble we need to add our delicious and twitter links to it. To do this, we&#8217;re going to employ an area outside of the MVC structure called &#8220;Libraries.&#8221;</p>
410			<p><a href="building-with-codeigniter-codeigniter-libraries.html">Read entire article &rarr;</a></p>
411			</div>
412      
413			<div class="content-entry">
414			<h1><a href="building-with-codeigniter-adding-the-blog.html">Building with CodeIgniter: Adding the Blog</a></h1>
415			<p>There is nothing in the world everyone wishes to hear more than your opinion. The primary vehicle for this is your blog. In the last article we began the process of <a href="building-with-codeigniter-part-1-beginning-your-tumblelog/index.html">building a tumblelog with CodeIgniter</a>. In this, Part 2 of a four-part series, we will be building the blog in CodeIgniter.</p>
416			<p><a href="building-with-codeigniter-adding-the-blog.html">Read entire article &rarr;</a></p>
417			</div>
418      
419			<div class="content-entry">
420			<h1><a href="developing-expressionengine-sites-on-windows.html">Developing EE Sites on Windows</a></h1>
421			<p><em>Editors Note: I&#8217;d like to welcome Sean Smith as the newest guest author on EE Insider. Sean is a Canadian web developer based in Seoul, South Korea. He is an avid ExpressionEngine fan and runs <a href="http://eeforums4u">EEforums4You</a>, which helps other EE developers skin the Forum module. If you want to know more about Sean he can be found on Twitter <a href="http://twitter.com/createsean">@createsean</a> or in a coffeeshop drinking coffee.</em></p>
422
423<p>When talking to web developers it seems that the overwhelming majority are Mac users. That certainly seems to be the case in the ExpressionEngine community, but there are still a large number of developers using Windows XP, Vista or soon Windows 7. This article will discuss several tools and applications that are essential for developers using the Windows platform.</p>
424			<p><a href="developing-expressionengine-sites-on-windows.html">Read entire article &rarr;</a></p>
425			</div>
426      
427			<div class="content-entry">
428			<h1><a href="building-with-codeigniter-part-1-beginning-your-tumblelog.html">Building with CodeIgniter: Beginning your Tumblelog</a></h1>
429			<p><em>Editors Note: I&#8217;d like to welcome back Kenny Meyers as a guest author on EE Insider. Kenny is a web developer at Seattle, WA based <a href="http://www.blueflavor.com" title="Blue Flavor">Blue Flavor</a>. He loves ExpressionEngine &amp; CodeIgniter for their &#8220;less is more&#8221; approach and the ability to generate good, clean standards-compliant markup. He will be writing a series of articles on building a simple web application with CodeIgniter.</em></p>
430
431<p>In my <a href="a-gentle-introduction-to-codeigniter/index.html" title="previous article">previous article</a>, we went over the basics of <a href="http://codeigniter.com/">CodeIgniter</a>. Now we&#8217;re going to actually build something. For this four-part series we&#8217;ll build a tumblelog using many of the features CodeIgniter has built-in as well as third-party libraries.</p>
432
433<p>Let&#8217;s get started.</p>
434			<p><a href="building-with-codeigniter-part-1-beginning-your-tumblelog.html">Read entire article &rarr;</a></p>
435			</div>
436      
437			<div class="content-entry">
438			<h1><a href="resources-for-optimizing-your-ee-website.html">Resources for Optimizing Your EE Website</a></h1>
439			<p>Many of us have been in this situation. You launch a snazzy new website and once the traffic starts to hit it, the site drops to its knees and begins crawling its w
439ay through the day. Your client or boss starts emailing and then calling, asking: &#8220;Why is the site so slow? Can you fix it?&#8221;</p>
440
441<p>With a little planning and an eye towards EE template coding best practices, you can prevent the situation I described above.</p>
442			<p><a href="resources-for-optimizing-your-ee-website.html">Read entire article &rarr;</a></p>
443			</div>
444      
445			<div class="content-entry">
446			<h1><a href="filtering-content-with-dynamic-parameters.html">Filtering Content with Dynamic Parameters</a></h1>
447			<p>Dynamic Parameters are a <a href="http://expressionengine.com/docs/modules/weblog/dynamic_parameters.html">documented feature</a> of the ExpressionEngine weblog entry tag pair but it&#8217;s something you might not have used before or even know about. In this article we&#8217;ll walk through two simple ways to allow your content to be filtered using Dynamic Parameters.</p>
448			<p><a href="filtering-content-with-dynamic-parameters.html">Read entire article &rarr;</a></p>
449			</div>
450      
451			<div class="content-entry">
452			<h1><a href="ee-quick-reference-chart.html">EE Quick Reference Chart</a></h1>
453			<p>So, you&#8217;re starting out building your first site with ExpressionEngine and you&#8217;re thinking to yourself: &#8220;I wish there was an easy one-page document I could use to reference some of the most commonly used ExpressionEngine tags and variables.&#8221; Well, you&#8217;re in luck.</p>
454			<p><a href="ee-quick-reference-chart.html">Read entire article &rarr;</a></p>
455			</div>
456      
457			<div class="content-entry">
458			<h1><a href="essential-ee-add-ons.html">Essential ExpressionEngine Add-ons</a></h1>
459			<p>There are hundreds, if not thousands, of ExpressionEngine add-ons out in the wild. Many of those are critical to any sites I develop, so I thought I&#8217;d share a list of ExpressionEngine add-ons that I use for almost every project.</p>
460			<p><a href="essential-ee-add-ons.html">Read entire article &rarr;</a></p>
461			</div>
462      
463			<div class="content-entry">
464			<h1><a href="a-gentle-introduction-to-codeigniter.html">A Gentle Introduction to CodeIgniter</a></h1>
465			<p>So you&#8217;ve heard the news that ExpressionEngine 2.0  is <a href="http://expressionengine.com/blog/entry/expressionengine_20_fully_codeignited/">built entirely on CodeIgniter</a> and with EE 2.0</p>
466			<p><a href="a-gentle-introduction-to-codeigniter.html">Read entire article &rarr;</a></p>
467			</div>
468      
469			<div class="content-entry">
470			<h1><a href="getting-started-with-git-and-github.html">Getting Started with Git and Github</a></h1>
471			<p>If you&#8217;re looking into implementing version control (what&#8217;s version control? <a href="http://betterexplained.com/articles/a-visual-guide-to-version-control/">A Visual Guide to Version Control</a>) in your workflow, there are a few options out there. A popular and solid choice is <a href="http://subversion.tigris.org/" title="Subversion">Subversion</a> (SVN), a free system that has one main repository on a centrally located server. It&#8217;s a great system and I use it for some of my personal projects and it&#8217;s our version control system for <a href="http://www.airbagindustries.com">Airbag</a> projects. Last summer I wrote about Subversion, and how it can improve how you collaborate on project, for <a href="http://www.alistapart.com/articles/collaboratewithsubversion">A List Apart magazine</a>.</p>
472			<p><a href="getting-started-with-git-and-github.html">Read entire article &rarr;</a></p>
473			</div>
474      
475			<div class="content-entry">
476			<h1><a href="using-the-custom-profile-data-tag.html">?Using the Custom Profile Data Tag</a></h1>
477			<p>If you&#8217;ve ever built an ExpressionEngine site with significant membership capabilities, you may have run into the less-than-ideal situation that is the Member Templates. I usually use a third party module to handle membership functionality in the templates. But there is a way to display member data on your site without the need for a third-party module.</p>
478			<p><a href="using-the-custom-profile-data-tag.html">Read entire article &rarr;</a></p>
479			</div>
480      
481			<div class="content-entry">
482			<h1><a href="creating-a-robust-config.php-file.html">Creating a Robust Config.php File</a></h1>
483			<p>A frequent question in the forums is how to easily move a site from a staging or local server to a production server without everything breaking. While site migration is out of the scope of this article, I do want to address one simple way you can make moving sites easier: create a robust <code>config.php</code> file.</p>
484
485<p>In recent versions of ExpressionEngine, the <code>config.php</code> file has become leaner as more of the installation settings have been moved into the database. This can be a inconvenience when moving a site to a different server because it requires making so many database changes and isn&#8217;t as portable as file.</p>
486
487<p>Luckily, we can still use the <code>config.php</code> file to override settings in the database.</p>
488			<p><a href="creating-a-robust-config.php-file.html">Read entire article &rarr;</a></p>
489			</div>
490      
491			<div class="content-entry">
492			<h1><a href="feeding-entries-with-lg-data-matrix.html">Feeding Entries with LG Data Matrix</a></h1>
493			<p><em>Editors Note: I&#8217;d like to welcome web developer <a href="http://brandon-kelly.com/" title="Brandon Kelly">Brandon Kelly</a> as a guest author on EE Insider. Brandon is also active in the EE developer community, having released five EE Add-ons, including the popular extension <a href="http://brandon-kelly.com/apps/playa" title="Playa">Playa</a>.</em></p>
494
495<p>As an extension developer, I want to make it as easy as possible for people to track updates to my extensions. I tend to promote major updates on the <a href="http://expressionengine.com/forums/viewforum/36/">EE Extensions Forum</a> and <a href="http://twitter.com/brandonkelly">Twitter</a>, and <a href="http://leevigraham.com/cms-customisation/expressionengine/lg-addon-updater/">LG Addon Updater</a> carries a lot of weight as well. Recently I decided to open up a new avenue for tracking updates: Change Log feeds. A lot of people use feed readers to subscribe to the websites they enjoy, so why not use them to track extension updates as well?</p>
496			<p><a href="feeding-entries-with-lg-data-matrix.html">Read entire article &rarr;</a></p>
497			</div>
498      
499			<div class="content-entry">
500			<h1><a href="a-simple-script-to-upgrade-expressionengine.html">A Simple Script to Upgrade ExpressionEngine</a></h1>
501			<p>Last week I showed you how to <a href="automatically-rebuilding-an-ee-sandbox/index.html" title="rebuild an EE sandbox">rebuild an EE sandbox</a> using a simple shell script that pulled from a database dump and tarball of ExpressionEngine files that create a fresh install of ExpressionEngine. Well, now here&#8217;s another shell script that I think you might find very useful.</p>
502			<p><a href="a-simple-script-to-upgrade-expressionengine.html">Read entire article &rarr;</a></p>
503			</div>
504      
505			<div class="content-entry">
506			<h1><a href="automatically-rebuilding-an-ee-sandbox.html">Automatically Rebuilding an EE Sandbox</a></h1>
507			<p>As part of this site and other development work, I find myself testing a lot of EE add-ons. I also work on my own add-ons. For both of these activities it&#8217;s required to have a local install of ExpressionEngine, configured just how I like it. I call it my EE Sandbox, a place where I can play in EE. I had been creating my sandbox manually each time I needed to refresh it, but that quickly became too much work each and every time I needed to start over.</p>
508			<p><a href="automatically-rebuilding-an-ee-sandbox.html">Read entire article &rarr;</a></p>
509			</div>
510      
511			<div class="content-entry">
512			<h1><a href="what-are-ee-add-ons.html">What are EE Add-Ons?</a></h1>
513			<p>If ExpressionEngine doesn&#8217;t do exactly what you need it to, don&#8217;t worry. The developers of EE have created a way to extend and customize ExpressionEngine using EE Add-ons. Add-ons  are small pieces of software that you download and install and which allow you to add features to ExpressionEngine without any programming knowledge or altering the core application files.</p>
514
515
516			<p><a href="what-are-ee-add-ons.html">Read entire article &rarr;</a></p>
517			</div>
518      
519			<div class="content-entry">
520			<h1><a href="the-not-always-simple-search-form.html">The (not always) Simple Search Form</a></h1>
521			<p>If you&#8217;ve implemented the <a href="http://expressionengine.com/docs/modules/search/simple.html">Simple Search Form</a> before, you&#8217;ve probably come across this. For me, it&#8217;s the small thing that I usually forget until I go to test some search terms to make sure the search functionality is working as expected and the results have the proper URLs. </p>
522
523<p>So what am I talking about?</p>
524			<p><a href="the-not-always-simple-search-form.html">Read entire article &rarr;</a></p>
525			</div>
526      
527			<div class="content-entry">
528			<h1><a href="hand-rolled-social-bookmark-links-for-your-ee-site.html">Hand-rolled Social Bookmark Links</a></h1>
529			<p>If you&#8217;re building a website it&#8217;s probably a good idea to make it as easy as possible for your site visitors and readers to share your content with their online community and friends. We&#8217;ll look at the easy way to do it and then the hand-rolled way. </p>
530
531
532			<p><a href="hand-rolled-social-bookmark-links-for-your-ee-site.html">Read entire article &rarr;</a></p>
533			</div>
534      
535			<div class="content-entry">
536			<h1><a href="ee-tags-primer.html">ExpressionEngine Tags Primer</a></h1>
537			<p>So, EE tags. They&#8217;re the things that start and end with curly braces and that you use all over your EE templates to make your content appear. This short tutorial will give you an overview of EE tags, the different kinds and how they&#8217;re made.</p>
538			<p><a href="ee-tags-primer.html">Read entire article &rarr;</a></p>
539			</div>
540      
541			<div class="content-entry">
542			<h1><a href="case-study-social-networking-with-expressionengine-part-2.html">Case Study: Social Networking with ExpressionEngine, Part 2</a></h1>
543			<p>Along with the ability for users to join networks, the client also required that users are able to connect individually as &#8220;colleagues.&#8221; This is, as you probably know, basic functionality for any social networking website. We&#8217;re not breaking new ground here&#8230;except that this type of functionality isn&#8217;t built-in to ExpressionEngine.</p>
544			<p><a href="case-study-social-networking-with-expressionengine-part-2.html">Read entire article &rarr;</a></p>
545			</div>
546      
547			<div class="content-entry">
548			<h1><a href="case-study-social-networking-with-expressionengine-part-1.html">Case Study: Social Networking with ExpressionEngine, Part 1</a></h1>
549			<p>ExpressionEngine is a great tool to manage content, allow commenting on content and dozens of other ways of interacting with the content (<a href="http://www.solspace.com/software/detail/rating/">ratings</a>, saving or <a href="http://www.solspace.com/software/detail/favorites/">favoriting</a>, <a href="http://www.solspace.com/software/detail/tag/">tagging</a>) using third party add-ons. But the client also wanted some more traditional social networking features: groups and friends.</p>
550			<p><a href="case-study-social-networking-with-expressionengine-part-1.html">Read entire article &rarr;</a></p>
551			</div>
552      
553			<div class="content-entry">
554			<h1><a href="the-tools-i-use-textmate-ee-bundle-and-color-theme.html">The Tools I Use - TextMate EE Bundle and Color Theme</a></h1>
555			<p>Earlier this week, <a href="http://forums.pragprog.com/forums/71/topics/679">Eric posted to the PragProg EE Screencast forum</a> asking about how I get the EE tags to be color coded in TextMate in the <a href="http://www.pragprog.com/screencasts/v-riexp/building-a-dynamic-website-with-expressionengine">ExpressionEngine training videos</a>. I realized that I never explicitly mentioned this and want to now for those who use Macs and TextMate. It might make it even easier to follow along with the screencasts if our code matches colors.</p>
556			<p><a href="the-tools-i-use-textmate-ee-bundle-and-color-theme.html">Read entire article &rarr;</a></p>
557			</div>
558      
559			<div class="content-entry">
560			<h1><a href="developing-an-expressionengine-site-locally.html">Developing an ExpressionEngine Site Locally</a></h1>
561			<p>I know I&#8217;m not the only one who develops <a href="http://www.expressionengine.com/index.php?affiliate=ryanirelan">ExpressionEngine</a> sites on the local computer first, but I&#8217;m also certain there are many people who do not and would like to learn more. If you&#8217;re one of those people, this ExpressionEngine tutorial is for you.</p>
562			<p><a href="developing-an-expressionengine-site-locally.html">Read entire article &rarr;</a></p>
563			</div>
564      
565			<div class="content-entry">
566			<h1><a href="installing-expressionengine.html">Installing ExpressionEngine</a></h1>
567			<p>So, you&#8217;re ready to jump into the world of <a href="http://www.expressionengine.com/index.php?affiliate=ryanirelan">ExpressionEngine</a>? You&#8217;ve got your tutorials in front you and are ready to start building your first EE-powered website. All you need to do is install E
567xpressionEngine on your local computer of web server and then it&#8217;s off to the races! This guide to installing EE will help you kick start the EE learning process.</p>
568			<p><a href="installing-expressionengine.html">Read entire article &rarr;</a></p>
569			</div>
570      
571
572		</div>
573				<div id="secondary-content">
574			<div class="module">
575				<form method="post" action="../index.html"  >
576<div class='hiddenFields'>
577<input type="hidden" name="ACT" value="19" />
578<input type="hidden" name="XID" value="8556035f9f663caea3e7198070485e68aafe2302" />
579<input type="hidden" name="RES" value="" />
580<input type="hidden" name="meta" value="NBCrxB8bs0rTAM9uR3RwJOOPhIyIytSfnaZGTfWby+HtQCEVErO6oUQ4O0p2RVU7Fs20Ao0/kRjB5DFritMsdFkJFXcparrgiosRJSJIeCNTZll2BCx9uDXhfirJvP0lMDV9gMfwSx+DrFwsYQ1n18aC89Amx3TMDOuasakZzN/dRAxxIlbObRfe99beMoyFkZxqHDfbHR2JPraFPd8xyiYfS5qlddTdE0b+sJ2zscT1zUY5mtSDQMW2OK3y33xUBDmo9L/6F0G622UB5ulDvlJZTzNrvsnM1vm0w+0v4XBO9VD/IAOzhqffLXcFjU+/p/+1aZwONWedMI3bqMOQ9uPiufWnXz4jCoMxURgQ0OMZQwb/l4c6XC2Vi5blj1qW" />
581<input type="hidden" name="site_id" value="1" />
582</div>
583
584
585				<div id="sidebar-search">
586					<label for="keywords">Search:</label>
587					<input style="width:100%;" type="text" value="" name="keywords" id="keywords" placeholder="Search" />
588				</div>
589				</form>
590			</div>
591		<div id="primary-ad">
592	<div id='div-gpt-ad-1322358240113-2' style='width:160px; height:600px;'>
593	
593<script type='text/javascript'>
594	googletag.cmd.push(function() {googletag.display('div-gpt-ad-1322358240113-2');});
595	</script>
595
596	</div>
597<br />
598<div id='div-gpt-ad-1322358240113-3' style='width:160px; height:600px;'>
599<script type='text/javascript'>
600googletag.cmd.push(function() {googletag.display('div-gpt-ad-1322358240113-3');});
601</script>
601
602</div>
603</div> 
604
605
606		
607		</div>
608                                                                                                                 
609		<div id="footer">
610	<ul id="footer-nav">
611		<li ><a href="../index.html">Home/News</a></li>
612		<li class="current"><a href="how-to.html">Articles</a></li>
613		<li ><a href="../videos.html">Videos</a></li>
614		<li ><a href="../about.html">About</a></li>
615		<li class="secondary"><a href="http://feeds.feedburner.com/eeinsider">Subscribe</a></li>
616		<li><a href="../advertise.html">Advertise</a></li>
617	</ul>
618	<div style="clear:both;"> </div>
619	<p><strong>Copyright 2017 <a href="http://mijingo.com">Mijingo, LLC</a> and the authors. All Rights Reserved</strong> (including the best parking spot at the office). Please do not reuse this content without authorization, including full content syndication via the <acronym title="Really Simple Syndication">RSS</acronym> feed. If you do, somewhere, a clown will cry.</p>
620	<p>EE Insider and its owner Mijingo, LLC are not affiliated with EllisLab, Inc., makers of ExpressionEngine. The ExpressionEngine name is a trademark of EllisLab, Inc.</p>
621</div>
622
623<script type="text/javascript">
624var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
625document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
626</script>
vendor: 1 bytes, line 626
626
627<script type="text/javascript">
628try {
629var pageTracker = _gat._getTracker("UA-67821-5");
630pageTracker._trackPageview();
631} catch(err) {}</script>
vendor: 1 bytes, line 631
631
632<script type="text/javascript">
633var _sf_async_config={uid:47774,domain:"eeinsider.com",useCanonical:true};
634(function(){
635  function loadChartbeat() {
636    window._sf_endpt=(new Date()).getTime();
637    var e = document.createElement('script');
638    e.setAttribute('language', 'javascript');
639    e.setAttribute('type', 'text/javascript');
640    e.setAttribute('src', '//static.chartbeat.com/js/chartbeat.js');
641    document.body.appendChild(e);
642  }
643  var oldonload = window.onload;
644  window.onload = (typeof window.onload != 'function') ?
645     loadChartbeat : function() { oldonload(); loadChartbeat(); };
646})();
647
648</script>
648
649	</div>       
650	
651</body>
652
653</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.